2 Stimmen

Berechnung von 64-Bit-Werten im 32-Bit-Modus

Ich schreibe einen C99-Compiler, der mit 64-Bit-Werten arbeitet.

Zunächst wird damit 32-Bit- und 64-Bit-Code kompiliert. Ich weiß, dass ich auf 64-Bit-Betriebssystemen die r[]x Register. Aber für den 32-Bit-Code, wie mache ich es.

Ich habe versucht, den Wert in 2 Registern zu laden jede (4 insgesamt), aber das funktioniert nicht bei großer Arithmetik. Googeln, wie GCC/LLVM funktioniert, bringt Müll, und ich will nicht ihren Quellcode zu schnorren.

Ich hoffe, dass ihr mir dabei helfen könnt.

1voto

SecurityMatt Punkte 6275

Die r64-Register sind nur 64-Bit-Register. Es gibt keine legitime Möglichkeit, von einem 32-Bit-Programm aus auf sie zuzugreifen (selbst auf einem 64-Bit-Prozessor).

Für die Last, die du tust:

mov r1, LO
mov r2, HI

Für add you do

; 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

Subtrahieren ist symmetrisch:

; 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

Für Multiplikation, Modifikation, Division und Verschiebung werden Sie wahrscheinlich einen Aufruf an eine Funktion in die Laufzeit einfügen wollen, die die Operation durchführt und das Ergebnis auf EDX:EAX zurückgibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X