Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >3.10 中断指令

3.10 中断指令

作者头像
命运之光
发布于 2024-09-13 05:16:00
发布于 2024-09-13 05:16:00
22000
代码可运行
举报
运行总次数:0
代码可运行

3.10 中断指令

在汇编语言中,中断机制是控制程序流程和处理异步事件的重要手段。有软中断指令 (INT n)和中断返回指令 (IRET)

1. 软中断指令 (INT n)
定义与格式
  • 指令格式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INT n
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- `n`:中断类型码,取值范围为 `0``0FFH`(即 0255),总共有 256 种不同的中断类型。
功能与工作原理
  • 中断矢量表
    • 中断类型码 n 对应于中断矢量表中的第 n 项。
    • 每个中断类型码在中断矢量表中占用 4 个字节:
      • 前两个字节:存放中断服务程序(Interrupt Service Routine, ISR)的入口地址偏移量(Offset)。
      • 后两个字节:存放中断服务程序的段基址(Segment Address)。
  • 执行过程
    1. 保存标志寄存器
      • INT n 指令执行时,首先将当前的标志寄存器(Flags Register, FR)的内容压入堆栈,以保存当前的状态。
    2. 清除特定标志位
      • 清除中断标志位(Interrupt Flag, IF)和陷阱标志位(Trap Flag, TF),以防止嵌套中断或单步调试中断。
    3. 保存程序断点
      • 将当前程序计数器(即下一条指令的地址)的段基址和偏移地址压入堆栈,以便中断服务程序执行完毕后能够返回。
    4. 跳转到中断服务程序
      • 从中断矢量表中获取与中断类型码 n 对应的 4 个字节内容:
        • 偏移地址(Offset):加载到指令指针寄存器(IP)中。
        • 段基址(Segment Address):加载到代码段寄存器(CS)中。
      • 这样,CPU 会跳转到指定的中断服务程序执行。
示例

假设我们有一个中断类型码为 0x21(常用于DOS的中断服务),使用 INT 21H 来调用DOS功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MOV AH, 09H       ; DOS功能号 09H:显示字符串
MOV DX, OFFSET msg ; DS:DX 指向要显示的字符串
INT 21H           ; 调用DOS中断
...
msg DB 'Hello, World!$' ; DOS字符串以 '$' 结尾
解释
  • 这里,INT 21H 调用了DOS提供的功能,通过设置 AHDX 寄存器来指定具体的操作(显示字符串)。
再看一个例子
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
section .text
    org 100h               ; 设置程序起始地址(一般用于COM程序)

start:
    ; 假设 AX 中已经有了要计算的数值
    int 7Ch                ; 调用自定义的中断 7Ch,计算 AX 中的数据的平方

    ; 示例计算:2 * 3456^2
    mov ax, 3456h          ; 初始化 AX = 3456h
    int 7Ch                ; 计算 3456h 的平方

    ; 结果存储在 DX:AX; 此时 DX 中存放高16位,AX 中存放低16位
    add ax, ax             ; 结果乘以2,更新 AX
    adc dx, dx             ; 结果乘以2,更新 DX

    mov ax, 4C00h          ; 正常结束程序
    int 21h

; 中断例程 - 中断7Ch: 计算AX中数值的平方
isr_7ch:
    pusha                  ; 保存所有通用寄存器

    ; 计算 AX 的平方,并将结果存入 DX:AX 中
    mov dx, ax             ;AX 复制到 DX 中
    mul dx                 ; AX * DX -> DX:AXAX 中低16位,DX 中高16位

    popa                   ; 恢复所有通用寄存器
    iret                   ; 返回到调用程序

section .data

软中断指令 (INT n)有哪些,都能做什么?

在 x86 汇编语言中,软中断指令 INT n 用于生成一个软件中断,通过调用操作系统或BIOS提供的服务。软中断允许程序在运行时请求操作系统或BIOS执行某些功能,类似于调用系统函数。

软中断指令概述
  • 语法: INT n
    • n 是中断向量号,指定了中断处理程序的入口点。
