assembly - 以下汇编命令会发生什么?

标签 assembly x86 dos

只是一个预防措施。我是一个完全的组装菜鸟。我唯一的问题是在 DOS 中只有以下命令:

MOV  AH, 09
INT  21

MOV  AX, 4C01
INT  21

第二个中断是否仍然有参数 09 表示显示屏幕,或者 AX 是否以某种方式改变了它?

最佳答案

您需要搜索Ralf Brown's Interrupt List ,它是这些旧 DOS/Windows 中断的权威指南。

调用 INT 21h with AH = 09H将位于 DS:DX 的以 $ 结尾的字符串输出到控制台。

调用 INT 21H with AH = 4cH使用 AL 中的返回码退出您的程序(在本例中为 01H)。

第二次调用不会AH设置为09H,因为AH只是高8位AX。第二个 MOVAH 设置为 4cH 作为设置 AX 的一部分:

enter image description here


更详细(来自 Wikipedia ):

enter image description here


这种由其他寄存器制成的寄存器在英特尔有着悠久的历史:

  • axahal组成;
  • eax 由 16 位加上来自 ax 的其他 16 位组成;
  • rax 由 32 位加上来自 eax 的其他 32 位组成。

以及用于其他通用寄存器特殊寄存器(如索引或基址寄存器)以及堆栈指针的类似方法。

有趣的是,它们没有复制访问扩展寄存器高半部分的能力,例如 eaxeaheal(都是虚构的,但后者是 ax 的别名)。

这会在更高模式下为我们提供超小寄存器的大缓存,但我不确定成本是多少(毫无疑问英特尔/AMD 确实知道成本并且它可能被认为太贵了)。

关于assembly - 以下汇编命令会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14680634/

相关文章:

linux - mov byte [esi +9], bl 导致段错误

c - 如何告诉 gcc 停止使用内置函数?

assembly - 反转汇编中的输入字符串

command-line - 使用批处理文件打开一系列文件中的一个

ubuntu - 如何从 Ubuntu 终端通过 MS Shell 创建、编辑和保存文件?

c# - 在c#中分配引用时添加神秘调用

c - gdb 在使用偏移量工作时在地址处中断时停止程序

c++ - MIPS 汇编中的 C 数组索引?

caching - 如何正确使用预取指令?

c++ - 如何隐藏SHLD延迟?