assume cs:code,ds:data,ss:stack
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16 ;set about segment
mov ax,0
mov es,ax
mov ax,word ptr es:[36]
mov ds:[0],ax
mov ax,word ptr es:[38]
mov ds:[2],ax ;save interrupted address
mov word ptr es:[36],offset key_dispose
mov word ptr es:[38],cs ;exchenge interrupted address
mov ax,0b800h
mov es,ax
mov al,'a'
flag:
mov byte ptr es:[7D0h],al
inc al
call sub_empty
cmp al,'z'
je flag
jb flag ;echo a char
mov ax,0
mov es,ax
push ds:[0]
pop es:[36]
push ds:[2]
pop es:[38] ;recover interrupted address
mov ax,4c00h
int 21h ;program return
key_dispose:
push ax
push bx
push es ;save segment
in al,60h ;rede key_virtual
pushf
pushf
pop bx
and bh,11111100b
push bx
popf
call dword ptr ds:[0] ;imitate iret
cmp al,1 ;if esc pressdown
jne exit
mov ax,0b800h
mov es,ax
inc byte ptr es:[7d1h]
exit:
pop es
pop bx
pop ax
iret
sub_empty: ;empty loop
push ax
push cx
pushf
mov ax,9000h
outer:
dec ax
mov cx,0FFFh
core:
nop
nop
loop core
cmp ax,0
ja outer
popf
pop cx
pop ax
ret
code ends
stack segment
dw 8 dup(0)
stack ends
data segment
db 'this is a empty!'
data ends
end start
汇编学习历程(按键中断劫持)
最新推荐文章于 2021-05-13 23:50:01 发布