Linux X86-64汇编和printf

我正在阅读一些Linux程序集手册,并发现使用printf()函数的想法。 我需要它为了debugging的原因以二进制forms输出寄存器值到terminal,但现在我试图简单地用文本来testing该function。

我卡住了,因为segfault,当我使用pushq而不是pushl。 我怎样才能改变这个程序输出string和二进制forms的寄存器?

.data input_prompt: .string "Hello, world!" printf_format: .string "%5d " printf_newline: .string "\n" size: .long 0 .text .globl main main: pushq $input_prompt call printf movl $0, %eax ret 

它由GCC编译为:

 gcc tmp.S -o tmp 

Solutions Collecting From Web of "Linux X86-64汇编和printf"

Linux(和Windows) x86-64调用约定有第一个不在栈上的参数,而是在寄存器中

请参阅http://www.x86-64.org/documentation/abi.pdf (第20页)

特别:

  1. 如果类是MEMORY,则将参数传递给堆栈。
  2. 如果类是INTEGER,则使用序列%rdi,%rsi,%rdx,%rcx,%r8和%r9的下一个可用寄存器。
  3. 如果类是SSE,则使用下一个可用的向量寄存器,寄存器按从%xmm0到%xmm7的顺序进行。
  4. 如果类是SSEUP,那么在最后一个使用的向量寄存器的下一个可用的八字节块中传递八字节。
  5. 如果该类是X87,X87UP或COMPLEX_X87,则将其传递到内存中。

INTEGER类是适合于通用寄存器的任何东西,所以这也是你将用于字符串指针的东西。