Нижегородский Государственный Технический Университет
им.
Лабораторная работа№1
по дисциплине «Системное программное обеспечение»
Тема: Программная модель процессора и программирование в кодах
Выполнил:
студент 10-В-1
Проверил:
Нижний Новгород
2012 г.
Задание.
Подготовить средствами отладчика TD в памяти таблицу
кодов {a(1),a(2),...,a(n)}. Написать программу в кодах, выполняющую
преобразование по заданному условию и перезапись таблицы кодов
из сегмента данных в дополнительный сегмент.
Заданное условие: Перестановка a(n),a(n-1),a(n-2),...,a(n/2),a(1),a(2),...,a(n/2-1).
Алгоритм решения задачи.
Организуем два цикла, каждый с количеством итераций равным n/2. В первом цикле перемещаем данные из исходных, начиная с конца. Это возможно сделать уменьшая смещение на 1 при каждой итерации. Во втором цикле перемещаем данные, начиная с первого знака, но продолжая заполнять массив выходных данных.
Код программы:
cs:0100BF3001 mov di,0130 ;позиция исходных данных
cs:0103 BE4001 mov si,0140 ;позиция выходных данных
cs:0106 BD0F00 mov bx,000F ;в указатель базы уууууууууууууууууууууууууууууууууууууууууу;записывае F
cs:0109 B90800 mov cx,0008 ;увеличиваем кол-во уууууууууууууууууууууууууууууууууууууууууу;итераций цикла до 8
cs:010C 8A03 mov al,[bx+di];загрузка в аккумулятор уууууууууууууууууууууууууууууууууууууууууу;данных из смещения bp+di
cs:010E 8804 mov [si],al ;загрузка из аккумулятора уууууууууууууууууууууууууууууууууууууууууу;данных по смещению
cs:0110 4D dec bx ;уменьшение значения в bp
cs:0111 46 inc si ;увеличение значения в si
cs:0112 E2F8 loop 010C ;цикл с переходом на 010C
cs:0114 B90700 mov cx,0008 ;увеличиваем кол-во уууууууууууууууууууууууууууууууууууууууууу;итераций цикла до 8
cs:0117 8A05 mov al,[di] ;загрузка в аккумулятор уууууууууууууууууууууууууууууууууууууууууу;данных из смещения di
cs:0119 8804 mov [si],al ; загрузка из аккумулятора уууууууууууууууууууууууууууууууууууууууууу;данных по смещению
cs:011B 46 inc si ;увеличение значения в si
cs:011C 47 inc di ;увеличение значения в di
cs:011D E2F8 loop 0117 ;цикл с переходом на 0117
Состояние дампа памяти до выполнения программы:
CPU 80486 ds:0130 01 02 03 04 05 06 07 08 ds:0138 09 10 11 12 13 14 15 16 ds:0140 00 00 00 00 00 00 00 00 ds:0148 00 00 00 00 00 00 00 00 | CPU 80486 ax 0000 bx 0000 cx 0000 dx 0000 si 0000 di 0000 bp 0000 sp 0080 ds 5AF6 es 5AF6 ss 5AF6 cs 5AF6 ip 0100 | CPU 80486 c=0 z=0 s=0 o=0 p=0 a=0 i=1 d=0 |
Состояние дампа памяти после выполнения программы:
CPU 80486 ds:0130 01 02 03 04 05 06 07 08 ds:0138 09 10 11 12 13 14 15 16 ds:0140 16 15 14 13 12 11 10 09 ds:0148 01 02 03 04 05 06 07 08 | CPU 80486 ax 0008 bx 0007 cx 0008 dx 0000 si 0150 di 0138 bp 0000 sp 0080 ds 5AF6 es 5AF6 ss 5AF6 cs 5AF6 ip 011D | CPU 80486 c=0 z=0 s=0 o=0 p=0 a=0 i=1 d=0 |
Методы адресации:
1.Непосредственная адресация – значение операнда располагается в байтах самой программы
mov ax, 27h 010 111 (значение8)
2.Регистровая адресация – операнд находится в регистре
mov ds, ax
3.Прямая адресация – адрес операнда является частью команды в виде байтов смещения
mov ax, [2100]
4.Косвенная адресация. Адрес операнда находится в одном из регистров BX, SI или DI.
mov dl,[si]
5.Неявная адресация – адресуемый объект указывается с помощью 1-го байта команды вместе с кодом операции без выделения специального кода
cbw
mul al
Команда CBW всегда работает с регистрами AX и AL, а у команды MUL фиксировано положение первого множителя и результата.
6. Косвенная регистровая (базовая) адресация со смещением
Адрес операнда вычисляется как сумма содержимого регистра BX, BP, SI или DI и 8- или 16-разрядного смещения
add ax,[bx+2]
mov dx,[array1+si]
Режим адресации в памяти и микропроцессоре Intel 86.
Режимом или способом адресации называют процедуру нахождения операндов.
Операнды в программе могут задаваться в:
РОНах Непосредственно в коде программы Ячейках памяти (прямо или косвенно) В портах ввода/выводаРежим адресации | Обозначение в ассемблере | Регистр. сегмент. по умолчанию | Пример использования |
регистровый | AX/AL (16/8) | ----- | Mov AX, CX; Mov AL, BH |
Непосредственная адресация | Const (16/8) | ----- | Mov AX,100H; Mov BL,-24H |
Прямая адресация | Метка, задающая смещение относительно данных. | DS | Mov Ax, TAB (обычно используется для задания статических переменных) |
Косвенная адресация | [BX], [BP] [DI], [SI] (>i386 можно исп. все регистры) | DS, SS DS (ES), SS | Mov AL,[DI] Mov AX, ES:[BX] |
Базовая адресация | [BX]+смещение [BP]+ смещение | DS ES | Mov AX, 4[BP] (означает 4+BP) Mov CX, [BP]+2 Mov AX, CS:[BX]+4 |
Индексная адресация | [SI]+смещение [Di]+ смщение | DS DS (ES) | Mov AL, B, TAB (исп. для строк или массивов) |
Базово – индексная адресация | [BX]:[DI]+смещение [BX]:[SI]+смещение [BX]:[BP]+смещение | DS, SS DS, SS | Mov AX, ES:VALUE [BX]:[DI] (VALUE+BX+DI) |
Базово – индексная с масштабированием (начиная с i386) | [EAX][ESX*m]+смещение m=1, 2, 4, 8 | Mov Ax,4*[BP] Mov CX,[BP]*2+2 |
Mov AX, ES:[DI] – из регистра [DI] выбирается адрес операнда, ищем его в сегменте EXTRA и пересылаем в AX.
Базовую адресацию используем, когда в регистре находится адрес начала структуры данных (вектора, строки и т. д.), а доступ надо осуществить к какому либо элементу этой структуры (Mov AX,4[BP] – содержимое является адресом операнда в AX). Другое применение – это доступ из подпрограмм к параметрам, переданных в STACK. Для нахождения элементов массива Для двумерных массивов и массивов записи Расширенный режим (используется в процессорах выше i386).

