Федеральное государственное бюджетное образовательное
учреждение высшего профессионального образования
«РЯЗАНСКИЙ ГОСУДАРСТВЕННЫЙ РАДИОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Отчет
О лабораторной работе по АСВТ
«Изучение команд микропроцессора i8086»
Выполнил
Студент гр. 242
Кабанова А.В.
Рязань 2013
Цель работы.
Ознакомление с принципами микропрограммной эмуляции ЭВМ с программным управлением, микропрограммирование машинных команд микропроцессора i8086 (МП-86).
Описание основных этапов выполнения команд в процессоре.
Задание.
Преобразовать 4-разрядное положительное десятичное число в двоичное по формуле B=((D1*10+D2)*10+D3)*10+D4, где Di - тетрады числа, начиная со старшей.
Схема алгоритма решаемой задачи.
Схема представлена с использованием переменных в абстрактном виде, без приложения к конкретной архитектуре. D – исходное число в BCD-коде.
Программа решаемой задачи на языке ассемблера.
Программа реализована с помощью ассемблерных вставок ИСР MS Visual Studio 2012 C++.
Код программы:
// ЛР АСВТ АСМ.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
_asm {
//Инициализация/////////////////////////////////
MOV CX, 4; //Счетчик циклов
MOV SI, 0; //Общая сумма
MOV BX, 0x1235;
//Начало цикла//////////////////////////////////
cycle: //Метка начала цикла.
MOV AX, BX;
MOV DI, CH;
XCHG DI,CX;
SHR AX,CX; //Сдвиг результата до младшей тетрады.
SHL BX, 4;
MOV DX, SI; //Копирование её же в EBX.
SHL SI, 1; //}
SHL DX, 3; //} Умножение общей суммы на 10.
ADD SI, DX; //}
ADD SI, AX; // Запись общей суммы.
LOOP cycle;
NOP;
}
return 0;
}
Кодирование команд.
Команда |
Формат |
Код команды в двоичном виде |
Код команды в 16-ричном виде |
MOV reg1, reg2 |
RRM |
1000.1011. 11 XX.X XXX |
8B XX |
SHR reg1, 12 |
RM |
1101.0001. 11 10.1 XXX |
D1E X |
SHL reg1, 1 |
RM |
1101.0001. 11 10.0 XXX |
D1E X |
ADD reg1, reg2 |
RRM |
0000.0011.11 XX.X XXX |
03 XX |
LOOP disp |
|
1110.0010. XXXX.XXXX |
E2 XX |
HALT |
|
1111.1111.0000.0000 |
FF00 |
Конечная программа в шестнадцатеричном виде.
Распределение регистров согласно тексту ассемблерной реализации.
ADDR |
00 |
02 |
04 |
06 |
08 |
0A |
0C |
WORD |
8BC3 |
D1E8 |
D1E3 |
D1E3 |
D1E3 |
D1E3 |
8BD6 |
0E |
10 |
12 |
14 |
16 |
18 |
1A |
1C |
D1E6 |
D1E2 |
D1E2 |
D1E2 |
03F2 |
03F0 |
E2E4 |
FF00 |
Сдвиги производятся на фиксированное для команды число разрядов по причине занятости регистра CX, единственно используемого в данной команде в силу ограничений программы-эмулятора, в команде LOOP. Что, в свою очередь, влечет последовательное использование нескольких команд сдвига, за исключением ЛС вправо, всегда сдвигающего на 12 разрядов, поскольку он не применяется для иного способа работы.