Корректное получение адреса элемента - 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;
- }
Объяснение кода листинга программы
- Программа начинается с объявления трех массивов: A, B и C.
- Массив A содержит 16 элементов, которые представляют собой целые числа.
- Массив B изначально пуст и будет использоваться для хранения результатов.
- Массив C содержит 16 элементов, которые представляют собой значения для подсчета количества элементов в массиве A.
- Затем в коде присутствует блок ассемблера, который выполняет следующие действия:
- Переменная ECX инициализируется значением 16, которая представляет собой размер массива A.
- Затем происходит цикл, который выполняется 16 раз.
- В каждой итерации цикла происходит сравнение значения элемента массива A с -3.
- Если значение элемента меньше или равно -3, то выполняется блок кода для левого элемента.
- Если значение элемента больше -3, то выполняется блок кода для правого элемента.
- После выполнения всех итераций цикла выполняется блок кода для остановки.
- Затем в основной части программы происходит печать значений массивов A, B и C.
- Значения массива A выводятся с пробелами в качестве разделителей.
- Значения массива B выводятся с пробелами в качестве разделителей.
- Значения массива C выводятся с пробелами в качестве разделителей.
- Программа завершается возвратом значения 0, что указывает на успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д