我正在編寫一個與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