【问题标题】:What happens in the following assembly commands?以下汇编命令会发生什么?
【发布时间】:2013-01-18 19:00:41
【问题描述】:

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

MOV  AH, 09
INT  21

MOV  AX, 4C01
INT  21

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

【问题讨论】:

  • 应该是MOV AX, 4c01
  • INT 是中断调用。
  • 是的,谢谢
  • loxxy 我知道 int21 是对 DOS 的 API 的调用,我完全不知道 ah 中的值如何变化以及 int 调用的参数如何变化。

标签: assembly x86 dos


【解决方案1】:

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

调用INT 21h with AH = 09H 会将位于DS:DX$ 终止字符串输出到控制台。

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

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


更详细(来自Wikipedia):


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

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

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

有趣的是,他们没有复制访问扩展寄存器的高半部分的能力,例如 eaxeaheal 组成(两者都是神话, 但后者是 ax 的别名。

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

【讨论】:

  • 感谢 Ralf 网站惊人列表的链接,现在我只需要克服几个小时对大会的误解。
【解决方案2】:

AHAL 分别是AX 的高半部分和低半部分。所以是的,设置AX 改变AH

4C 是“退出程序”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多