Pregunta

Tengo una pregunta relativa a nasm y su vinculación con C ++. Declaro una función de prueba litte como

extern "C" void __cdecl myTest( byte i1, byte i2, int stride, int *width );

y yo lo llamo así:

byte i1 = 1, i2 = 2;
int stride = 3, width = 4;
myTest( i1, i2, stride, &width );

el método sólo sirve para el montaje de depuración y echar un vistazo a cómo se utiliza el puntero de pila para obtener los argumentos. más allá de eso, el valor de los argumentos de puntero se pondrá a 7, para averiguar cómo funciona. Esto se implementa como esto:

    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

y compilado a través de

yasm -f win32 -g cv8 -m x86 -o "$(IntDir)\$(InputName).obj" "$(InputPath)"

, a continuación, vinculado a la aplicación c ++. En el modo de depuración, todo funciona bien. la función se llama un par de veces y funciona como se esperaba, mientras que en el modo de disparo de la función funciona una vez, pero las operaciones posteriores program falle. Me parece que algo anda mal con los punteros de pila / marco, cerca / lejos, pero estoy bastante nuevo en este tema y necesita un poco de ayuda. ¡gracias por adelantado! a.

¿Fue útil?

Solución

Bueno, parece que tengo para preservar ebx a través de push / pop.

Otros consejos

Puede ser que esto ayuda a:. FLAC utiliza algunas fuentes en ensamblador, que pretenden ser compilado por nasm

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top