烽火连城 发表于 2012-9-3 21:23:55

试验十五


[*]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:         ;   IP
[*]            pop es:
[*]            push es:         ;   CS
[*]            pop es:
[*]            
[*]            ;   set ni9 as int9
[*]            cli
[*]            mov word ptr es:,204H
[*]            mov word ptr es:,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:
[*]            
[*]            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:,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行继续执行 不是死循环吗顺便问下这个程序是不是只有在实模式下才可以运行

静雨纷纷 发表于 2012-9-3 22:11:18

中断产生的时候第一步是保护现场··就是把 flag入栈·cs,ip入栈···
···那个46 pushf                  
   47 call dword ptr es:
   我感觉就是再模仿原来int 9 这条指令的功能··
原来的int9中断的程序里面应该就包含popf和iret····

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

···我是这么想的··呵呵···

·

烽火连城 发表于 2012-9-3 22:15:39

嗯 后来想了半天 和你说的差不多 最后的IRET是对应 INT9中断的 不是47行的CALL 哥们谢谢你啦

静雨纷纷 发表于 2012-9-3 22:23:01

烽火连城 发表于 2012-9-3 22:15 static/image/common/back.gif
嗯 后来想了半天 和你说的差不多 最后的IRET是对应 INT9中断的 不是47行的CALL 哥们谢谢你啦

呵呵···木有事····
页: [1]
查看完整版本: 试验十五