Ъγ:_小ツ雨oο 发表于 2015-7-11 20:24:35

第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-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指令 记录下当前时刻的位置

Ъγ:_小ツ雨oο 发表于 2015-7-11 21:56:02

几经懂了,懂的不明不白的、

Ъγ:_小ツ雨oο 发表于 2015-7-13 19:46:17

ryxcaixia 发表于 2015-7-12 08:09
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...

自己举了例子,越想越晕,记的用int了后面就要有iret好了,谢谢你详细的解答;)   手机登陆的,等电脑登陆了在设置最佳

Ъγ:_小ツ雨oο 发表于 2015-7-13 19:49:31

ryxcaixia 发表于 2015-7-12 08:09
楼主这么想一下
既然是模拟int指令 那么正常的int指令结束的最后一条指令的iret是是pop哪里的cs和ip呢
肯 ...

执行int指令的步骤中要Push ip pushcs.Irer 等于回去了,,,

秋天不回来2 发表于 2015-7-15 22:37:11

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

查看全部内容

lwmheaton 发表于 2015-7-24 11:58:18

看看
~~~~~~~~~~~~~~~~~~~~·····:lol:

Maru 发表于 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的时候,不跳转,直接执行完后面的改颜色程序后不是没有返回么
头都要炸啦!

Maru 发表于 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键不返回也可以
页: [1]
查看完整版本: 第15张外中断 显示有颜色的a到z 求解