zoukankan      html  css  js  c++  java
  • int指令理解

    以下是王爽老师的《汇编语言》中第十五章中的一段程序代码,其功能是增加9号中断的功能,当按下Esc键时屏幕中显示的字母改变颜色

    assume cs:codesg,ss:stack,ds:data

    data segment

    dw 0,0 

    data ends

    stack segment

    db 128 dup(0)

    stack ends

    codesg segment

    start:

    mov ax,data

    mov ds,ax

    mov ax,stack

    mov ss,ax

    mov sp,128

    mov ax,0

    mov es,ax

    push es:[9*4]

    pop ds:[0]

    push es:[9*4 + 2]

    pop ds:[2]

    mov word ptr es:[9*4],offset int9

    mov word ptr es:[9*4 + 2],cs

    mov ax,0b800h

    mov es,ax

    mov ah,11000001b

    mov dl,'a'

    s:

    mov byte ptr es:[160*12+40*2],dl

    call delay

    inc dl

    cmp dl,'z'

    jna s

    mov ax,0

    mov es,ax

    push ds:[0]

    pop es:[9*4]

    push ds:[2]

    pop es:[9*4+2]

            mov ax,4c00h

            int 21h

    delay:

    push ax

    push dx

    mov ax,0

    mov dx,2000h

    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

    pop bx

    and bh,11111100b

    push bx

    popf

    call dword ptr ds:[0]

     

    cmp al,1

    jne int9ret

    mov ax,0b800h

    mov es,ax

    inc  byte ptr es:[160*12+40*2+1]

    int9ret:

    pop es

    pop bx

    pop ax

    iret

    codesg ends

    end start

    1.其中红色代码处最后出有条iret指令,而代码中并没有pushf,push ip,push cs指令,难道代码错了,可是编译执行后,程序并没有错

    那么代码是正确的。

    看下程序框架,红色代码段是改写的BIOS中的9号中断,9号中断执行的过程是,当键盘被敲击是,处理键盘的芯片就产生键盘扫描码,扫描码被送入60h端口,引发9号中断,cpu执行int 9中断例程处理键盘输入。

    所以程序实际是先执行了int 9指令,再从标号int9:出执行,也就是与int 9与iret成对配套了。

    int中断执行过程如下

    1)取中断类型码n

    2)pushf,IF=0,TF=0

    3)push IP,push CS

    4)(IP)=(n*4),(CS)=(n*4+2)

    2.也就很容易理解

    pushf

    pushf

    pop bx

    and bh,11111100b

    push bx

    popf

    call dword ptr ds:[0]

    与BIOS中的int 9号中断例程中的iret配套了 

  • 相关阅读:
    JDK8的JVM内存模型小结
    揭开Service Mesh的神秘面纱
    通过Shell脚本读取properties文件中的参数时遇到 换行符的问题
    NodeJs+Express实现简单的Web增删改查
    SpringBoot之Thymeleaf模板引擎
    面向对象(下)
    内部类
    线程学习oneday
    Python-使用tkinter实现的Django服务进程管理工具
    Python-使用百度文字识别API实现的文字识别工具
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3764408.html
Copyright © 2011-2022 走看看