鱼C论坛

 找回密码
 立即注册
查看: 1828|回复: 3

试验十五

[复制链接]
发表于 2012-9-3 21:23:55 | 显示全部楼层 |阅读模式
10鱼币
  • assume cs:code  
  •   
  • stack segment  
  •     db 128 dup(0)  
  • stack ends  
  •   
  • code segment  
  • start:      mov ax,stack            ;   init stack  
  •             mov ss,ax  
  •             mov sp,128  
  •               
  •             push cs                 ;   mov NI9 to 0:204  
  •             pop ds  
  •             mov si,offset ni9         
  •             mov ax,0                  
  •             mov es,ax  
  •             mov di,204H  
  •             mov cx,offset ni9e - offset ni9  
  •             cld  
  •             rep movsb  
  •               
  •             ;   save BIOS origin int9  
  •             push es:[9*4]           ;   IP  
  •             pop es:[200H]  
  •             push es:[9*4+2]         ;   CS  
  •             pop es:[202H]  
  •               
  •             ;   set ni9 as int9  
  •             cli  
  •             mov word ptr es:[9*4],204H  
  •             mov word ptr es:[9*4+2],0  
  •             sti  
  •               
  •             mov ax,4c00H  
  •             int 21H  
  •               
  • ni9:        push ax  
  •             push es  
  •             push bx  
  •             push cx  
  •               
  •               
  •             mov bx,0  
  •             mov es,bx  
  •               
  •             pushf                   ;   call BIOS origin int9  
  •             call dword ptr es:[200H]  
  •               
  •             in al,60H               ;   get keyboard input from port 60H  
  •             cmp al,9EH              ;   cmp with "A" UP  
  •             jne ni9r  
  •               
  •             ;   change screen color  
  •             mov bx,0b800H  
  •             mov es,bx  
  •             mov bx,0  
  •             mov cx,2000             ;   2000 chars per page  
  • lp:         mov byte ptr es:[bx],41H  
  •             add bx,2  
  •             loop lp  
  •               
  • ni9r:       pop cx  
  •             pop bx  
  •             pop es  
  •             pop ax  
  •             iret  
  • ni9e:       nop           
  •               
  • code ends  
  •   
  • end start  


ni9中是先PUSH AX BX ES AX的 后PUSHF 和CALL时 吧CS IP入栈的  后进先出那应该是先IRET 吧后进的CS IP PUSHF 出栈 为什么 ni9r 中先POP CX 后才IRET 不应该是先IRET  还有IRET中的 CS IP 不是指向CALL 下一行的代码的吗 那不是又要跳到 48行继续执行 不是死循环吗  顺便问下这个程序是不是只有在实模式下才可以运行

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-3 22:11:18 | 显示全部楼层
中断产生的时候第一步是保护现场··就是把 flag入栈·cs,ip入栈···
···那个46 pushf                  
     47 call dword ptr es:[200H]  
     我感觉就是再模仿原来int 9 这条指令的功能··
原来的int9中断的程序里面应该就包含popf和iret····

你说的那个iret 好像是 返回到  发生新的“int 9“ 的时候的  下一条指令··

···我是这么想的··呵呵···
  
·
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-3 22:15:39 | 显示全部楼层
嗯 后来想了半天 和你说的差不多 最后的IRET是对应 INT9中断的 不是47行的CALL 哥们谢谢你啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-9-3 22:23:01 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 12:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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