一尘不染

汇编:printf不打印新行

linux

我有以下代码可以打印传递给的参数数量./main。请注意fmtrodata部分中的。我已经包括了新行\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和“ Number …”之后包含10 fmt将打印它,但我想printf这样做。我用 NASM 汇编代码,然后通过 GCC
将其链接以创建我的可执行文件。


阅读 264

收藏
2020-06-03

共1个答案

一尘不染

当您在 NASM中 对字符串使用双引号或双引号时,它不接受 C 样式转义序列。在Linux上,您可以这样编码\n为ASCII 10:

fmt db "Number of parameters: %d", 10, 0

还有一种选择。 NASM 支持反引号(反引号),这允许 NASM 将它们之间的字符作为 C 样式转义序列进行处理。这也应该工作:

fmt db `Number of parameters: %d \n`, 0

请注意:这些不是单引号,而是 反引号
NASM文档中对此进行了描述:

3.4.2字符串

字符串最多由八个字符组成,这些字符包含在单引号(’…’),双引号(“
…”)或反引号(...)中。单引号或双引号等效于NASM(当然,用单引号引起来的常量可以使双引号出现在反引号中,反之亦然);这些内容按原样表示。
用反引号引起来的字符串支持C样式的特殊字符转义

2020-06-03