Linux X86-64程序集和printf

ISE*_*ISE 4 linux assembly x86-64 binary-data

我正在阅读一些linux汇编手册,并找到了使用printf()函数的想法.我需要它以二进制形式将调试原因的寄存器值输出到终端,但现在我只是尝试用文本测试该函数.

我被困了,因为当我使用pushq而不是pushl时出现段错误.如何更改此程序以输出字符串和二进制形式的寄存器?

.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
Run Code Online (Sandbox Code Playgroud)

它由GCC编制为:

gcc tmp.S -o tmp
Run Code Online (Sandbox Code Playgroud)

Eva*_*ran 10

Linux (and Windows) x86-64 calling convention has the first few arguments not on the stack, but in registers instead

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,则在最后使用的向量寄存器的下一个可用的8字节块中传递8字节.
  5. 如果类是X87,X87UP或COMPLEX_X87,则它将在内存中传递.

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

  • [Windows x64调用约定](http://msdn.microsoft.com/en-us/library/7kcdt6fy)也会在寄存器中传递一些参数,但与Linux调用约定不同(请参阅["参数]特此传递"](http://msdn.microsoft.com/en-us/library/zthk2dkh.aspx)部分. (3认同)