Сист. прогр. Ч1 (Лекции по СПО), страница 5

2018-01-12СтудИзба

Описание файла

Файл "Сист. прогр. Ч1" внутри архива находится в следующих папках: Лекции по СПО, сис пр об. Документ из архива "Лекции по СПО", который расположен в категории "". Всё это находится в предмете "операционные системы" из 7 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "операционные системы" в общих файлах.

Онлайн просмотр документа "Сист. прогр. Ч1"

Текст 5 страницы из документа "Сист. прогр. Ч1"

3. Класс. Данный элемент, заключенный в апострофы, используется для группирования относительных сегментов при компоновке:

имя SEGMENT PARA STACK 'Stack'

фрагмент программы на рис.3.1 в следующем разделе иллюстрирует директиву SEGMENT и ее различные параметры.

Директива PROС

Сегмент кода содержит выполняемые команды программы. Кроме того, этот сегмент также включает в себя одну или несколько процедур, определенных директивой PROC. Сегмент, содержащий только одну процедуру, имеет следующий вид:

имя _ сегмента SEGMENT PARA

имя _ процедуры PROC FAR

Сегмент кода с одной процедурой

RET
имя_процедуры ENDP
имя_ сегмента ENDS

Имя процедуры должно обязательно присутствовать, быть уникальным и удовлетворять соглашениям по именам в Ассемблере. Операнд FAR указывает загрузчику DOS, что начало данной процедуры является точкой входа для выполнения программы.

Директива ENDP определяет конец процедуры и имеет имя, аналогичное имени в директиве PROC. Команда RET завершает выполнение программы и в данном случае возвращает управление в DOS.

Сегмент может содержать несколько процедур.

Директива ASSUME

Процессор использует регистр SS для адресации стека, регистр DS для адресации сегмента данных и регистр CS для адресации сегмента кода. Ассемблеру необходимо сообщить назначение каждого сегмента. Для этого служит директива ASSUME, кодируемая в сегменте кода следующим образом:

Директива Операнд

ASSUME SS:им _ стек, DS:им _ дан, CS:им_ код

Например, SS:им_стек указывает, что ассемблер должен ассоциировать имя сегмента стека с регистром SS. Операнды могут записываться в любой последовательности. Регистр ES также может присутствовать среди операндов. Если программа не использует регистр ES, то его можно опустить или указать ES:NOTHING.

Директива END

Как уже показано, директива ENDS завершает сегмент, а директива ENDP завершает процедуру. Директива END в свою очередь полностью завершает всю программу:

Директива Операнд

END [имя_процедуры]

Операнд может быть опущен, если программа не предназначена для выполнения, например, если ассемблируются только определения данных, или эта программа должна быть скомпонована с другим (главным) модулем. Для обычной программы с одним модулем операнд содержит имя, указанное в директиве PROC, которое было обозначено как FAR.



ПАМЯТЬ И РЕГИСТРЫ

Рассмотрим особенности использования в командах имен, имен в квадратных скобках и чисел: В следующих примерах положим, что WORD А определяет слово в памяти:

MOV АХ,ВХ ;Переслать содержимое ВХ в регистр АХ
MOV AX,WORDA ;Переслать WORDA в регистр АХ
MOV АХ, [ВХ] ;Переслать содержимое памяти по

;адресу в регистре ВХ в регистр АХ

MOV АХ,25 ;Переслать значение 25 в регистр АХ
MOV АХ, [25] ;Переслать содержимое по смещению 25

Новым здесь является использование квадратных скобок, что потребуется в следующих главах.

ИНИЦИАЛИЗАЦИЯ ПРОГРАММЫ

Существует два основных типа загрузочных программ: ЕХЕ и СОМ.
Рассмотрим требования к ЕХЕ-программам, а СОМ-программы
будут представлены дальше. Система DOS имеет четыре требования
для инициализации ассемблерной ЕХЕ-программы. Для этого
необходимо: 1} указать ассемблеру, какие сегментные регистры
должны соответствовать сегментам, 2) сохранить в стеке адрес
находящийся в регистре DS, когда программа начнет выполнение,
3) записать в стек нулевой адрес и 4) загрузить в регистр DS
адрес сегмента данных.

Выход из программы и возврат в DOS сводится к использованию команды RET. На рис.3.1. проиллюстрированы требования к инициализации н выходу из программы:

1. ASSUME - это ассемблерная директива, которая устанавливает для ассемблера соответствие между конкретными сегментами и сегментными регистрами; в данном случае соответствует CS, DATASG - DS и STACKSG - SS. DATASG и STACKSG не определены в этом примере, но они могли быть представлены следующим образом:

STACKSG SEGMENT PARA STACK Stack 'Stack'
DATASG SEGMENT PARA 'Data'

