ПРОГРАММИРОВАНИЕ ОПЕРАТОРОВ АССЕМБЛЕРА

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ФГБОУ ВПО

«Воронежский государственный УНИВЕРСИТЕТ

ИНЖЕНЕРНЫХ ТЕХНОЛОГИЙ»

 

ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ

РЕГИСТРОВ МИКРОПРОЦЕССОРА

 

Методические указания и задания к практическим занятиям

И для выполнения РПР

по курсу “Архитектура информационных систем”

 

Для бакалавров, обучающихся

По направлению 230400

 

 

ВОРОНЕЖ

 

 

ПРОГРАММИРОВАНИЕ ОПЕРАТОРОВ АССЕМБЛЕРА

В текстовом редакторе (один из тех редакторов, которые формируют файлы в коде ASCII) введите следующие строки программы:

 

.MODEL SMALL

.STACK 100h

.DATA

Message DB 'Привет!',13,10,'$'

.CODE

mov ax,@Data

mov dx,ax ; установить регистр DS таким

; образом, чтобы он указывал

; на сегмент данных

mov ah,9 ; функция DOS вывода строки

mov dx,OFFSET Message ; ссылка на сообщение "Привет!"

int 21h ; вывести "Привет!" на экран

mov ah,4ch ; функция DOS завершения

; программы

int 21h ; завершить программу

END

 

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

i = j + k;

а на Ассемблере это потребует шести строк:

 

mov ax,[j]

mov dx,[j+2]

add ax,[k]

addc dx,[k+2]

mov [i],ax

mov [i+2],dx

 

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

Процессор может адресоваться к памяти объемом 1 мегабайт (это два в двадцатой степени или 1048576 ячеек памяти, каждая размером 8 битов). Первый байт памяти имеет адрес 0, а последний - адрес 0FFFFFh.

В любой момент программа может считать или изменить содержимое любого из более 1000000 байтов памяти. Например, фрагмент программы:

 

mov ax,0

mov dx,ax

mov bx,0

mov al,[bx]

 

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

Один мегабайт - это память, существенно большая, чем 64 Кб (килобайта, 2 в степени 16 или 65536 байтов). Из одного мегабайта адресного пространства доступно для общего использования только 640 Кб. Остальное адресное пространство предназначено для использования системным программным обеспечением, а также занято памятью, используемой для работы с дисплеем (видеопамять). К тому же, не следует забывать о том, что инструкции, а также данные, хранятся в памяти, поэтому данные и код программы должны помещаться в компьютере в память объемом не более 640 Кб.

В то время как процессор может адресоваться к памяти объемом 1 мегабайт, практически не так просто одновременно получить доступ с более чем 64 Кб памяти. Это связано со специфическим средством, которое называется сегментацией.

Доступ к адресам ввода-вывода можно получить с помощью двух специальных инструкций, IN и OUT, которые больше ни для чего не используются. Например:

out dx,al

посылает содержимое регистра AL в порт ввода-вывода, определяемый регистром DX.

Некоторые устройства ввода-вывода представляют собой устройства с отображаемой памятью. Это означает, что они управляются через обычные адреса памяти, а не адреса ввода-вывода. Особенно это относится к дисплейным адаптерам.

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

 

РЕГИСТРЫ

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

Регистры разбиваются на четыре категории: регистры флагов,

регистры общего назначения, указатель инструкций и сегментные регистры.

 

Регистр флагов

Этот 16-разрядный регистр содержит всю необходимую информацию о состоянии процессора 8086 и результатах последних инструкций.

Регистр флагов не считывается и не модифицируется непосредственно. Вместо этого регистр флагов управляется в общем случае с помощью специальных инструкций (таких, как CLD, STI и CMC), а также с помощью арифметических и логических инструкций, модифицирующих отдельные флаги. И наоборот, содержимое отдельных битов регистра флагов влияет на выполнение инструкций (например, JZ, RCR и MOVSB). Регистр флагов не используется на самом деле, как ячейка памяти, вместо этого он служит для контроля за состоянием и управления процессором.

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