如何在GNU GAS中使用字符文字替换数字?

Cir*_*四事件 1 assembly gnu-assembler

例如,我想写一些类似的东西,'a'而不是0x61像我在C语言中那样。

该手册在以下位置提到了它们:https : //sourceware.org/binutils/docs/as/Chars.html,但如果没有示例,我不确定我是否理解。

Cir*_*四事件 5

/* Immediate. Without the `$`, does a memory access, and segfaults! */
mov $'a, %al
/* al == 0x61 */

/* Memory. */
mov c, %al
/* al == 0x62 */

c: .byte 'b

/* Space character works. */
mov $' , %al
/* al == 0x20 */

/* Backslash escapes work. */
mov $'\n , %al
/* al == 0x0A */
Run Code Online (Sandbox Code Playgroud)

GitHub上游

实际上有一个示例:https : //sourceware.org/binutils/docs-2.25/as/Characters.html

.byte  74, 0112, 092, 0x4A, 0X4a, 'J, '\J # All the same value.
Run Code Online (Sandbox Code Playgroud)

我不喜欢此语法的原因如下:

  • 不能很好地与C预处理器配合使用:MACRO($'a)失败,因为cpp '像char文字一样对待。
  • 可能会产生尾随空白$',这很难观察
  • 不像C

  • 结束符 '' 是可选的,您*必须*忽略它。(我没有意识到你甚至*可以*忽略它)。`mov $'a', %al` 组装得很好,并且是我通常使用的。 (2认同)
  • 但不幸的是 `mov $'abcd', %eax` 不像 NASM 那样被接受。`ab` 部分在 GAS 中看起来像是标签 `97` 的反向引用,就像 `1b`,但带有 `a` 的 ASCII 代码。所以你会收到奇怪的错误信息。 (2认同)