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页)
特别:
- 如果类是MEMORY,则在堆栈上传递参数.
- 如果类是INTEGER,则使用序列%rdi,%rsi,%rdx,%rcx,%r8和%r9的下一个可用寄存器.
- 如果类是SSE,则使用下一个可用的向量寄存器,寄存器按从%xmm0到%xmm7的顺序获取.
- 如果类是SSEUP,则在最后使用的向量寄存器的下一个可用的8字节块中传递8字节.
- 如果类是X87,X87UP或COMPLEX_X87,则它将在内存中传递.
这个INTEGER类是适合通用寄存器的任何东西,所以这也是你用于字符串指针的东西.