argumentos nasm / yasm, unión a C ++
-
21-09-2019 - |
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.
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