Переставить все числа в массиве в обратном порядке - 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. Ассемблерный код выполняет следующие действия:

  1. lea esi, s — указывает на начало массива s в регистре esi.
  2. lea edi, s_c — указывает на начало массива s_c в регистре edi.
  3. mov ecx,5 - инициализирует счётчик цикла ecx равным 5.
  4. add edi,4 - добавляет к адресу массива s_c 4, сдвигая его на 4 байта вправо.
  5. mov al,[esi] — читает байт из массива s и сохраняет его в регистре al.
  6. mov [edi],al — записывает байт из регистра al в массив s_c по адресу, смещённому на ecx байтов влево от edi.
  7. add esi,1 - увеличивает значение регистра esi на 1, перемещая его на следующий элемент массива s.
  8. sub edi,1 - уменьшает значение регистра edi на 1, перемещая его на предыдущий элемент массива s_c.
  9. loop next — выполняет пункты с 5 по 8 для каждого из 5 элементов массива s.
  10. for (int i = 0; i < 5; i++) — цикл, выполняющий вывод элементов массива s_c.
  11. std::cout << s_c[i] << ; — вывод элемента массива s_c.
  12. std::cout << std::endl; — переход на новую строку. Остальные строки кода обеспечивают ввод, вывод и работу с пользовательским интерфейсом и не относятся к задаче перестановки элементов массива.

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


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

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

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