加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

两个多位十进制数相加----汇编语言

(2006-12-12 12:48:40)
DATA     SEGMENT
DATA1    DB  31H,32H,33H,34H,35H    ; 第一个数据(作为被加数)     
DATA2    DB  35H,36H,37H,38H,33H    ; 第二个数据(作为加数)   
DATA     ENDS  
STACK    SEGMENT                    ; 堆栈段    
STA      DB     64 DUP(0)  
SP_TOP   DB                           
STACK    ENDS    
CODE     SEGMENT        
         ASSUME    CS:CODE, DS:DATA, ES:DATA, SS:STACK     
START:   MOV    AX,DATA        
         MOV    DS,AX     
         MOV    AX,STACK       
         MOV    SS,AX      
         LEA    SP,SP_TOP   
         MOV    SI,OFFSET DATA2           
         MOV    BX,05     
         CALL   DISPL               ; 显示被加数   
         CALL   CRLF                ; 回车、换行      
         MOV    SI,OFFSET DATA1                
         MOV    BX,05                  
         CALL   DISPL               ; 显示加数
         CALL   CRLF                ; 回车、换行          
         MOV    DI,OFFSET DATA2    
         CALL   ADDA                ; 加法运算    
         MOV    SI,OFFSET DATA1             
         MOV    BX,05               ; 显示结果       
         CALL   DISPL                  
         CALL   CRLF                    
         MOV    AX,4C00H            ; 正常结束      
         INT    21H       
CRLF     PROC   NEAR                ; 回车、换行功能      
         MOV    AH,02H                             
         MOV    DL,0DH              ; 回车
         INT    21H                
         MOV    AH,02H              ; 换行         
         MOV    DL,0AH    
         INT    21H    
         RET            
CRLF     ENDP  
DISPL    PROC   NEAR                ; 显示功能         
DSL:     MOV    AH,02                
         MOV    DL,[SI+BX-1]        ; 显示字符串   
         INT    21H        
         DEC    BX                  ; 修改偏移量       
         JNZ    DSL          
         RET     
DISPL    ENDP  
ADDA     PROC                 
         MOV    DX,SI               ; 保存段首址到寄存器中
         MOV    BP,DI        
         MOV    BX,05           
ADDI:    SUB    BYTE PTR[SI+BX-1],30H         
         SUB    BYTE PTR[DI+BX-1],30H               
         DEC    BX              
         JNZ    ADDI                      
         MOV    CX,05         
         CLC                        ; 清进位         
ADD2:    MOV    AL,[SI]                   
         MOV    BL,[DI]                
         ADC    AL,BL               ; 带进位相加             
         AAA                        ; 非组合BCD码的加法调整        
         MOV    [SI],AL             ; 结果送被加数区             
         INC    SI             
         INC    DI                  ; 指向下一位      
         LOOP   ADD2                ; CX!=0则循环                            
         MOV    SI,DX               ; 恢复SI和DI                 
         MOV    DI,BP                                 
         MOV    BX,05H            
ADD3:    ADD    BYTE PTR [SI+BX-1],30H  ; 十六进制的数字串
         ADD    BYTE PTR [DI+BX-1],30H  ; 转化为ASCII码表示的数字串 
         DEC    BX                    
         JNZ    ADD3          
         RET                         
         ADDA   ENDP                                                            
CODE       ENDS                                                       
           END    START    

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有