【发布时间】:2019-03-24 16:45:52
【问题描述】:
在 IA-32 架构上,我如何将两个 32 位有符号 值相加/相减并将结果存储在 64 位 (EDX:EAX) 中,同时维护标志?
对于这个 32 位值:
A = 97
B = 232
C = 2147483600
D = 200
如何在 Assembly 中执行 C + A - D + B 并返回 64 位值?
注意:C + A 的结果会溢出 32 位注册表。
在将 C 添加到 A 之后,我尝试使用 adc 函数将进位添加到 edx,但由于它已签名,因此它不会像我假装的那样做。
我为 C+A 尝试过的,但它没有保留标志:
#Prologue
pushl %ebp
movl %esp, %ebp
#Body
movl $0, %edx
movl $0, %ecx
movl $0, %eax
movb 8(%ebp), %al #
movsx %al, %eax #move with sign extention to 32 bit eax
addl 16(%ebp), %eax #adding C + A
adcl $0, %edx
如果 C 是 -97 而 A 是 -2147483600(对于负值),我也会遇到同样的问题。
【问题讨论】:
-
我不太明白你的示例代码。你能告诉我你的整个代码,包括你存储
A和C的位置吗?您的基本方法似乎是正确的。 -
这是更新的,A 值最初是一个 char,由参数给出,并转换为 32 位值添加到 C
-
如果你想做一个 64 位的加法,显然你需要将
al符号扩展成一个 64 位的值。例如,您可以使用movsbl 8(%ebp), %eax; clq将8(%esp)转换为%edx:%eax中的64 位值。