2012-07-02 43 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

但是。這是我想要的。謝謝! –