常见的软中断指令及其功能
  1. INT 10h: 视频服务中断
    • 用途: 提供视频功能,包括显示模式设置、光标控制、字符显示等。
    • 功能示例:
      • INT 10h 使得可以设置屏幕模式、显示光标、打印字符等。
      • AH = 0x02: 设置光标位置。
      • AH = 0x0E: 显示字符。
  2. INT 13h: 磁盘服务中断
    • 用途: 提供磁盘操作服务,如读取和写入磁盘扇区。
    • 功能示例:
      • INT 13h 用于访问硬盘和软盘。
      • AH = 0x02: 读扇区。
      • AH = 0x03: 写扇区。
  3. INT 14h: 串行端口服务中断
    • 用途: 提供串行端口操作服务。
    • 功能示例:
      • INT 14h 用于串行通信。
      • AH = 0x00: 初始化串行端口。
      • AH = 0x01: 发送字符。
  4. INT 15h: 扩展服务中断
    • 用途: 提供系统扩展服务,例如内存管理电源管理
    • 功能示例:
      • INT 15h 用于获取系统内存信息和电源管理。
      • AH = 0xE820: 获取系统内存范围。
  5. INT 16h: 键盘服务中断
    • 用途: 提供键盘操作服务。
    • 功能示例:
      • INT 16h 用于键盘输入。
      • AH = 0x00: 获取键盘按键。
      • AH = 0x01: 检测键盘按键是否被按下。
  6. INT 21h: DOS 系统调用中断
    • 用途: 提供大量的操作系统服务,如文件操作、内存分配、程序退出等。
    • 功能示例:
      • INT 21h 提供多种 DOS 服务。
      • AH = 0x01: 读取字符。
      • AH = 0x09: 打印字符串。
      • AH = 0x4Ch: 退出程序。
示例代码

下面是一个使用 INT 21h 打印字符串的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ORG 100h          ; 设定起始地址为 100h

MOV AH, 09h       ; 功能号:打印字符串
MOV DX, OFFSET MSG ; 设置字符串地址
INT 21h           ; 调用 DOS 中断

MOV AH, 4Ch       ; 功能号:退出程序
INT 21h           ; 调用 DOS 中断

MSG DB 'Hello, World!$', 0

当然,以下是将这段汇编代码整合到一起,并进行详细解释的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ORG 100h          ; 设定起始地址为 100h

MOV AH, 09h       ; 功能号:打印字符串
MOV DX, OFFSET MSG ; 设置字符串地址
INT 21h           ; 调用 DOS 中断

MOV AH, 4Ch       ; 功能号:退出程序
INT 21h           ; 调用 DOS 中断

MSG DB 'Hello, World!$', 0
代码解释
  1. ORG 100h
    • 含义: 指定程序的起始地址为 100h。
    • 作用: 在 DOS 执行的 .COM 文件中,代码通常从内存地址 100h 开始,因为前面 100h 字节的空间用于存储程序的 PSP(程序控制块)。这个伪指令告诉汇编器生成的机器代码从地址 100h 开始。
  2. 打印字符串部分
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MOV AH, 09h       ; 功能号:打印字符串
MOV DX, OFFSET MSG ; 设置字符串地址
INT 21h           ; 调用 DOS 中断
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- `MOV AH, 09h`: 将 09h 放入 AH 寄存器中。09h 是 DOS 中断 21h 的一个功能号,表示打印以 `$` 结束的字符串。
- `MOV DX, OFFSET MSG`:`MSG` 标签的地址放入 DX 寄存器中。`<font style="color:#DF2A3F;">OFFSET MSG</font>` 计算 `<font style="color:#DF2A3F;">MSG</font>` 数据的<font style="color:#DF2A3F;">起始地址</font>DX 寄存器现在包含了字符串的地址。
- `INT 21h`: 调用 DOS 中断 21h。由于 AH 寄存器中包含 09h,这次中断调用会打印 DX 寄存器中指定的字符串(即 `MSG`)。
  1. 退出程序部分
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MOV AH, 4Ch       ; 功能号:退出程序
INT 21h           ; 调用 DOS 中断
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- `MOV AH, 4Ch`: 将 4Ch 放入 AH 寄存器中。4Ch 是 DOS 中断 21h 的功能号,表示正常退出程序。
- `INT 21h`: 调用 DOS 中断 21h。由于 AH 寄存器中包含 4Ch,这次中断调用会结束程序的执行并返回到 DOS 命令行。
  1. 字符串数据定义
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MSG DB 'Hello, World!$', 0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- `MSG DB 'Hello, World!$', 0`: 定义一个名为 `MSG` 的数据字节(DB),内容是字符串 `'Hello, World!'``$` 结束,`0` 作为字符串结束符。虽然 `$` 已经足够标识字符串的结束,`0` 是为了避免潜在的字符串结束问题(尤其是对其他功能)。
整体流程
  1. 程序开始:
    • 从地址 100h 开始执行代码。
  2. 打印字符串:
    • 设置 AH 寄存器为 09h,准备调用打印字符串的功能。
    • 将字符串的地址放入 DX 寄存器。
    • 调用 INT 21h,执行打印操作,将 “Hello, World!” 显示在屏幕上。
  3. 退出程序:
    • 设置 AH 寄存器为 4Ch,准备调用退出程序的功能。
    • 调用 INT 21h,正常退出程序,返回到 DOS 命令行。

这个程序展示了如何在 DOS 环境下使用汇编语言打印字符串并正常退出,适用于简单的 DOS .COM 文件编程。

总结
  • INT** 指令**: 通过调用软件中断,程序可以请求操作系统或 BIOS 执行特定任务。
  • INT** 指令的功能**: 包括视频服务、磁盘操作、串行通信、键盘输入、系统服务等。

通过不同的 INT n 指令和相关功能号,汇编语言程序可以访问底层硬件或操作系统提供的功能,执行各种系统级任务。

2. 中断返回指令 (IRET)
定义与格式
  • 指令格式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IRET
功能与工作原理
  • 作用**<font style="color:#DF2A3F;">IRET</font>** 指令用于从中断服务程序返回到被中断的主程序,恢复中断前的执行状态。
  • 执行过程
    1. 恢复标志寄存器
      • 从堆栈中弹出一个字(通常是 16 位),并将其加载到标志寄存器(FR)中,恢复中断前的标志状态。
    2. 恢复代码段和指令指针
      • 从堆栈中依次弹出两个字(各 16 位),将其加载到代码段寄存器(CS)和指令指针寄存器(IP)中,恢复中断前的程序计数器。
    3. 继续执行
      • 程序控制权返回到被中断的主程序,继续执行 CALLINT 指令之后的下一条指令。
  • 重要性
    • 必须性:在中断服务程序的最后,必须使用 IRET 指令来确保程序能够正确返回到中断前的位置。如果没有 IRET,程序将无法恢复到中断前的状态,导致程序执行混乱或崩溃。
示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
; 主程序
MAIN:
    ; 一些主程序代码
    INT 21H           ; 调用DOS中断
    ; 中断返回后继续执行
    ...

; 中断服务程序(假设自定义中断)
ISR:
    ; 中断服务程序的代码
    ...
    IRET             ; 返回到主程序
解释
  • INT 指令被执行时,CPU 跳转到对应的中断服务程序(如 ISR)。
  • 中断服务程序执行完毕后,通过 IRET 指令返回到主程序的 INT 指令之后的位置,继续执行主程序的后续代码。
再看一个例子
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
section .text
    org 100h               ; 设置程序起始地址(一般用于COM程序)

start:
    ; 假设 AX 中已经有了要计算的数值
    int 7Ch                ; 调用自定义的中断 7Ch,计算 AX 中的数据的平方

    ; 示例计算:2 * 3456^2
    mov ax, 3456h          ; 初始化 AX = 3456h
    int 7Ch                ; 计算 3456h 的平方

    ; 结果存储在 DX:AX; 此时 DX 中存放高16位,AX 中存放低16位
    add ax, ax             ; 结果乘以2,更新 AX
    adc dx, dx             ; 结果乘以2,更新 DX

    mov ax, 4C00h          ; 正常结束程序
    int 21h

