Не работает ассемблерная вставка Masm32 в C++ - Assembler
Формулировка задачи:
Добрый вечер мы в институте учим ассемблерные вставки. Я пользуюсь Visual studio 2012.
Пытаюсь скомпилировать код-пример из пары:
Код (кажется) компилируется,но при исполнеии выдает ошибку-окно, да и Log много чего пишет. Что я делаю не так ?
#include <stdio.h> int main(){ char s[100]; _asm{ mov edi,scanf mov ecx,0 call edi l: xor edx,edx xor al,al pop byte ptr [edx] cmp byte ptr[edx],0 je l2 mov al,byte ptr [edx] mov s[ecx],al inc ecx jmp l l2: dec ecx mov edx,ecx xor bl,bl mov bl, s[0] cmp bl, 'A' jb pr2 cmp bl, 'Z' ja pr2 l3: xor bl,bl mov bl,s[ecx] cmp bl,s[0] je pr2 loop l3 jmp pr1 pr2: pr1: } }
Решение задачи: «Не работает ассемблерная вставка Masm32 в C++»
textual
Листинг программы
#include <stdio.h> int i ; char* str = "%i" ; void main() { __asm { push offset i push _str call scanf add esp, 8 } printf(str, i) ; }
Объяснение кода листинга программы
- Объявлена переменная типа int i.
- Объявлена переменная типа char* str, которая содержит строку
%i
. - В функции main() встроенная функция scanf вызывается с двумя аргументами: как указатель на строку для чтения и как указатель на целочисленную переменную.
- Выполняется добавление к стеку адреса i и строки str.
- Из стека удаляются два последних элемента (i и str), и в стек добавляется новый элемент, значение которого равно сумме предыдущего значения стека и 8.
- Выполняется printf с аргументом, который является указателем на строку, и значение переменной i подставляется в строку.
- Значение переменной i выводится на экран.