Question

Je suis en train d'appeler la fonction suivante:

long long RtlLargeIntegerDivide(long long dividend, long long divisor, long long* pRemainder)

dans le code assembleur (NASM). Il utilise la convention d'appel stdcall, et il renvoie le quotient. Ce sont les spécifications:

Entrée: [EDX, EAX] (dividende), [ECX, EBX] (diviseur)

Output: [EDX, EAX] (quotient), [ECX, EBX] (suite)

Comment puis-je prendre? (Mon problème principal est pas exactement la compréhension et RASE ESP, et comment ils se rapportent à des variables locales.)

(Et non, ce n'est pas devoir;. Je suis en train de mettre en œuvre une bibliothèque d'exécution wrapper C)

Merci!

Était-ce utile?

La solution

En mode 32 bits, vous ne devez pas utiliser RASE pour accéder aux variables locales du tout, qui est juste un reste de convention de 16 fois de bits et ne nous regarde maintenant de toute façon.

ESP est le pointeur de la pile, je suppose que vous savez que. Vous pouvez « affecter » l'espace pour vos variables locales en décrémentant ESP.

stdcall convention d'appel utilise la pile pour le passage des arguments. Ils sont dans l'ordre normal quand sur la pile, mais si vous utilisez PUSH cela signifie que vous poussez-les inverser. Les valeurs de retour sont intégrées dans EAX (et EDX si nécessaire). La fonction appelée nettoie les arguments de la pile.

Ainsi, le code suivant doit faire ce que vous voulez:

sub  ESP, 8; make room for remainder
push ESP   ; pass pointer to remainder as argument
push ECX
push EBX   ; pass divisor argument
push EDX
push EAX   ; pass dividend argument
call RtlLargeIntegerDivide
; quotient returned in EDX:EAX
; so just load remainder from stack
pop  EBX
pop  ECX

(Pour la vitesse, vous pouvez utiliser MOV au lieu de PUSH / POP)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top