我有以下代码打印传递给./main
的参数数量。请注意fmt
部分中的rodata
。我已经包含了新的行\n
,就像在 C 中一样,但它不是打印新行,而是打印:
参数数量:1 \ n
我的代码是:
;main.asm
GLOBAL main
EXTERN printf
section .rodata:
fmt db "Number of parameters: %d \n", 0
section .text:
main:
push ebp
mov ebp, esp ;stackframe
push dword[ebp+8] ;prepara los parametros para printf
push fmt
call printf
add esp, 2*4
mov eax, 0 ;return value
leave ;desarmado del stack frame
ret
我知道在0之前和fmt
中的“数字...”之后包含10将打印它,但我希望printf
执行此操作。我用 NASM 组装代码,然后通过 GCC 链接它来创建我的可执行文件。
答案 0 :(得分:4)
当您在 NASM 中的字符串周围使用引号或双引号时,它不会接受 C 样式的转义序列。在Linux上,您可以将\n
编码为ASCII 10,如下所示:
fmt db "Number of parameters: %d", 10, 0
还有另一种选择。 NASM 支持反引号(反引号),它允许 NASM 以#em> C 样式转义序列处理它们之间的字符。这也应该有效:
fmt db `Number of parameters: %d \n`, 0
请注意:这些不是单引号,而是反引号。这在NASM documentation:
中有所描述3.4.2字符串
字符串最多由八个字符组成,用单引号(' ...'),双引号(" ...")或反引号({ {1}})。单引号或双引号等同于NASM(当然,用单引号围绕常量允许双引号出现在其中,反之亦然);这些内容逐字表示。 反引号中的字符串支持特殊字符的C风格-escapes 。
答案 1 :(得分:3)
汇编程序不是C.C编译器将\ n理解为ASCII 10的转义码。汇编程序不会将其视为两个字符。如您所述添加10。