汇编语言(NASM); 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 nasm computer-science
1个回答
0
投票

int
指令实际上并不执行任何打印。它的作用是跳转到另一段代码。 那个代码进行打印。

具体来说,

int 0x10
正是这样做的:

  1. 将 FLAGS 压入堆栈
  2. 禁用中断和单步模式(由FLAGS中的位控制)
  3. 将下一条指令的完整分段地址压入堆栈(返回地址)
  4. 从 RAM 位置 [0x10*4]=[64] 处读取完整分段地址(4 字节)。请注意,这里的
    0x10
    是您提供给
    int
    的操作数。
  5. 跳转到该地址

仅修改 CS、IP、FLAGS 和 SP 寄存器。所有其他寄存器保持原样,目标代码可以检查它们。目标代码决定寄存器的含义。代码完成后,它会执行

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

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

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

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

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