Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
110607_INF_UChPOS-2_v9.doc
Скачиваний:
29
Добавлен:
08.11.2018
Размер:
3.4 Mб
Скачать

Система операций

Все операции, выполняемые в командах ЭВМ, принято делить на пять классов.

1. Арифметико-логические и специальные — команды, в которых выполняется собственно преобразование информации. К ним относятся арифметические операции сложение, вычитание, умножение и деление (с фиксированной и плавающей занятой), команды десятичной арифметики, логические операции конъюнкции, дизъюнкции, инверсии и др., сдвиги, преобразование чисел из одной системы счисления в другую и др.

2. Пересылки и загрузки — обеспечивают передачу информации между процессором и памятью.

3. Ввода/вывода — обеспечивают передачу информации между процессором и внешними устройствами.

4. Передачи управления — команды, которые изменяют естественный порядок выполнения команд программы. Эти команды меняют содержимое программного счетчика, обеспечивая переходы по программе. Существуют команды безусловной и условной передачи управления. В последнем случае передача управления происходит, если выполняется заданное в коде команды условие, иначе выполняется следующая по порядку команда.

Различают три разновидности команд передачи управления:

- переходы;

- вызовы подпрограмм;

- возвраты из подпрограмм.

Команды переходов помещают в программный счетчик содержимое своего адресного поля — адрес перехода. При этом старое значение программного счетчика теряется.

Команда вызова подпрограммы работает подобно команде безусловного перехода, но старое значение программного счетчика предварительно сохраняется в специальном регистре или в стеке. Команда возврата передает содержимое верхушки стека или специального регистра в программным счетчик.

5. Системные— команды, выполняющие управление процессом обработки информации и внутренними ресурсами процессора. К таким командам относятся команды управления подсистемой прерывания, команды установки и изменения параметров защиты памяти.

Язык ассемблер является символическим аналогом машинного языка. По этой причине программа, написанная на ассемблере, отражает все особенности архитектуры микропроцессора (организацию памяти, способы адресации операндов, правила использования регистров и т.д.).

Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков сегментов. Каждый сегмент содержит совокупность машинных команд, которые необходимо выполнить процессору. Машинная команда может содержать операнды.

Основные способы задания операндов команды:

  1. Операнд задается в самой команде (непосредственный операнд). Операнд находится в коде команды, то есть является ее частью.

Например: add sum, 2 (команда складывает содержимое поля по адресу sum с целым числом 2 и записывает результат по месту первого операнда, то есть в память).

2. Операнд находится в одном из регистров. Регистровые операнды указываются именами регистров.

3. Операнд располагается в памяти. Это наиболее сложный и в тоже время наиболее гибкий способ задания операндов. Он позволяет реализовать следующие два основных вида адресации: прямую адресацию (эффективный адрес содержится в самой команде и для формирования не используется никаких дополнительных источников и регистров), косвенную адресацию.

Команды могут не иметь операндов, иметь один или два операнда. В двухоперандовой машинной команде возможны операнды: регистр-регистр, регистр-память, память-регистр, непосредственный операнд - регистр, непосредственный операнд-память.

Регистры

Регистры процессора представляют собой ячейки очень быстрой памяти и служат для временного хранения различных кодов: данных, адресов, служебных кодов.

Рис. 4.9. Регистры общего назначения: AX, BX, CX, DX

Регистры АХ, BX, CX, DX в основном участвуют в арифметических и логических операциях.

Регистр AX является основным сумматором и применяется для всех операций ввода-вывода, некоторых операций над строками и некоторых арифметических операций.

Регистр BX является базовым регистром. Это регистр, который может использоваться в качестве индекса для расширенной адресации, а также для вычислений.

Регистр CX является счетчиком. Он необходим для управления числом повторений циклов и для операций сдвига влево или вправо. Регистр также используется для вычислений.

Регистр DX является регистром данных. Он применяется для некоторых операций ввода-вывода и тех операций умножения и деления над большими числами, которые использует пару DX:AX.

Сегментные регистры: CS, DS, SS, ES

