Вызов фунции из ассемблера - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть код, вызывающий несколько функций си и WinAPI. Вот так работает:
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;
        
    }
}
Во втором варианте возникает "Необработанное исключение в "0x00be2160" в "5L0.exe": 0xC0000005: Access violation." после ввода символов. Собственно, вопрос: в чём причина ошибки и как её исправить для запуска функции MessageBox из асссемблера?

Решение задачи: «Вызов фунции из ассемблера»

textual
Листинг программы
        push    0;
        push    obr1
        lea eax, name1
    push    eax
        push    0;
        call    dword ptr MessageBoxW

Объяснение кода листинга программы

В данном коде происходит вызов функции MessageBoxW из библиотеки Windows.h. Код осуществляет следующие действия:

  1. push 0 - отправляет в стек значение 0.
  2. push obr1 - отправляет в стек значение переменной obr1.
  3. lea eax, name1 - выполняет обращение к переменной name1 и сохраняет результат в регистре eax.
  4. push eax - отправляет в стек значение регистра eax.
  5. push 0 - отправляет в стек значение 0.
  6. call dword ptr MessageBoxW - вызывает функцию MessageBoxW, передавая ей в качестве аргументов значения из стека. Таким образом, код подготавливает и отправляет в функцию MessageBoxW следующие аргументы:
    • obr1
    • адрес переменной name1
    • 0
    • 0

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5