装配386:使用具有功能02h的中断21h时出现意外输出

时间:2011-02-19 00:20:41

标签: assembly x86

我今天开始使用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

1 个答案:

答案 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