【问题标题】:x86 Assembly - Add Two 64 Bit Numbersx86 汇编 - 添加两个 64 位数字
【发布时间】: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 位代码。

标签: assembly x86


【解决方案1】:

与小学没有什么不同。

 011
 1234
+5678
=====
 6912

把它分成两半

 11
  34
+ 78
=====
 112

 12
+56
=====
 68

你需要把结转移到上面的加法

 11   <--- carry out hanging off the left
  34
+ 78
=====
  12

  1  <--- carry in from lower level addition
 12
+56
=====
 69

还有 6912。

X86 有一个进位位,应该有一个带进位的加法指令,以将该位(零或一)包含到下一级加法中。

显然,根据您选择的指令,您可以一次添加与存储 8、16、32、64 位一样宽的数字。 100 万位、10 亿位等……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2022-10-15
    相关资源
    最近更新 更多