我正在编写一个使用64位值的C99编译器。
对于初学者来说,这将编译32位和64位代码。在64位操作系统上,我知道我可以使用r[]x
寄存器。但对于32位代码,我该怎么做。
我已经尝试将值加载到2个寄存器中每个(共4个),但这对大算法不起作用。谷歌搜索GCC / LLVM如何工作会带来垃圾,我不想看到他们的源代码。
我希望你们这里的人能帮助我做到这一点。
答案 0 :(得分: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
对于multiply,mod,divide和shift,你可能想要在运行时注入一个函数,该函数将执行操作并在EDX上返回结果:EAX。