C语言 如何在程序集中表示'\n'?

v8wbuo2f  于 2023-04-29  发布在  其他
关注(0)|答案(3)|浏览(125)

我想将“\n”表示为汇编代码!!
比如说

#include <stdio.h>

int main() {
    printf("Hi! My name is Joe.\n I'm 11 years old");

    return 0;
}

如何在程序集中表示“\n”部件?

xzabzqsa

xzabzqsa1#

这取决于您使用的特定汇编器,但在某些情况下(包括GAS:https://sourceware.org/binutils/docs/as/Characters.html),它仍然是\n,就像C一样。您可以通过许多不同的方式看到组件的外观,但这些天GodBolt非常好。
https://gcc.godbolt.org/z/ZLq3Kn

.LC0:
        .string "Hi! My name is Joe.\n I'm 11 years old"

你可以看到字符串看起来是一样的。在GAS中,.string创建一个以0结尾的字符串。如果您更改为Clang(使用相同的语法,但对发出哪些指令做出不同的选择),您将看到它使用.asciz

.L.str:
        .asciz  "Hi! My name is Joe.\n I'm 11 years old"

但是在这两个汇编器中,\n是相同的。

**并非所有汇编器都支持此语法。”””但很多人做。检查你的装配机的手册。

.string.asciz在大多数目标上相同,都附加了一个零。The manual says在某些ISA的GAS语法中,.string可能不会附加零,而.asciz总是附加零,而.ascii从不附加零。z代表零。

6ovsh4lw

6ovsh4lw2#

要在汇编语言中表达\n,尤其是nasm汇编语言(指向来自dvhh的注解),可以使用0x0a
示例:

string1 db "Hi! My name is Joe.", 0x0a
string2 db "I'm 11 years old.", 0x0a
3hvapo4f

3hvapo4f3#

在NASM语法中,C样式转义是在反勾中处理的,因此您可以将\n写成值为0xa = 10的整数常量

mov byte [mem], `\n`

newline: equ `\n`        ; or 0xa or 10, but not '\n' or "\n"

str1: db `Hello\n`
str2: db 'Hello', 0xa   ; exactly identical to str1

参见手册。
关于GNU汇编程序,请参见its manual'\n'的工作原理与movb $'\n', (%rdi)类似

相关问题