Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GCC程序集中的两个字符串上调用printf_Gcc_Assembly - Fatal编程技术网

在GCC程序集中的两个字符串上调用printf

在GCC程序集中的两个字符串上调用printf,gcc,assembly,Gcc,Assembly,我试图对_格式字符串调用printf,但是我没有打印出这两个字符串,而是得到了一个错误。在添加_printStr函数之前,我能够让程序运行,所以我真的不确定为什么它不能同时打印这两个函数。我还可以单独打印每个字符串,它工作正常(12(%ebp)和16(%ebp))。这是我的代码: .text .globl _main _string: .ascii "Hello\0" _string2: .ascii "

我试图对_格式字符串调用printf,但是我没有打印出这两个字符串,而是得到了一个错误。在添加_printStr函数之前,我能够让程序运行,所以我真的不确定为什么它不能同时打印这两个函数。我还可以单独打印每个字符串,它工作正常(12(%ebp)和16(%ebp))。这是我的代码:

            .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