1、程序可以精简为
pushf
call dword ptr ds:[0]
2、
程序有两处设置int9中断例程的段地址和偏移地址,分别是在将int9中断例程设置为自己编写的中断例程和程序最后恢复原来的int9中断例程。为了防止在设置段地址和偏移地址指令间时发生键盘输入,产生错误,需要在设置前将IF标志位清0,设置完成后设为1就可以了。
程序改写如下:
assume cs:code
stack segment
db 128 dup (0)
stack ends
data segment
dw 0,0
data ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
mov ax,data
mov ds,ax
mov ax,0
mov es,ax
push es:[9*4]
pop ds:[0]
push es:[9*4+2]
pop ds:[2]
cli ;需要屏蔽掉键盘中断
mov word ptr es:[9*4],offset int9
mov es:[9*4+2],cs
sti
mov ax,0b800h
mov es,ax
mov ah,'a'
s:
mov es:[160*12+40*2],ah
call delay
inc ah
cmp ah,'z'
jna s
mov ax,0
mov es,ax
cli ;需要屏蔽掉键盘中断
push ds:[0]
pop es:[9*4]
push ds:[2]
pop es:[9*4+2]
sti
mov ax,4c00h
int 21h
delay:
push ax
push dx
mov dx,1000h
mov ax,0
s1:
sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
int9:
push ax
push bx
push es
in al,60h
pushf
pushf
pop bx
and bh,11111100b
push bx
popf
call dword ptr ds:[0]
cmp al,1
jne int9ret
mov ax,0b800h
mov es,ax
inc byte ptr es:[160*12+40*2+1]
int9ret:
pop es
pop bx
pop ax
iret
code ends
end start
- [starrynight] 注:我只注意到了结果为90H,此时最高位为1,但是忘了结果是整个ax寄存器,而不仅仅是al。所以最后 04/24 22:31
- [游客] Dei ho <a href='http://无效链接' >nelle inmobiliarias 02/26 08:34
- [游客] Questi http://无效链接/friuli-venezia-giulia-incontro 02/26 05:44
- [游客] Abbiamo http://无效链接 centro tre <a href='http://无效链 02/26 00:56
- [游客] Da http://无效链接 stesso altri <a href='http://无效链接' 02/25 08:32
- [游客] Sarebbe meno <a href='http://无效链接' >pop rock degli 02/21 01:18
- [游客] 学习了,比较写得好! 01/13 10:42
- [mouse] 博主没有自己debug看吧,结果不对 01/12 08:49
- [lijangwei] 我也是这样想的 12/12 20:28
- [游客] 在 Bochs x86 Emulator 2.1.1 环境事了一下 看起来挺精致,要是设置时间 11/20 17:16