5. Исполняемые файлы. Консольный ввод/вывод символа

Цель работы: ознакомление с типами исполняемых файлов, приобретение навыков использования функций ввода/отображения символа.

Теоретическая часть

Исполняемые файлы

Рассмотрим форматы исполняемых файлов типа .comи .exe.

В файлах типа .comпрограмма состоит из одного сегмента. Код и данные могут занимать до 64Kb и располагаться в одном сегменте. Для создания .com–файлов используется модель памяти tiny. Чтобы получить .com–файл на этапе линкования, необходимо задать параметр /t.

Исходный код программы начинается с псевдокоманды ORG 100h для сохранения пространства памяти размером 100h под заголовок файла. Данные могут быть размещены в любом месте программы, но рекомендуется  объявлять их вначале.

При этом, чтобы данные не попали в выполняемую часть кода, перед их объявлением следует вставить команду перехода jmp на исполняемый код, иначе они будут интерпретированы как инструкции кода, что приведет к неверному результату.

Регистр DS , как и регистр CS, содержит адрес сегмента кода. Это делается компилятором автоматически.

Точка входа в программу не описывается. Программа всегда начинается с адреса 100h. Завершить программу можно либо с помощью команды RET (возврат из подпрограммы), либо вызовом функции 4ch прерывания 21h.

Образец программы типа .com:

.model tiny
.code
	org 100h 		
start:
	jmp label
...			; область объявления данных
label:
...			;текст программы
	mov ah,4ch
	int 21h		; выход из программы
end start

Для получения файла с расширением .com необходимо выполнить следующие команды (предполагается, что имя исходного файла p.asm):

tasm p.asm

tlink /t p.obj

Формат .exe– самый распространенный для исполняемых файлов. В программах этого формата может быть несколько сегментов. Этот формат используется для программ с большим объемом кода. Размер программы ограничивается только размером доступной памяти.

Программист должен сам следить за правильностью адресов, хранящихся в сегментных регистрах, и явно их инициализировать. Для программ типа .exe можно использовать любую модель памяти: tiny, small, compact, medium, large, huge. Пример программы в формате .exe рассмотрен в предыдущих работах.

Ввод/вывод символа функциями 01h и 02h прерывания 21h

Вызов функции01hпрерывания 21h для введения символа с клавиатуры выполняется следующим образом:

mov   ah, 01h     ;номер вызываемой функции записывается в регистр ah

int       21h             ;вызов прерывания.

;код введенного символа помещается в регистр al

Для сохранения введенного символа после выполнения функции, его рекомендуется переместить в заранее объявленную область памяти размером в один байт или в однобайтный регистр.

Вывод символа на экран можно выполнить с помощью функции02h прерывания 21h:

mov ah, 02h            ;определяем номер функции

mov dl, <код>        ;код символа помещается в регистр dl

int      21h                    ;вызов прерывания

Рассмотрим пример программы, в которой символ вводится с клавиатуры. Введенный символ сохраняется в переменной S, а затем выводится на консоль. Программа будет иметь тип .com:

.model tiny
.code
org 100h
start: jmp 	label_start
s		db 	? 	;объявление неинициализированной переменной
mes1 	db 	‘Введите символ: $’
mes2	db 	‘Вы ввели символ:,10,13,$’
 
label_start:
; вывод первого сообщения
mov	ah,9
lea 	dx,mes1
int 	21h
; ввод символа 
mov 	ah, 1
int 	21h		;в al находится код введенного символа
mov 	s,al		;сохраним его в s
; вывод сообщения 2 
mov 	ah,9
lea 	dx,mes2
int 	21h
; вывод на экран введенного символа
mov 	ah, 2
mov 	dl, s	;ранее мы сохранили символ в переменной s
int 	21h
; завершение программы
mov 	ah, 4ch
int 	21h
end	start
end

Задания

  1. Написать программу для форматов .com и .exe.
  2. Сравнить размеры полученных файлов. Объяснить, почему файлы этих форматов различаются в размерах.

