Краткие теоретические и учебно-методические материалы по теме практической работы




Процессор способен выполнять команды, находящиеся в памяти в виде двоичных кодов. В процессорах iх86 длина команды может составлять от 1 до 12 байт. Первый байт команды содержит код операции, а также некоторую дополнительную информацию (например, о длине обрабатываемых данных). Данные, подлежащие обработке, называются операндами. Каждый операнд может представлять собой байт или слово и находиться в регистре общего назначения или в памяти. Кроме того, существуют команды, использующие в качестве операндов последовательности байтов или слов (строки).

Разрабатывать программу, записывая все команды непосредственно в двоичной кодировке, очень трудно. С другой стороны, языки программирования высокого уровня, такие, как Паскаль или Си, намного облегчают написание программ, но они не дают доступа ко всем ресурсам компьютера; размер получаемого кода оказывается значительным. «Золотой серединой» здесь оказывается язык Ассемблер. В этом языке каждой команде процессора соответствует мнемонический код (или мнемокод), т.е. код, удобный для запоминания. Кроме кодов команд, Ассемблер содержит директивы, т.е. служебные инструкции, определяющие формат программы, данных и т.п. Существуют как самостоятельные Ассемблер-системы, так и встроенные в языки высокого уровня (например, в системе Borland Pascal).

Использование регистров процессора

Регистр – специально отведенная память для временного хранения каких-то данных. Микропроцессоры i8086 имеют 14 регистров.

 

Таблица 6.1 – Регистры данных (регистры общего назначения, РОН)

AX BX CX DX
AH AL BH BL CH CL DH DL
Аккумулятор База Счетчик Регистр данных
               

 

РОН могут использоваться программистом по своему усмотрению (за исключением некоторых случаев). В них можно хранить любые данные: числа, адреса и пр. В верхнем ряду таблицы 6.1 находятся шестнадцатиразрядные регистры, которые могут хранить числа от 0 до 65535 или от 0h до FFFFh в шестнадцатеричной системе счисления. В следующей строке расположен ряд восьмиразрядных регистров. В них можно загружать максимальное число 255 (FFh). Они представляют собой старшую (High) и младшую (Low) половинки шестнадцатиразрядных регистров.

 

Таблица 6.2 – Регистры-указатели

SI DI BP SP
Индекс источника Индекс приемника Регистры для работы со стеком

 

Регистры SI и DI используются в строковых операциях.

 

Таблица 6.3 – Сегментные регистры

CS DS ES SS
Регистр кода Регистр данных Дополнительный регистр Регистр стека

 

Сегментные регистры необходимы для обращения к тому или иному сегменту памяти.

Команды пересылки данных и загрузки

 

Таблица 6.4 – Команды пересылки данных, загрузки адресов

Название Общий вид команды Действие
Пересылка данных MOV op1, op2 op1 ← op2
Обмен (перестановка) данных XCHG op1, op2 op1 ↔ op2
Загрузка исполнительного адреса LEA op1, op2 op1 ← (адрес op2)

 

Команда MOV (to move – передвигать, перемещать) осуществляет пересылку байта или слова из источника (это второй операнд, «op2») в место назначения (первый операнд, он же операнд-получатель, «op1»). В качестве источника и получателя могут служить РОН, индексный или сегментный регистр, ячейка памяти. Источником могут также являться данные (константа), непосредственно указанные в команде.

Пример

MOV AX, 5050 – записать число 5050 в регистр АХ.

MOV AX, BX – переместить число из регистра ВХ в регистр АХ.

Команда XCHG (to exchange – переставлять) осуществляет обмен байтами или словами между своими операндами (РОН, индексные регистры, память). Сегментные регистры не могут использоваться при обмене.

В этих командах, как и многих других двухоперандных командах рассматриваемых МП, недопустимы сочетания операндов типа «память-память», что представляет определённые неудобства при программировании.

Команда LEA (Load Executable Address) носит название «загрузить исполнительный адрес». По этой команде извлекается не сам операнд, а его исполнительный адрес. Действие команды состоит в передаче вычисленного 16-разрядного адреса (внутрисегментного смещения) операнда в 16-разрядный регистр.

Арифметические команды

В классической системе команд 8086-совместимых процессоров существуют все четыре арифметические действия – сложение, вычитание, умножение, деление над 8- и 16-разрядными данными, представляющими целые числа.

 

