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

УТС 7 семестр / ПР1и2 с защитой

.docx
Скачиваний:
2
Добавлен:
10.06.2023
Размер:
493.49 Кб
Скачать

МИНОБРНАУКИ РОССИИ

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

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра АПУ

отчет

по практической работе №1

по дисциплине «Системное программирование»

Тема: Структура EXE- и COM- программы. Вывод на экран. Циклы.

Ввод с клавиатуры.

Студент гр. 8391

Гоглев А.А.

Студент гр. 8391

Шушков Д.А.

Студент гр. 8391

Маликов А.А.

Преподаватель

Кораблев Ю.А.

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

2021

Цель работы.

• Изучение структуры EXE- и COM-программы. Получение навыков вывода данных на экран монитора.

• Получение навыков организации циклических структур в ассемблерных программах. Ввод символов с клавиатуры.

Задание.

1. Разработать EXE-программу вывода символа на экран, и COM- программу вывода на экран строки.

2. Разработать программу ввода строковых данных с клавиатуры. В веденной строке удалить пробелы, все строчные символы «а» заменить на прописные «А» и вывести результирующую строку на экран.

Выполнение работы.

  1. Разработаем EXE-программу вывода символа на экран:

STAK SEGMENT STACK

DB 256 DUP (?)

STAK ENDS

DATA SEGMENT

SYMB DB '$'

DATA ENDS

CODE SEGMENT

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

START:

XOR AX, AX

MOV AX, DATA

MOV DS, BX

MOV AH, 02H

MOV DL, SYMB

INT 21H

MOV AH,4CH

INT 21H

CODE ENDS

END START

В C:\DOS\ воспользуемся редактором «edit.com» для написания ассемблерного кода:

Рис. 1. Код программы program.asm.

Теперь получим EXE-файл нашей программы.

Для этого воспользуемся программой «masm.exe», находящимся в корне диска C. Данная программа преобразовывает ассемблерный код в объектный файл с расширением «.obj». В командной строке пишем:

C:\>masm program.asm

Далее нам потребуется сборщик (линковщик). Для этого воспользуемся программой «link.exe», которая также находится в корне диска C. Эта программа преобразовывает объектный файл в исполняемый с расширением «.exe». В командной строке пишем:

C:\>link program.obj

Рис. 2. Использование команд «masm» и «link».

Теперь содержимое диска C выглядит так:

Рис. 3. Содержимое диска C.

Заметим, что на диске С появились новые файлы «program.obj» и «program.exe». Запустим наш новый исполняемый файл:

Рис. 4. Работа программы «program.exe».

Программа успешно выполнила свою задачу – вывод символа «$» на экран.

  1. Разработаем COM- программу вывода на экран строки.

CODE SEGMENT

ASSUME CS:CODE, DS:CODE, SS:CODE

ORG 100H

START:

XOR AX, AX

MOV AH, 09H

MOV DX, OFFSET STR

INT 21H

MOV AH,4CH

INT 21H

STR DB “HELLO, WORLD$”

CODE ENDS

END START

Напишем код в «edit.com»:

Рис. 5. Код программы program2.asm.

Получим EXE-файл тем же способом, что и program.exe:

C:\>masm program2.asm

C:\>link program2.obj

Рис. 6. Использование команд «masm» и «link».

В этот раз мы должны получить COM-файл. Программа masm не позволяет получить данный тип файла напрямую: при создании EXE-файла мы получаем ошибку «no stack segment». Выходом в нашем случае послужит утилита «exetobin.exe», которая конвертирует выполняемый файл .EXE в выполняемый файл .COM. Для этого пишем в командной строке:

C:\>exetobin program2.exe program2.com

Рис. 7. Использование команды «exetobin».

Теперь содержимое диска C выглядит так:

Рис. 8. Содержимое диска C.

Запустим «program2.com»:

Рис. 9. Работа программы «program2.com».

