arguments nasm / de yasm, liaison à C ++
-
21-09-2019 - |
Question
J'ai une question concernant nasm et ses liens avec C ++. Je déclare une fonction de test litte comme
extern "C" void __cdecl myTest( byte i1, byte i2, int stride, int *width );
et je l'appelle comme ceci:
byte i1 = 1, i2 = 2;
int stride = 3, width = 4;
myTest( i1, i2, stride, &width );
la méthode sert uniquement à l'assemblage de débogage et d'avoir un regard sur la façon dont le pointeur de la pile est utilisée pour obtenir les arguments. au-delà, la valeur des arguments de pointeur est fixée à 7, pour savoir comment cela fonctionne. Ceci est mis en œuvre comme ceci:
global _myTest
_myTest:
mov eax, [esp+4] ; 1
mov ebx, [esp+8] ; 2
mov ecx, dword [esp+16] ; width
mov edx, dword [esp+12] ; stride
mov eax, dword [esp+16]
mov dword [eax], 7
ret
et compilé via
yasm -f win32 -g cv8 -m x86 -o "$(IntDir)\$(InputName).obj" "$(InputPath)"
, puis lié à l'application c ++. En mode débogage, tout fonctionne bien. la fonction est appelée deux fois et fonctionne comme prévu, alors que dans le mode de déclenchement de la fonction fonctionne une fois, mais les opérations de programm ultérieures échouent. Il me semble que quelque chose ne va pas avec des pointeurs pile / cadre, proche / lointain, mais je suis tout à fait nouveau à ce sujet et ont besoin d'un peu d'aide. Merci d'avance! a.
La solution
Eh bien, il semble que je dois préserver ebx
via push / pop.