Pergunta

Eu tenho uma pergunta sobre o NASM e sua ligação ao C ++. Eu declaro uma função de teste Litte como

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

E eu chamo assim:

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

O método serve apenas para depurar a Assembléia e dar uma olhada em como o ponteiro da pilha é usado para obter os argumentos. Além disso, o valor dos argumentos do ponteiro deve ser definido como 7, para descobrir como isso funciona. Isso é implementado assim:

    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

e compilado via

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

, depois vinculado ao aplicativo C ++. No modo de depuração, tudo funciona bem. A função é chamada algumas vezes e funciona conforme o esperado, enquanto no modo de liberação a função funciona uma vez, mas as operações subsequentes de programação falham. Parece -me que algo está errado com os ponteiros da pilha/quadro, perto/longe, mas sou bastante novo nesse assunto e preciso de uma pequena ajuda. desde já, obrigado! uma.

Foi útil?

Solução

Bem, parece que eu tenho que preservar ebx via push/pop.

Outras dicas

Pode ser que isso ajude: Flac usa algumas fontes no assembler que destinam -se a ser compiladas pelo NASM.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top