Files
templates/Labv2.cpp
2024-09-10 22:24:24 +03:00

290 lines
15 KiB
C++
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Шаблон программы для лаб работы LAB2
// Изучение системы команд
#include <stdio.h>
#include <conio.h>
int main (void)
{ int aa;
clrscr();
/*
********************************************************
1 2 3 Напишите программы, иллюстрирующие работу след команд:
1. Команда JL.
JL metka.
Осуществляет переход на указанную метку,
если результат предыдущего сравнения: БОЛЬШЕ
(Переход осуществляется, если флаги SF=0 и OF =0)
asm {
cmp ax, 13
JL metka
..... ; какой-то блок команд
metka:
...... ; какой-то блок команд
};
2. Команда ROL
Rol ax, 1
Rol bx, cl
Команда циклического сдвига влево.
Если второй операнд - CL, то число разрядов, на которые
осуществляется сдвиг, определяется содержимым регистра CL.
3. Команда LEA.
По этой команде адрес второго операнда передается в регистр
первого операнда.
lea ax, a;
4. Команда NOP
Команда нет операции
5. Команда AND
and ax,bx
Команда логического умножения
Первый операнд лог умножается (конъюнкция) на второй
результат в первый */
/*
********************************************************
4 Напишите программу со строковыми командами
Команда MOVS.
Команда пересылки строки.
Направление пересылки определяется значением флага DF - флага направления.
Для операций с байтами - MOVSB
Для операций со словами - MOVSW
Не имеет операндов. Не воздействует на флаги.
Пересылает из области памяти, адресуемой регистром SI - sourse
в область памяти, адресуемую регистром DI - destination.
*/
// Ниже приведен пример программы
int A[10]={2,1,2,3,4,5,6,7,8,9};
int B[10]={1,1,0,0,0,0,0,0,0,0};
asm {
cld //сбрасываем флаг направления
lea si,A
lea di,B
// mov dx,di
};
// Задание: Распечатайте значения индексных регистров
// до передачи
// printf ("\n значения индекс регистров is, di = %x %x ", _SI, _DI);
asm mov cx,1 ; // ????
asm movsb ; // ?????
// Задание: Распечатайте значения индексных регистров
// после передачи Передача прошла? Сколько слов передано?
printf ("\n значения индекс регистров is, di = %x %x ", _SI, _DI);
printf ("\n Вывод массива В после строковой передачи");
for (int i=0; i<10; i++)
{
printf (" \n %d ", B[i]);
}
getch();
//********************************************************
// 5 Программа поиска в видеопамяти символа
printf (" \n Поиск символа ");
/* asm
asm
e1: asm {
mov ax, 0xb800
mov es, ax
mov
cmp es:[di],al
jnz e2 };
printf (" \n Нашли символ ");
e2: asm add di, 2
asm loop e1
printf (" \n Не нашли символ ");
getch();
*/
// return (0);
//***************** Задания ******************
//
// 1 Проиллюстрируйте программами указанные выше команды
// 2 Рассмотрите двоичный код этих команд
// 3 Заполните таблицу, используя TD. Должны присутствовать
// все поля формата команды.
/*
Мнемоника Префикс КОП Постбайт Смещение Непоср.операнд
│ │ │ │ │адресации │ │ │
├────┼─────────────┼──────┼──────┼────────────┼─────────┼─────────────┤
│ 1 │and ax,bx │ - │ │ │ - │ - │
│ 2 │rep and bx,ax│ │ │ │ │ │
│ 3 │add ax,16 │ - │ │ │ - │ │
4 add al,[bx+si]
*/
// 4. Напишите программу со строковыми командами при 10 передачах
// 5. Разработайте блок-схему и напишите программу
// поиска символа в видеопамяти на первых 4-х видеостраницах
// 6. Ответьте на вопросы: Какая мнемоника двухоперандной команды 00FF.
// Как выполняется команда LDS BX,PtriA
/*
 _Структура процессора i8086
Программисту на уровне команд доступны четырнадцать регист-
ров. Их удобно разбить на четыре группы: 1)Регистры данных, 2)ад-
ресные, 3)сегментные 4)указатель команд и регистр флажков(призна-
ков).
1) Регистры данных (в некоторых книгах их называют регистрами общего
назначения). Операнды в этих регистрах могут быть как слова так и
байты. Если операнд - байт, может быть указана любая половина
регистра. Есть ряд команд, в которых функции отдельных регистров
специализированы (см.табл.)
2) Указатели и индексные регистры (адресные регистры, используются для
хранения 16-разрядных адресов). Адресные регистры во многих командах
также специализированы (см.табл.)
3) Сегментные регистры (указывают начала четырех сегментов - участков
по 64 К байт в 1М ОЗУ: сегмент команд CS, сегмент стека SS и два
сегмента данных - DS и ES extra)
4) Указатель команд и регистр флажков
Специальные функции регистров 8086
AX Аккумулятор Умножение, деление и ввод-вывод слов
AL Аккумулятор(мл) Умножение, деление и ввод-вывод байтов
AH Аккумулятор(ст) Умножение и деление байтов
BX База Базовый регистр, преобразование (?)
CX Счетчик Операции с цепочками, циклы
CL Счетчик (мл) Динамические сдвиги и ротации
DX Данные Умножение и деление слов,
косвенный ввод-вывод
SP Указатель стека Стековые операции
BP Указатель базы Базовый регистр
SI Индекс источника Операции с цепочками, индексный регистр
DI Индекс получателя Операции с цепочками,
 _Регистр флагов процессора
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
OF DF IF TF SF ZF AF PF CF
CF ( Carry Flag ) - флаг переноса;
PF ( Parity Flag ) - флаг четности;
AF ( Auxiliary Carry Flag ) - флаг вспомогательного переноса;
ZF ( Zero Flag ) - флаг нуля;
SF ( Sign Flag ) - флаг знака;
TF ( Trap Flag ) - флаг ловушки;
IF ( Interrupt-Enable Flag ) - флаг разрешения прерывания;
DF ( Direction Flag ) - флаг направления;
OF ( Overflow Flag ) - флаг переполнения.
- 5 -
 _Организация памяти
Адресуемая память (адресное пространство) представляет собой
область из 1М байт(в реальном режиме работы для микропроцессоров
i80286 и старше). Два смежных байта образуют слово. Адресом слова
считается адрес младшего байта. МП 8086 считывает информацию из
ОЗУ 16 бит.словами, начинающимися с четных адресов, хотя команда
или слово данных могут быть расположены в ОЗУ в любом адресе.
Физический адрес памяти имеет длину 20 бит, однако все обра-
батываемые в регистрах МП величины имеют длину 16 бит. Для форми-
рования физических адресов используется механизм сегментации памя-
ти. Пространство памяти 1 М доступно процессору через 4 "окна"
(сегмента) каждый размером 64 К байт. Начальный адрес каждого сег-
мента содержится в оюном из четырех сегментных регистров. Команды
обращаются к байтам и словам в пределах сегментов, используя отно-
сительный (внутрисегментный) адрес.
 _Общий формат команды следующий:
[Префикс] КОП [постбайт адресации] [смещение] [непоср.операнд]
Элементы в квадратных скобках могут отсутствовать.
Назначение элементов команды:
 рефикс .. Длина 1 байт.
а)Префикс переназначения сегмента позволяет переназначить сегмент
ОЗУ, к которому происходит обращение.Если префикс переназначения
сегмента отсутствует, сегмент выбирается по умолчанию.
б)Префикс повторения действия для строковых команд
 _КОП . - код операции. Длина 1 байт. 0-й бит КОП во многих (но не во всех)
командах показывает, производится ли операция со словом ( =1) или с
байтом ( =0). 1-й бит КОП в двухадресных командах указывает, какой
из операндов является приемником.
 остбайт адресации .. Длина 1 байт. Постбайт адресации показывает, где
находятся операнды. Структура системы адресации МП 8086 в
двухоперандной команде несимметрична. Один из операндов (первый) может
быть расположен в регистре (регистровая адресация) или в произвольной
ячейке ОЗУ (все способы адресации кроме непосредственной).
Второй операнд может находиться в теле команды (непосредственная
адресация) или в регистре (регистровая адресация). Каждый из
операндов может быть как источником так и приемником (за исключением
непосредственной адресации: непосредственный операнд может быть
только источником). Структура постбайта адресации следующая:
7 6 5 4 3 2 1 0
! mod ! reg ! r/m !
!-----!-----!-----!-----!-----!-----!-----!----!
Поля mod и r/m задают место расположения первого операнда (или
едиственного в одноадресной команде). Поле reg задает положение
второго операнда в двухадресных командах, или используется для
расширения КОП в одноадресных командах.
Значения поля mod:
11 - операнд в регистре
(при остальных mod операнд в ОЗУ, а регистры, на
которые указывают поля mod и r/m, содержат компоненты
адреса операнда)
10 - смещение два байта (без знака)
- 6 -
01 - смещение один байт (со знаком)
00 - смещение в команде отстутствует
Значения поля reg а также поля r/m при mod=0 (т.е. при регистровой
адресации следующие:
reg или r/m Байт Слово
000 AL AX
001 CL CX
010 DL DX
011 BL BX
100 AH SP
101 CH BP
110 DH SI
111 BH DI
При адресации в память значения mod и r/m определяют способ
вычисления адреса следующим образом:
r/m mod=00 mod=01 или 10
000 BX+SI BX+SI+смещение
001 BX+DI BX+DI+смещение
010 BP+SI BP+DI+смещение
011 BP+DI BP+DI+смещение
100 SI SI+смещение
101 DI DI+смещение
110 direct BP+смещение
111 BX BX+смещение
Смещение. Длина 1 байт (при mod-01) или 2 байта(при mod=10).
Непосредственный операнд. Длина 1 или 2 байта
Таким образом, длина команды лежит в пределах от 1 до 7 байтов.
*/
};