Правила оформления программ на ассемблере

Практическое овладение навыками упрощённого оформления простейших программ на языке Ассемблера и работы с программами TASM и TLINK.

  • 2 Теоретический материал
  • 2.1 Упрощенное оформление программ

Для создания простых программ, которые содержат по одному сегменту для данных и кода, а также для программ, модули которых предполагается связывать с программами на языках высокого уровня, используются упрощенные директивы сегментации. При этом структура исходного модуля несколько упрощается.

Такие программы начинаются с директивы указания модели памяти .MODEL, которая в простейшем случае имеет формат:

.MODEL [, язык)

Здесь — — имя выбранной модели памяти, является обязательным операндом;

— [язык] — имя языка программирования, на котором написаны вызываемые из данного модуля процедуры. Это может быть С, Pascal, Basic и другие.

Если программа написана полностью на Ассемблере, то достаточно указать только модель памяти. Возможные модели памяти и их описание приведены в таблице 2.1. Как видно из этой таблицы выбор директивы .MODEL определяет набор сегментов программы, размеры сегментов данных и кода, способы связывания сегментов и сегментных регистров. Директиву ASSUME, в отличие от способа традиционного оформления сегментов, не используют.

ВИРУС на Ассемблере | Как программно отключить монитор?

Для программ на Ассемблере используется модель памяти Small.

Применение директивы .MODEL обязывает программиста использовать для описания сегментов исходного модуля упрощенные директивы описания сегментов. Каждая из моделей может использовать директивы, представленные в таблице 2.2.

CS = DS = SS = dgroup Код и данные объединены в одну группу с именем dgroup.

Для создания *.com программ

Код занимает один сегмент. Данные объединены в одну группу с именем dgroup.

Для небольших и средних программ (*.ехе). Для программ на Ассемблере.

CS = _text Несколько сегментов кода. Данные объединены в одну группу с именем dgroup.

Для больших программ с малым объемом данных.

Код в одном сегменте. Данные объединены в одну группу с именем dgroup.

Сегмент кода 64К. Объем данных не ограничен.

CS = _text Код в нескольких сегментах. Данные объединены в одну группу с именем dgroup.

Размер кода и данных не ограничены. Для больших программ.

Тоже, что и large. Для совместимости с

Используется при программировании на Turbo С и Borland C++.

Используется в среде OS/2.

Упрощенные директивы описания сегментов_______

Сегмента инициализированных данных

Сегмента постоянных данных

Сегмента неинициализированных данных

.stack размер

Сегмента стека. Параметр задает размер стека

.fardata [илля]

Сегмента инициализированных данных типа far

Сегмента неинициализированных данных типа far

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

#1 Первая программа на ассемблере MASM

Идентификаторы, создаваемые директивой MODEL

Значение: Физический адрес сегмента

Данных типа near

Неинициализированных данных типа near

Данных типа far

Неинициализированных данных типа far

Для создания Ассемблерных программ с упрощенными директивами сегментации можно использовать приводимый ниже шаблон:

;Forma_l — упрощенное оформление программ

.MODEL SMALL ; модель памяти ближнего типа

.STACK 100h ; определить стек размером 100h

.DATA ; открыть сегмент данных

В этом сегменте определяются данные с использованием символических имен

; открыть сегмент кодов

; сегментный регистр DS

Здесь следуют команды, которые определяются алгоритмом решаемой задачи

mov AL, О mov АН, 4Ch int 21h

; конец исходного модуля.

Как следует из описанного выше, исходный модуль содержит три сегмента с именами STACK, DATA и CODE, организованных с помощью упрощенных директив создания сегментов .STACK, .DATA и .CODE. После загрузки программы в память каждый из сегментных регистров будут указывать на начало соответствующего сегмента программы: регистр DS на сегмент данных, регистр SS на сегмент стека, регистр CS на сегмент кода. Расположение сегментов в памяти описывается с помощью образа программы, который приведен на рис. 2.1.

Образ программы *.ехе в памяти

Рис. 2.1 — Образ программы *.ехе в памяти

Как следует из рисунка, образ программы содержит три логических сегмента, которые присутствуют в исходном тексте. Длина каждого сегмента определяется их содержимым:

  • — для сегмента кодов — числом команд и их длиной;
  • — для сегмента данных — количеством и размером переменных, объявленных в программе;
  • — для сегмента стека — числом зарезервированных под стек ячеек памяти.
Читайте также:
При обновлении версии программы возникла ошибка слишком много фактических параметров

Уточнить порядок расположения сегментов в памяти и их длину можно открыв файл карты, с расширением *.тар.

