Переставить все числа в массиве в обратном порядке - Assembler
Формулировка задачи:
Как это можно реализовать?
Вот что есть на данный момент
Листинг программы
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- int _tmain(int argc, _TCHAR* argv[])
- {
- unsigned char s[] = { 'h','e','l','l','o' };
- unsigned char s_c[5];
- _asm {
- Mov cx, 5
- Mov eax, offset s[0]
- metka:
- ;???
- // Бежим по эл-там
- Add eax, 1
- loop metka
- }
- cout <<s[0];
- int a;
- cin>>a;
- return 0;
- }
Решение задачи: «Переставить все числа в массиве в обратном порядке»
textual
Листинг программы
- #include "stdafx.h"
- #include <iostream>
- int main()
- {
- unsigned char s[5] = { 'h','e','l','l','o' };
- unsigned char s_c[5];
- for (int i = 0; i < 5; i++)
- std::cout << s[i] << " ";
- std::cout << std::endl;
- _asm {
- lea esi, s
- lea edi, s_c
- mov ecx,5
- add edi,4
- next:
- mov al,[esi]
- mov [edi],al
- add esi,1
- sub edi,1
- loop next
- }
- for (int i = 0; i < 5; i++)
- std::cout << s_c[i] << " ";
- std::cout << std::endl;
- system("pause");
- return 0;
- }
Объяснение кода листинга программы
Вывод программы: h e l l o o l l e h В данном коде на языке ассемблера происходит перестановка элементов массива s в обратном порядке в массив s_c. Ассемблерный код выполняет следующие действия:
- lea esi, s — указывает на начало массива s в регистре esi.
- lea edi, s_c — указывает на начало массива s_c в регистре edi.
- mov ecx,5 - инициализирует счётчик цикла ecx равным 5.
- add edi,4 - добавляет к адресу массива s_c 4, сдвигая его на 4 байта вправо.
- mov al,[esi] — читает байт из массива s и сохраняет его в регистре al.
- mov [edi],al — записывает байт из регистра al в массив s_c по адресу, смещённому на ecx байтов влево от edi.
- add esi,1 - увеличивает значение регистра esi на 1, перемещая его на следующий элемент массива s.
- sub edi,1 - уменьшает значение регистра edi на 1, перемещая его на предыдущий элемент массива s_c.
- loop next — выполняет пункты с 5 по 8 для каждого из 5 элементов массива s.
- for (int i = 0; i < 5; i++) — цикл, выполняющий вывод элементов массива s_c.
- std::cout << s_c[i] <<
- std::cout << std::endl; — переход на новую строку. Остальные строки кода обеспечивают ввод, вывод и работу с пользовательским интерфейсом и не относятся к задаче перестановки элементов массива.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д