Программа успешно выполнила свою задачу – вывод строки «HELLO WORLD$» на экран.

  1. Разработаем программу, ввода строковых данных с клавиатуры. В веденной строке удалим пробелы, а все строчные символы «а» заменим на прописные «А» и выведем результирующую строку на экран.

CODE SEGMENT

ASSUME CS:CODE, DS:CODE, SS:CODE

ORG 100H

START:

XOR AX, AX

MOV AH, 0AH

LEA DX, BUFFER

INT 21H

MOV AL, [BUFFER+1]

TEST AL, AL

JZ EXIT

XOR CX, CX

MOV CL, AL

LEA SI, BUFFER+2 ; индекс символа введенной строки

MOV DI, SI ; индекс символа преобразованной строки

LEA BX, [BUFFER+1]

MOV [BX], BYTE PTR 0

CYCLE: ; функция проверки символа

MOV AL, [SI]

CMP AL, ‘ ‘

JE PASS

CMP AL, ‘a’

JNE PUT

ADD AL, ‘A’-‘a’

PUT: ; функция вставки символа в новую строку

MOV [DI], AL

INC DI

ADD [BX], BYTE PTR 1

PASS: ; функция пропуска пробела

INC SI

LOOP CYCLE

MOV [DI], BYTE PTR ‘$’ ; признак окончания строки

MOV AH, 09H

LEA DX, NL

INT 21H

MOV AH, 09H

LEA DX, BUFFER+2

INT 21H

EXIT:

MOV AH, 4CH

INT 21H

BUFFER DB 128, 128 DUP(‘$’)

NL DB 0AH, 0AH, 0DH, ‘$’

CODE ENDS

END START

Напишем код в «edit.com»:

Рис. 10. Код программы program3.asm.

Рис. 11. Продолжение кода программы program3.asm.

Рис. 12. Продолжение кода программы program3.asm.

Получим COM-файл тем же способом, что и program2.com:

C:\>masm program3.asm

C:\>link program3.obj

C:\>exetobin program3.exe program3.com

Рис. 13. Использование команд «masm», «link» и «exetobin».

Теперь содержимое диска C выглядит так:

Рис. 14. Содержимое диска C.

Запустим «program3.com»:

Рис. 15. Работа программы «program2.com».

Получившаяся программа успешно выполнила свою задачу – считала строку, удалила все пробелы, а также заменила все строчные символы «а» на прописные «А».

Вывод.

В данной практической работе мы изучили виды структур написания программ на ассемблере EXE и COM. Ознакомились с программами «masm.exe», «link.exe» и «exetobin.exe», которые позволяют получить исполнительные файлы; узнали как осуществляется ввод/вывод со стандартных портов.

Выполнение задания на защиту.

Без использования команд умножения и деления вычислить: B = (A div 1000) * (A mod 1000)

CODE SEGMENT

ASSUME CS:CODE, DS:CODE, SS:CODE

ORG 100H

START:

MOV AX, F5E // 3934 в десятичной

MOV CX, 0 // частное от деления на 1000 (03E8h)

LOOP1:

SUB AX, 3E8 // отнимаем по 1000 для получения остатка в AX

INC CX // считаем частное путем отнимания 1000

JS NEGATIVE // если значение стало отрицательным

LOOP LOOP1 // иначе повторяем отнимать по 1000

NEGATIVE:

ADD AX, 3E8 // если тут, возвращаем лишнее отнятое

JZ IFZERO // если в AX ноль, то число делится без остатка на 1000

MOV BX, 0 // инициализируем BX нулём

LOOP2:

ADD BX, AX // циклически выполняем умножение

LOOP LOOP2 // путем прибавления AX и уменьшения счетчика CX

JMP EXIT

IFZERO:

MOV BX, 0 // ответ 0, т.к. AX - кратное 1000

EXIT:

MOV AH, 4CH

INT 21H

CODE ENDS

END START

Рис. 16. Код программы.

Соседние файлы в папке УТС 7 семестр