Linux X86-64 汇编和打印



我正在阅读一些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页)

具体说来:

  1. 如果类是 MEMORY,则在堆栈上传递参数。
  2. 如果类为 INTEGER,则使用序列 %rdi、%rsi、%rdx、%rcx、%r8 和 %r9 的下一个可用寄存器。
  3. 如果类为 SSE,则使用下一个可用的矢量寄存器,寄存器按从 %xmm0 到 %xmm7 的顺序获取。
  4. 如果类是 SSEUP,则在上次使用的矢量寄存器的下一个可用八字节块中传递八字节。
  5. 如果类为 X87、X87UP 或 COMPLEX_X87,则会在内存中传递该类。

INTEGER类是适合通用寄存器的任何类,因此您也将用于字符串指针。

相关内容

  • 没有找到相关文章

最新更新