| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
跟大牛学C++学算法数据结构
共有 1142 人关注过本帖
标题:两个多位十进制数相加
只看楼主 加入收藏
casanava
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-3-9
结帖率:100%
  已结贴   问题点数:20  回复次数:2   
两个多位十进制数相加
将两个多位十进制数相加,要求被加数、加数均以ASCⅡ码形式各自顺序存放在以DATA1和DATA2为首的五个内存单元中(低位在前),结果送回DATA1处。

DATA  SEGMENT
    DATA1   DB   34H,35H,39H,38H,36H,' '  ;被加数
    DATA2    DB     37H,34H,33H,36H,32H,' '  ;加数
DATA  ENDS
CODE  SEGMENT
     MAIN  PROC  FAR
        ASSUME  CS:CODE,DS:DATA
    START:  MOV  AX,DATA
       MOV  DS,AX
      LEA    SI,DATA1      ;有效地址送SI,为调用显示子程序做准备
      CALL  DISPLAY        ;调用显示子程序
      CALL  CRLF        ;调用回车换行子程序
    LEA SI,DATA2  ;有效地址送SI,为调用显示子程序做准备,同时为加法运算做准备
      CALL  DISPLAY        ;调用显示子程序
      CALL  CRLF        ;调用回车换行子程序
      LEA    DI,DATA1      ;有效抵制送DI,为加法运算做准备
      MOV  AX,0                        
      MOV  BX,0                          
      MOV  CL,05H        ;记录循环次数
     ADDS: MOV  AL,[SI]        ;将加数送往AL               
      SUB    AL,30H                        
      ADD  AL,BL        ;加上进位                     
      MOV  BL,[DI]        ;将被加数送往BL               
      SUB    BL,30H                        
      ADD  AL,BL        ;加法运算               
      ADD  AL,30H                        
      CMP  AL,3AH                        
      JA    SUBA        ;结果>=10,跳到SUBA
      JB    NSUBA                        
     SUBA:  SUB    AL,0AH        ;减去10的值,并置BL为1     
     MOV  BL,01H                        
      JMP    CONTINUE                        
    NSUBA:  MOV  BL,00H        ;置BL为0               
  CONTINUE:MOV  [DI],AL        ;将相加的结果从AL送往DI的地址,即DATA1的地址  
        INC    DI        ;地址加1               
        INC    SI        ;地址加1               
      LOOP  ADDS        ;循环               
      JC    SHUCHU                        
      JNC    SHUCHU2                        
   SHUCHU2: MOV  AL,31H        ;CF为1设置结果最高位为1     
   JMP    CONTINUE2                        
    SHUCHU:MOV  AL,30H        ;CF为0设置结果最高位为0              
CONTINUE2:MOV  [DI],AL                        
       LEA    SI,DATA1      ;将DATA1的有效地址送往SI,为调用DISPLAY子程序做准备  
       CALL  DISPLAY        ;调用DISPLAY子程序                 
       MOV  AX,4C00H      ;返回DOS            
       INT  21H                        
MAIN    ENDP  
                     
CRLF    PROC  NEAR        ;回车、换行 于功能                                 
   MOV  DL,0DH                        
      MOV  AH,02H                                                            
      INT    21H                                                            
      MOV  DL,0AH                        
      MOV  AH,02H                                                           
      INT    21H                        
      RET                                               
CRLF    ENDP
DISPLAY    PROC    NEAR          ;显示于功能
         MOV  BX,0006H                        ;记录循环次数     
     DSL:  MOV  DL,[SI+BX-1]      ;将有效地址内的内容送往DL
           MOV  AH,02                           ;2号功能输出                    
           INT    21H         
           DEC  BX           ;BX自动减1
           JNZ    DSL                                                  
           RET                                                         
DISPLAY    ENDP
CODE  ENDS
END  START
程序运行通过,但有一处地方不明白,
JC    SHUCHU  
SHUCHU:MOV  AL,30H     ;CF为0设置结果最高位为0   
请哪位大侠解释一下,谢谢
2018-04-29 10:35
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:10
帖 子:204
专家分:1362
注 册:2016-5-15
  得分:20 
;代码写得比较乱,不如换一个方式,方便解理.

DATA SEGMENT
 DATA1 DB '459860'  ;被加数   68954
 DATA2 DB '743620'  ;加数   + 26347 = 95301
DATA ENDS

CODE SEGMENT
 ASSUME  CS:CODE,DS:DATA
START:
 MOV AX,DATA
 MOV DS,AX
 LEA SI,DATA1
 MOV CX,5
 CALL DISPLAY  ;印出
 LEA SI,DATA2
 MOV CX,5
 CALL DISPLAY  ;印出
 LEA SI,DATA1
 LEA DI,DATA2
 MOV AH,0  ;初始化进位
 MOV CX,6
NEXT1:
 MOV AL,[SI] ;取值
 SUB AL,'0'  ;ASCII -> 值
 ADD AH,[DI] ;取值 + 进位(若有)
 SUB AH,'0'  ;ASCII -> 值
 ADD AL,AH   ;相加
 AAM         ;BCD调整,假如9+4,加后AL=0DH,AAM后,AX=0103,即AH=进位,AL=个位
 ADD AL,'0'  ;值 -> ASCII
 MOV [SI],AL ;放回DATA1
 INC SI      ;下一偏移
 INC DI      ;下一偏移
 LOOP NEXT1  ;回圈
 MOV CX,6
 LEA SI,DATA1
 CALL DISPLAY ;印出
 MOV AH,4CH
 INT 21H
;---------
DISPLAY:
 MOV DX,CX
DISP1:
 LODSB
 PUSH AX
 LOOP DISP1
 MOV CX,DX
DISP2:
 POP DX
 MOV AH,2
 INT 21H
 LOOP DISP2
 MOV DL,0DH
 INT 21H
 MOV DL,0AH
 INT 21H
 RET
;---------
CODE  ENDS
END  START

[此贴子已经被作者于2018-4-29 23:02编辑过]

2018-04-29 22:50
casanava
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-3-9
  得分:0 
谢谢,
我己经想明白了,
最高位的 6+2,
再换算成ASCII码的形式,38,
38当然比3A小,所以,
CMP  AL,3AH 执行之后,标志位就变化了,
2018-05-01 15:31







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067360 second(s), 9 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved