
Міністерство освіти і науки України
Національний технічний університет України
«Київський політехнічний інститут»
Факультет інформатики та обчислювальної техніки
Кафедра технічної кібернетики
Звіт до лабораторних робіт з дисципліни
Системне програмування
Виконав:
Викладач:
Київ – 2009
Лабораторна робота №1
Тема:створення програм на асемблері.
Завдання:
1. Для програми, наведеної вище, створити файл типу .asm. Ця програма не має
засобів виводу даних, тому правильність її виконання треба перевірити за
допомогою td.exe.
2. Скомпілювати програму, включивши потрібні опції для налагоджувача та створення
файла лістингу типу .lst.
3. Ознайомитись зі структурою файла .lst. За вказівкою викладача, для певної команди
асемблера розглянути структуру машинної команди і навести її у звіті.
4. Скомпонувати .obj-файл програми. Включити опції для налагодження та створення
.map-файлу.
5. Занести до звіту адреси початку та кінця всіх сегментів з .map-файлу.
6. Завантажити до налагоджувача td.exe одержаний .exe-файл програми.
7. У вікні CPU у полі DUMP знайти початкову адресу сегмента даних та записати
його до звіту. Знайти масиви SOURCE та DEST. Дані у масиві SOURCE подаються
у шістнадцятковій системі.
8. У покроковому режимі за допомогою клавіші F7 виконати програму. Одержані
результати у масиві DEST показати викладачеві.
Текст програми:
STSEG SEGMENT PARA STACK "STACK"
DB 64 DUP ( "STACK" )
STSEG ENDS
DSEG SEGMENT PARA PUBLIC "DATA"
SOURCE DB 10, 20, 30, 40
DEST DB 4 DUP ( "?" )
DSEG ENDS
CSEG SEGMENT PARA PUBLIC "CODE"
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, SS: STSEG
; адреса повернення
PUSH DS
MOV AX, 0
PUSH AX
; ініціалізація DS
MOV AX, DSEG
MOV DS, AX
; обнуляємо масив
MOV DEST, 0
MOV DEST+1, 0
MOV DEST+2, 0
MOV DEST+3, 0
; пересилання
MOV AL, SOURCE
MOV DEST+3, AL
MOV AL, SOURCE+1
MOV DEST+2, AL
MOV AL, SOURCE+2
MOV DEST+1, AL
MOV AL, SOURCE+3
MOV DEST, AL
RET
MAIN ENDP
CSEG ENDS
END MAIN
Блок-схема до програми:
Отримані результати:
Адреси початку та кінця всіх сегментів з .map-файлу:
Start Stop Class
00000H 0013FH STACK
00140H 00147H DATA
00150H 00186H CODE
Початкова адреса сегмента даних: 5490
Висновки:Програма вирішує поставлене завдання. Теоретичні розрахунки відповідають отриманим. Програма працює правильно.
Лабораторна робота №2
Тема:засоби обміну даними.
Завдання:
1. Скласти процедуру введення і перетворення цілого числа.
2. Скласти і релізувати програму введення та виведення цілого числа зі знаком та
виведення рядка символів.
Текст програми:
LAB_2
assume CS:code, DS:data
code segment
begin:
mov AX, data
mov DS, AX
call Input ; ввод целого числа с клавы
call Display_ok
call Output ; вывод целого числа с АХ
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
;----------------------------------------------------------------------------------------------------------
Input proc
mov DX, offset Buff ; вводимнашечисло
mov AH, 10
int 21h
mov SI, offset Buff+1 ; адрес где лежит кол-во введенных цифр
xor CX, CX
mov CL, [SI] ; берем кол-во введенных цифр для цикла
cmp CX, 0 ; если ноль - на выход
je exit_lbl
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
inc SI ; берем первый разряд нашего числа
mov AL, [SI] ; пхаем его в регстр для обработки
cmp AL,'-' ; если минус - установить флаг
jne positiv
mov fl, 1 ; флаг негативного числа
dec CL ; кло-во цифр стало на 1 меньше
cmp CX, 0 ; если кроме минуса там ничего нет - на выход
je exit_lbl
inc SI ; следующий разряд нашего числа
positiv:
xor AX, AX
xor DI, DI
mov DI, 10 ; 10 - кратность
dec SI ; адрес цифры возвращаем обратно
lbl1:
inc SI ; берем следующий разряд нашего числа
xor BX, BX
mov BL, [SI] ; пхаем его в регстр для обработки
sub BL, '0' ; обрабатываем его - перобразуем в людской вид
cmp BL, 9 ; если это не цифра - на выход
ja exit_lbl
mul DI ; умножаем его на 10
add AX, BX ; складываем до купы
loop lbl1
cmp fl,1 ; если у нас отрицательное число
jne ee
neg AX ; цепляем ему минус
ee:
ret
exit_lbl:
call Error_Exit
Input endp
;----------------------------------------------------------------------------------------------------------
Output proc
mov BX, 10 ; основа системы счисления
mov DI, offset Buff+6 ; счетчик на конец буффера
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
cmp AX, 0 ; наше число отрицаиельное?
jge Pr1
neg AX ; если да, то делаем его положительным
mov fl, 1 ; но устанавливаем флаг отриц. числа
Pr1: xor DX, DX ; тут будет остаток
div BX ; делим АХ на 10 - остаток в DX
mov SI, offset Tabl ; адес начала таблицы с символами
add SI, DX ; адрес нужного нам символа
mov DL, [SI] ; пхаем его в память, там где Buff
mov [DI], DL
dec DI ; переходим на следующее место
cmp AX, 0 ; а не закончилось ли у нас число?
jnz Pr1 ; если нет то опять за свое
cmp fl,1 ; если у нас отрицательное число
jne eee
mov DL, '-'
mov [DI], DL ; цепляем ему минус
dec DI ; переходим на следующее место
eee:
mov AH, 9 ; если да, то гуляем (выводим число на экран)
mov DX, DI ; это у нас место, где начинается символы числа
inc DX ; на самом деле чуть правее
int 21h
ret
Output endp
;----------------------------------------------------------------------------------------------------------
Display_ok proc ; сообщаем, что все хорошо
push AX
mov DX, offset text1
mov AH, 9
int 21h
pop AX
ret
Display_ok endp
;----------------------------------------------------------------------------------------------------------
Error_Exit proc ; сообщаем, что все пропало и выходим
mov DX, offset text2
mov AH, 9
int 21h
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
ret
Error_Exit endp
;----------------------------------------------------------------------------------------------------------
code ends
data segment
Buff db 5, 6 dup(0), '$'
fl db 0
Tabl db '0123456789'
text1 db 13, 10, 'All ok', 13, 10, '$'
text2 db 13, 10, 'Error Exit', 13, 10, '$'
data ends
end
stak segment stack
db 256 dup(?)
stak ends
end begin
Блок-схема до програми:
Отримані результати:
100 All ok 100 -100 All ok -100
Висновки:Програма вирішує поставлене завдання. Теоретичні розрахунки відповідають отриманим. Програма працює правильно.