【发布时间】:2019-06-23 23:33:47
【问题描述】:
我想将两个 12 字节的数字相加,并将结果存储在 16 字节的 var 中。我该怎么做?
section .data
big_num1 dd 0x11111111, 0x22222222, 0x33333333
big_num2 dd 0xffffffff, 0x22222222, 0x33333333
section .bss
result_4word resd 4
我想我可以将数字 1 的前 4 个字节数字与数字 2 的其他前 4 个字节相加,依此类推.. 但我不知道如何在我的结果变量中连接结果。 如果需要,我该怎么做? 这个解决方案合适吗?
xor eax, eax
xor ebx, ebx
mov ecx, 3
loop1:
mov eax, dword[big_num1+4*(ecx-1)]
mov ebx, dword[big_num2+4*(ecx-1)]
mov [result_4word+4*(ecx-1)], eax
adc [result_4word+4*(ecx-1)], ebx
loop loop1
【问题讨论】:
-
阅读指令集参考中
adc的条目。 -
您无需验证任何内容。
adc会为你做这件事。用add添加最低的双字,其余的使用adc。完成。 -
是的,但这是
adc的明确目的,因此您不必手动操作。 -
它确实有效,但你只有最后添加的一个进位,你不能将它存储在任何地方。
-
操作数和结果的大小仅受内存限制。如果您想将 100 万位数字添加到另一个 100 万位数字中,超级简单。第一个字节/字/双字无论您选择使用添加,其余使用 adc。
标签: assembly x86 bigint carryflag extended-precision