|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zhenglibob 于 2012-8-26 21:42 编辑
请问一下,最后个iret指令时返回什么?请详解,想了很久了,在执行完最后的call指令中断例程中不是已经有iret返回指令了么,那最下面的指令返回的是什么呢?前面也没看见推入栈中什么啊?别笑话俺哈,俺不懂就问
assume cs:code
data segment
db 36 dup(0)
data ends
code segment
start: pushf
pushf
pop ax
and ah,11111100b
push ax
popf
mov ax,data
mov ds,ax
mov si,0
mov ax,0
mov es,ax
push es:[4*9+2] ;将原中断例程的cs推入栈中
push es:[4*9] ;将原中断例程的ip推入栈中
pop ds:[0] ;将原中断例程的cs,ip依次放入内存中
pop ds:[2]
mov es:[4*9+2],cs
mov es:[4*9],offset change
popf
mov ax,0b800h
mov es,ax
mov di,12*160+72
mov al,'a' ;al存放要显示的ASCII码
mov cl,2 ;cl存放字符的颜色
char: mov byte ptr es:[di],al
mov byte ptr es:[di+1],cl
inc al
call circle
cmp al,'z'
jna short char
mov ax,0
mov es,ax
push ds:[0]
pop es:[4*9]
push ds:[2]
pop ds:[2]
mov ax,4c00h
int 21h
circle:push ax ;循环次数,延缓字符更换时间
push dx
mov dx,1500h
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中断例程的程序---------
change:push ax
push ds
push es
in al,60h
pushf
pushf ;
pop bx
and bh,11111100b
push bx
popf ;从上个注释号到这里可省略
call dword ptr ds:[0]
cmp al,1
jne short home
mov ax,0b800h
mov es,ax
inc cl ;颜色属性加1更改属性
home: pop es
pop ds
pop ax
iret ;就是这个iret指令
code ends
end start
|
|