实验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]