0

我编译代码

gcc -g3 hello3.s -o 你好

.data

ssttrr:
  .string "%d\n"

.text
.globl main

main:

  mov $213, %rdx
  push %rdx
  push $ssttrr
  call printf
  add  $8, %rsp

mov  $60, %rax
xor  %rdi, %rdi
syscall

我理解错误,但我不知道如何修复它。我什至不知道什么时候出错。cpy:intel-64 操作系统:debian

4

1 回答 1

1

x86_64 的默认调用约定已经改变,它现在不仅使用堆栈,还使用寄存器来传递参数:

通过

一旦参数被分类,寄存器被分配(按从左到右的顺序)用于传递,如下所示:

  1. 如果类是 MEMORY,则在堆栈上传递参数。
  2. 如果类是整数,则使用序列 %rdi、%rsi、%rdx、%rcx、%r8 和 %r9 的下一个可用寄存器*
  3. 如果类是 SSE,则使用下一个可用的 SSE 寄存器,寄存器按从 %xmm0 到 %xmm7 的顺序获取。

...

*请注意,%r11 既不需要保留,也不需要用于传递参数。使该寄存器可用作临时寄存器意味着 PLT 中的代码在计算控制需要转移到的地址时不需要溢出任何寄存器。%raxis 用于指示传递给需要可变数量参数的函数的 SSE 参数的数量。%r10 用于传递函数的静态链指针。

您可能希望分别在 %rdi 和 %rsi 寄存器中传递字符串和整数值,而不是将它们直接推入堆栈:

mov $213, %esi ;%d is not a 64-bit integer
mov $ssttrr, %rdi
mov $0, %rax ;no sse registers as arguments
call printf
于 2013-04-15T14:52:01.907 回答