Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 写一个程序来求两个数的和_Assembly_Emu8086 - Fatal编程技术网

Assembly 写一个程序来求两个数的和

Assembly 写一个程序来求两个数的和,assembly,emu8086,Assembly,Emu8086,嗨,我想写一个练习来求0到9之间的2个数字的和,问题是当我只能得到15个结果时,如果结果是17,它将返回到0,它将显示1 我做错了什么 #make_COM# ; COM file is loaded at CS:0100h ORG 100h ;******************************* ;* Programa: CONDIC4.ASM * ;******************************* .MODEL small .STACK 512d .

嗨,我想写一个练习来求0到9之间的2个数字的和,问题是当我只能得到15个结果时,如果结果是17,它将返回到0,它将显示1

我做错了什么

#make_COM#

; COM file is loaded at CS:0100h
ORG 100h

;*******************************
;*    Programa: CONDIC4.ASM    *
;*******************************

.MODEL small
.STACK 512d

.DATA
  msg1 DB 'Decimal 1 (0 to 9): ', 024h
  msg2 DB 0Dh, 0Ah, 'Decimal 2 (0 to 9): ', 024h
  msg3 DB 0Dh, 0Ah, 'Sum = ', 024h
  msg4 DB 0Dh, 0Ah, 'Invalid', 024h

.CODE
  LEA   DX, msg1
  CALL  write
  CALL  read
  MOV   BH, AL

  LEA   DX, msg2
  CALL  write
  CALL  read
  MOV   BL, AL

  LEA   DX, msg3 
  CALL  write
  XCHG  AX, BX

  ADD   AL, AH
  SUB   AH, AH
  AAA
  MOV   DX, AX
  MOV   AH, 0Eh
  CMP   DH, 0h
  JE    not_zero
  OR    DH, 30h
  MOV   AL, DH
  INT   010h
  not_zero:
  OR    DL, 30h
  MOV   AL, DL
  INT   010h
  INT   020h

write PROC NEAR
  MOV   AH, 09h
  INT   021h
  RET
write ENDP

read PROC NEAR
  MOV   AH, 01h
  INT   021h
  CMP   AL, 030h
  JL    erro
  CMP   AL, 03Ah
  JGE   erro
  SUB   AL, 030h  
  RET
  erro:
    LEA   DX, msg4
    CALL  write
    INT   020h
  RET
read ENDP
我用MOV(MOV-AH,0h)命令而不是SUB(SUB-AH,AH)修复了它,因为手册上说MOV不会更改任何标志

#make_COM#

; COM file is loaded at CS:0100h
ORG 100h

;*******************************
;*    Programa: CONDIC4.ASM    *
;*******************************

.MODEL small
.STACK 512d

.DATA
  msg1 DB 'Decimal 1 (0 to 9): ', 024h
  msg2 DB 0Dh, 0Ah, 'Decimal 2 (0 to 9): ', 024h
  msg3 DB 0Dh, 0Ah, 'Sum = ', 024h
  msg4 DB 0Dh, 0Ah, 'Invalid', 024h

.CODE
  LEA   DX, msg1
  CALL  write
  CALL  read
  MOV   BH, AL

  LEA   DX, msg2
  CALL  write
  CALL  read
  MOV   BL, AL

  LEA   DX, msg3 
  CALL  write
  XCHG  AX, BX

  ADD   AL, AH  
  MOV   AH, 0h     ;Clears AH WITHOUT CHANGING FLAGS
  AAA
  MOV   DX, AX
  MOV   AH, 0Eh
  CMP   DH, 0h
  JE    not_zero
  OR    DH, 30h
  MOV   AL, DH
  INT   010h
  not_zero:
  OR    DL, 30h
  MOV   AL, DL
  INT   010h
  INT   020h

write PROC NEAR
  MOV   AH, 09h
  INT   021h
  RET
write ENDP

read PROC NEAR
  MOV   AH, 01h
  INT   021h
  CMP   AL, 030h
  JL    erro
  CMP   AL, 03Ah
  JGE   erro
  SUB   AL, 030h  
  RET
  erro:
    LEA   DX, msg4
    CALL  write
    INT   020h
  RET
read ENDP

注释您的代码,特别是如果您希望其他人提供帮助。学习使用调试器,以便您可以单步执行程序并自己查找错误。我正在进行单行调试,但我无法理解运行AAA命令时遇到的错误。请描述错误以及您所看到的
AAA
的输入和输出。请参阅指令集参考以查看预期的行为。请注意“AAA指令只有在ADD之后才有用”的部分。你在中间放了一个
SUB
,这会破坏所需的标志。根据我对AAA的读取,如果我的输入为0Fh,它将存储在AH 01h AL 05h中,但如果我的输入为12h,它将存储在AH 00h和AL 02h中。为什么?哦,所以我不应该用sub啊,啊?我怎么空啊?