Палиндромчик, но с ошибочкой - Assembler

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

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

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
int main(int argc, char* argv[])
{ 
char *text[2]={"yes","no"};
char *fmt="$s";
char s[256];

_asm{  mov   esi,offset s //здесь выдает ошибку:improper operand type
        push  esi
        push  [fmt]
        call  dword ptr[scanf]
        mov   edi,esi
        xor   eax,eax
        repne scasb
        
        a:sub edi,2
          cmp esi,edi
          jae yes
          cmpsb
        je a
        mov  eax,4
        yes:
 
        push dword ptr[text+eax]
        call dword ptr[printf]
        jmp $

}
 
getch();
    return 0;
}

Решение задачи: «Палиндромчик, но с ошибочкой»

textual
Листинг программы
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
int main(int argc, char* argv[])
{ 
char *text[2]={"yes","no"};
char *fmt="%s";
char *s[256];
 
 
 
_asm{  
        lea esi, s 
        push  esi
        push  [fmt]
        call ds:scanf
        add esp,8
        mov   edi,esi
        mov ecx,-1
        xor   eax,eax
        repne scasb
    
        a:sub edi,2
          cmp esi,edi
          jae yes
          cmpsb
        je a
        add eax,4
        yes:
 
        push dword ptr[text+eax]
        call ds:printf
        add esp,4
}
 
_getch();
    return 0;
}

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

  1. Включаются необходимые заголовочные файлы
  2. Определяется переменная text типа массив символов (char*) с двумя элементами: yes и no.
  3. Определяется переменная fmt типа строка (char*) с одним элементом: %s.
  4. Определяется переменная s типа массив символов (char*) на 256 элементов.
  5. Задается последовательность команд на ассемблере, начинающаяся с метки _asm{
  6. Команды на ассемблере выполняются в следующем порядке:
    • lea esi, s
    • push esi
    • push fmt
    • call scanf
    • add esp,8
    • mov edi,esi
    • mov ecx,-1
    • xor eax,eax
    • repne scasb (цикл, пока не найдено байтовое совпадение)
    • sub edi,2 (переход к следующему байту в строке)
    • cmp esi,edi (сравнение двух указателей)
    • jae yes (если указатели совпадают, переход к метке yes)
    • cmpsb (сравнение двух байтов)
    • je a (если байты совпадают, переход к метке a)
    • add eax,4 (увеличение счетчика совпадений на 4)
    • yes: (если байты совпадают)
      • push dword ptr[text+eax] (вызов функции printf с аргументом из массива text)
    • call ds:printf
    • add esp,4
  7. Выполняется функция _getch()
  8. Возвращается 0.

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


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

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

6   голосов , оценка 4 из 5