1

我试图在 _format 字符串上调用 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

感谢您的宝贵时间,感谢您的帮助。

4

2 回答 2

2

不要将未知字符串作为第一个参数传递给printf. 始终使用已知的格式说明符,如果可能,最好使用文字。如果要使用printf打印字符串,请执行以下操作:

_simpleformat:  .ascii      "%s\0"

...

                pushl       8(%ebp)
                pushl       _simpleformat
                call _printf
                addl        $8, %esp
于 2012-11-18T20:48:19.197 回答
1

您在 中缺少一个$标志pushl _format。它应该读取pushl $_format,因为您想传递它的地址。顺便说一句,你也以相反的顺序传递这两个词,它会打印" World Hello". 此外,您缺少换行符,但有额外的空间。最后,将字符串常量放在该.text部分中并不是最佳做法。查看运行中的固定版本(注意我删除了一些 ideone 不需要的前导下划线,但可能在您的系统上需要)

于 2012-11-18T21:38:42.670 回答