ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.02.2024
Просмотров: 5
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Лабораторная работа №13
Тема: Косвенная и базовая адресация. Работа с массивами
Косвенная адресация состоит в следующем. Если адрес ячейки содержится в регистре, например, EAX, то для того, чтобы послать туда число 100, нужно написать MOV BYTE PTR [EAX], 100. Префикс BYTE PTR указывает, что в операции участвует однобайтовая ячейка памяти (можно использовать WORD PTR, DWORD PTR – это будет соответствовать двух- и четырехбайтовому операнду). Чтобы получить адрес ячейки памяти, используется команда LEA.
ПРИМЕР КОДА
ЗАДАНИЕ: Имеется массив целых чисел. Вывести сумму первых 3х элементов.
/* использование косвенной адресации */
#include
#include
#include
using namespace std;
int main()
{
BYTE ar[6] = { 1, 12, 128, 50, 200, 10 }; // статический массив типа BYTE
BYTE a1, a2, a3, a4, a5, sum; // 8-битные беззнаковые числа
WORD b1, b2; // 16-битные беззнаковые числа
DWORD c; // 32-битное беззнаковое число
__asm {
LEA EBX, ar; // загрузка эффективного адреса первого элемента массива
// ar в регистр EAX
MOV AL, BYTE PTR[EBX]; // помещаем в регистр AL число (типа BYTE)
// число, записанное по адресу, хранящемуся
// в регистре EBX, то есть первый элемент массива
MOV a1, AL; // записываем содержимое регистра AL в переменную a
/*помещаем в переменную a2 число, записанное по адресу "начало массива
плюс 1 байт", то есть по адресу второго элемента массива*/
MOV AH, BYTE PTR[EBX] + 1;
MOV a2, AH;
Add AH, AL;
MOV CH, BYTE PTR[EBX] + 2;
MOV a2, CH;
Add CH, AH;
MOV sum, CH;
/*помещаем в переменную a3 число, записанное по адресу "число, записанное в
регистре EBX плюс 1", то есть по адресу второго элемента массива*/
MOV AL, BYTE PTR[EBX + 1];
MOV a3, AL;
/*помещаем в переменную a4 число, записанное по адресу "номер,
хранящийся в регистре EDX, начиная с номера, записанного регистре EBX",
то есть второй элемент массива*/
MOV EDX, 1;
MOV AL, BYTE PTR[EBX][EDX];
MOV a4, AL;
/*помещаем в переменную a5 число, записанное по адресу "сумма чисел,
записанных в регистрах EBX и EDX", то есть второй элемент массива*/
MOV AL, BYTE PTR[EBX + EDX];
MOV a5, AL;
};
printf("1 element of array a1 = %u \n", a1);
printf("2 element of array a2 = %u \n", a2);
printf("2 element of array (another way) a3 = %u \n", a3);
printf("2 element of array (base addressation) a4 = %u \n", a4);
printf("2 element of array (base addr. - another way) a5 = %u \n", a5);
printf("sum = %u \n", sum);
_getch();
}
ВАРИАНТЫ ЗАДАНИЙ
Вариант | Задание |
1 | Имеется массив целых чисел {1, 2, 3, 4, 5} a) Вывести сумму 2+3+5 – чисел = элементов массива, используя косвенную адресацию б)* найти сумму всех элементов с помощью цикла |
2 | Имеется массив целых чисел {7, 8, 12} a) Вывести сумму 12+8-7 – чисел = элементов массива, используя косвенную адресацию б)* найти произведение всех элементов с помощью цикла |
3 | Имеется массив целых чисел {7, 8, 12, 10,} a) Вывести сумму 12+8-7 – чисел = элементов массива, используя базовую адресацию б)* найти сумму первых 3х элементов с помощью цикла |
4 | Имеется массив целых чисел {1, 3, 12, 10,} a) Вывести разность чисел 10-3 = элементов массива, используя базовую адресацию б)* найти сумму последних 2х элементов с помощью цикла |
5 | Имеется массив целых чисел {5, 3, 12, 10,} a) если 3й элемент больше 2го то вывести эту разность, используя косвенную базовую адресацию б)* найти произведение последних 2х элементов с помощью цикла |
6 | Имеется массив целых чисел {5, 3, 12, 10,} a) найти сумму 12+10 элементов массива, используя базовую адресацию б)* найти максимальный элемент массива с помощью цикла |
7 | Имеется массив целых чисел {-2, 3, 12,13, 10,} a) Вывести произведение -2*3 = элементов массива, используя базовую адресацию б)* найти сумму 3+12+13 элементов с помощью цикла |
8 | Имеется массив целых чисел {7, 8, 12, 10,} a) если все числа больше нуля то вывести 3й элемент массива, используя базовую адресацию б)* найти разность первых 3х элементов с помощью цикла |
9 | Имеется массив целых чисел {15, 13, 2, 10,} a) найти разность 13-2 элементов массива, используя базовую адресацию б)* найти минимальный элемент массива с помощью цикла |
10 | Имеется массив целых чисел {16, 27, 3, 4, 5} a) Вывести сумму 16+2+10 – чисел = элементов массива, используя косвенную адресацию б)* найти если числа массива больше 0 то вывести сумму всех элементов с помощью цикла |
11 | Имеется массив целых чисел {1, 18, 12, 15, 5} a) Вывести произведение 1*18*12 – чисел = элементов массива, используя косвенную адресацию б)* найти произведение всех четных элементов с помощью цикла (1*12*5) |
12 | Имеется массив целых чисел {7, 8, 12, 10,} a) Вывести сумму 12-8*7 – чисел = элементов массива, используя базовую адресацию б)* найти сумму всех нечетных элементов с помощью цикла (8+10) |
13 | Имеется массив целых чисел {1, 3, 12, 10,} a) Вывести сумму чисел 1+3+12= элементов массива, используя базовую адресацию б)* найти произведение последних 2х элементов с помощью цикла |