我正在编写一个适用于 64 位值的 C99 编译器。
对于初学者,这将编译 32 位和 64 位代码。在 64 位操作系统上,我知道我可以使用r[]x
寄存器。但是对于 32 位代码,我该怎么做。
我已经尝试将值加载到 2 个寄存器中(总共 4 个),但这不适用于大算术。谷歌搜索 GCC/LLVM 的工作原理会带来垃圾,我不想搜索他们的源代码。
我希望你们在这里可以帮助我做到这一点。
我正在编写一个适用于 64 位值的 C99 编译器。
对于初学者,这将编译 32 位和 64 位代码。在 64 位操作系统上,我知道我可以使用r[]x
寄存器。但是对于 32 位代码,我该怎么做。
我已经尝试将值加载到 2 个寄存器中(总共 4 个),但这不适用于大算术。谷歌搜索 GCC/LLVM 的工作原理会带来垃圾,我不想搜索他们的源代码。
我希望你们在这里可以帮助我做到这一点。
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 上返回结果。