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.

Était-ce utile?

La solution

Eh bien, il semble que je dois préserver ebx via push / pop.

Autres conseils

Peut-être cela aide. utilise FLAC certaines sources en assembleur qui destinés à être compilé par nasm

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