Файл: Косвенная и базовая адресация. Работа с массивами.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.02.2024

Просмотров: 5

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторная работа №13
Тема: Косвенная и базовая адресация. Работа с массивами

Косвенная адресация состоит в следующем. Если адрес ячейки содержится в регистре, например, EAX, то для того, чтобы послать туда число 100, нужно написать MOV BYTE PTR [EAX], 100. Префикс BYTE PTR указывает, что в операции участвует однобайтовая ячейка памяти (можно использовать WORD PTRDWORD PTR – это будет соответствовать двух- и четырехбайтовому операнду). Чтобы получить адрес ячейки памяти, используется команда LEA.


ПРИМЕР КОДА
ЗАДАНИЕ: Имеется массив целых чисел. Вывести сумму первых 3х элементов.
/* использование косвенной адресации */

#include // необходим для работы printf

#include // необходим для работы _getch();

#include // содержит определение типов BYTE, WORD, DWORD;

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х элементов с помощью цикла