Переставить все числа в массиве в обратном порядке - 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] <<
; — вывод элемента массива s_c. - std::cout << std::endl; — переход на новую строку. Остальные строки кода обеспечивают ввод, вывод и работу с пользовательским интерфейсом и не относятся к задаче перестановки элементов массива.