j1n*_*nma 0 linux x86 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
Run Code Online (Sandbox Code Playgroud)
我知道在 0 之前和“Number ...”之后包括一个 10fmt会打印它,但我想printf这样做。我用NASM组装代码,然后通过GCC链接它以创建我的可执行文件。
当您在NASM 中的字符串周围使用引号或双引号时,它不接受C风格的转义序列。在 Linux 上,您可以\n像这样编码为 ASCII 10:
fmt db "Number of parameters: %d", 10, 0
Run Code Online (Sandbox Code Playgroud)
有一个替代方案。NASM支持反引号(反引号),这将允许NASM将它们之间的字符处理为C风格的转义序列。这也应该有效:
fmt db `Number of parameters: %d \n`, 0
Run Code Online (Sandbox Code Playgroud)
请注意:那些不是单引号,而是反引号。这在NASM 文档中有描述:
3.4.2 字符串
字符串最多由八个字符组成,包括在单引号 ('...')、双引号 ("...") 或反引号 (
...) 中。单引号或双引号等价于 NASM(当然,用单引号包围常量允许其中出现双引号,反之亦然);这些内容是逐字表示的。用反引号括起来的字符串支持 C 风格的特殊字符转义。