+ -
当前位置:首页 → 问答吧 → 一个诡异的问题

一个诡异的问题

时间:2011-09-23

来源:互联网

先贴上代码

;用二进制形式显示所按键的ASC2码
cseg segment
assume cs:cseg
start:
next:
xor ax,ax
mov ah,1
int 21h
call newline
mov bl,al

mov cx,8
tobin:
shl bl,1
mov dl,30h
adc dl,0
mov ah,2
int 21h
loop tobin

call newline
cmp al,"$"
jnz next

mov ah,2
int 21h
mov ah,4ch
int 21h

newline proc
push ax
push dx
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
pop dx
pop ax
ret
newline endp
cseg ends
end start

上述实现的功能是循环的输入一个字符,会显示它的asc码,本意是输入“$”时便不再循环。。但是这个程序却终止不了,输入 $ 后还是会继续循环  
我调试的时候发现
  shl bl,1
mov dl,30h
adc dl,0
mov ah,2
int 21h
这段代码调用21h中断后会把 al设置为30h 
但是21h中断的2号功能描述为下:

功能02H
功能描述:向标准输出设备(如:屏幕)输出一个字符。该输出还可被重定向,如果这样做,
则将无法判断磁盘是否满
入口参数:AH=02H
DL=待输出字符的ASCII 码
出口参数:无

从描述来看不会改变al的值,但是却改变了,为什么? 请各位高手赐教

作者: nimisolo   发布时间: 2011-09-23

我想是因为它内部操作的时候没有把AL还原所以,你就能看到那个了

作者: WJN92   发布时间: 2011-09-23

引用 1 楼 wjn92 的回复:

我想是因为它内部操作的时候没有把AL还原所以,你就能看到那个了


但是为什么中断说明上面却没有说明呢?
我和朋友做了个简单的测试,发现2号功能会把dl的值赋给al  
求原因。

作者: nimisolo   发布时间: 2011-09-23