Сегментные регистры CS и DS обеспечивают адресацию памяти. Как было сказано выше, все ячейки памяти пронумерованы последовательно. Процессор обеспечивает доступ к этим ячейкам памяти, для хранения машинных команд и данных. Адрес машинной команды или данных состоит из двух частей: сегмент памяти и смещение.

Сегмент - независимый, поддерживаемый на аппаратном уровне блок памяти, имеющий размер не более 216 байт=65536 байт.

Смещение - номер байта в сегменте.

Например: 13C6:0100 - сегмент смещение

Для адресации машинной команды или данных используют специальные регистры, называемые сегментными регистрами.

Имеются три главных сегмента:

1. Сегмент кодов, который содержит выполняемые машинные команды. Обычно первая выполняемая команда находится в начале этого сегмента. Регистр сегмента кодов (CS) содержит начальный адрес сегмента кода. Этот адрес плюс значение смещения в командном указателе (IP) определяет адрес машинной команды, которая должна быть выполнена.

2. Сегмент данных, который содержит определенные данные, константы, необходимые программе. Регистр сегмента данных (DS) адресует данный сегмент. Регистр содержит начальный адрес сегмента данных. Этот адрес плюс значение смещения, который указывается в машинной команде, указывают на конкретную ячейку в сегменте данных.

3. Сегмент стека содержит адреса возврата как для программы при возврате в операционную систему, так и для вызовов подпрограмм при возврате в главную программу. Регистр сегмента стека (SS) содержит начальный адрес сегмента стека. Этот адрес плюс значение смещения в регистровом указателе (SP) определяют адрес стека памяти для временного хранения адресов и данных.

Регистр ES используется для управления адресацией памяти.

Регистр командного указателя IP содержит смещение на команду, которая должна быть выполнена.

Рассмотрим пример программы на языке ассемблер:

Задание: Найти значение выражения S=1+2+…+N

; Указываем соответствие сегментных регистров сегментам

assume cs:code, ds:data

; Опишем сегмент данных

; Откроем сегмент данных

data segment

; Закроим сегмент данных

data ends

; Опишем сегмент кода

; Откроем сегмент кода

code segment

begin:

; Настроим регистр ds на сегмент данных

mov ax,data

mov ds,ax

mov ax,0ah

int 21h

mov cx,ax

mov ax,[0000]

mov bx,[0001]

A:

add ax,bx

inc bx

loop A

mov [0004],ax

mov dx,ax

mov ah,09h

int 21h

nop

ret

code ends

end begin

Рис.4.10. Пример задачи

Машинные команды имеют различную длину: один, два, или три байта. Они находятся в памяти непосредственно друг за другом. Выполнение программы начинается с первой команды, и далее непосредственно выполняются остальные. Память разбивается на блоки в 1 байт. Все ячейки памяти пронумерованы последовательно, начиная с нуля. Адрес машинной команды состоит из двух частей: сегмент, смещение. Например: 13С6:0100.

При всевозможных пересылках данных: из регистров в регистры или из памяти в регистры и обратно, различают регистры-источники и регистры-приемники данных.

ПАМЯТЬ

Вектор прерывания

с м е щ е н и е

0h

1h

21h

0004 0008 …

Программа

Данные

ПРОЦЕССОР

Регистры общего назначения

AX – аккумулятор

BX – база

CX – счетчик

DX - данные

0000:

0000

с

е

г

м

е

н

т

15 7 0

Сегментные регистры

CS – коды

DS – данные

SS – стек

ES - данные

Счетчик команд

IP

31 0

1400:0000

Данные

1 байт 1 байт

Программа

00

00

00

01

00

03

8BD8

2BC0

0002 0004 0006 0008

13EF:0000

13EF:0002

13EF:0004


Рис.4.11.

S=0; I=1

S=S+I

I=I+1

да

нет

Адрес команды

(сегмент: смещение)

Машинная команда

Адрес данных

(сегмент: смещение)

Оператор на языке машинных кодов

Операция

Оператор на языке высокого уровня

1400:0000

B8----R

MOV AX,DATA

Переслать DATA в регистр AX

1400:0003

8ED8

MOV DS,AX

Переслать содержимое регистра AX в регистр DS

1400:0005

B40A

MOV AH,0A

Переслать значение 0А (номер функции ввода) в регистр AH

Scanf (“%d”, N)

