Корректное получение адреса элемента - 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, что указывает на успешное выполнение.