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

Санкт-Петербургский государственный электротехнический университет

Отчёт по лабораторной работе №1

по дисциплине «Организация и функционирование ЭВМ»

Проверил:

Выполнил: Юбрин А.Н.

Шин Е.Д.

Санкт-Петербург

2002

1. Цель работы

  • Изучение структуры программы на языке Assembler.

  • Изучение работы программы отладчиком и отладка программы.

  • Вывод текстовой строки на экран с помощью стандартной функций MS-DOS.

  • Центрирование строки на экране (несколько способов).

2.

Программа на языке Assembler состоит из определения одного или нескольких сегментов (программ без сегментов не бывает).

Обычно в программе задаются три сегмента: команд, данных и стека. В сегменте кода обычно размещается код программы, т.е. последовательность операторов описывающих выполняемые процессором команды.

Сегмент данных в основном служит для хранения данных обрабатываемых программой.

Сегмент стека служит для размещения структуры называемой стеком. Стек - это область памяти, в которой можно сохранять значения и из которой они могут затем извлекаться по дисциплине "последний – пришел – первый - ушел" (FIFO).

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

3.

В результате лабораторной работы в исходном тексте были проведены следующие изменения:

  • Изменено содержимое строк сообщений Hello, Greeting в соответствии со своими параметрами (таблица 2)

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

4.

Для вывода строки используется функция MS-DOS - 09h – запись строки на стандартное устройство вывода (в данном случае консоль) (строка завершается символом ‘$’).

Вход:

AX – 09h (номер функции)

DS:DX – адрес строки

Выход:

Ничего не возвращает

Сегментная адресация, сегментная структура программ. МП Intel 8086 имеет 16 разрядную шину данных, таким образом максимальное передаваемое число 216-1=65535. Однако адресная шина 20 разрядов, что соответствует адресному пространству в 1 Мб, для того, чтобы с помощью 16 разрядных чисел можно было адресовать любую точку пространства, существуют 4 сегментных регистра.

Таблица 1

Содержимое регистров при отладке программы в Turbo Debugger v3.1

Regs Start program

ax 0000

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0018

ds 5F50

es 5F50

ss 5F60

cs 5F67

ip 0005

Regs push DS

ax 0000

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0016

ds 5F50

es 5F50

ss 5F60

cs 5F67

ip 0006

Regs sub ax,ax

ax 0000

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0016

ds 5F50

es 5F50

ss 5F60

cs 5F67

ip 0008

Regs push ax

ax 0000

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0014

ds 5F50

es 5F50

ss 5F60

cs 5F67

ip 0009

Regs mov ax,DATA

ax 5F62

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0014

ds 5F50

es 5F50

ss 5F60

cs 5F67

ip 000C

Regs mov ds,ax

ax 5F62

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0014

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 000E

Regs mov dx,offset

Hello

ax 5F62

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0014

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 0011

Regs call WriteMsg

ax 5F62

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0012

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 0000

Regs mov ah,9

ax 0962

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0012

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 0002

Regs int 21h

ax 0924

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0012

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 0004

Regs ret

ax 0924

bx 0000

cx 0000

dx 0000

si 0000

di 0000

bp 0100

sp 0014

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 0014

Regs mov dx,offset

GRETTING

ax 0924

bx 0000

cx 0000

dx 0010

si 0000

di 0000

bp 0100

sp 0014

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 0017

Regs call WriteMsg

ax 0924

bx 0000

cx 0000

dx 0010

si 0000

di 0000

bp 0100

sp 0012

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 0000

Regs mov ah,9

ax 0924

bx 0000

cx 0000

dx 0010

si 0000

di 0000

bp 0100

sp 0012

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 0002

Regs int 21h

ax 0924

bx 0000

cx 0000

dx 0010

si 0000

di 0000

bp 0100

sp 0012

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 0004

Regs ret

ax 0924

bx 0000

cx 0000

dx 0010

si 0000

di 0000

bp 0100

sp 0014

ds 5F62

es 5F50

ss 5F60

cs 5F67

ip 001A

Terminated, exit code 0

Таблица 2

; ТЕКСТ ПРОГРАММЫEOFLine EQU '$' ; Определение символьной константы

; "Конец строки"

; Стек программы

AStack SEGMENT STACK

DW 12 DUP(?) ; Отводится 12 слов памяти

AStack ENDS

; Данные программы

DATA SEGMENT