1400:0007

CD21

INT 21

Передать управление в ОС для ввода данных

1400:0009

8BD8

MOV CX,AX

Переслать содержимое регистра AX (введенные данные) в CX

1400:000B

A10000

13EF:0000

MOV AX,[0000]

Переслать данные (2 байта) из памяти, начинающиеся в DS по адресу 0000, в регистр AX

S=0

1400:000E

8B1E0200

13EF:0002

MOV BX,[0002]

Переслать данные (2 байта) из памяти, начинающиеся в DS по адресу 0002, в регистр BX

I=1

1400:0012

03C3

ADD AX,BX

Прибавить содержимое регистра BX к AX (результат записывается в регистр AX)

S=S+1

1400:0014

40

INC BX

Прибавить значение 1 к регистру BX

I=I+1

1400:0015

E2F9

LOOP

Вернуться к метке А при выполнении условия цикла

While (I<=N)

1400:0017

A30400

13EF:0004

MOV [0004],AX

Переслать содержимое регистра AX в память по адресу 0004

Printf (“%d”, S)

1400:001A

8BD0

MOV DX,AX

Переслать содержимое регистра AX в DX

1400:001C

B409

MOV AH,09

Переслать значение 09 (номер функции вывода) в регистр AH

1400:001E

CD21

INT 21

Передать управление в ОС для вывода данных

1400:0020

90

NOP

Пустой оператор

Остановка

1400:0021

CB

RETF

Конец программы

Таблица 1.

Таблица 2.

Оператор на языке машинных кодов

Машинный команда

Значения регистров

AX

BX

CX

DX

SP

BP

SI

DI

DS

ES

CS

SS

IP

MOV AH,0A

B40A

0000

0000

0000

0000

0100

0000

0000

0000

13EF

13EF

1400

13EF

0005

INT 21

CD21

0A00

0000

0000

0000

0100

0000

0000

0000

13EF

13EF

1400

13EF

0007

MOV CX,AX

8BD8

0A02

0000

0000

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

0009

MOV AX,[0000]

A10000

0000

0000

0002

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

000B

MOV BX,[0002]

8B1E0200

0000

0000

0002

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

000E

ADD AX,BX

03C3

0000

0001

0002

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

0012

INC BX

40

0001

0001

0002

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

0014

LOOP

E2F9

0001

0002

0002

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

0015

ADD AX,BX

03D8

0001

0002

0001

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

0012

ADD BX,0001

830100

0003

0002

0001

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

0014

LOOP

E2F9

0003

0003

0001

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

0015

MOV [0004],AX

A30400

0003

0003

0000

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

0017

MOV DX,AX

8BD0

0003

0003

0000

0000

00ED

0000

0000

0000

13EF

13EF

1400

13EF

001A

MOV AH,09

B409

0003

0003

0000

0003

00ED

0000

0000

0000

13EF

13EF

1400

13EF

001C

INT 21

CD21

0903

0003

0000

0003

00ED

0000

0000

0000

13EF

13EF

1400

13EF

001E

NOP

90

0903

0003

0000

0003

00EB

0000

0000

0000

13EF

13EF

1400

13EF

0020

RETF

CB

0903

0003

0000

0003

00EB

0000

0000

0000

13EF

13EF

1400

13EF

0021


Машинный код (операционный код) команды зависит от регистров, на которые имеется ссылка, количества байтов, направления передачи данных (регистр – регистр, регистр – память, память – регистр и т.д.) и от ссылки на непосредственные данные или на память. За кодом команды следуют или непосредственные данные, или адресное смещение данных.

Таблица 4.3.

Команда

Способ адресации

Машинный код

Пересылки

Регистровая

AX-BX

BX-AX

BX-CX

CX-BX

AX-CX

CX-AX

8BC3

8BD8

8BD9

8BCB

8ВC1

8BC8

Непосредственная

AX-данные

BX-данные

CX-данные

B8

B9

BB

Прямая

AX-адрес

адрес-AX

А1

А3

Сложения

Регистровая

AX-BX

BX-AX

BX-CX

CX-BX

AX-CX

CX-AX

03С3

03D8

03D9

03СB

03C1

03C8

Непосредственная

AX-данные

