以下是王爽老师的《汇编语言》中第十五章中的一段程序代码,其功能是增加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配套了

int指令理解的更多相关文章

  1. int指令

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  2. 汇编学习笔记(11)int指令和端口

    格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...

  3. [汇编学习笔记][第十三章int指令]

    第十三章int指令 13.1 int指令 格式: int n, n 为中断类型码 可以用int指令调用任何一个中断的中断处理程序(简称中断例程). 13.4 BIOS和DOS 所提供的中断例程 BIO ...

  4. int指令(软件中断指令)

    INT(软件中断指令)是CALL指令的一种特殊形式.call指令调用调用的子程序是用户程序的一部分,而INT指令调用的操作系统提供的子程序或者其他特殊的子程序. 中断服务子程序和标准过程的最大区别是 ...

  5. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  6. 关于int指令

    1.关于int指令 格式:int n     n为中断类型码: 作用:     调用n号中断程序:   指令“int n”的执行过程:     1]获取中断类型码n     2]标志寄存器入栈,IF. ...

  7. Java Integer 与 int 深刻理解

    今天在做Object 自动转为Integer 类型之后的判断,遇到一个不理解的点,当数值超过127之后,两个数值相同的Object 对象用 == 判断的结果是false. Object a = 128 ...

  8. VS2013中反汇编常用指令理解

    最近复习C语言,对反汇编感兴趣,就用下图举例解释一下我的理解,如有错还请大佬指教. 首先,认识两个常用指令 :   lea ---> 取地址赋值      mov ---> (同类型)赋值 ...

  9. 深入汇编指令理解Java关键字volatile

    volatile是什么 volatile关键字是Java提供的一种轻量级同步机制.它能够保证可见性和有序性,但是不能保证原子性 可见性 对于volatile的可见性,先看看这段代码的执行 flag默认 ...

随机推荐

  1. 免费的在线Web文件管理器:Net2FTP,Pydio,eXtplorer,KodExplorer–功能强大

    https://www.freehao123.com/web-ftp/ 经常有朋友在使用一些没有带文件管理器的空间时,苦于没有办法来解压上传的文件压缩包,而如果不先上传压缩包,直接上传文件夹的话耗费的 ...

  2. sql标准化的后缀

    今天在SQL编码风格中看到的sql编码标准

  3. 第零篇、HTML5简介

    1.什么是HTML5? 背景:互联网的快速兴起 1>网页5.0版本 2>2014年才定制HTML5标准 3>移动先行 2.为什么要使用HTML5? 1>跨平台(可以运行所有的浏 ...

  4. 解决div布局中第一个div的margin-top在浏览器中显示无效果问题。

    原味来源:http://www.hicss.net/do-not-tell-me-you-understand-margin/ 垂直外边距合并问题 别被上面这个名词给吓倒了,简单地说,外边距合并指的是 ...

  5. [转]JavaScript去重的6种方法

    Array.prototype.unique1 = function() { var n = []; for(var i = 0; i < this.length; i++) { if (n.i ...

  6. linux 判断指定用户对指定目录具有的权限

    脚本名:power.sh 脚本内容: ------------------------------------------- 注意:必须以root 身份执行该脚本. 脚本power.sh 需要两个参数 ...

  7. Finding a needle in Haystack: Facebook’s photo storage

    http://www.importnew.com/3292.html 面向对象存储系统

  8. Linux下的ntp时钟同步问题

    前段时间,项目中有个需求,需要将linux和windows的时间进行同步,网上也有很多类似时钟同步的帖子,大致类似:不过本次的linux的机器有点特殊,没有service命令,而且要求在另一台suse ...

  9. sql 修改字段小记

    增加字段默认值: alter table 表名 ADD 字段 类型 NULL Default 0 修改字段类型: alter table 表名 alter column UnitPrice decim ...

  10. PHP权限分配思路

    常见四种方式1.用户+组+角色+权限2.用户+组+权限3.用户+角色+权限(最多用)4.用户+权限以第三种为例:权限:用户操作的具体事件:如curd角色:指一类用户拥有的权限,如超级管理员,管理员,普 ...