用汇编实现大数的加减运算

1.大数加法

DATAS SEGMENT

    A db 100 dup(?);第一个数

    B db 100 dup(?) ;第二个数

    count db ?;记录最大位数

    temp db ?;进位标志位

    len1 db 0;记录A的位数

    len2 db 0;B的位数

DATAS ENDS

CODES SEGMENT

    ASSUME CS:CODES,DS:DATAS,SS:DATAS

START:

    MOV AX,DATAS

    MOV DS,AX

    mov es,ax

    xor ax,ax

in1:   ;A数组的输入

    mov ah,1

    int 21h

    sub al,'0'

    cmp al,0;判定输入的字符是否是0-9

    jl @F

    cmp al,9

    jg @F

    push ax

    inc len1

    jmp in1

@@:

    mov dl,10

    mov ah,2

    int 21h

    mov dl,13

    mov ah,2

    int 21h

    lea di,A

    mov cl,len1

@@:  ;将数组A倒置

    pop ax

    mov [di],al

    inc di

    loop @B

    xor ax,ax

in2:   ;输入B数组

    mov ah,1

    int 21h

    sub al,'0' ;判定输入的字符是否是0-9

    cmp al,0

    jl @F

    cmp al,9

    jg @F

    push ax

    inc len2

    jmp in2

@@:

    mov dl,10

    mov ah,2

    int 21h

    mov dl,13

    mov ah,2

    int 21h

    lea si,B

    mov cl,len2

@@:    ;将数组A倒置

    pop ax

    mov [si],al

    inc si

    loop @B

    mov bl,len1

    mov al,len2

    mov count,bl  ;比较出最大位数,并将位数小的数组在高位补0,直到位数相等

    cmp bl,al

    jz sa

    jg xy

    mov count,al

    sub al,bl

    mov cl,al

@@:

    mov [di],0

    inc di

    loop @B

    jmp sa

xy:

    sub bl,al

    mov cl,bl

@@:

    mov [si],0

    inc si

    loop @B

sa:

    mov cl,count

    lea di,A

    lea si,B

    mov temp,0;设置进位标志

    clc

fg:   ;2个数组add

    mov bl,[si]

    cmp temp,1

    clc

    jnz p3

    stc

p3:

    mov temp,0

    adc bl,[di]

    cmp bl,10

    jl p2

    sub bl,10

    mov temp,1

p2:

    push bx

    inc di

    inc si

    loop fg

    cmp temp,1

    jnz p1

    mov bl,1 ;最高位有进位,加1位并置1

    push bx

    inc count

p1:

    mov cl,0

@@:  ;清除前面多余的0

    pop ax

    inc cl

    cmp cl,count

    jz @F

    cmp al,0

    jz @B

@@:

    push ax

    dec cl

    sub count,cl

    mov cl,count

@@:  ;结果输出

    pop dx

    add dl,'0'

    mov ah,2

    int 21h

    loop @B

    MOV AH,4CH

    INT 21H

CODES ENDS

END START
View Code

 

结果:

4986746546546

8798798

4986755345344

 

2.大数减法

DATAS SEGMENT

    A db 100 dup(?);第一个数

    B db 100 dup(?) ;第二个数

    count db ?;记录最大位数

    temp db ?;标志位

    len1 db 0;记录A的位数

    len2 db 0;B

DATAS ENDS

CODES SEGMENT

    ASSUME CS:CODES,DS:DATAS,SS:DATAS

START:

    MOV AX,DATAS

    MOV DS,AX

    mov es,ax

    xor ax,ax

in1:   ;A数组的输入

    mov ah,1

    int 21h

    sub al,'0'

    cmp al,0;判定输入的字符是否是0-9

    jl @F

    cmp al,9

    jg @F

    push ax

    inc len1

    jmp in1

@@:

    mov dl,10

    mov ah,2

    int 21h

    mov dl,13

    mov ah,2

    int 21h

    lea di,A

    mov cl,len1

@@:  ;将数组A倒置

    pop ax

    mov [di],al

    inc di

    loop @B

    xor ax,ax

in2:   ;输入B数组

    mov ah,1

    int 21h

    sub al,'0' ;判定输入的字符是否是0-9

    cmp al,0

    jl @F

    cmp al,9

    jg @F

    push ax

    inc len2

    jmp in2

@@:

    mov dl,10

    mov ah,2

    int 21h

    mov dl,13

    mov ah,2

    int 21h

    lea si,B

    mov cl,len2

@@:    ;将数组A倒置

    pop ax

    mov [si],al

    inc si

    loop @B

    mov bl,len1

    mov al,len2

    mov count,bl  ;比较出最大位数,并将位数小的数组在高位补0,直到位数相等

    cmp bl,al

    jz com

    jg xy

    mov count,al

    sub al,bl

    mov cl,al

@@:

    mov [di],0

    inc di

    loop @B

    jmp sba

xy:

    sub bl,al

    mov cl,bl

@@:

    mov [si],0

    inc si

    loop @B

    jmp sab

    mov cl,count

    lea di,A

    lea si,B

    ;比较a/b大小

com:

    mov bl,[di]

    cmp bl,[si]

    jl sba

    jg sab

    inc di

    inc si

    jz com

;a>b时让a-b

sab:

    mov cl,count

    lea di,A

    lea si,B

    mov temp,0;设置进位标志

fg1:  

    mov bl,[di]

    sub bl,temp

    mov temp,0

    cmp bl,[si]

    jge p3

    add bl,10

    mov temp,1

p3:

    sub bl,[si]

    push bx

    inc di

    inc si

    loop fg1

    jmp p1

;

;a<b是让b-a

sba:

    mov cl,count

    lea di,A

    lea si,B

    mov temp,0;设置进位标志

fg2:   ;2个数组sub

    mov bl,[si]

    sub bl,temp

    mov temp,0

    cmp bl,[di]

    jge p32

    add bl,10

    mov temp,1

p32:

    sub bl,[di]

    push bx

    inc di

    inc si

    loop fg2

    mov dl,2DH ;输入‘-’

    mov ah,2

    int 21h

;

p1:

    mov cl,0

@@:  ;清除前面多余的0

    pop ax

    inc cl

    cmp cl,count

    jz @F

    cmp al,0

    jz @B

@@:

    push ax

    dec cl

    sub count,cl

    mov cl,count

@@:  ;结果输出

    pop dx

    add dl,'0'

    mov ah,2

    int 21h

    loop @B

    MOV AH,4CH

    INT 21H

CODES ENDS

END START
View Code

 

结果:

416546546

87987987979

-87571441433

 

转载于:https://www.cnblogs.com/xin-hua/archive/2012/12/15/2819824.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值