Ассоциируя сегменты с сегментными регистрами, ассемблер сможет определить смещения к отдельным областям в каждом сегменте. Например, каждая команда в сегменте кодов имеет определенную длину: первая имеет смещение 0, и если это двухбайтовая команде, вторая команда будет иметь смещение 2 и т.д.

Загрузочному модулю в памяти непосредственно
предшествует 256-байтовая (100Н) область, называемая
префиксом программного сегмента PSP. Программа
загрузчика использует регистр DS для установки адреса
начальной точки PSP. Пользовательская программа должна
сохранить этот адрес, поместив его в стек. Позже команда
RET возьмет этот адрес из стека для возврата в DOS.
В системе требуется, чтобы следующее значение в стеке
являлось нулевым адресом (точнее, смещением). Для этого
команда SUB очищает регистр АХ, вычитая его из этого же
регистра АХ, а команда PUSH заносит это значение в стек.
Загрузчик DOS устанавливает правильные адреса стека в
регистре SS и сегмента кодов в регистре CS. Поскольку
программа загрузчика использует регистр DS для других
целей, необходимо инициализировать регистр DS двумя
командами MOV, как показано на рис.3.1. В следующем
разделе этой главы "Пример исходной программы" детально
поясняется инициализация регистра DS.

Команда RET обеспечивает выход из пользовательской программы и возврат в DOS, используя для этого адрес, записанный в стек в начале программы командой PUSH DS. Другим часто используемым способом завершения программы является команда INT 20H.

CODESG SEGMENT PARA ‘CODE’

BEGIN PRQC FAR

1. ASSUME CS:CODESG,DS:DATASG,SS:STACKG

2. PUSH DS ;3аписать DS в стек

3. SUB AX,AX ;Установить ноль в АХ
PUSH AX ;3аписать ноль в стек

4. MOV AX,DATASG ;3анести адрес
MOV DS,AX ; DATASG в DS

5. RET ;Возврат в DOS

BEGIN ENDP

CODESG ENDS

END BEGIN

Рис.3.1. Инициализация ЕХЕ-программы

Теперь, даже если приведенная инициализация программы до конца не понятна, не отчаивайтесь. Каждая программа фактически имеет аналогичные шаги инициализации, так что их можно дублировать всякий раз при кодировании программ.

ПРИМЕР ИСХОДНОЙ ПРОГРАММЫ

На рис.3.2 обобщены предыдущие сведения в простой исходной программе на ассемблере. Программа содержит сегмент стека -STACKSG и сегмент кода - CODESG.

Сегмент STACKSG содержит один элемент DB (определить байт), который определяет 12 копий слова 'STACKSEG'. В последующих программах стек не определяется таким способом, но при использовании отладчика для просмотра ассемблированной программы на экране данное определение помогает локализовать стек.

Сегмент кода CODESG содержит выполняемые команды программы, хотя первая директива ASSUME не генерирует кода. Директива ASSUME назначает регистр SS для STACKSG и регистр CS для CODESG. В действительности эта директива сообщает ассемблеру, что для адресации в STACKSG необходимо использовать адрес в регистре SS и для адресации в CODESG -адрес в регистре CS. Системный загрузчик при загрузке программы с диска в память для выполнения устанавливает действительные адреса в регистрах SS и CS. Программа не имеет сегмента данных, так как в ней нет определения данных и соответственно в ASSUME нет необходимости ассигновать регистр DS.

page 60,132

TITLE EXASM1 (EXE); Пример регистровых операций

STACKSG SEGMENT PARA STACK 'Stack'

DB 12 DUP('STACKSEG')

STACKSG ENDS

CODESG SEGMENT PARA 'Code'

BEGIN PROC FAR

ASSUME SS:STACKSG, CS:CODESG, DS:NOTHING

PUSH DS ;3аписать DS в стек

SUB AX, AX ;3аписать ноль

PUSH AX ; в стек

MOV AX, 0123H .-Записать 0123 в АХ

ADD AX, 0025H ;Прибавить 25 к АХ

MOV BX,AX ;Переслать АХ в ВХ

ADD BX, AX ;Прибавить ВХ к АХ

MOV CX,BX ; Переслать ВХ в СХ

SUB CX, AX ; Вычесть АХ из СХ

SUB AX, AX ;0чистить АХ

NOP

RET ; Возврат в DOS

BEGIN ENDP ; Конец процедуры

CODESG ENDS ;Конец сегмента

END BEGIN ;Конец программы

Рис.3.2. .Пример исходной программы на ассемблере

АССЕМБЛИРОВАНИЕ И ВЫПОЛНЕНИЕ ПРОГРАММ