; 中断例程 - 中断7Ch: 计算AX中数值的平方
isr_7ch:
    pusha                  ; 保存所有通用寄存器

    ; 计算 AX 的平方,并将结果存入 DX:AX 中
    mov dx, ax             ;AX 复制到 DX 中
    mul dx                 ; AX * DX -> DX:AXAX 中低16位,DX 中高16位

    popa                   ; 恢复所有通用寄存器
    iret                   ; 返回到调用程序

section .data

总结
  • 软中断指令 (INT n)
    • 用于调用中断服务程序,处理特定的服务或事件。
    • 通过中断类型码 n 来选择具体的中断服务。
    • 执行 INT 指令时,CPU 会保存当前状态并跳转到对应的中断服务程序。
  • 中断返回指令 (IRET)
    • 用于从中断服务程序返回到被中断的主程序。
    • 恢复中断前的程序状态,确保程序能够继续正常执行。
    • 必须在中断服务程序的末尾使用,以确保程序流程的正确性。

应用场景

  • 操作系统服务调用:如DOS中断 INT 21H 提供了文件操作、设备控制等功能。
  • 硬件中断处理:例如键盘输入、定时器中断等,通过中断服务程序来处理异步事件。
  • 软件异常处理:如断点调试、非法操作处理等。

通过正确使用 INTIRET 指令,汇编程序能够有效地管理程序流程、处理事件和调用系统服务,实现复杂的功能和响应外部事件。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CPU 指令 INT n 的深度解析
在计算机领域,CPU 是计算机的核心,它通过执行指令来完成各种任务。INT n 是 x86 架构中非常重要的一条指令,其功能是触发软件中断。这条指令的含义以及应用范围涉及计算机操作系统、硬件驱动程序、以及应用程序等多个领域。本文将从技术原理、实现方式、实际应用、以及相关代码示例等多角度,详细解析 INT n 指令的含义。
编程小妖女
2025/01/17
1220
CPU 指令 INT n 的深度解析
收藏夹吃灰版!汇编语言快速入门(非常详细)
汇编语言程序以段为单位进行书写,一般把数据定义在数据段里,程序写在代码段中。下面给出段的定义语法:
C语言与CPP编程
2024/06/08
3100
收藏夹吃灰版!汇编语言快速入门(非常详细)
【汇编语言】int指令(一)—— 中断与栈的联动机制:透视int与iret的核心原理
中断信息可以来自CPU的内部和外部,当CPU的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。在前面一个章节中,我们讲解了中断过程和两种内中断的处理。
Crossoads
2024/12/29
1910
【汇编语言】int指令(一)—— 中断与栈的联动机制:透视int与iret的核心原理
3.9 控制转移指令
在上述示例中,根据 AX 和 BX 的比较结果,程序会跳转到不同的标号来执行相应的代码。
命运之光
2024/09/13
1390
x86汇编语言之8086语法和指令集
上面使用db或者dw定义数据的方式,定义数据的同时就已经定义好了数据所在的物理地址, 如果我们想要从指定的内存地址中写入或者读取数据的话,需要借助段寄存器来实现 在8086中给我们提供了DS SS CS ES四个寄存器,理论上你使用哪一个都行,但是由于系统默认读取DS寄存器中的数据当做段地址,所以我们一般使用DS进行数据的段地址管理
乱码三千
2021/08/24
2.7K0
【汇编语言】int指令(二)—— 从硬件到应用的桥梁:BIOS与DOS中断的最佳实践
在系统板的ROM中存放着一套程序,称为BIOS(基本输入输出系统),BIOS中主要包含以下几部分内容。
Crossoads
2024/12/29
1820
【汇编语言】int指令(二)—— 从硬件到应用的桥梁:BIOS与DOS中断的最佳实践
8086汇编语言之函数的声明和调用
由于print函数默认执行,为了保证在call时才执行, 咱们将print函数代码移至中断后:
乱码三千
2021/08/24
1.6K0
汇编语言从键盘输入一个字符串以十进制输出字符串中非字母字符的个数A to Z)
(1)从键盘输入一个字符串(串长不大于80)。 (2)以十进制输出字符串中非字母字符的个数(不是a to z或 A to Z)。 (3)输出原字符串且令非字母字符闪烁显示。 (4)找出字符串中ASCII码值最大的字符,在字符串中用红色显示。 (5)字符串的输入和结果的输出都要有必要的提示,且提示独占一行。 (6)要使用到子程序。 data segment hintinput db "please input a string:$" hintoutput1 db "The number of n
炒香菇的书呆子
2021/05/27
3.2K0
汇编版冒泡排序
用到的东西都很简单,只用了基本的寄存器和jmp运算。 更新补充:我自己的电脑上\n即可实现回车换行,但是有的机器不支持,需要\r\n才可以回车换行。如果测试时出现没有回车的情况,可以在对应部分的输出语句加上mov dl,13 int 21h。
KevinBruce
2020/03/11
3420
内存寻址方式
在处理汇编语言程序中,用'.......'的方式指明数据是以字符的形式给出的 编译器将他们转化为他们对应的ascii码 通过ascii码表我们可以发现同一个大写和小写字符相差20h
用户7272142
2023/11/24
2620
内存寻址方式
雷军 1994 年写的代码,像诗一样优雅!不服不行!
雷军曾自夸自己写的代码像诗一样优雅,网友感觉这雷军写的94年代码如何?2019年世界500强企业排行榜,仅成立9年的小米全球排名第468位,这让小米的创始人雷军兴奋的像个孩子一样。雷军一高兴就给小米的每一位员工包了1000股公司的股票,总价值超过了一亿。
路人甲Java
2020/06/04
4.4K0
汇编语言关于2号功能函数的坑点
也可以参考如下文章: http://www.delorie.com/djgpp/doc/rbinter/id/65/25.html
KevinBruce
2020/03/12
5620
16汇编第十讲完结Call变为函数以及指令的最后讲解
16汇编完结Call变为函数以及指令的最后讲解 学了10天的16位汇编,这一讲就结束了,这里总结一下昨天的LOOP指令的缺陷,因为lOOP指令的缺陷,所以我们都改为下面的汇编代码使用了,自己去写,其中
IBinary
2018/01/05
9590
16汇编第十讲完结Call变为函数以及指令的最后讲解
DOS汇编程序提高练习
编写一个汇编程序,实现字符串的复制功能,并且将复制的字符串显示出来。(选做部分:倒
timerring
2022/07/20
9110
DOS汇编程序提高练习
【汇编语言】外中断(二)—— 键盘的奥秘:编写自己的 int 9 中断例程
上面的过程中,第1、2、3步都是由硬件系统完成的。我们能够改变的只有int9中断处理程序。我们可以重新编写int9中断例程,按照自己的意图来处理键盘的输入。
Crossoads
2025/01/03
1440
汇编基础
​ cup与所有内存之间:地址总线,数据总线,控制总线,每条线对应不同信息,指令与数据分开
Dean0731
2020/08/17
1.5K0
汇编语言中断及外部设备操作篇--06
这里重点关注的不在是各个功能的具体实现了,而是主程序中通过查表得到每个子程序开始的地址,这个操作是如何完成的
大忽悠爱学习
2022/07/12
1K0
汇编语言中断及外部设备操作篇--06
汇编DOS与Windows Masm编译运行代码步骤详解
obj文件一般是Object的简写,是程序编译后的二进制文件,obj文件可称为目标文件或中间文件。另外obj文件只给出了程序的相对地址。
timerring
2022/07/20
1.4K0
汇编DOS与Windows Masm编译运行代码步骤详解
COM病毒实验原理
test.asm的正常运行界面 点击新建,在新建工程的代码窗口中删除原有代码,并粘贴如下代码:
用户8909609
2023/11/20
3170
Mac下写8086汇编
我们课上讲的是8086下的16位汇编,如此远古的操作系统导致我在配置环境时遇到了很多问题。起初打算在win7虚拟机下用masm和汇编ide写汇编,但编译不成功,因为masm新版已经不是16位了。据查,masm5.0版本支持16位汇编,但又发现了DOSBox,与其在win7虚拟机下模拟DOS,不如直接在Mac中运行DOS环境。
gojam
2019/05/14
2.7K0
相关推荐
CPU 指令 INT n 的深度解析
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验