BX-данные

CX-данные

05

83С3

83С1

Прямая

AX-адрес

0306

Рассмотрим машинные команды, встречающиеся в программе.

1) В8 - - - - R

Четыре дефиса означают, что ассемблер не может определить адрес DATA, он определяется, когда объектная программа будет скомпонована и загружена для выполнения. Поскольку загрузчик может расположить программу в любом месте памяти, ассемблер оставляет данный адрес открытым и показывает символом R, компоновщик должен будет подставить в это место действительный адрес.

2) 8ED8 – команда пересылки содержимое регистра AX в регистр DS

8ED8

3) B40A - команда пересылки значения 0А в регистр AH

4) CD21 - команда прерывания

5) 8BD8 - команда пересылки данных из регистра AX в регистр CX

8BD8

6) A10000 - команда пересылки данных (2 байта) из памяти по адресному смещению 0000 (сегмент памяти берется из регистра DS) в регистр AX

Данные в памяти занимают 2 байта.

В ходе выполнения команда А1 пересылает значение 00 в младшую часть регистра AX, т.е. однобайтовый регистр AL, а значение 00 – в старшую часть регистра AX, т.е в регистр AH

AX: | 00 | 00 |

AH AL

7) 8B1E0200 - команда пересылки данных (2 байта) из памяти по адресному смещению 0002 (сегмент памяти берется из регистра DS) в регистр BX

Данные в памяти занимают 2 байта.

В ходе выполнения команда 8B1E пересылает значение 00 в младшую часть регистра BX, т.е. однобайтовый регистр BL, а значение 02 – в старшую часть регистра BX, т.е в регистр BH

BX: | 02 | 00 |

BH BL

8) 03C3 - команда суммирования содержимого регистра BX в AX

03С3

9) 40 - команда суммирования значения 0001 к регистру BX

40

10) А30400 - команда пересылки данных (2 байта) по адресному смещению 0004 из памяти (сегмент памяти берется из регистра DS) в регистр AX.

Данные в памяти занимают 2 байта.

В ходе выполнения команда А3 пересылает значение 00 в младшую часть регистра AX, т.е. однобайтовый регистр AL, а значение 04 – в старшую часть регистра AX, т.е в регистр AH

AX: | 04 | 00 |

AH AL

11) 8BD0 - команда пересылки данных из регистра AX в DX

8BD0

12) B409 - команда пересылки значения 09 в регистр AH

13) E2F9

E2 – команда для перехода LOOP

F9 – отрицательное значение смещения (-7)

Команда LOOP прибавляет F9 к командному указателю (IP), который содержит адрес команды после LOOP (001В):

Командный указатель: 001В

Адрес в команде LOOP: F9

Адрес перехода: 0014

14) 90 - команда пустого оператора

90

15) СВ - команда длинного возврата из процедуры

СB

Рассмотрим команды языка ассемблер, встречающиеся в программе.

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

Команда пересылки mov

Команда mov копирует значение из источника в приемник:

mov приемник, источник

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

Команда сложения add

Команда add требует двух операндов. Операнды – данные, которые обрабатываются командами.

add о1,о2

Команда add складывает оба операнда о1 и о2 и записывает результат в о1, предыдущее значение которого теряется.

Команда инкрементирования inc

inc о1

Команда inc добавляет единицу к оператору.

Команда Loop

Команда Loop реализует цикл с конечным числом шагов. Она использует начальное значение регистра CX. В каждом цикле команда уменьшает содержимое регистра CX на 1.

Команды ввода-вывода

Периферийные устройства используют так называемые шлюзы ввода – вывода или порты ввода - вывода. С помощью портов программа может «общаться» с тем или иным периферийным устройством.

В ассемблере для ввода-вывода данных используют прерывание 21h.

Для запроса на ввод необходимо поместить в регистр AH номер функции ввода 10 (0AH), на вывод - 09 (09H)

Команда INT прерывает обработку программы и передает управление в ОС по вектору прерывания 0А для ввода данных.

Обработка прерываний производится в три этапа:

прекращается выполнение текущей программы;

управление предается по адресу таблицы векторов прерываний;

выполняется процедура обработки прерывания и управление возвращается прерванной программе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]