汇编学习历程(按键中断劫持)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值