Не работает ассемблерная вставка Masm32 в C++ - Assembler

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

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

Добрый вечер мы в институте учим ассемблерные вставки. Я пользуюсь Visual studio 2012. Пытаюсь скомпилировать код-пример из пары:
#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:    
    
}
}
Код (кажется) компилируется,но при исполнеии выдает ошибку-окно, да и Log много чего пишет. Что я делаю не так ?

Решение задачи: «Не работает ассемблерная вставка 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) ;
}

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

  1. Объявлена переменная типа int i.
  2. Объявлена переменная типа char* str, которая содержит строку %i.
  3. В функции main() встроенная функция scanf вызывается с двумя аргументами: как указатель на строку для чтения и как указатель на целочисленную переменную.
  4. Выполняется добавление к стеку адреса i и строки str.
  5. Из стека удаляются два последних элемента (i и str), и в стек добавляется новый элемент, значение которого равно сумме предыдущего значения стека и 8.
  6. Выполняется printf с аргументом, который является указателем на строку, и значение переменной i подставляется в строку.
  7. Значение переменной i выводится на экран.

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

9   голосов , оценка 4.333 из 5
Похожие ответы