2012-07-02 39 views
2

我正在编写一个与64位值一起工作的C99编译器。在32位模式下计算64位值

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

我试过将值加载到2个寄存器每个(总共4个),但这对大算法不起作用。搜索GCC/LLVM的工作方式会导致垃圾,而且我不想分析他们的源代码。

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

+0

一些信息在这里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

回答

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 

对于乘法,MOD,分裂和转移,你可能会想要在运行时注入一个调用函数来执行操作并在EDX上返回结果:EAX。

+0

我的意思是编译64位代码和32位位代码。所以64位的人可以使用它们。 –

+0

但是。这是我想要的。谢谢! –