gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:04:32 24 4
gpt4 key购买 nike

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

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;

我该如何解决这个问题(最好是对齐常量)。

编辑我也尝试过使用 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;

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

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

最佳答案

这可能根本不是对齐问题。编译器已警告您对 SHUFIDX 的绝对引用将被截断为 32 位。如果地址不在前 4GiB 内,则会导致错误的内存引用。您应该在调试器中检查这一点。

作为一种解决方法,您应该使用 rip-relative 或间接寻址。前者可能看起来像 movdqu xmm1, [rip+SHUFIDX]movdqu xmm1, rel SHUFIDX 或类似的东西。请查阅您的编译器手册。

关于assembly - x64 代码中的对齐问题,Free Pascal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28366918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com