汇编 十进制加法, 支持运算结果254位

 

        ;program name decimal adder ,  supports  254  bit result
        ;author 郭真林 0505115班16号
        ;date 
4 : 52  PM  6 / 6 / 2007                 
                
showMeg Macro message                    ;dispaly tip 
for  user
        
push  dx
        
push  ax
        mov dx
, offset message
        mov ah
, 09
        
int  21h
        
pop  ax
        
pop  dx
        EndM
                        
        
. model small
        
. stack
        
. data
intip    db 
' Please input two number: '         
        db 
' for example: 120+300 ' , 0dh , 0ah
        db 
' enter q exit program ' , 0dh , 0ah , ' $ '
erorMeg db 
' Sorry,Your input is invalid! ' , 0dh , 0ah , ' $ '
rtMeg   db 
' The result is:$ '
crlf    db 0dh
, 0ah , ' $ '
bitLeng equ 
255                             ;set bit  length  needed
buffer  db bitLeng                        ;
' + '  need occupy a bit
        db 
0
        db bitLeng dup(
0 )    
aResult db bitLeng dup(
0 )        
        db 0dh
, 0ah , ' $ '     
        
. code
        
. startup
        
. REPEAT
            showMeg intip            
            mov dx
, seg buffer            ;get user ' s expression string
            mov ds,dx
            mov dx,offset buffer
            mov ah,0ah
            int 21h
            
            showMeg crlf                ;CR_LF after user
' s input
                    
            mov si
, offset buffer            
            mov di
, offset aResult        
            
            xor bx
, bx            
            call checkInput                ;valid user
' s input        
            
            .IF bl == 0
                showMeg erorMeg
            .ELSEIF bl == 1                        
                showMeg rtMeg                
                mov dx,di                ;show the result to user                
                mov ah,09h
                int 21h                
            .ENDIF            
        .UNTIL bl == 2
        .exit 0        
        
checkInput proc                            ;check user
' s input .  in para : si , di; out para : bl  0 : 1 : 2 : exit , di : start address of result
local  caFlag : byte , heighF : byte
        mov byte ptr caFlag
, 0
        mov byte ptr heighF
, 0
        
push  dx
        
push  cx
        
push  ax    
        
push  si            
        
        mov bx
, lengthof aResult            ;recalculate the lenght of result        
        add di
, bx                        ;locate the bottom of result
        dec di
                    
        mov al
, [si + 1 ]                    ;get the  length  of user ' s input string in practice    
        .IF al == 1
            mov al,[si+2]
            .IF al == 
' q ' || al ==  ' Q '
                jmp  exitMP
            .ENDIF    
            jmp invalid    
        .ELSEIF al == 0    
            jmp invalid    
        .ENDIF
        
        mov cx,0                
        .WHILE cl < [si+1]                ;get the poisition of 
' + '
            mov bx,cx
            mov al,[bx+si+2]
            .IF al == 
' + '
                .IF caFlag != 0
                    jmp invalid
                .EndIF
                mov caFlag, cl
                inc caFlag
            .ELSEIF !(al >= 
' 0 '  && al <=  ' 9 ' )                                
                jmp invalid    
            .ELSE
                and byte ptr[bx+si+2],0fh    ;convert ASCII to number
            .EndIF            
            inc cl
        .ENDW
                
        mov al,[si+1]                        ;the lenght of user
' s input
        
. IF  (caFlag  ==   0 ||  (caFlag  ==   1 ||  (caFlag  ==  al) ; ' + '  at the first or  last  poisition or not existing it
            jmp invalid
        
. ENDIF
        
        mov cl
, byte ptr [si + 1 ]                ; .....+... ;            
        
sub  cl , caFlag
        mov dl
, caFlag    
        dec dl         
        
. IF  cl  >  dl
            mov dl
, cl                        ;the max lenght of number
            mov cl
, caFlag                    ;the min lenght of number
            dec cl
        
. EndIF        
        
        mov ch
, 1         
        
. WHILE  ch  <=  dl
            mov bx
, 0
            mov bl
, caFlag
            
sub  bl , ch    
            mov dh
, caFlag                    ;the lenght of first number    
            dec dh
            
            
. IF  ch  <=  cl  ||  dh  >  cl                
                mov al
, [bx + si + 1 ]            ;get first char
            
. ELSE
                mov al
, 0
            
. ENDIF
            
            mov bx
, si
            inc bx
            mov bh
, 0
            mov bl
, [bx]
            
sub  bl , ch
            inc bl
            
            mov dh
, [si + 1 ]                    ;the lenght of second number
            
sub  dh , caFlag    
                
            
. IF  ch  <=  cl  ||  dh  >  cl        
                mov ah
, [bx + si + 1 ]            ;get second char
            
. ELSE
                mov ah
, 0
            
. ENDIF
            
            add al
, heighF                    ;add Carry from low byte
            mov byte ptr heighF
, 0
            daa                
            
            test al
, 10h
            jz noCarry1
            mov heighF
, 1             
noCArry1
:     add al , ah                        ;add two number
            daa                                ;BCD adjusment    
                    
            test al
, 10h
            jz noCarry2
            mov heighF
, 1             
noCArry2
:     or al , 30h                        ;convert to ASCII char                
            mov [di]
, al                        ;save result        
            dec di            
            inc ch
        
. ENDW
        inc di                                ;must incrase 
1 , because  sub  more  1  above
        
. IF  heighF  !=   0
            dec di
            mov byte ptr [di]
, ' 1 '
        
. EndIF
        
        mov al
, [di]
        
. WHILE  al  ==   ' 0 '                     ; delete   0  front of result
            inc di
            mov al
, [di]
        
. ENDW
        
        mov al
, 0dh                            ; if  result is  0 , then di should be  sub   1 ,  and set  0
        
. IF  [di]  ==  al
            dec di
            mov byte ptr [di]
, 30h
        
. EndIf
        
        mov bl
, 1
        jmp overP
        
invalid
: mov bl , 0
        jmp overP
exitMP
:     mov bl , 2
overP
:      pop  si
        
pop  ax
        
pop  cx    
        
pop  dx    
        ret    
checkInput endp    
        end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值