Вызов фунции из ассемблера - Assembler
Формулировка задачи:
Здравствуйте. Есть код, вызывающий несколько функций си и WinAPI. Вот так работает:
А так - нет:
Во втором варианте возникает "Необработанное исключение в "0x00be2160" в "5L0.exe": 0xC0000005: Access violation." после ввода символов. Собственно, вопрос: в чём причина ошибки и как её исправить для запуска функции MessageBox из асссемблера?
void printName() { wchar_t* fmt2=L"%s"; wchar_t name1[255]; wchar_t* obr = L"What is your name?"; wchar_t* obr1 = L"Your name is"; __asm{ push obr; push fmt2; call wprintf; add esp, 8; lea eax, name1; push eax; push fmt2; call wscanf; add esp, 8; } MessageBox(0, name1, obr1, 0); }
void printName() { wchar_t* fmt2=L"%s"; wchar_t name1[255]; wchar_t* obr = L"What is your name?"; wchar_t* obr1 = L"Your name is"; __asm{ push obr; push fmt2; call wprintf; add esp, 8; lea eax, name1; push eax; push fmt2; call wscanf; add esp, 8; push 0; push obr1; push name1; push 0; call MessageBox; } }
Решение задачи: «Вызов фунции из ассемблера»
textual
Листинг программы
push 0; push obr1 lea eax, name1 push eax push 0; call dword ptr MessageBoxW
Объяснение кода листинга программы
В данном коде происходит вызов функции MessageBoxW из библиотеки Windows.h. Код осуществляет следующие действия:
- push 0 - отправляет в стек значение 0.
- push obr1 - отправляет в стек значение переменной obr1.
- lea eax, name1 - выполняет обращение к переменной name1 и сохраняет результат в регистре eax.
- push eax - отправляет в стек значение регистра eax.
- push 0 - отправляет в стек значение 0.
- call dword ptr MessageBoxW - вызывает функцию MessageBoxW, передавая ей в качестве аргументов значения из стека.
Таким образом, код подготавливает и отправляет в функцию MessageBoxW следующие аргументы:
- obr1
- адрес переменной name1
- 0
- 0
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д