2

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

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

我已经尝试将值加载到 2 个寄存器中总共 4 个),但这不适用于大算术。谷歌搜索 GCC/LLVM 的工作原理会带来垃圾,我不想搜索他们的源代码。

我希望你们在这里可以帮助我做到这一点。

4

1 回答 1

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

对于乘法、模数、除法和移位,您可能希望在运行时中注入对函数的调用,该函数将执行操作并在 EDX:EAX 上返回结果。

于 2012-07-19T13:16:14.600 回答