аргументы nasm / yasm, привязка к C ++
-
21-09-2019 - |
Вопрос
У меня есть вопрос, касающийся 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.