我有以下代码可以打印传递给的参数数量./main。请注意fmt该rodata部分中的。我已经包括了新行\n,就像 C中一样 ,但是它不是打印新行而是打印:
./main
fmt
rodata
\n
参数数量: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 将其链接以创建我的可执行文件。
printf
当您在 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样式的特殊字符转义 。
3.4.2字符串
字符串最多由八个字符组成,这些字符包含在单引号(’…’),双引号(“ …”)或反引号(...)中。单引号或双引号等效于NASM(当然,用单引号引起来的常量可以使双引号出现在反引号中,反之亦然);这些内容按原样表示。 用反引号引起来的字符串支持C样式的特殊字符转义 。
...