当前位置: 首页 > news >正文

汇编语言[王爽]-13 int指令【中断实现loop、jmp】

int指令

格式:int n :n是中断向量码,引发一个中断

作用:等价于下面的代码【中断流程】

1. 取中断向量码N
2. pushf
3. IF=0,TF=0
4. push CS , push IP
5. (IP)=(N*4) ; (CS)=(N*4+2)

iret指令

格式: iret 从中断例程中返回

作用:等价于下面的代码

pop IP
pop CS
popf
call 调用子程序 push cs; push ip; jmp
ret 子程序返回 pop ip ; pop cs
int 调用中断例程 pushf ; push cs ; push ip ; jmp
iret 中断例程返回 pop ip ; pop cs ; popf

Untitled

编写可供应用程序调用的中断例程

Untitled

我们要完成三步工作:

  1. 编写实现求平方功能的程序
  2. 安装程序,将其安装在0:200处
  3. 设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程
assume cs:code
code segment
start:mov ax,csmov ds,axmov si,offset sqrmov ax,0mov es,axmov di,200hmov cx,offset sqrend-offset sqrcld rep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hsqr: mul axiret
sqr:nopcode ends
end start

对int、iret和栈的深入理解:中断实现loop、jmp

loop的流程

  1. 查看cx,为0则继续执行
  2. 不为0,则跳转

对于cx条件跳转,可以用 jcxz ,如果不跳转则不干预,跳转则需要ip的相对于目标地址的偏移,这需要参数提供

;中断例程
lp:push bpmov bp,spdec cxjcxz lpretadd [bp+2],bx
lpret:pop bpiret
  • 为什么需要使用bp,因为sp寄存器不能作为索引,只有bx,si,di,bp可以,我们之前说过,bp一般用于栈的寻址,就是用在这里
  • 为什么是bp+2

push bp后的栈结构

push bp后的栈结构

检测点13,1

Untitled

;应用举例
assume cs:code
data segment db 'conversation',0
data endscode segment
start:mov ax,datamov ds,axmov si,0mov ax,0b800hmov es,axmov di,12*160s:cmp byte ptr [bx], 0je okmov al,[si]mov byte ptr es:[di],alinc siadd di,2mov bx,offset s-offset okint 7ch
ok:mov ax,4c00hint 21hcode ends
end start
;编写的7ch中断例程
jmnp:push bpmov bp,spadd [bp+2],bxpop bpiret

BIOS和DOS所提供的中断例程

前面的课程汇总,我们都是自己编写中断例程,将他们放到安装程序中,然后运行安装程序,才把他们安装到指定的内存区中,并登记中断向量表。

而BIOS和DOS提供的中断例程是如何安装到内存中的呢?

Untitled

Untitled

(1). 错误。此处的程序是固化在ROM中的,可读不可写。

(2). 错误。int 19h执行前,os(此处指DOS)还没有开始引导。

BIOS中断例程应用

举个例子体会一下

int 10h 中断例程,由BIOS提供,包含了 多个 和屏幕相关的子程序。

一般来说,一个供程序员调用的中断例程往往包含多个子程序,中断例程内部通过传入的参数来判断执行的是哪个子程序。

BIOS和DOS提供的中断例程,都用 ah来传递内部子程序的编号

[关于显存的相关知识]

mov ah,2 ;置光标
mov bh,0 ;第0页
mov dh,5 ;dh中放行号
mov dl,12;dl中放列号
int 10h
  • (ah)=2 表示调用第10h号中断的2号子程序,功能为设置光标。提供三个参数
  • (bh)=0,(dh)=5,(dl)=12,设置光标到第0页,第5行,第12列
mov ah,9   ;在光标的位置显示字符
mov al,'a' ;字符
mov bl,7   ;颜色属性(0000 0111)黑底白字
mov bh,0   ;第0页
mov cx,3   ;字符重复次数
int 10h

Untitled

编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的’a’

assume cs:codecode segment
start:mov ah,2mov bh,0mov dh,5mov dl,12int 10hmov ah,9mov al,'a'mov bl,11001010bmov bh,0mov cx,1int 10hmov ax,4c00hint 21hcode ends
end start

Untitled

;在光标的位置显示字符串,字符串地址为ds:dx,以"$"结尾
mov ax,data
mov ds,ax
mov dx,0
mov ah,9
int 21h

编程:用DOS中断例程在平面5行12列显示字符串”Welcome to masm!”

assume cs:code
data segmentdb 'Welcome to masm!','$'
data endscode segment
start:mov ah,2mov bh,0mov dh,5mov dl,12int 10hmov ax,datamov ds,axmov dx,0mov ah,9int 21hmov ax,4c00hint 21hcode ends
end start
http://www.wxhsa.cn/company.asp?id=4759

相关文章:

  • Supabase云同步架构:Flutter应用的数据同步策略
  • 汇编语言[王爽]-12 内中断
  • 【SPIE出版】第五届先进制造技术与电子信息国际学术会议(AMTEI 2025)
  • 2025.9.15 考试总结
  • 汇编语言[王爽]-01 基础知识
  • 贪心外套计数
  • 汇编语言[王爽]-02 寄存器
  • 汇编语言[王爽]-03 寄存器(内存访问)
  • 汇编语言[王爽]-05 [BX]和loop指令
  • 完整教程:YOLO数据集格式转换工具v1.0-微智启软件工作室
  • 2.docker 安装
  • 树形DP2F
  • 搞定SPI开发:硬件设计精讲与CH390H示例应用
  • Qt-摄像头捕获画面
  • 我开发的软件和开源/免费软件
  • PostgreSQL中级认证,PG证书官网查询
  • LLaMA-Adapter - 详解
  • 查看安装软件版本的命令
  • ubuntu 20.04安装mysql 5.7
  • 企业微信逆向开发协议,ipad协议调用方式
  • OpenStack Nova Scheduler 计算节点选择机制
  • 记一种很新的 bitset
  • 基于yolo12进行深度学习的机动车车牌检测
  • 有向图强连通分量
  • Kafka 消费者元数据topicId变化问题
  • 【SPIE出版】第五届生物医学与生物信息工程国际学术会议(ICBBE 2025)
  • Qoder 全新「上下文压缩」功能正式上线,省 Credits !
  • journald 持久化 + 限额脚本
  • 【2025-09-14】连岳摘抄
  • 深入解析:PAT乙级_1125 子串与子列_Python_AC解法_含疑难点