第15张外中断 显示有颜色的a到z 求解
本帖最后由 Ъγ:_小ツ雨oο 于 2015-7-11 20:27 编辑;编程:在屏幕中间依次显示“a”~“z”,并可以让人看清。在显示的过程中,按下'Esc'键后,改变显示的颜色。
;完整功能代码:
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:
pop ds:
push es:
pop ds: ;将原来的int 9中断例程的入口地址保存在ds:0、ds:2单元中
mov word ptr es:,offset int9
mov es:,cs ;在中断向量表中设置新的int 9中断例程的入口地址
mov ax,0b800h
mov es,ax
mov ah,'a'
s:
moves:,ah
call delay
inc ah
cmp ah,'z'
jna s
mov ax,0
mov es,ax
push ds:
pop es:
push ds;
pop es; ;将中断向量表中int 9中断例程的入口恢复为原来的地址
mov ax,4c00h
int 21h
delay:
push ax
push dx
mov dx,2000h
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
;------以下为新的int 9中断例程--------------------
int9:
push ax
push bx
push es
in al,60h
pushf
pushf
pop bx
and bh,11111100b
push bx
popf
call dword ptr ds: ;对int指令进行模拟,调用原来的int 9中断例程
cmp al,1
jne int9ret
mov ax,0b800h
mov es,ax
inc byte ptr es:;属性增加1,改变颜色
int9ret:
pop es
pop bx
pop ax
iret
code ends
end start
代码我都理解, debug‘ 不能调试 我也知道原因
求执行过程 比如字符a 按这个程序从上到下执行直接就显示出来了根本没 经过下面的 中断求解 还有 最后的 iret是pop哪里的cs和ip 本帖最后由 ryxcaixia 于 2015-7-12 16:29 编辑
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯定是调用int指令时候的这一地址的cs和ip 好返回当前调用int指令的位置
举个例子
0x1000 -> mov ax, 4c00h
0x1003 -> int 21h
类似于这种手动调用中断, 当int调用的时候肯定是去中断向量表里找中断过程函数
等结束的时候 返回的是1003的位置 即哪里调用的中断
这个int9我觉得有点类似于回调函数 时刻带等待着系统去调用 而不是用户去手动调用
对于这种int9 也就是楼主你问的 最后的iret是pop的哪里的cs 和ip
这个 iret pop了哪里的cs和 ip取决于楼主 你按esc(或者其他按键)触发int9指令的前刹那 cpu执行到哪里了
相当于 cpu在无线循环中 直到你按下了esc 触发了int9指令 记录下当前时刻的位置 几经懂了,懂的不明不白的、 ryxcaixia 发表于 2015-7-12 08:09
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...
自己举了例子,越想越晕,记的用int了后面就要有iret好了,谢谢你详细的解答;) 手机登陆的,等电脑登陆了在设置最佳 ryxcaixia 发表于 2015-7-12 08:09
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...
执行int指令的步骤中要Push ip pushcs.Irer 等于回去了,,, ryxcaixia 发表于 2015-7-11 20:24
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...
查看全部内容 看看
~~~~~~~~~~~~~~~~~~~~·····:lol: ryxcaixia 发表于 2015-7-11 20:24
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...
有两个疑问
第一:新的int9中断例程里78行f寄存器两次入栈在ax,bx,es后面入栈,然后在后面iret出栈时又是在后面,栈里面不就乱了么。
第二:第87行,端口里的数等于1的时候,不跳转,直接执行完后面的改颜色程序后不是没有返回么
头都要炸啦! ryxcaixia 发表于 2015-7-11 20:24
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...
第一个疑问我弄清楚了,从78行到84行是模拟int,f寄存器,csip入栈后,开始执行ds:【0】处原本的int9程序,原本的int9程序里面已经写好了iret。唉,不懂的时候还是要多看几遍书!
然后第二个疑问,我还是不太明白,为什么不返回,我自己在91行后面加pop es ....iret,也是可以执行的,不知道是不是这个程序按ESc键不返回也可以
页:
[1]