【发布时间】:2017-04-09 07:04:23
【问题描述】:
我在内存中有两个 128 位的十六进制数,例如(小端序):
x:0x12 0x45 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
y:0x36 0xa1 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
我必须在这两个数字之间执行无符号乘法,所以我的新数字将是:
z:0xcc 0xe3 0x7e 0x2b 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
现在,我知道我可以将 x 和 y 的一半移动到 rax 和 rbx 寄存器中,例如,执行 mul 操作,并对另一半执行相同的操作。问题是这样做我失去了结转,我不知道如何避免这种情况。我面临这个问题大约有 4 个小时,我能看到的唯一解决方案是二进制转换 (and shl,1)。
你能就这个问题给我一些意见吗?
我认为最好的解决方案是按标准时间计算一个字节。
【问题讨论】:
-
x86 提供 64 × 64 → 128 乘法,结果在 rdx:rax 中。您可以使用该操作来获得所需的结果。如果您有兴趣,我可以提供详细信息。请告诉我你想要有符号还是无符号乘法。
-
很高兴。乘法必须是无符号的。但我必须做一个 128 x 128 -> 128 乘法。如果它溢出,我只保留最低部分(这是正常的)并设置 OF 标志。告诉我
-
简单:最大数为(2^128)-1
-
@Davide 你对我的回答满意吗?您还需要其他信息吗?
-
@AdrianColomichi 这里的数字太短了,帮不上忙,简单的方法已经只有 3 个乘法
标签: algorithm assembly byte x86-64 multiplication