组装:printf不打印新行

时间:2016-04-19 03:13:56

标签: assembly printf nasm

我有以下代码打印传递给./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 链接它来创建我的可执行文件。

2 个答案:

答案 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。