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

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

 

posted @ 2012-12-15 21:44  _随心所欲_  阅读(2258)  评论(0编辑  收藏  举报