我正在编写一个与64位值一起工作的C99编译器。在32位模式下计算64位值
对于初学者,这将编译32位和64位代码。在64位操作系统上,我知道我可以使用r[]x
寄存器。但对于32位代码,我该怎么做。
我试过将值加载到2个寄存器每个(总共4个),但这对大算法不起作用。搜索GCC/LLVM的工作方式会导致垃圾,而且我不想分析他们的源代码。
我希望你们在这里可以帮助我做到这一点。
我正在编写一个与64位值一起工作的C99编译器。在32位模式下计算64位值
对于初学者,这将编译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
对于乘法,MOD,分裂和转移,你可能会想要在运行时注入一个调用函数来执行操作并在EDX上返回结果:EAX。
我的意思是编译64位代码和32位位代码。所以64位的人可以使用它们。 –
但是。这是我想要的。谢谢! –
一些信息在这里http://eli.thegreenplace.net/2010/10/21/64-bit-types-and-arithmetic-on-32-bit-cpus/乘法:http://stackoverflow.com/questions/3190143/how-is-64-bit-math-on-a-32-bit-machine您可以谷歌搜索“32位的64位算术” – nhahtdh