我是一名学习汇编语言(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
之上吗?
int
指令实际上并不执行任何打印。它的作用是跳转到另一段代码。 那个代码进行打印。
具体来说,
int 0x10
正是这样做的:
0x10
是您提供给 int
的操作数。仅修改 CS、IP、FLAGS 和 SP 寄存器。所有其他寄存器保持原样,目标代码可以检查它们。目标代码决定寄存器的含义。代码完成后,它会执行
iret
(中断返回)指令,该指令的作用与 int
相反,并跳回您的程序。
目标代码很可能是 BIOS 的一部分,尽管它也可以是视频适配器 ROM 的一部分。
您也可以在[64]位置写入新地址,并将
int 0x10
重定向到您自己的代码。你必须在[64]处写一个偏移字,在[64+2]=[66]处写一个代码段字。