鱼C论坛

 找回密码
 立即注册
查看: 2803|回复: 8

第15张外中断 显示有颜色的a到z 求解

[复制链接]
发表于 2015-7-11 20:24:35 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 Ъγ:_小ツ雨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:[9*4]
        pop ds:[0]
        push es:[9*4+2]
        pop ds:[2]                ;将原来的int 9中断例程的入口地址保存在ds:0、ds:2单元中

        mov word ptr es:[9*4],offset int9
        mov es:[9*4+2],cs        ;在中断向量表中设置新的int 9中断例程的入口地址

        mov ax,0b800h
        mov es,ax
        mov ah,'a'
s:        
        mov  es:[160*12+40*2],ah
        call delay
        inc ah
        cmp ah,'z'
        jna s
        mov ax,0
        mov es,ax

        push ds:[0]
        pop es:[9*4]
        push ds;[2]
        pop es;[9*4+2]           ;将中断向量表中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:[0]         ;对int指令进行模拟,调用原来的int 9中断例程

        cmp al,1
        jne int9ret

        mov ax,0b800h
        mov es,ax
        inc byte ptr es:[160*12+40*2+1]  ;属性增加1,改变颜色

int9ret:
        pop es
        pop bx
        pop ax
        iret

code ends

end start


代码我都理解, debug‘ 不能调试 我也知道原因
求执行过程 比如字符a 按这个程序从上到下执行直接就显示出来了根本没 经过  下面的 中断求解   还有 最后的 iret是pop  哪里的cs和ip   

最佳答案

查看完整内容

楼主这么想一下 既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢 肯定是调用int指令时候的这一地址的cs和ip 好返回当前调用int指令的位置 举个例子 0x1000 -> mov ax, 4c00h 0x1003 -> int 21h 类似于这种手动调用中断, 当int调用的时候肯定是去中断向量表里找中断过程函数 等结束的时候 返回的是1003的位置 即哪里调用的中断 这个int9我觉得有点类似于回调函数 时刻带等待着系统去 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-11 20:24:36 | 显示全部楼层
本帖最后由 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指令 记录下当前时刻的位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-11 21:56:02 From FishC Mobile | 显示全部楼层
几经懂了,懂的不明不白的、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-13 19:46:17 From FishC Mobile | 显示全部楼层
ryxcaixia 发表于 2015-7-12 08:09
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...

自己举了例子,越想越晕,记的用int了  后面就要有iret好了,谢谢你详细的解答;)   手机登陆的,等电脑登陆了在设置最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-13 19:49:31 From FishC Mobile | 显示全部楼层
ryxcaixia 发表于 2015-7-12 08:09
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...

执行int指令的步骤中要Push ip push  cs.  Irer 等于回去了,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-15 22:37:11 | 显示全部楼层
ryxcaixia 发表于 2015-7-11 20:24
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...

查看全部内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-24 11:58:18 | 显示全部楼层
看看
~~~~~~~~~~~~~~~~~~~~·····:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-20 00:20:09 | 显示全部楼层
ryxcaixia 发表于 2015-7-11 20:24
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...

有两个疑问
第一:新的int9中断例程里78行f寄存器两次入栈在ax,bx,es后面入栈,然后在后面iret出栈时又是在后面,栈里面不就乱了么。
第二:第87行,端口里的数等于1的时候,不跳转,直接执行完后面的改颜色程序后不是没有返回么
头都要炸啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-20 11:48:04 | 显示全部楼层
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键不返回也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 16:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表