аргументы nasm / yasm, связь с C ++ - PullRequest
4 голосов
/ 19 марта 2010

У меня вопрос по поводу nasm и его связи с C ++. Я объявляю небольшую тестовую функцию как

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

и я называю это так:

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

метод служит только для отладки сборки и ознакомления с тем, как указатель стека используется для получения аргументов. кроме того, значение аргументов указателя должно быть установлено в 7, чтобы выяснить, как это работает. Это реализовано так:

    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

и скомпилировано с помощью

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

, затем связано с приложением c ++. В режиме отладки все отлично работает. функция вызывается пару раз и работает, как и ожидалось, тогда как в режиме выпуска функция работает один раз, но последующие программные операции не выполняются Мне кажется, что что-то не так с указателями стека / фрейма, рядом / далеко, но я совершенно новичок в этом вопросе и нуждаюсь в небольшой помощи. заранее спасибо! а.

Ответы [ 2 ]

1 голос
/ 20 марта 2010

Ну, похоже, мне нужно сохранить ebx с помощью push / pop.

0 голосов
/ 20 марта 2010

Может быть, это поможет: FLAC использует некоторые источники в ассемблере, предназначенные для компиляции с помощью nasm.

...