我今天开始使用Assembly(i386),我正在尝试输出2位数的字符。我在一些研究之后找到的方法是将我的数字除以10d得到余数和商,然后用函数02h中断21h来分别输出2位数。
我的问题是,使用下面的代码我期望53作为输出,但我有55.看起来存储在AL寄存器中的值被修改(我尝试使用变量来存储商和余数和在这种情况下输出是正确的)。我想了解为什么我的代码没有预期的输出。
我做错了吗?有人可以详细解释我吗?此外,关于性能,你能否证实我最好使用寄存器而不是将商和余数存储在变量中。
.386
code segment use16
assume cs:code, ds:code, ss:code
org 100h ;offset décalés de 100h=256
label1:
;Division to get quotient and remainder
MOV AX, 35d
DIV divisor
;If the divider is a byte then
;the quotient will be stored on the AL register
;and the residue on AH
ADD AH, 30h
ADD AL, 30h
;Displays first caracter (from the right of the string)
MOV DL, AH
MOV AH, 02h
INT 21h
;Displays second character (from the right of the string)
MOV DL, AL
MOV AH, 02h
INT 21h
RET
divisor db 10d
code ends
end label1
答案 0 :(得分:1)
是的,如果我没记错的话,INT 21h和任何中断都是允许的,并且确实可能会覆盖任何寄存器AX,CX和DX。
最简单的解决方法可能是
PUSH AX
;Displays first caracter (from the right of the string)
MOV DL, AH
MOV AH, 02h
INT 21h
POP AX
;Displays second character (from the right of the string)
MOV DL, AL
MOV AH, 02h
INT 21h