и в чат я зашел из-за трабла с обращением с стеку после вызова call. Здесь разрешены скрины?
Пару дней ? Это сильно
Дай угадаю, ты делаешь esp+4 после создания кадра стэка. Но ты не учитываешь, что call заносит в стэк адрес возврата. Т.е делает ещё push, поэтому нужно смещение esp+8
Я учитываю, что call добавляет в стек адрес возврата
Аргументы у тебя берутся правильно. Отладь и посмотри, что у тебя будет в LastError Подозреваю, что ты передаёшь в CharsWritten = 0. Лучше так не делать, и передать адрес, который для этого будет предназначен: reserved: dd 0 ... push 0 push reserved push ecx push ebx push eax call dword[WriteConsoleA] И ещё лучше не делай бесконечный цикл. У тебя есть WinAPI и msvcrt. Тут подошёл бы msvcrt.getchar
ты стек не вырпвниваешь в конце подпрограммы. перед ret у тя вершина смотрит на параметр, а не на адрес возврата. и вообще принято делать пролог-эпилог и адресоваться к параметрам и локальным переменным через ebp
stdcall сам выравнивает стек, делая ret 4 * argcount
Не, там всё нормально с возвратом. В документации не написано, что CharsWritten можно писать 0. Из-за этого ошибка, скорее всего.
а в чём тут разница между invoke и stdcall?
а ещё твоя подпрограмма стек не почистила как полагается, аргументы надо убирать из стека с помощью ret
ну вот пртмер для српвнения stdcall myproc invoke [myproc] это валидная запись вызова процедур
а в чём разница, stdcall понятно, для соглашения stdcall, а invoke для какого?
или invoke это косвенный stdcall?
для импортированных функций, алреса которых находятся в секции импорта. вызов к ним идет через переменную, в которой содержится адрес
а для cdecl вариант есть?
а если импортированный?
Обсуждают сегодня