烽火连城 发表于 2012-9-3 21:13:36

实验15


[*]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行继续执行 不是死循环吗


页: [1]
查看完整版本: 实验15