当前位置: 代码迷 >> 汇编语言 >> ~利用非压缩BCD码实现不大于10位十进制数加法运算的有关问题
  详细解决方案

~利用非压缩BCD码实现不大于10位十进制数加法运算的有关问题

热度:168   发布时间:2016-05-02 04:29:49.0
求助~利用非压缩BCD码实现不大于10位十进制数加法运算的问题
有几位的结果不对,输入不同个数的0,会在不同位置上出现数字……
程序:
DATA SEGMENT
  STRING1 DB 10,?,10 DUP('0');高位在后低位在前
  STRING2 DB 10,?,10 DUP('0')
DATA ENDS
CODE SEGMENT
  ASSUME CS:CODE,DS:DATA,ES:DATA
START:
  MOV AX,DATA
  MOV DS,AX
  MOV ES,AX

  LEA DX,STRING1
  MOV AH,10
  INT 21H

  MOV AH,2H
  MOV DL,0DH
  INT 21H
  MOV DL,0AH
  INT 21H

  LEA DX,STRING2
  MOV AH,10
  INT 21H

  MOV AH,2H
  MOV DL,0DH
  INT 21H
  MOV DL,0AH
  INT 21H

  

  LEA SI,STRING1
  LEA DI,STRING2
  ADD SI,2
  ADD DI,2
  
  
  MOV CX,10
  MOV AH,0H

L1:MOV AL,DS:[SI]
   INC SI
   SAHF
   ADC AL,[DI]
   AAA
   LAHF
   OR AL,30H
   MOV ES:[DI],AL
   INC DI
   LOOP L1

   AND AH,01H
   OR AH,30H
   MOV [DI],AH
   MOV AH,02H
   MOV CX,10

L2:MOV DL,[DI]
   INT 21H
   DEC DI
   LOOP L2
   MOV AH,4CH
   INT 21H
CODE ENDS
END START
------解决思路----------------------
0ah 功能输入的字符串,末尾有个回车 0dh 字节的;数值的顺序也不对吧,输入的和加运算的关系反了;结果放在 STRING2 里,那就应多定义一个字节吧,输出时也要多一个。
------解决思路----------------------
楼主写的程序堪称精美,本人仔细阅读了楼主的程序。
略做修改如下(未改变计算顺序,仍然是高位在后,低位在前):
修改后,程序实现了第一个加数的位数可以和第二个加数的位数不同。和的位数以位数多的加数的位数为准。
由于本人水平有限,还请楼主和各位高手批评指正。
DATA SEGMENT
  STRING1 DB 10,?,10 DUP('0');高位在后低位在前
  STRING2 DB 10,?,10 DUP('0')
DATA ENDS
CODE SEGMENT
  ASSUME CS:CODE,DS:DATA,ES:DATA
START:
  MOV AX,DATA
  MOV DS,AX
  MOV ES,AX

  LEA DX,STRING1
  MOV AH,10
  INT 21H

  MOV AH,2H
  MOV DL,0DH
  INT 21H
  MOV DL,0AH
  INT 21H

  LEA DX,STRING2
  MOV AH,10
  INT 21H

  MOV AH,2H
  MOV DL,0DH
  INT 21H
  MOV DL,0AH
  INT 21H

  

  LEA SI,STRING1
  LEA DI,STRING2
  ADD SI,2
  ADD DI,2
  MOV AH,0H
  MOV BH,0H
  XOR DX,DX
  MOV AL,[SI-1]
  MOV BL,[DI-1]
  CMP AL,BL
  JB BL1
  PUSH AX
  SUB AX,BX
  MOV CX,AX
  ADD DI,BX
BLCZ1:
  MOV BYTE PTR[DI],0
  INC DI
  LOOP BLCZ1
  POP CX
  LEA DI,STRING2
  ADD DI,2
  JMP L1

BL1:
  PUSH BX
  SUB BX,AX
  MOV CX,BX
  ADD SI,AX

BLCZ2:
  MOV BYTE PTR[SI],0
  INC SI
  LOOP BLCZ2
  POP CX
  LEA SI,STRING1
  ADD SI,2

L1:
   MOV AL,DS:[SI]
   SAHF
   ADC AL,[DI]
   AAA
   LAHF
   OR AL,30H
   MOV ES:[DI],AL
   INC SI
   INC DI
   INC DX
   LOOP L1

   
   AND AH,01H
   OR AH,30H
   MOV [DI],AH
   MOV AH,02H
   INC DX
   MOV CX,DX

L2:MOV DL,[DI]
   INT 21H
   DEC DI
   LOOP L2
   MOV AH,4CH
   INT 21H
CODE ENDS
END START 
  相关解决方案