Корректное получение адреса элемента - 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, что указывает на успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д