2.2 Создание исполняемых модулей типа *.сот

По внутренней организации все программы, написанные для MS DOS, принадлежат к одному из двух типов. Каждому из них соответствуют имена с расширениями *.ЕХЕ или *.СОМ. Программы, составленные в лабораторной работе № 1 с помощью стандартных директив сегментации, относятся к наиболее распространенному типу .EXE приложений.

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

Во многих случаях объем программы оказывается значительно меньше 64 Кбайт. Такую программу нет никакой необходимости составлять из нескольких сегментов. В этом случае и данные и стек и команды можно разместить в одном сегменте, настроив все сегментные регистры на его начало. Исполняемые файлы, составленные по этим правилам, имеют расширение *.СОМ, В виде .СОМ приложений обычно пишутся резидентные программы и драйверы, хотя в таком виде можно оформить любую прикладную программы.

Для написания исходных текстов программы типа .СОМ можно использовать приведенный ниже шаблон:

;Forma_2 — исходный модуль для создания *.сот приложения

Begin: jmp Start

; модель памяти ближнего типа

; открыть сегмент кодов

; отвести 256 байт под PSP

; безусловный переход на

Здесь определяются данные

с использованием символических имен

Здесь следуют команды, которые определяются алгоритмом решаемой задачи

mov AL, 0 ; завершить программу

mov АН, 4Ch ; с помощью

END Begin ; конец исходного модуля.

Из исходного текста видно, что программа использует упрощенные директивы сегментации и содержит один сегмент — сегмент кода. Оператор ORG 100h резервирует 256 байт в памяти для сегмента префикса программы (Program Segment Prefics — PSP). Этот сегмент содержит таблицы и поля данных, которые заполняются и используются системой в процессе выполнения программы.

Данные, необходимые программе, можно объявить перед командами, внутри них или в конце сегмента. Однако при загрузке программы типа .СОМ регистр счетчика команд IP всегда инициализируется числом 100h, поэтому вслед за оператором ORG 100h должна стоять первая выполняемая программой команда. В нашем случае это команда безусловного перехода на метку Start:

Begin: jmp Start;

После загрузки программы в память все сегментные регистры указывают на начало сегмента, в котором располагается программа, фактически на начало PSP. Регистр указателя стека SP автоматически загружается числом — начальной точкой входа в стек FFFEh. Таким образом, независимо от размера программы, под нее отводится 64 Кбайта адресного пространства.

Всю нижнюю часть занимает стек, размер которого заранее не определен, а зависит от работы программы. Образ программы в памяти показан на рис. 2.2.

Префикс программы (PSP) 256 байт

Команды и данные

Рис. 2.2 — Образ программы .СОМ в памяти

Из рисунка видно, что программа состоит из единственного сегмента, содержимое которого почти точно отражает содержимое исходного модуля. Отличие заключается в том, в исходном модуле отсутствует префикс программы (PSP), который появляется в памяти в процессе загрузки программы.

Процесс ассемблирования исходного модуля происходит как обычно, а при вызове компоновщика TLINK.EXE в командной строке следует задавать ключ /t, который заставляет формировать исполняемый файл типа *.СОМ:

2.3 Организация паузы до нажатия клавиши

Один из способов организации ожидания нажатия клавиши использует функцию BIOS которая обеспечивает ожидание ввода символа с клавиатуры без его отображения на экране. К функциям BIOS позволяет обратиться команда прерывания INT 16h с номером 0, который должен быть загружен в регистр АН.

Следующие две строки обеспечивают организацию паузы между фрагментами программы до нажатия любой клавиши. Никаких других параметров не требуется.

MOV АН, 00h ; пауза до

