Linux 程序集:printf不打印新行
下面的代码打印了传递给Linux 程序集:printf不打印新行,linux,assembly,x86,printf,nasm,Linux,Assembly,X86,Printf,Nasm,下面的代码打印了传递给/main的参数数量。请注意rodata部分中的fmt。我加入了新行\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
/main
的参数数量。请注意rodata
部分中的fmt
。我加入了新行\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
我知道在
fmt
中的“Number…”之前和之后加上一个10会打印出来,但我想printf
这样做。我用NASM组装代码,然后通过GCC链接它以创建可执行文件 汇编程序不是C。C编译器将\n理解为ASCII 10的转义码。汇编程序不会将其视为两个字符。按照您的描述添加10 当在NASM中对字符串使用引号或双引号时,它不接受C样式的转义序列。在Linux上,您可以将\n
编码为ASCII 10,如下所示:
fmt db "Number of parameters: %d", 10, 0
还有一种选择。NASM支持反引号(backticks),这将允许NASM将它们之间的字符作为C样式的转义序列进行处理。这也应该起作用:
fmt db `Number of parameters: %d \n`, 0
请注意:这些不是单引号,而是反勾号。以下章节对此进行了描述:
3.4.2字符串
一个字符串由最多八个字符组成,这些字符用单引号(“…”)、双引号(“…”)或反引号(…
)括起来。单引号或双引号相当于NASM(当然,除了用单引号包围常量允许双引号出现在其中,反之亦然);这些文件的内容一字不差地表示出来反引号中的字符串支持特殊字符的C样式转义
您不会像那样“编译”汇编程序代码,而是使用汇编程序。您不“编译”生成的对象文件,而是链接它。无论如何,这与gcc无关,也与C语言无关。不要添加不相关的标记。请注意,YASM版本的NASM语法不支持倒勾引用的字符串文本。我认为YASM没有办法用转义序列来写字符串常量。只有当你关心亚斯姆以及官方nasm本身时,这才重要。@PeterCordes:最后一段的原始问题是nasm,我的答案是为nasm。如果我指的是YASM,我会这么说。YASM不是NASM就像TASM不是MASM一样。。如果问题是关于GAS、YASM、MASM语法(以及其他变体,其中一些共享一些特性,而不是其他特性),我会提供一个涵盖这些特性的答案。如果你想给出一个涵盖市场上每一个组装商和变体的答案,请随意。我并不是说你的答案不完整,或者你应该提到它。我只是觉得这是一个有趣的补充,因为YASM几乎完全兼容NASM语法。