当前位置: 首页 > 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.zskr.cn/news/5253.html

相关文章:

  • Supabase云同步架构:Flutter应用的数据同步策略
  • 【SPIE出版】第五届先进制造技术与电子信息国际学术会议(AMTEI 2025)
  • 2025.9.15 考试总结
  • 汇编语言[王爽]-02 寄存器
  • 2.docker 安装
  • 搞定SPI开发:硬件设计精讲与CH390H示例应用
  • 我开发的软件和开源/免费软件
  • ubuntu 20.04安装mysql 5.7
  • 企业微信逆向开发协议,ipad协议调用方式
  • OpenStack Nova Scheduler 计算节点选择机制
  • 记一种很新的 bitset
  • 有向图强连通分量
  • Kafka 消费者元数据topicId变化问题
  • 【2025-09-14】连岳摘抄
  • GZY.Quartz.MUI(基于Quartz的UI可视化操作组件) 2.8.0发布 新增仪表盘和检索功能
  • MacOS升级15.2后的问题(二):无法修改mac网络地址
  • HCIA——VLAN间通信
  • vue - 内置指令
  • 读书笔记:为什么你的数据库有时不用索引?一个关键参数告诉你答案
  • MacOS升级15.2后的问题(一):安装第三方下载的软件,提醒文件已损坏
  • 故障分析:ORA-00900 修改props$中字符集导致
  • Ollama + Python 极简工作流
  • 单片机实现挡位调节
  • 长城杯WriteUp
  • vite取别名@
  • kingbase金仓数据库docker部署完整步骤
  • 【VPX361】基于3U VPX总线架构的XCZU47DR射频收发子模块
  • 自动驾驶ADAS数据集 13万张高清道路车辆识别图像 覆盖多场景智能交通应用 支持目标检测图像识别模型训练与AI视觉算法开发
  • Norwood-Hamilton男性脱发分级图像集|2400+张多角度高清头皮图像|涵盖7类脱发诊断标注|适用于AI诊断工具开发、皮肤科研究与植发产品研发|包含5角度标准化拍摄、支持秃顶早期检测
  • 30万份行业报告数据集:覆盖金融科技医疗能源等20+行业领域,2010-2024年完整时间跨度,提供高质量PDF和文本格式,支持深度学习模型训练、行业趋势分析、市场竞争研究、学术论文写作的多场景应用