Таблица 6.5 – Арифметические команды

Название Общий вид команды Действие
Сложение ADD op1, op2 op1 ← op1+op2
Инкремент (увеличение на 1) INC op op ← op+1
Вычитание SUB op1, op2 op1 ← op1-op2
Декремент (уменьшение на 1) DEC op op ← op-1
Умножение MUL op см. ниже
Деление DIV op см. ниже

 

Команда ADD (addition) выполняет сложение операнда-источника («op2») с операндом места назначения («op1»). Операндами могут быть регистры и ячейки памяти, причём в качестве источника может быть указано число (константа).

Команда SUB (subtraction) выполняет вычитание операнда-источника из операнда-получателя (op1-op2), записывая результат на место первого операнда. Опять же могут быть использованы регистры, память; вычитаемое может быть константой.

Операции «память-память» в этих командах недопустимы, то есть нельзя указывать ссылку на ячейку памяти одновременно и в первом и во втором операнде. Если это необходимо согласно алгоритму решения задачи, следует использовать операцию «регистр-память», а затем переслать (командой MOV) результат из указанного регистра в другую ячейку памяти.

Команда инкремента INC увеличивает свой единственный операнд на единицу, команда декремента DEC – уменьшает. Эти команды удобно применять, например, в цикле при необходимости наращивания или уменьшения какого-либо счётчика, адреса и т.п.

Команда MUL (multiplication), осуществляющая умножение, более сложна в использовании. Она имеет лишь один операнд – первый множитель. Где указывается второй и где окажется результат зависит от того, будет ли работать команда со словом или с байтом.

Пусть в качестве единственного операнда указан регистр или ячейка размером в байт (например, MUL CL). Тогда второй множитель (тоже байт) берётся обязательно из регистра AL, а результат (16-разрядный, т.е. длиной в слово) окажется в регистре AX:

AX ← AL*op.

Если же операнд «op» взят 16-разрядным (например, MUL CX), то команда выполнит следующее действие:

DXAX ← AX*op,

то есть второй множитель, также 16-разрядный, будет автоматически взят из регистра AX, а результат размером в двойное слово, т.е. 32-разрядный, окажется в регистровой паре, состоящей из DX и AX.

Команда деления DIV работает следующим образом. Как и в команде MUL, здесь указывается единственный операнд, который является делителем. Этот делитель опять же может быть словом или байтом. Если «op» – байт, то команда выполняется как

((AH-остаток) и (AL-частное)) ← AX/op,

то есть делимое берётся из 16-разрядного регистра AX, 8-разрядное частное оказывается записанным в AL, остаток такой же размерности – в AH.

Если же «op» – 16-разрядное слово, то МП выполнит команду как

((DX-остаток) и (AX-частное)) ← DXAX/op,

то есть 32-разрядное делимое будет взято из регистровой пары DXAX, частное окажется в AX, остаток – в DX (оба – 16-разрядные).

 

Примеры разработки программ

Задание: записать во все РОН целое число 5050.

Данное нам число – это константа. Для записи констант в какие-либо регистры в нашем распоряжении есть команда MOV (таблица 6.4). Число 5050 превосходит максимальное значение для байта (255), но меньше максимального значения для машинного слова (65535). Следовательно, будем использовать 16-разрядные регистры. Программа будет выглядеть так:

MOV AX, 5050

MOV BX, AX

MOV CX, AX

MOV DX, AX

 

Задание: вычислить выражение (25*7+137*5-60) и результат оставить в регистре AX.

Из рассмотрения данного выражения следует, что нам понадобятся команды ADD (сложить), MUL (умножить), SUB (вычесть), приведённые в таблице 6.5, а также MOV (переслать). Получим сначала произведение 25*7 и сохраним его; затем получим произведение 137*5 и сложим оба частичных результата; вычтем 60 из того, что получилось. Приходим к программе:

MOV AL, 25; записать в AL число 25

MOV DL, 7; записать в DL число 7

MUL DL; теперь AX = 25*7

MOV BX, AX; копировать из АХ в ВХ, теперь BX = 25*7

MOV AL, 137

MOV DL, 5

MUL DL; AX = 137*5

ADD AX, BX; AX = 25*7 + 137* 5

SUB AX, 60; AX уменьшен на 60

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: