casanava 发表于 2017-5-21 11:36:54

第十五章外中断的例子

int9:
    push ax
        push bx
        push es
       
        in al,60h
       
        pushf      
        pushf      
两次压栈的究竟是什么标志寄存器?

人造人 发表于 2017-5-21 11:43:56

不清楚你想问什么
标志寄存器只有一个呀

casanava 发表于 2017-5-24 20:47:10

是啊,你看071讲的内容

casanava 发表于 2017-5-24 20:48:55

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: mov es:,ah
           call delay
           inc ah
           cmp ah,'z'
           jna s
           mov ax,0
           mov es,ax
          
           push ds:
           pop es:
           push ds:   
           pop es:       ;将中断向量表中INT9的程序入口恢复成原来的地址
                     
           mov ax,4c00h
           int 21h
          
delay: push ax
       push dx
           mov dx,3
           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
          
int9:
    push ax
        push bx
        push es
       
        in al,60h
       
        pushf       ;模拟
        pushf      ;一条指令只完成8位?为还原真实的中断用到的
        pop bx
        and bh,11111100b
        push bx
        popf
        call dword ptr ds:;对INT9模拟,调用原来的INT9
       
        cmp al,1    ;1就是ESC键盘扫描码
        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

人造人 发表于 2017-5-25 10:38:05

casanava 发表于 2017-5-24 20:48
assume cs:code

stack segment


别忘了
call dword ptr ds:;对INT9模拟,调用原来的INT9

ds: 这个地址的指令序列最后是用 iret 返回的

casanava 发表于 2017-5-31 16:32:17

"ds: 这个地址的指令序列最后是用 iret 返回的",
哦,我再想一想
页: [1]
查看完整版本: 第十五章外中断的例子