Главная страница
Навигация по странице:

  • Косвенная адресация

  • MOV BYTE PTR [EAX], 100

  • LEA

  • Лабораторная работа №13 Ассемблер (3). Косвенная и базовая адресация. Работа с массивами


    Скачать 17.33 Kb.
    НазваниеКосвенная и базовая адресация. Работа с массивами
    Дата21.02.2023
    Размер17.33 Kb.
    Формат файлаdocx
    Имя файлаЛабораторная работа №13 Ассемблер (3).docx
    ТипЛабораторная работа
    #948944

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


    написать администратору сайта