Санкт-Петербургский государственный электротехнический университет
Отчёт по лабораторной работе №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 более четко показывает работу процессора, чем языки высокого уровня, но значительно увеличивает трудоемкость, при написании программы.
Узнали несколько способов центрирования текста.