在GCC程序集中的两个字符串上调用printf
我试图对_格式字符串调用printf,但是我没有打印出这两个字符串,而是得到了一个错误。在添加_printStr函数之前,我能够让程序运行,所以我真的不确定为什么它不能同时打印这两个函数。我还可以单独打印每个字符串,它工作正常(12(%ebp)和16(%ebp))。这是我的代码:在GCC程序集中的两个字符串上调用printf,gcc,assembly,Gcc,Assembly,我试图对_格式字符串调用printf,但是我没有打印出这两个字符串,而是得到了一个错误。在添加_printStr函数之前,我能够让程序运行,所以我真的不确定为什么它不能同时打印这两个函数。我还可以单独打印每个字符串,它工作正常(12(%ebp)和16(%ebp))。这是我的代码: .text .globl _main _string: .ascii "Hello\0" _string2: .ascii "
.text
.globl _main
_string: .ascii "Hello\0"
_string2: .ascii " World\0"
_format: .ascii "%s %s\0"
_main: // push params, call fn, clear params, return
pushl $_string2
pushl $_string
call _printStr
addl $8, %esp
ret
//function to print a string passed to it on the stack
_printStr:
push %ebp # save old frame ptr
movl %esp, %ebp # set frame ptr
pushl 8(%ebp)
pushl 12(%ebp)
pushl _format
call _printf
addl $12, %esp # clear params from stack
leave
ret
谢谢你的时间,我感谢你的帮助 不要将未知字符串作为第一个参数传递给
printf
。始终使用已知的格式说明符,如果可能,最好使用文字。如果要使用printf
打印字符串,请执行以下操作:
_simpleformat: .ascii "%s\0"
您在
pushl\u格式中缺少$
符号。它应该是pushl$\u格式
,因为您想传递它的地址。顺便说一句,您也在按相反的顺序传递这两个单词,它将打印“World Hello”
。此外,您缺少换行符,但有额外的空间。最后,将字符串常量放在.text
部分不是最佳做法。请参阅(注意,我删除了一些ideone不需要的前导下划线,但您的系统可能需要这些下划线)您不是按错误的顺序推送了参数吗?是的,我主要关心的是现在是否要打印这两个参数。我更新了它,感谢您让我知道您的调用只将format
参数转发到printf
,而不是所有参数。由于格式字符串printf
最终将堆栈上紧跟其后的任何内容视为缺少的参数。编辑原始代码以将_格式放入_printStr函数确定感谢您的回复,因此我需要在_printStr函数中使用该格式。我编辑了我的原始代码,但它仍然不起作用,我有正确的想法吗?我一直在看它,没有意识到我忘记了美元,谢谢。我确实意识到它的顺序是错误的,并提前修复了它。它现在正在工作,但我很好奇,为什么要添加xor%eax,%eax行?这是为了将从main
返回的值设置为零。
pushl 8(%ebp)
pushl _simpleformat
call _printf
addl $8, %esp