【发布时间】:2020-09-11 01:56:50
【问题描述】:
我正在尝试在 x86 程序集中编写此代码(X[i] 和 C 是 64 位数字)。假设 A[i] 的内存地址存储在 ebx 中,C 存储在 edx 中。
for(int i = 0; i <= 100; i++) {
A[i] = A[i] + C
}
我非常了解如何访问内存中的值。因为我有 32 位寄存器,所以我相信我需要做两次加法:一个用于每个操作数的低 32 位,一个用于高 32 位。
比如:
mov rax, [A[i]_bits0_15]
add rax, [C_bits0_15]
mov [A[i]_bits0_15], rax
mov rbx, [A[i]_bits16_31]
adc rbx, [C_bits16_31]
mov [A[i]_bits16_31], rbx
我在正确的轨道上吗?我不确定如何使用正确的符号从内存中添加低/高 32 位,这样也有助于查看。
【问题讨论】:
-
您的尺寸组合令人困惑。您在标题中提到了 64 位数字,32 位寄存器,您的示例代码使用 64 位寄存器,但暗示它想要读取每个数字的 16 位。
-
这些是 64 位寄存器,在 x86-64 上您只需要一个 qword
add。 (除非你想实现 128 位整数数学)。您当然可以使用 dword add + adc,但效率较低。查看 gcc 输出 (godbolt.org) 的unsigned long long和-m32,或unsigned __int128的普通 64 位代码。