Лабораторная работа №13 Ассемблер (3). Косвенная и базовая адресация. Работа с массивами
Скачать 17.33 Kb.
|
Лабораторная работа №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(); } ВАРИАНТЫ ЗАДАНИЙ
|