在32位模式下计算64位值

时间:2012-07-02 05:41:20

标签: 64-bit 32-bit cpu-registers arithmetic-expressions

我正在编写一个使用64位值的C99编译器。

对于初学者来说,这将编译32位和64位代码。在64位操作系统上,我知道我可以使用r[]x寄存器。但对于32位代码,我该怎么做。

我已经尝试将值加载到2个寄存器中每个(共4个),但这对大算法不起作用。谷歌搜索GCC / LLVM如何工作会带来垃圾,我不想看到他们的源代码。

我希望你们这里的人能帮助我做到这一点。

1 个答案:

答案 0 :(得分:1)

r64寄存器仅为64位。没有合法的方法可以从32位程序访问它们(即使在64位处理器上)。

对于加载,您可以:

mov r1, LO
mov r2, HI

要添加,请执行

; allocate unused reg r1:r2
mov r1, LO_1
mov r2, HI_1
add r1, LO_2
adc r2, HI_2
jc _int64_add_overflow
; result is r2:r1

减法是对称的:

; allocate unused reg r1:r2
mov r1, LO_1
mov r2, HI_1
sub r1, LO_1
sbb r2, HI_1
jb _int64_sub_underflow
; result is r2:r1

对于multiply,mod,divide和shift,你可能想要在运行时注入一个函数,该函数将执行操作并在EDX上返回结果:EAX。