Палиндромчик, но с ошибочкой - 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; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяется переменная
text
типа массив символов (char*) с двумя элементами:yes
иno
. - Определяется переменная
fmt
типа строка (char*) с одним элементом:%s
. - Определяется переменная
s
типа массив символов (char*) на 256 элементов. - Задается последовательность команд на ассемблере, начинающаяся с метки
_asm{
- Команды на ассемблере выполняются в следующем порядке:
- 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
- Выполняется функция _getch()
- Возвращается 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д