Регистровые указатели: sp и bp
Регистровые указатели SP и BP обеспечивают системе доступ к данным в сегменте стека. Реже они используются для операций сложения и вычитания.
1. Регистр SP. Указатель стека обеспечивает использование стека в памяти, позволяет временно хранить адреса и иногда данные. Этот регистр связан с регистром SS для адресации стека.
2. Регистр BP. Указатель базы облегчает доступ к параметрам: данным и адресам переданным через стек.
Индексные регистры: si и di
Оба индексных регистра возможны для расширенной адресации и для использования в операциях сложения и вычитания.
1. Регистр SI. Этот регистр является индексом источника и применяется для некоторых операций над строками. В данном контексте регистр SI связан с регистром DS.
2. Регистр DI. Этот регистр является индексом назначения и применяется также для строковых операций. В данном контексте регистр DI связан с регистром ES.
Регистр командного указателя: ip
Регистр IP содержит смещение на команду, которая должна быть выполнена. Обычно этот регистр в программе не используется, но он может изменять свое значение при использовании отладчика DOS DEBUG для тестирования программы.
Флаговый регистр
Девять из 16 битов флагового регистра являются активными и определяют текущее состояние машины и результатов выполнения. Многие арифметические команды и команды сравнения изменяют состояние флагов. Назначение флаговых битов:
Флаг Назначение
O (Переполнение) Указывает на переполнение
старшего бита при арифметических командах.
D (Направление) Обозначает левое или правое
направление пересылки или сравнения строковых данных (данных в памяти превышающих длину одного слова).
I (Прерывание) Указывает на возможность
внешних прерываний.
T (Пошаговый режим) Обеспечивает возможность работы
процессора в пошаговом режиме. Например, программа DOS DEBUG устанавливает данный флаг так, что возможно пошаговое выполнение каждой команды для проверки изменения содержимого регистров и памяти.
S (Знак) Содержит результирующий знак
послеарифметических операций (0 - плюс,1 - минус).
Z (Ноль) Показывает результат
арифметических операций и операций сравнения (0 - ненулевой, 1 – нулевой результат).
A (Внешний перенос) Содержит перенос из 3-го бита
для 8-битных данных, используется для специальных арифметических операций.
P (Контроль четности) Показывает четность младших
8-битовых данных (1 - четное и 0 - нечетное число).
C (Перенос) Содержит перенос из старшего
бита, после арифметических операций, а также последний бит при сдвигах или циклических сдвигах.
При программировании на ассемблере наиболее часто используются флаги O, S, Z, и C для арифметических операций и операций сравнения, а флаг D для обозначения направления в операциях над строками. В последующих главах содержится более подробная информация о флаговом регистре.
Код программы:
Файл: hello1.exe
DOSSEG ; Задание сегментов под ДОС
.MODEL SMALL ; Модель памяти-SMALL(Малая)
.STACK 100h ; Отвести под Стек 256 байт
.DATA ; Начало сегмента данных
Greeting LABEL BYTE ; Текст приветствия
DB 'Вас приветствует ст.гр.1304 – Плохой Н.А.',13,10,'$'
.CODE ; Начало сегмента кода
mov ax,@data ; Загрузка в DS адреса начала
mov ds,ax ; сегмента данных
mov dx,OFFSET Greeting ; Загрузка в dx смещения
; адреса текста приветствия
DisplayGreeting:
mov ah,9 ; # функции ДОС печати строки
int 21h ; вывод на экран приветствия
mov ah,4ch ; # функции ДОС завершения программы
int 21h ; завершение программы и выход в ДОС
END
Файл: hello2.exe
;Программа использует процедуру для печати строки
EOFLine EQU '$' ; Определение символьной константы "Конец строки"
AStack SEGMENT STACK ; Стек программы
DW 12 DUP(?) ; Отводится 12 слов памяти
AStack ENDS
DATA SEGMENT ; Данные программы
; Директивы описания данных
HELLO DB 'Здравствуйте!', 0AH, 0DH,EOFLine
GREETING DB 'Вас приветствует ст.гр.1304 – Плохой Н.А.$'
DATA ENDS
CODE SEGMENT ; Код программы
ASSUME CS:CODE, DS:DATA, SS:AStack
WriteMsg PROC NEAR ; Процедура печати строки
mov AH,9
int 21h ; Вызов функции DOS по прерыванию
ret
WriteMsg ENDP
Main PROC FAR ; Головная процедура
push DS ;\ Сохранение адреса начала PSP в стеке
sub AX,AX ; > для последующего восстановления по
push AX ;/ команде ret, завершающей процедуру.
mov AX,DATA ; Загрузка сегментного
mov DS,AX ; регистра данных.
mov DX, OFFSET HELLO ; Вывод на экран первой
call WriteMsg ; строки приветствия.
mov DX, OFFSET GREETING ; Вывод на экран второй
call WriteMsg ; строки приветствия.
ret ; Выход в DOS по команде,
; находящейся в 1-ом слове PSP.
Main ENDP
CODE ENDS
END Main
Трассировка:
Файл: hello1.exe
ds = 15C0 cs = 15D0 ss = 15D5 es = 15C0
Адрес команды |
Символический код команды |
16-ный код команды |
| |||
0010 |
MOV AX,15D2 |
B8D215 |
ax = 0000 ip = 0010 |
ax = 15D2 ip = 0013 | ||
0013 |
MOV DS,AX |
8ED8 |
ax = 15D2 ds = 15C0 ip = 0013 |
ax = 15D2 ds = 15D2 ip = 0015 | ||
0015 |
MOV DX,0000 |
BA0000 |
dx = 0000 ip = 0015 |
dx = 0000 ip = 0018 | ||
0018 |
MOV AH,09 |
B409 |
ax = 15D2 ip = 0018 |
ax = 09D2 ip = 001A | ||
001A |
INT 21 |
CD21 |
ax = 09D2 ip = 001A |
ax = 0924 ip = 1C | ||
001C |
MOV AH,4C |
B44C |
ax = 09D2 ip = 001C |
ax = 4CD2 ip = 001E | ||
001E |
INT 21 |
CD21 |
ip = 001E |
Программа завершена |
Файл: hello2.exe
ds = 15C0 cs = 15D6 ss = 15D0 es = 15C0
Адрес команды |
Символический код команды |
16-ый код команды |
Содержимое регистров и ячеек памяти | |
до выполнения |
после выполнения | |||
0005 |
PUSH DS |
1E |
sp = 0018 ip = 0005 |
sp = 0016 ip = 0006 |
0006 |
SUB AX,AX |
2BC0 |
ax = 0000 ip= 0006 |
ax = 0000 ip= 0008 |
0008 |
PUSH AX |
50 |
sp = 0016 ip = 0008 |
sp = 0014 ip = 0009 |
0009 |
MOV AX,15D2 |
B8D215 |
ax = 0000 ip= 0009 |
ax = 15D2 ip= 000C |
000C |
MOV DS,AX |
8ED8 |
ds = 15C0 ip = 000C |
ds = 15D2 ip = 000E |
000E |
MOV DX, 0000 |
BA0000 |
dx = 0000 ip = 000E |
dx = 0000 ip = 0011 |
0011 |
CALL 0000 |
E8ECFF |
sp = 0014 ip = 0011 |
sp = 0012 ip = 0000 |
0000 |
MOV AH,09 |
B409 |
ax = 15D2 ip = 0000 |
ax = 09D2 ip = 0002 |
0002 |
INT 21 |
CD21 |
ax = 09D2 ip = 0002 |
ax = 0924 ip = 0004 |
0004 |
RET |
C3 |
sp = 0012 ip = 0004 |
sp = 0014 ip = 0014 |
0014 |
MOV DX, 0010 |
BA1000 |
dx = 0000 ip = 0014 |
dx = 0010 ip = 0017 |
0017 |
CALL, 0000 |
E8E6FF |
sp = 0014 ip = 0017 |
sp = 0012 ip = 0000 |
0000 |
MOV AH, 09 |
B409 |
ax = 0924 ip = 0000 |
ax = 0924 ip = 0002 |
0002 |
INT 21 |
CD21 |
ip = 0002 |
ip = 0004 |
0004 |
RET |
C3 |
sp = 0012 ip = 0004 |
sp = 0014 ip = 001A |
001A |
RET |
CB |
sp = 0014 ip = 001A |
sp = 0016 ip = 0000 |
0000 |
INT 20 |
CD20 |
sp = 0018 ip = 0000 |
Программа завершена |
Результат программы:
В результате вызова программы hello1.exe мы увидим на экране сообщение: «Вас приветствует ст.гр.1304 – Плохой Н.А.»
При выполнении программы hello2.exe на экране будет отображена та же строка приветствия, но она будет выведена с использованием процедуры для печати строки.
Вывод:
В результате выполнения данной лабораторной работы мы приобрели навыки по трансляции и компиляции программы на языке Ассемблер. В процессе выполнения были транслированы, а затем откомпилированы две программы: hello1.exe и hello2.exe После чего, данные программы были проверены на отладчике и результаты их выполнения представлены в виде таблиц.