2

64 ビット値で動作する C99 コンパイラを作成しています。

まず、これは 32 ビットと 64 ビットのコードをコンパイルします。64 ビット オペレーティング システムでは、r[]xレジスタを使用できることがわかっています。しかし、32ビットコードの場合、どうすればよいですか。

値をそれぞれ2 つのレジスタ (合計 4 つ) にロードしようとしましたが、大きな演算では機能しません。GCC/LLVM がどのように機能するかをグーグルで検索すると、ゴミが表示されます。そのソース コードを調べたくありません。

ここにいる皆さんが私がこれを行うのを手伝ってくれることを願っています.

4

1 に答える 1

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に結果を返す関数への呼び出しを挿入することをお勧めします。

于 2012-07-19T13:16:14.600 に答える