4. Процесс транслирования и выполнения программы
Набор символьной программы в среде программирования Turbo Pascal, ее трансляция и выполнение (с получением результатов на экране дисплея) выполняются как обычно.
Ассемблерные вставки в программе на языке Pascal оформляются так:
Метки переходов необходимо объявить командой Label. (Прим. ред.: Можно их и не объявлять, если они начинаются с одного [!] символа “@” [собачка, коммерческая эт])
Команды ассемблера начинаются строчкой Asm и завершаются строчкой End;.
После метки ставится двоеточие.
Переменные, объявляемые как байты, должны пересылаться в регистры-байты (AH, AL, BH, BL, CH, CL, DH, DL).
Если используются слова — в регистры слова (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