INT 16h ; нажатия клавиши

  • 3 Подготовка к работе
  • 3.1. Изучить методические указания и рекомендованную литературу.
  • 3.2. Подготовить ответы на контрольные вопросы.
  • 4 Задание на выполнение работы
  • 4.1 Используя текстовый редактор, создать и отредактировать исходный модуль программы hello_2.asm, (см. лаб. раб. №1) с использованием директив упрощенного оформления программ. Сохранить исходный текст на диске с именем hello_2s.asm. При наборе исходного текста используйте шаблон Forma_l, описанный в п.2.1.
  • 4.2 Используя компилятор Турбо Ассемблера tasm.exe создать файлы hello_2s.obj и hello_2s.lst.
  • 4.3 Используя компоновщик tlink.exe создать файлы hello_2s.exe и hello_2s.map,
  • 4.4 Убедиться в работоспособности программы hello_2s.
  • 4.5 Добавьте в исходный текст программы hello_2s команды, которые вводят паузы до нажатия любой клавиши после вывода очередного сообщения на экран.
  • 4.6 Просмотреть в текстовом редакторе тексты всех созданных файлов и проанализировать их. Уточнить размеры сегментов и нарисовать образ программы hello_2s.exe в памяти ЭВМ.
  • 4.7 Используя текстовый редактор, создать и отредактировать исходный модуль предыдущей программы для создания исполняемого файла типа *.сош. Сохранить исходный текст на диске с именем hello_2c.asm. При наборе исходного текста используйте шаблон Forma_2, приведенный в п. 2.2.
  • 4.8 Выполнить ассемблирование и компоновку созданного исходного модуля для создания исполняемого файла типа *.сот.
  • 4.9 Убедиться в работоспособность созданного исполняемого файла.
  • 4.10 Просмотреть в редакторе все созданные файлы и проанализировать их. Уточнить размеры сегментов и нарисовать образ программы hello_2c.com в памяти ЭВМ.
  • 5 Требования к отчёту
Читайте также:
В чем пишется программа для чпу

Отчёт должен содержать:

  • — титульный лист с указанием названия ВУЗа, кафедры, номера и темы лабораторной работы, а также фамилии И.О. студента, подготовившего отчёт;
  • — цель работы;
  • — листинги исходного модуля и всех файлов, созданных в процессе ассемблирования и компоновки для программ hello_2s и hello_2c с комментариями: *.asm, *.obj, *.lst, *.map, *.exe, *.com;
  • — список команд, использующихся для ассемблирования и компоновки;
  • — образы созданных программ hello_2s.exe и hello_2c.com в памяти.
  • 6 Контрольные вопросы
  • 6.1 Команды и директивы Ассемблера. Формат и отличия.
  • 6.2 Какова цель сегментации памяти?
  • 6.3 Сколько и каких сегментов может иметь программа?
  • 6.4 В каких случаях имеет смысл использовать упрощенную сегментацию?
  • 6.5 Какие директивы упрощенной сегментации используются?
  • 6.6 Какие модели памяти используются при упрощенной сегментации?
  • 6.7 Какими директивами описывается сегмент?
  • 6.8 В чем заключается инициализация сегментных регистров и как она производится при упрощенной сегментации?
  • 6.9 Как производится ассемблирование и компоновка программы при упрощенной сегментации?
  • 6.10 Как выглядит типовая форма для создания .ехе приложений упрощенной сегментацией?
  • 6.11 Каким образом располагается программа типа .ехе после ее загрузки в память?
  • 6.12 В каких случаях используются программы типа .сот?
  • 6.13 Как выглядит типовая форма для создания .сот приложений?
  • 6.14 Из каких сегментов состоит исходный модуль программы типа .сот?
  • 6.15 Каким образом располагается программа типа .сот после ее загрузки в память?
  • 6.16 Каков размер области сегмента префикса программы (PSP)?
  • 6.17 Каков размер стека в программах типа .сот?
  • 6.18 Как производится ассемблирование и компоновка программ типа .сот?
  • 6.19 Что представляет собой образ программы в памяти ЭВМ?
  • 6.20 Что требуется для того, чтобы представить образ программы в памяти ЭВМ?
  • 7 Рекомендуемая литература

Юров, В. И. Assembler [Текст]: учеб, пособие для вузов / В. И. Юров. 2-е изд. — СПб.: Питер, 2007. С.103. 110.

Финогенов, К. Г. Основы языка Ассемблера [Текст] / К. Г. Финогенов. — М.: Радио и связь, 2000. — с. 96. 107.

Финогенов, К. Г. Использование языка Ассемблера [Текст]: учеб, пособие для вузов / К. Г. Финогенов. — М.: Горячая линия-Телеком, 2004.-с. 107. 120.

Источник: bstudy.net

Составление и оформление программ на ассемблере

Логические сегменты отражают разработку програм­мы в виде отличающихся друг от друга областей кода (соб­ственно программы), данных и стека.

Каждый логический (программный) сегмент должен начинаться с директивы SEGMENT (сегмент) и заканчиваться директивой ENDS (конец сег­мента):

Логические сегменты как средство языка ассемблера взаимосвязаны с физическими сегментами, представляю­щими собой особенности архитектуры микропроцессора.

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

Необходимая ассемблеру информация о содержимом сегментных регистров сообщается в директиве ASSUME, имеющей следующий формат:

Поле SR содержит имя одного из сегментных регистров (CS, DS, SS, ES), а базовое значение указывает начало об­ласти памяти, адресуемой через сегментный регистр.