; Директивы описания данных

HELLO DB 'Здравствуйте!', 0AH, 0DH,EOFLine

GREETING DB 'Вас приветствуют ст.гр.0341 - Шин Е.Д.',0Ah,0Dh

DB 'и ст.гр.0341 - Юбрин А.Н.',EOFLine

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

2 Способа центрирования строки на экран

1 Способ, при помощи пробелов

EOFLine EQU '$' ; Определение символьной константы

; "Конец строки"

; Стек программы

AStack SEGMENT STACK

DW 12 DUP(?) ; Отводится 12 слов памяти

AStack ENDS

; Данные программы

DATA SEGMENT

; Директивы описания данных

Clear db 80*25 dup (' '),eofLine NextStr db 0Ah, 0Dh,eofLine

HELLO DB ' Здравствуйте!', 0AH, 0DH,EOFLine

GREETING DB ' Вас приветствуют ст.гр.0341 - Шин Е.Д.',0Ah,0Dh

DB ' и ст.гр.0341 - Юбрин А.Н.',EOFLine

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 CLEAR ; Очистка экрана

call WriteMsg ;

mov DX, OFFSET HELLO ; Вывод на экран первой

call WriteMsg ; строки приветствия.

mov DX, OFFSET GREETING ; Вывод на экран второй

call WriteMsg ; строки приветствия.

mov DX, OFFSET NextStr ; Вывод на экран сдвига

mov CX,11

mt:

call WriteMsg

loop mt

ret ; Выход в DOS по команде,

; нах-ся в 1-ом слове PSP.

Main ENDP

CODE ENDS

END Main

2 Способ, при помощи позиционирования курсора функцией bios int 10h фн 02

EOFLine EQU '$' ; Определение символьной константы

; "Конец строки"

; Стек программы

AStack SEGMENT STACK

DW 12 DUP(?) ; Отводится 12 слов памяти

AStack ENDS

; Данные программы

DATA SEGMENT

; Директивы описания данных

HELLO DB 'Здравствуйте!', 0AH, 0DH,EOFLine

GREETING DB 'Вас приветствуют ст.гр.0341 - Шин Е.Д.',EOFLine

GREETING1 DB 'и ст.гр.0341 - Юбрин А.Н.',EOFLine

DATA ENDS

; Код программы

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:AStack

; Процедура печати строки

WriteMsg PROC NEAR

mov AH,9

int 21h ; Вызов функции DOS по прерыванию

ret

WriteMsg ENDP

; Процедура позиционирования курсора

CursPos PROC NEAR

push AX ; Сохраняем регистр АХ

push BX ; Сохраняем регистр ВХ

mov Ah,2 ; Позиционируем курсор

mov BX,0

int 10h

pop BX ; Восстанавливаем регистр BX

pop AX ; Восстанавливаем регистр AX

ret

CursPos ENDP

ClearScr PROC NEAR

push AX

mov Ah,0

mov Al,3

int 10h

pop AX

ret

ClearScr ENDP

; Головная процедура

Main PROC FAR

push DS ;Сохранение адреса начала PSP в стеке

sub AX,AX ;для последующего восстановления по

push AX ;команде ret, завершающей процедуру.

mov AX,DATA ; Загрузка сегментного

mov DS,AX ; регистра данных.

call ClearScr ; Очистка экрана

push DX ; Позиционирование курсора

mov DX, 0A21h

call CursPos

pop DX

mov DX, OFFSET HELLO ; Вывод на экран первой

call WriteMsg ; строки приветствия.

push DX ; Позиционирование курсора

mov DX, 0B15h

call CursPos

pop DX

mov DX, OFFSET GREETING ; Вывод на экран второй

call WriteMsg ; строки приветствия.

push DX ; Позиционирование курсора

mov DX, 0C1Bh

call CursPos

pop DX

mov DX, OFFSET GREETING1 ; Вывод на экран второй половины

call WriteMsg ; строки приветствия.

ret ; Выход в DOS по команде,

; нах-ся в 1-ом слове PSP.

Main ENDP

CODE ENDS

END Main

Вывод: В результате проведенной лабораторной работы, мы научились работать с транслятором tasm и редактором связей tlink, а также отладчиком turbo Debugger. Видно, что программа на языке assembler более четко показывает работу процессора, чем языки высокого уровня, но значительно увеличивает трудоемкость, при написании программы.

Узнали несколько способов центрирования текста.