Вопрос

У меня есть вопрос, касающийся 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 ++.В режиме отладки все работает нормально.функция вызывается пару раз и работает должным образом, тогда как в режиме выпуска функция срабатывает один раз, но последующие операции программы завершаются неудачей.Мне кажется, что что-то не так с указателями стека / фрейма, ближними / дальними, но я совсем новичок в этой теме и нуждаюсь в небольшой помощи.заранее спасибо!a.

Это было полезно?

Решение

Что ж, похоже, что я должен сохранить ebx с помощью push /pop.

Другие советы

Может быть, это помогает: ФЛАК использует некоторые исходные тексты на ассемблере, которые предназначались для компиляции nasm.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top