我正在阅读一些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
它由海湾合作委员会编译为:
gcc tmp.S -o tmp
Linux(和Windows)x86-64调用约定的前几个参数不在堆栈上,而是在寄存器中
见 http://www.x86-64.org/documentation/abi.pdf(第20页)
具体说来:
- 如果类是 MEMORY,则在堆栈上传递参数。
- 如果类为 INTEGER,则使用序列 %rdi、%rsi、%rdx、%rcx、%r8 和 %r9 的下一个可用寄存器。
- 如果类为 SSE,则使用下一个可用的矢量寄存器,寄存器按从 %xmm0 到 %xmm7 的顺序获取。
- 如果类是 SSEUP,则在上次使用的矢量寄存器的下一个可用八字节块中传递八字节。
- 如果类为 X87、X87UP 或 COMPLEX_X87,则会在内存中传递该类。
INTEGER
类是适合通用寄存器的任何类,因此您也将用于字符串指针。