Всегда необходимо вводить имя исходного файла и обычно запрашивать OBJ-файл - это требуется для компоновки программы в загрузочный файл. Возможно, потребуется указание LST-файла, особенно, если необходимо проверить сгенерированный машинный код. CRF-файл полезен для очень больших программ, где необходимо видеть, какие команды ссылаются на какие поля данных. Кроме того, ассемблер генерирует в LST-файле номера строк, которые используются в CRF-файле.

Ассемблер преобразует исходные команды в машинный код и выдает на экран сообщения о возможных ошибках. Типичными ошибками являются нарушения ассемблерных соглашений по именам, неправильное написание команд (например, MOVE вместо MOV), а также наличие в операндах неопределенных имен. Программа ASM выдает только коды ошибок, которые объяснены в руководстве по ассемблеру, в то время как программа MASM выдает и коды ошибок, и пояснения к ним. Всего имеется около 100 сообщений об ошибках.

Ассемблер делает попытки скорректировать некоторые ошибки, но в любом случае следует перезагрузить текстовой редактор, исправить исходную программу (EXASM1.ASM) и повторить ассемблирование.

На рис 3.3. показан листинг, полученный в результате ассемблирования программы и записанный на диск под именем EXASM1.LST.

В начале листинга обратите внимание на реакцию ассемблера на директивы PAGE и TITLE. Никакие директивы, включая SEGMENT, PROC, ASSUME и END, не генерируют машинных кодов.

Листинг содержит не только исходный текст, но также в левой части транслированный машинный код в шестнадцатеричном формате. В самой левой колонке находятся шестнадцатеричные адреса команд и данных.

Сегмент стека начинается с относительного адреса 0000. В действительности он загружается в память в соответствии с адресом в регистре SS и нулевым смещением относительно этого адреса. Директива SEGMENT устанавливает 16-кратный адрес и указывает ассемблеру на то, что это начало стека. Сама директива не генерирует машинный код. Команда DB также находится по адресу 0000, содержит 12 копий слова 'STACKSEG'; машинный код представлен значениями 0С (десятичное 12) и шестнадцатеричным представлением ASCII-символов. (В дальнейшем можно использовать отладчик для просмотра результатов в памяти.)

Сегмент стека заканчивается по адресу 0060, что эквивалентно десятичному значению 96 (12x8).

  1. Page 60,132

  2. TITLE EXASМ1 (EXE) ;Пример регистровых операций

  3. ; --------------------------------------

  4. 0000 STACKSG SEGMENT PARA STACK ‘Stack ‘

  5. 0000 0C [ DB 12 DUP (‘STACKSEG’)

  6. 53 54 41 43

  7. 4B 53 45 47

  8. ]

  9. 0060 STACKSG ENDS

  10. ;----------------------------

  11. 0000 CODESG SEGMENT PARA ‘Code’

  12. 0000 BEGIN PROC FAR

  13. ASSUME SS:STACKSG, CS:CODESG, DS:NOTHING

  14. 0000 1E PUSH DS ;3аписать DS в стек

  15. 0001 2B С0 SUB AX, AX ; Записать ноль

  16. 0003 50 PUSH AX ; в стек

  17. 0004 B8 0123 MOV AX, 0123H ; Записать шест. 01223 в AX

  18. 0007 05 0025 ADD AX, 0025H ;Прибавить шест. 25 к AX

  19. 000А 88 D8 MOV BX, AX

  20. 0000C 03 D8 ADD BX, AX

  21.  000E 8B CB MOV CX, BX

  22. 0010 2B C8 SUB CX,AX

  23. 0012 2B C0 SUB AX,AX

  24. 0014 90 NOP

  25. 0015 CB RET

  26. 0016 BEGIN ENDP

  27. 0016 CODESG ENDS

  28. END BEGIN ; Конец программы

Segments and Groups:

Name Size Align Combine Class


CODESG ............ 0016 PARA NONE 'CODE'

STACKSG. ........... 0060 PARA STACK 'STACK1



Symbols:

NAME Type Value Attr

Begin F PROC 0000 CODESG Length = 16

Рис.3.3. Листинг ассемблирования программы

Сегмент кода также начинается с относительного адреса 0000: Он загружается в память в соответствии с адресом в регистре CS и нулевым смещением относительно этого адреса. Поскольку ASSUME является директивой ассемблеру, то первая команда, генерирующая машинный код,- это PUSH DS, однобайтовая команда (1E), находящаяся в сегменте на нулевом смещении. Следующая команда SUB АХ,АХ генерирует двухбайтовый машинный код (2В С0), начинающийся с относительного адреса 0001. Пробел между байтами предназначен только для удобства чтения. В данном примере встречаются одно-, двух- и трехбайтовые команды.

Последняя команда END содержит операнд BEGIN, который имеет отношение к имени команды PROC по смещению 0000. Это адрес сегмента кодов, с которого начинается выполнение после загрузки программы.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
426
Средний доход
с одного платного файла
Обучение Подробнее