【问题标题】:GCC ASM set AH Register to 1h from CGCC ASM 从 C 将 AH 寄存器设置为 1h
【发布时间】:2021-01-03 01:54:34
【问题描述】:

有没有办法将此行从 GCC 的 C 推送到 asm

    mov ah,1h
    int 21h

我找不到将 AH 寄存器设置为 1h 的方法

 asm("mov %ah,1h");
 asm("int 21h");

【问题讨论】:

  • 因为这似乎是 DOS 的代码,而且您不太可能使用 16 位 gcc,因此即使编译它也可能无法工作。 (不幸的是,您没有指定您的环境。)更不用说 int 21/01 是键盘输入,因此您通常需要一种方法来返回您需要使用扩展 asm 的键。
  • 我正在尝试从 grub 运行程序。英特尔 x86。

标签: c assembly gcc x86 inline-assembly


【解决方案1】:

1h 表示十六进制数字中的1。您可以使用$0x1 来表达这一点。 (GCC 汇编语言中的整数文字需要$0x 将数字标记为十六进制)。

还要注意,在 GCC 汇编语言中,mov 指令(以及其他具有两个操作数的指令)的目标应该是第二个操作数。

asm("mov $0x1, %ah");
asm("int $0x21");

还有一点需要注意的是,如果要确保%ah在执行int时是0x1,那么这两行应该放在一个asm语句中,不要让编译器放其他指令他们之间。

asm(
    "mov $0x1, %ah\n\t"
    "int $0x21"
);

【讨论】:

  • 这两个指令必须在单个 asm 语句中,以确保 ah 不会在它们之间发生变化。此外,将 al 分配给输出的指令必须是同一 asm 语句的一部分。
  • $ is required for integer literals in GCC assembly language 你可以使用.intel_syntax noprefix,然后使用不带$的整数文字
  • 还要注意,clobber 是为了确保 gcc 在 ah 中没有任何东西。
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多