Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет 1 лаба (архитектура).doc
Скачиваний:
14
Добавлен:
09.02.2015
Размер:
111.1 Кб
Скачать

Регистровые указатели: 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 для обозначения направления в операциях над строками. В последующих главах содержится более подробная информация о флаговом регистре.

  1. Код программы:

Файл: 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

  1. Трассировка:

Файл: 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

Программа завершена

  1. Результат программы:

В результате вызова программы hello1.exe мы увидим на экране сообщение: «Вас приветствует ст.гр.1304 – Плохой Н.А.»

При выполнении программы hello2.exe на экране будет отображена та же строка приветствия, но она будет выведена с использованием процедуры для печати строки.

  1. Вывод:

В результате выполнения данной лабораторной работы мы приобрели навыки по трансляции и компиляции программы на языке Ассемблер. В процессе выполнения были транслированы, а затем откомпилированы две программы: hello1.exe и hello2.exe После чего, данные программы были проверены на отладчике и результаты их выполнения представлены в виде таблиц.

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