标签:例程 mov pop int esc push ax ds es
第一点要注意的是原int 9例程用 iret 语句返回,从栈里弹出三个数据。我们用call 语句调用int 9 例程,需要也入栈一个寄存器值 pushf,保持对应。
修改中断向量表时,用 cli 和 sti 语句禁用中断,和恢复中断。防止程序出错。
assume cs:code,ds:data,ss:stack
stack segment
db 128 dup (0)
stack ends
data segment
db 4 dup (0)
data ends
code segment
main:
mov ax,stack
mov ss,ax
mov sp,128;设置栈段
mov ax,data
mov ds,ax;设置数据段,保存原int9中断例程入口地址
mov ax,0
mov es,ax
cli
mov ax,es:[9 * 4];IP
mov ds:[0],ax
mov ax,es:[9 * 4 + 2];CS,保存原int9入口
mov ds:[2],ax
sti
mov word ptr es:[9 * 4],offset int9
mov word ptr es:[9 * 4 + 2],cs;int9 指向新段
mov ax,0b800h
mov es,ax
mov ah,'a'
show:
mov es:[160 * 12 + 40 * 2],ah
call delay
inc ah
cmp ah,'z'
jna show
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,10h
mov ax,0
godelay:
sub ax,1
sbb dx,0
cmp ax,0
jne godelay
cmp dx,0
jne godelay
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];以call调用,int9以iret返回
cmp al,1
jne int9ret
mov ax,0b800h
mov es,ax
inc byte ptr es:[160 * 12 + 2 * 40 + 1]
int9ret:
pop es
pop bx
pop ax
iret;重点,以iret返回中断掉用
code ends
end main
测试效果如下:
谢谢阅读
标签:例程,mov,pop,int,esc,push,ax,ds,es 来源: https://blog.csdn.net/zhangzhangkeji/article/details/121496351
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。