Скачиваний:
85
Добавлен:
11.02.2014
Размер:
398.44 Кб
Скачать

Міністерство освіти і науки України

Національний технічний університет України

«Київський політехнічний інститут»

Факультет інформатики та обчислювальної техніки

Кафедра технічної кібернетики

Звіт до лабораторних робіт з дисципліни

Системне програмування

Виконав:

Викладач:

Київ – 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

Висновки:Програма вирішує поставлене завдання. Теоретичні розрахунки відповідають отриманим. Програма працює правильно.

Соседние файлы в папке лабораторные работы по ASSAMBLER