Одним из наиболее часто используемых типов базового значения является имя сегмента, например:

До использования сегментного регистра в формировании физических адресов памяти он должен быть инициализиро­ван. База, соответствующая логическому сегменту, пред­ставлена именем сегмента. Следовательно, при инициали­зации сегментного регистра DS, определяющего основную область данных, используется имя основного сегмента дан­ных, например:

Читайте также:
Как удалить полностью программу с компьютера вин 10

сегмент DATA яв­ляется в программе основной областью данных, тогда до лю­бых обращений к переменным необходимо инициализиро­вать сегментный регистр DS:

mov ax,DATA; инициализация регистра ds

mov ds,ax; через регистр ax

Пример объявления стекового сегмента:

sSTACK SEGMENT stack

Вызов процедуры (переход с возвратом):

Возврат из процедуры (return):

RET

Для организации процедур в языке ассемблера предназначены директивы PROC и ENDP. Директива PROC отмечает точку входа процедуры, а директива ENDP — окончание процедуры. Формат этих директив имеет следующий вид:

Справа от ключевого слова PROC указывает­ся тип процедуры NEAR или FAR (по умолчанию прини­мается тип NEAR).

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Источник: studopedia.ru

Правила оформления программ на ассемблере

Хотелось бы узнать ка наиболее правильно оформлять программы на ассемблере!
Как разделять блоки, макросы, выделять циклы и т.д.
Вот как пока оформляю я:

;————————
;Инициализируем порты
;Все порты- выходы, = 0
; CBI-0 SBI-1
SBI DDRB, DataPin ;
CBI PORTB, DataPin ;

SBI DDRB, ClockPin ;
CBI PORTB, ClockPin ;

Последний раз редактировалось Levsha100; 06.01.2010 в 23:06 .
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
По блочно с изобилием комментариев. Иначе — Смерть через пару дней
Заблокирован
Регистрация: 20.07.2008
Сообщений: 4,033
Хотелось бы поконкретней.
Какие комментарии Вы используете?

Ставите ли после каждой команды «;» (как в ЯВУ)?
Как оформляете блоки, комментарии.
Может есть системы типа Doxywizard для асма?

//А вообще хотелось бы создать цикл тем «Кодируем стильно», где показывается как правильно оформлять код, называть переменные и т.д.

Последний раз редактировалось Levsha100; 07.01.2010 в 00:05 .
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409

Такие комментарии есть только в GASM и еще каком то ассемблере, кажется YASM-е.

Если нужно что то прокомментировать делаю так:
;;################
;;## Hello world block ##
;;################

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

fdd_stop: mov dx,3F2h mov al,0 out dx,al nmi_disable: in al,70h or al,80h out 70h,al

Эти две метки совершенно не нужны, но с другой стороны они не так выделяются среди общей массы кода и в тоже время в ней не теряются.

«Тяжело в учении, легко в бою» — А.В. Суворов
Последний раз редактировалось Ivan_32; 07.01.2010 в 01:01 .
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
Пример блока

. xor eax,eax mov eax,1 ; Something is here and very important to udnerstand it xor eax,eax ; clear eax mov eax,1 ; move 1 to eax ; Next block xor eax,eax mov eax,1

А вообще понимаете, то как «правильно» будет для каждого свое. Я для себя выработал основные пунктики:
1. Использовать только English в наименовании функций, переменных и т.д.
2. Использовать (не сильно сокращать) имена функций, чтобы попытаться вложить весь смысл функции в ее имя, а так же параметры — их именовать так же, например FileName или Path или scan0 и т.п. т.е. сразу можно понять что есть параметр и для чего он нужен, на крайний случай сделать так

/* Make something with your PC drive — setup drive of the PC to be formated */ bool DriveFormat(char *drive)

т.е. именно DriveFormat, а не FormatDrive. Почему ? Т.к. в теории можно будет сгруппировать осмысленный набор функций например:
DriveFormat
DriveRemove
DriveMount
DriveUnmount и т.п.
А теперь представьте, чтобы было если бы Drive стоял в каждой функции на втором месте

Ну и так далее много мелочей. В принципе именно учится «правильно» писать, думаю никто не учит. Все приходит на практике, т.е. сама задача и ее решение ведут вас к тому идеалу «правильности» написания кода. В конце концов вам приходится видеть другие коды, их реализации и их структуру и вы автоматически добавляете новые, удобные и корректные способы написания кода, в результате постоянно формируете свой идеал

Думаю открывать еще тему для этого излишество.

Источник: www.programmersforum.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru