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

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

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

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

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. char A[16] = {-5,2,4,-2,-5,-7,9,2,10,11,2,-5,-9,-3,3,0};
  7. char B[16];
  8. unsigned long C[16] = {0};
  9. int i;
  10.  
  11. __asm
  12.  {
  13.  MOV ECX, 16
  14.  CYCLE:
  15.   CMP A[ECX-1], -3
  16.   JLE LEFT
  17.   JMP RIGHT
  18.         // Если меньше или равно -3
  19.  
  20.   LEFT:
  21.    MOV BL, A[ECX-1];
  22.    MOV B[ECX-1], BL;
  23.    MOV C[ECX-1], 0;
  24.    LOOP CYCLE;
  25.  JMP STOP
  26.         // Если больше -3
  27.   RIGHT:
  28.    MOV B[ECX-1], 1;
  29.    LEA EBX,B[ECX-1];
  30.    MOV  C[4*ECX-4], EBX;
  31.    LOOP CYCLE;
  32.  STOP:
  33.  }
  34.  
  35. printf("A: ");
  36. for(i = 0; i < 16; i++) printf("%i ", A[i]);
  37. printf("\nB: ");
  38. for(i = 0; i < 16; i++) printf("%i ", B[i]);
  39. printf("\nC: ");
  40. for(i = 0; i < 16; i++) printf(" %i ", C[i]);
  41. printf("\n");
  42. return 0;
  43. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы