相关疑难解决方法(0)

是否为少于四个参数的函数保留了必要的堆栈空间?

刚开始学习x64程序集,我对函数,参数和堆栈有疑问.据我所知,函数中的前四个参数传递给Windows中的rcx,rdx,r8和r9寄存器(以及浮点数的xmm0-xmm3).所以带有四个参数的简单加法函数如下所示:

add:
   mov r10, rcx
   add r10, rdx
   add r10, r8
   add r10, r9
   mov rax, r10
   ret
Run Code Online (Sandbox Code Playgroud)

但是,我遇到的文档提到了这一点:

每个函数至少必须在堆栈上保留32个字节(4个64位值).该空间允许将传递到函数中的寄存器轻松复制到众所周知的堆栈位置.不需要被调用函数将输入寄存器参数溢出到堆栈,但堆栈空间预留确保它可以在需要时使用.

所以,我必须预留堆栈空间,即使我做的功能需要四个参数或更低,或者是它只是一个建议?

64-bit assembly stack cpu-registers

18
推荐指数
1
解决办法
4031
查看次数

x64 代码中的对齐问题,Free Pascal

如果针对 32 位进行编译(使用适用的寄存器重命名),下面的代码可以正常工作。但它在执行时会抛出错误(并且“警告:目标文件“project1.o”包含到符号“.data.n_tc_p$project1_orbitkeyheader64$int64$longint$$int64_shufidx”的32位绝对重定位。”编译时)。

function SwapBytes64(const Val: Int64): Int64;
{$A 16}
const
  SHUFIDX : array [0..1] of Int64 = ($0001020304050607, 0);
begin
asm
  movq          xmm0, rcx
  pshufb        xmm0, SHUFIDX    // throws
  movq          rax, xmm0
end;
end;
Run Code Online (Sandbox Code Playgroud)

我该如何纠正这个问题(最好是对齐常数)。

编辑 我也尝试使用 movdqu。

答案 这是@Jester 答案的结果:

function SwapBytes64(const Val: Int64): Int64;
const
  SHUFIDX : array [0..1] of Int64 = ($0001020304050607, 0);
begin
asm
  movq          xmm0, rcx
  movdqu        xmm1, [rip+SHUFIDX]
  pshufb        xmm0, xmm1
  movq          rax, xmm0
end;
end;
Run Code Online (Sandbox Code Playgroud)

这也有效,但没有明显的速度优势:

function SwapBytes64(const Val: Int64): Int64;
const …
Run Code Online (Sandbox Code Playgroud)

assembly freepascal lazarus

3
推荐指数
1
解决办法
820
查看次数

C语言全局数组位于其反汇编代码中的哪个位置

我写了一个非常简单的C代码如下:

int data_items[] = {3,67,32,4,89,6,34,2,9,0};

int max(int* pt)
{
  int val = *pt;
  while(*pt != 0)
  {
    if (*pt > val)
    {
      val = *pt;
    }
    ++pt;
  }
  return val;
}

int main()
{

  max(data_items);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我用gcc编译它:

gcc main.c

然后将其拆解为:

objdump -d a.out

最后我得到了汇编代码:

a.out:     file format elf64-x86-64


Disassembly of section .init:

00000000004003a8 <_init>:
  4003a8:   48 83 ec 08             sub    $0x8,%rsp
  4003ac:   48 8b 05 45 0c 20 00    mov    0x200c45(%rip),%rax        # 600ff8 <_DYNAMIC+0x1d0>
  4003b3:   48 85 c0 …
Run Code Online (Sandbox Code Playgroud)

c assembly

2
推荐指数
1
解决办法
507
查看次数

标签 统计

assembly ×3

64-bit ×1

c ×1

cpu-registers ×1

freepascal ×1

lazarus ×1

stack ×1