int指令运行时如何知道使用哪些寄存器?

问题描述 投票:0回答:1

我是一名学习汇编语言(NASM)的学生,我需要一些关于中断“功能”或 int 如何知道要“运行”哪些寄存器的澄清。我发现了一个声明

mov ah, 0x0e
mov al, "A"
int 0x10  

打印

A
并且
0x0e
A
(
0x41
) 形成
ax
寄存器,如 (
0x0e, 0x41
) 但是 int “函数”如何知道
ax
寄存器应该“运行” “而不是
bx
cx
?难道只是因为
ah
al
的语句都在int
0x10
之上吗?

assembly x86 nasm system-calls bios
1个回答
4
投票

int
指令实际上并不执行任何打印。它的作用是跳转到另一段代码。 该代码执行打印,并在 AH 中获取函数编号(以及其他寄存器中的参数,具体取决于函数)是 IBM PC BIOS 作者的一个软件设计选择。 https://en.wikipedia.org/wiki/BIOS_interrupt_call


具体来说,

int 0x10

正是这样做的(
https://www.felixcloutier.com/x86/intn:into:int3:int1):

    将 FLAGS 压入堆栈
  1. 禁用中断和单步模式(由FLAGS中的位控制)
  2. 将下一条指令的完整分段地址压入堆栈(返回地址)
  3. 从 RAM 位置 [0x10*4]=[64] 处读取完整分段地址(4 字节)。请注意,此处的
  4. 0x10
     是您提供给 
    int
     的操作数。这是 IVT(中断向量表)的索引,逻辑 seg:off 地址数组。
  5. 跳转到该地址
仅修改 CS、IP、FLAGS 和 SP 寄存器。所有其他寄存器保持原样,目标代码可以检查它们。目标代码决定寄存器的含义。代码完成后,它会执行

iret

(中断返回)指令,该指令的作用与 
int
 相反,并跳回您的程序。

目标代码很可能是 BIOS 的一部分,尽管它也可以是视频适配器 ROM 的一部分。

您也可以在[64]位置写入新地址,并将

int 0x10

重定向到您自己的代码。你必须在[64]处写一个偏移字,在[64+2]=[66]处写一个代码段字。

© www.soinside.com 2019 - 2024. All rights reserved.