Корректное получение адреса элемента - Assembler

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

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

Имеется следующие задание: Дан массив A из 16 байтов. Скопировать его в массив B, заменяя числа, большие –3, единицами. Сосчитать количество таких элементов. В массив C поместить адреса (смещения) этих элементов. Необходимо реализовать на ассемблере в вставке в VS. Собственно, я реализовал почти все, кроме одного момента: не получается получить адрес элементов массива, которые были заменены. Для получения адреса элемента массива B и присвоение этого адреса массиву C пытаюсь использовать следующее:
XOR EBX, EBX;
    LEA EBX, massiv_B[EAX];
    MOV  massiv_C[4*EAX], EBX;
При этом:
signed char massiv_B[16];
       unsigned int massiv_C[16] = {0};
И на выходе я получаю, что элементы массива не стоят в блоке, то есть не друг за другом. И к тому же, в массиве С элементы стоят не правильно. Как с этим бороться? На скриншоте внизу массив массив показывает, какой элемент был заменен.

Решение задачи: «Корректное получение адреса элемента»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
char A[16] = {-5,2,4,-2,-5,-7,9,2,10,11,2,-5,-9,-3,3,0};
char B[16];
unsigned long C[16] = {0};
int i;
 
__asm
 {
 MOV ECX, 16
 CYCLE:
  CMP A[ECX-1], -3
  JLE LEFT
  JMP RIGHT
        // Если меньше или равно -3
 
  LEFT:
   MOV BL, A[ECX-1];
   MOV B[ECX-1], BL;
   MOV C[ECX-1], 0;
   LOOP CYCLE;
 JMP STOP
        // Если больше -3
  RIGHT:
   MOV B[ECX-1], 1;
   LEA EBX,B[ECX-1];
   MOV  C[4*ECX-4], EBX;
   LOOP CYCLE;
 STOP:
 }
 
printf("A: ");
for(i = 0; i < 16; i++) printf("%i ", A[i]);
printf("\nB: ");
for(i = 0; i < 16; i++) printf("%i ", B[i]);
printf("\nC: ");
for(i = 0; i < 16; i++) printf(" %i ", C[i]);
printf("\n");
return 0;
}

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

  1. Программа начинается с объявления трех массивов: A, B и C.
  2. Массив A содержит 16 элементов, которые представляют собой целые числа.
  3. Массив B изначально пуст и будет использоваться для хранения результатов.
  4. Массив C содержит 16 элементов, которые представляют собой значения для подсчета количества элементов в массиве A.
  5. Затем в коде присутствует блок ассемблера, который выполняет следующие действия:
    • Переменная ECX инициализируется значением 16, которая представляет собой размер массива A.
    • Затем происходит цикл, который выполняется 16 раз.
    • В каждой итерации цикла происходит сравнение значения элемента массива A с -3.
    • Если значение элемента меньше или равно -3, то выполняется блок кода для левого элемента.
    • Если значение элемента больше -3, то выполняется блок кода для правого элемента.
    • После выполнения всех итераций цикла выполняется блок кода для остановки.
  6. Затем в основной части программы происходит печать значений массивов A, B и C.
  7. Значения массива A выводятся с пробелами в качестве разделителей.
  8. Значения массива B выводятся с пробелами в качестве разделителей.
  9. Значения массива C выводятся с пробелами в качестве разделителей.
  10. Программа завершается возвратом значения 0, что указывает на успешное выполнение.

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


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

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

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