Варианты задач

1. Массив символов s1 определен в сегменте данных. С клавиатуры вводятся строка s2 и символы a1 и a2. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите строку s2:
s2
Введите символ a1:
a1
Введите символ a2:
a2
Результат: s1ba1ba2bs2 (b – символ пробела)

2. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся символы a1 и a2 и строка s3. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите строку s3:
s3
Введите символ a1: a1
Введите символ a2:
a2
Результат: a1bbs2a2bbs1bbs3 (b – символ пробела)

3. Массив символов s1 определен в сегменте данных. С клавиатуры вводятся строки s2 и s3 и символ a1. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите строку s2:
s2
Введите символ a1:
a1
Введите строку s3: s3
Результат: s1bba1s1a1bbs2s3 (b – символ пробела)

4. Массив символов s1 определен в сегменте данных. С клавиатуры вводятся строка s2 и символы a1 и a2. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите строку s2: s2
Введите символ a1:
a1
Введите символ a2: a2
Результат: a1bbs1bba2bbs1bbs2 (b – символ пробела)

5. Массив символов s1 определен в сегменте данных. С клавиатуры вводятся строки s2 и s3 и символы a1, a2 и a3. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите строку s2: s2
Введите символ a1: a1
Введите символ a2:
a2
Введите символ a3: a3
Введите строку s3:
s3
Результат: s1a1bba3a2a2bbs2bbs3 (b – символ пробела)

6. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся строка s3 и символ a1. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите строку s3:
s3
Введите символ a1: a1
Результат: a1bbs2a1s1bbs3bba1 (b – символ пробела)

7. Массив символов s1 определен в сегменте данных. С клавиатуры вводятся строка s2 и символ a1. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите символ a1:
a1
Введите строку s2:
s2
Результат: s1bba1s1bbs2bba1 (b – символ пробела)

8. Массив символов s1 определен в сегменте данных. С клавиатуры вводятся строка s2 и символы a1 и a2. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите символ a1:
a1
Введите символ a2: a2
Введите строку s2: s2
Результат: a2s1bbs1a1bbs2 (b – символ пробела)

9. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся строка s3 и символы a1 и a2. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите символ a1: a1
Введите символ a2: a2
Введите строку s3:
s3
Результат: s1a1bba2bbs2bbs3 (b – символ пробела)

10. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся строка s3 и символы a1 и a2. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите символ a1: a1
Введите строку s3:
s3
Введите символ a2:
a2
Результат: a1bbs2a2s1bbs3 (b – символ пробела)

11. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся строка s3 и символ a1. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите строку s3: s3
Введите символ a1:
a1
Результат: a1bs2a1s1bbba1bs3 (b – символ пробела)

12. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся строка s3 и символы a1 и a2. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите строку s3:
s3
Введите символ a1: a1
Введите символ a2: a2
Результат: s2bba2s1bs3ba1s3 (b – символ пробела)

13. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся строка s3 и символ a1. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите символ a1: a1
Введите строку s3: s3
Результат: s2ba1bs1bs3ba1bs1 (b – символ пробела)

14. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся строка s3 и символы a1 и a2. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите символ a1: a1
Введите символ a2:
a2
Введите строку s3: s3
Результат: s1ba2ba1bs2bs3ba1 (b – символ пробела)

15. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся строка s3 и символ a1. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите строку s3: s3
Введите символ a1: a1
Результат: a1bs2ba1s1bs3ba1ba1 (b – символ пробела)

16. Массивы символов s1 и s2 определены в сегменте данных. С клавиатуры вводятся строка s3 и символы a1 и a2. Написать программу, которая выводит на экран входные данные по следующему сценарию:
Введите символ a1: a1
Введите строку s3:
s3
Введите символ a2: a2
Результат: a1bs2a1s3bbs1ba2 (b – символ пробела)

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов