Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
33
Добавлен:
01.05.2014
Размер:
140 Кб
Скачать

4. Процесс транслирования и выполнения программы

Набор символьной программы в среде программирования Turbo Pascal, ее трансляция и выполнение (с получением результатов на экране дисплея) выполняются как обычно.

Ассемблерные вставки в программе на языке Pascal оформляются так:

  1. Метки переходов необходимо объявить командой Label. (Прим. ред.: Можно их и не объявлять, если они начинаются с одного [!] символа “@” [собачка, коммерческая эт])

  2. Команды ассемблера начинаются строчкой Asm и завершаются строчкой End;.

  3. После метки ставится двоеточие.

  4. Переменные, объявляемые как байты, должны пересылаться в регистры-байты (AH, AL, BH, BL, CH, CL, DH, DL).

  5. Если используются слова — в регистры слова (AX, BX, DX, CX, SI, DI, BP).

Вход в операционную систему осуществляется по прерыванию — команда Int и номер прерывания. Если указывается номер функции, то его надо переслать в регистр AH командой Mov (передать, Move).

Ее формат:

Mov Dst,Src

Исполнение этой команды: (Dst)  (Src).

Например,

Mov AH,1h

Затем вызвать, например, прерывание 21h:

Int 21h

Формат команды “Загрузить эффективный адрес” (Load Effective Address):

LEA Dst,Src

Исполнение этой команды: (Reg)  (Src).

Логические команды: And, Or, Not, XOr, Test.

Это команды микропроцессора, реализующие логические операции. Все команды обрабатывают операнды (байты или слова) поразрядно. Логические команды наиболее часто используются для селективных установок, инвертирования, сброса или проверки битов в операнде-получателе в соответствии с двоичным набором операнда-источника. Такие действия часто встречаются в операциях над битами регистров и данных ввода-вывода. При этом операнд-источник называют маской, а сама операция называется маскированием. Их описание представлено в таблице 3.

Таблица C Формат логических команд

Название команды

Мнемоника и формат команды

Описание действия

Инвертировать

Not Opr

(Opr)  Not Opr

Объединить по “или”

Or Dst,Src

(Dst)  (Dst) Or (Src)

Объединить по “и”

And Dst,Src

(Dst)  (Dst) And (Src)

Сложить по модулю 2 (Mod2)

Xor Dst,Src

(Dst)  (Dst) Xor (Src)

Проверить

Test Opr1,Opr2

Opr1 And Opr2

Флажки. Команда Not не воздействует на флажки. Остальные команды сбрасывают OF и CF, оставляют АF не определенным и устанавливают СF, ZF, PF по обычным правилам.

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

5. Программирование устройств

5.1 Примеры программ

1) Программа установки времени (на ассемблере):

s_s segment stack “stack” ; адрес начала сегмента стека

dw 12 dup (?) ; зарезервировано в памяти 12 ячеек с ; любым значением

s_s ends ; адрес конца сегмента стека

d_s segment ; адрес начала сегмента данных

hou db 10 ; данное, т.е. число 10 записано по

;адресу hou

; оно определено как байт. Это часы.

min db 35 ; данное, т.е. число 35 записано по

;адресу min

; оно определено как байт. Это минуты.

sec db 20 ; данное, т.е. число 20 записано по

;адресу sec

; оно определено как байт. Это секунды.

hund db 46 ; данное, т.е. число 46 записано по

;адресу hund

; это сотые доли секунды

msg1 dw “OK”,0ah,0dh,”$”

; в пеpвых кавычках то, что выводим, ; затем 0ah — пеpевод стpоки, 0dh — возвpат каpетки;

; стpока должна завеpшаться символом “$”.

msg2 dw “NO”,0ah,0dh,”$”

d_s ends ; адрес конца сегмента данных

c_s segment ; начало сегмента кода

assume ss:s_s,ds:d_s,cs:c_s

; псевдооператор, определяющий каким

; сегментным регистрам соответствуют

; назначенные метками адреса начала сегментов

begin: ; начало пpогpаммы — имя и после него двоеточие

mov ax,d_s ; пересылка в регистр сегмента данных

;(ds) адреса

; начала сегмента данных т.е. метки ; начала сегмента данных с которым мы будем работать

mov ds,ax ; пересылку в ds можно сделать только ; через промежуточную пересылку в рабочий регистр,

; например, ax, из памяти

;записывать в сегм.рег.нельзя

mov ch,hou ; пересылка в регистр ch содержимого,

; находящегося по адресу hou, т.е.

;числа 10

mov cl,min ; пересылка в регистр cl содержимого,

; находящегося по адресу min, т.е.

; числа 35

mov dh,sec ; пересылка в регистр dh содержимого,

; находящегося по адресу sec, т.е.

;числа 20

mov dl,hund ; пересылка в регистр dl содержимого,

; находящегося по адресу hund, т.е.

;числа 46

mov ah,2dh ; номер функции для установки времени

int 21h ; вызвать прерывание равное 21h —

; установить время

cmp ah,0ffh ; проверяем правильность установки

;времени

je err ; переход на обработку ошибки, иначе-

; следующая команда

lea dx,msg1 ; адpес стpоки для вывода того, что

; время установлено и правильно

; выводим строку с фразой “OK”

kon: mov ah,9h ; вывод стpоки символов на экpан,

;функция 9h

int 21h ; вывод стpоки

jmp kon1 ; на конец программы

err: lea dx,msg2 ; адpес стpоки для вывода того, что

; время не установлено, поскольку

;неправильно

; выводим строку с фразой “NO”

jmp kon ; переход на метку kon

kon1: mov ah,4ch ; для правильного завершения

;программы необхо-

; димо переслать в регистр ah байт,

;равный 4ch

int 21h ; и вызвать прерывание 21h

c_s ends ; конец сегмента кода

end begin ; конец программы. После end должна

;стоять метка

; начала программы – точка

;входа в программу

2) Программа сброса 3 и 4 бита в байте и установки нулевого и первого в единицу:

s_s segment stack “stack”

dw 12 dup (?)

s_s ends

d_s segment

аа db 75h

sum db 0

d_s ends

c_s segment

assume ss:s_s,ds:d_s,cs:c_s

begin: mov ax,d_s

mov ds,ax

mov dl,aa ; пересылка в регистр dl содержимого,

; находящегося по адресу аа

and dl,11100111b ; сбросить, т.е. установить в ноль, биты

;3 и 4

or dl,00000011b ; установить 0 и 1 бит

mov sum,dl ; записать результат в sum

mov ah,4ch

int 21h

c_s ends

end begin

3) пpогpамма вывода на экpан одного сивола:

s_s segment stack “stack”

dw 12 dup (?)

s_s ends

d_s segment

аа dw 5h,3h; (Прим. : сегмент данных не используется)

d_s ends

c_s segment

assume ss:s_s,ds:d_s,cs:c_s

begin: mov ax,d_s

mov ds,ax

mov ah,2h ; Функция 2h: вывод символа на экpан

mov dx,41h ; Символ для вывода

int 21h ; Выводим символ

mov ah,4ch

int 21h

c_s ends

end begin