Основные элементы программ на языке турбо ассемблер. Контрольные вопросы и задания
ZX Turbo Assembler - Версии.Начать я хотел бы все же с версии 2.5, это давно забытая, несправедливо кстати сказать, но какое-то время ей активно пользовались и не только я. Как оказалось, раньше это был просто "ZX Assembler", дальнейшая приставка "Turbo" появилась позже и подозреваю с легкой руки Кости Афендикова, потому что я никогда не страдал по поводу скорости ассемблирования.
Так же оказалось, что я об этом думал давно, о восстановлении справедливости, относительно забытой версии и т.п. Вот что я писал в 2016 году:ZX Turbo Assembler
(c) Hohlov Oleg
Давно собирался это сделать. Версия с которой для меня, с Костей, все началось
совершенно незаслуженно забыта. Этой версии нет ни на вирте, ни на zx.pc.Так как ZX\IBM Editor v1.0 во первых в чистом, авторском виде его нигде нет, а во
вторых в какой-то мере является примером к ZAsm"у присутствует здесь. Сначала хотел
отдельно. И да, сначала был ZAsm, потом - на его исходниках сделан редактор.В общем, восстанавливаю справедливость. Получилось такое наследие Олега Хохлова
Итак, на диске находятся следующие файлы:
ZXASM2.5 b загрузчик ZAsm v2.5 на Basic"е
a2.5exe c кодовый блок
Font6 c -
Bold.fnt c - шрифты
ReadMe1 c - описание среды
ReadMe2 c - и ассемблер компилятора
a2.5_p c - файл проэкта
a2.5_1 c - подпрограммы
a2.5_2 c - редактор
a2.5_3 c - компилятор
a2.5_4 c - меню
std.lib c - дополнительные библиотеки
std.io c - используются пп. ниже и в
chr&str c - качестве примера.
ed1.0 b - ZX/IBM Editor v1
ed1.0exe c - кодовый блок
ed.p c - исходные тексты
ed.1 c - в формате
ed.2 c - ZX Turbo Assembler
ed.3 c - v2.5
ibm_copy c - пример исп. библитек
miner c - игра
graph c - так же библиотеки
keyboard c - различного назначения
FP_CALC c - ! очень интересная!
random c -
disassm c - ДизассемблерКак видите довольно богатое наследие.
Всем этим можно и нужно пользоваться как по прямому назначению, так и меняя что
то для своих целей, так и изучая тексты.Вот у кого можно поучиться как нужно писать программы правильно.
И по структуре и по обильным комментариям практически к каждой пп.
14.12.2016 V.Rubts0FF
Оказывается я временами что то полезное таки делаю, только забываю об этом.
21.07.2018 V.Rubst0FF
P.s. Исходные тексты в разных форматах, что то в формате обычного текста (v2.5),
что то уже токенизировано. Ну уж как получилось. Обратить туда/обратно можно в любой версии ZAsm"а кроме v2.5.Собственно ReadMe с диска. Там же присутствует ReadMe1 с описанием среды и ReadMe2 с описанием ассемблер-компилятора.
Про остальные версии ничего говорить не буду, каждая содержит файлы с описанием. Так, что мы имеем на сегодня:
1 - ZAsm v2.5 Олег Хохлов, 48к2 - ZAsm v3.0 практически тоже. но 128-я версия - т.е. сама программа располагается в страницах, 48-я память полностью под программы пользователя.
3 - ZAsm v3.10 - 128+, то есть, если больше чем 128 - используется как рам-диск, и это очень удобно, особенно на реальных компьютерах. На диске много файлов с описанием среды, редактора и еще много чего.
4 - ZAsm v3.2x - 256 и больше. ZAsm занимает/использует последние 128 к памяти. Основная 128-я память - под программы пользователя. Об отличиях от v3.10 ReadMe, About.
5 - ZAsm x64 - та же 3.2х только с одним шрифтом - 64 символа в строке - такая блажь, хотя временами и пользуюсь.
6 - ZAsm v3.15 - Попытка сделать версию 3.2x работающую в 128к.
Версии последних ZAsm`ов в архивах могут отличаться от тех что в разделе "Программирование". Так что лучше качать оттуда.ZAsm3.2o - исходные тексты оверлеев.
ZX Turbo Assembler v3.3.02 - Версия на базе v3.2x и v3.4x с исправленными ошибками.
здесь
NASM (Netwide Assembler)
NASM - свободный (LGPL и лицензия BSD) ассемблер для архитектуры Intel x86. Используется для написания 16-, 32- и 64-битных программ.
NASM был создан Саймоном Тэтхемом совместно с Юлианом Холлом и в настоящее время развивается небольшой командой разработчиков на SourceForge.net. Первоначально он был выпущен согласно его собственной лицензии, но позже эта лицензия была заменена на GNU LGPL после множества проблем, вызванных выбором лицензии. Начиная с версии 2.07 лицензия заменена на «упрощённую BSD» (BSD из 2 пунктов).
NASM может работать на платформах, отличных от x86, таких как SPARC и PowerPC, однако код он генерирует только для x86 и x86-64.
NASM успешно конкурирует со стандартным в Linux- и многих других UNIX-системах ассемблером gas . Считается, что качество документации у NASM выше. Кроме того, ассемблер gas по умолчанию использует AT&T-синтаксис, ориентированный на процессоры не от Intel, в то время как NASM использует вариант традиционного для x86-ассемблера Intel-синтаксиса; Intel-синтаксис используется всеми ассемблерами для Windows-систем, например MASM, TASM, FASM.
NASM компилирует программы под различные операционные системы в пределах x86-совместимых процессоров. Находясь в одной операционной системе, можно беспрепятственно откомпилировать исполняемый файл для другой.
Компиляция программ в NASM состоит из двух этапов. Первый - ассемблирование, второй - компоновка. На этапе ассемблирования создаётся объектный код. В нём содержится машинный код программы и данные, в соответствии с исходным кодом, но идентификаторы (переменные, символы) пока не привязаны к адресам памяти. На этапе компоновки из одного или нескольких объектных модулей создаётся исполняемый файл (программа). Операция компоновки связывает идентификаторы, определённые в основной программе, с идентификаторами, определёнными в остальных модулях, после чего всем идентификаторам даются окончательные адреса памяти или обеспечивается их динамическое выделение.
Для компоновки объектных файлов в исполняемые в Windows можно использовать свободный бесплатно распространяемый компоновщик alink, а в Linux - компоновщик ld, который есть в любой версии этой операционной системы.
В NASM используется Intel-синтаксис записи инструкций.
TASM - программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. Кроме того, TASM может работать совместно с трансляторами с языков высокого уровня фирмы Borland, такими как Turbo C и Turbo Pascal. Как и прочие программные пакеты серии Turbo, Турбо Ассемблер больше не поддерживается.
TASM до сих пор используется для обучения программированию на ассемблере под архитектуру x86. Многие находят его очень удобным и продолжают его использовать, расширяя набором дополнительных макросов.
Пакет TASM поставляется вместе с компоновщиком Turbo Linker и порождает код, который можно отлаживать с помощью Turbo Debugger.
По умолчанию TASM работает в режиме совместимости с другим распространённым ассемблером - MASMi, то есть TASM умеет транслировать исходники, разработанные под MASM. Кроме того, TASM имеет режим IDEAL, улучшающий синтаксис языка и расширяющий его функциональные возможности.
Команда программы на языке Турбо ассемблер (Turbo assembler) имеет следующий формат /13,18,19/:
[Метка:] [Префикс] Операция Операнды; Комментарий
Поля команды отделяются пробелами, а операнды - запятыми. Команда не может иметь более двух операндов, обозначаемых dst и src.
Структура ассемблерной программы существенно зависит от используемых программистом директив управления сегментами. Турбо ассемблер поддерживает два набора управления сегментами.
Первый набор – стандартные (расширенные) сегментные директивы (GROUP, ASSUME, ENDS, SEGMENT) обеспечивает самые полные средства управления сегментами, необходимые в сложных прикладных программах, но более сложен в использовании, и полученные программные модули имеют сложную логическую структуру.
Второй набор – упрощенные сегментные директивы (DOSSEG, .MODEL, .STACK, .DATA, .CODE) обеспечивает ограниченные средства управления сегментами, но сравнительно прост в применении, и полученные программные модули более обозримы и читаемы.
Практика показывает, что для разработки ассемблерных программ малого и среднего размера как для автономного применения, так и для компоновки с программными модулями, разработанных на языках высокого уровня, достаточно возможностей упрощенных сегментных директив. Поэтому ниже будут рассмотрены директивы этого типа и примеры ассемблерных программ на основе этих директив. Применение стандартных сегментных директив подробно рассмотрено в /18,19/.
Директива DOSSEG вызывает группирование сегментов ассемблерной программы в соответствии с соглашениями, принятыми фирмой Microsoft для языков высокого уровня.
Директива.MODEL model, language задает модель памяти, где model представляет имя модели памяти, а language – имя языка программирования (C, Pascal и др.), на котором написаны вызываемые процедуры данного ассемблерного модуля. В программах, написанных целиком на языке Турбо ассемблер, достаточно ограничиться названием модели памяти.
Существуют следующие модели памяти:
tiny – код и данные программы размещаются в одном и том же сегменте, размером 64 Кбайт;
small – код и данные программы размещаются в двух отдельных сегментах размером 64 Кбайт;
medium – код программы может занимать более одного сегмента, а данные этой программы размещаются в одном отдельном сегменте;
compact – код программы занимает один сегмент, а данные могут размещаться в нескольких сегментах;
large и huge – код программы и данные могут превышать по размеру 64 Кбайт и занимать по несколько сегментов.
Ассемблерные программы на практике редко требуют более 64 Кбайт памяти для программного кода или данных, поэтому для большинства приложений применима модель small.
Директива.STACK size определяет размер стека. Например, .STACK 200h
определяет размер стека равным 200h, или 512 байт.
Директива.CODE определяет начало кодового сегмента программы и не имеет операндов. Загружать регистр CS в явном виде никогда не требуется, ибо это производит операционная система при запуске программы. Подобным образом операционная система устанавливает также регистр SS и, как правило, во время работы программы эта установка сохраняется.
Директива.DATA определяет начало сегмента данных. Следует учесть, что при выполнении программы для доступа к ячейкам памяти сегмента данных, определяемого директивой.DATA, необходимо явно загрузить в регистр DS символическое имя @Data. Эта загрузка обычно производится последовательностью из двух команд:
………………..
………………..
Таким образом, обобщенная структура (шаблон) типовой ассемблерной программы, использующей упрощенные сегментные директивы, имеет вид:
STACK size
mov ah,4ch ;Обращение к DOS для выхода из программы
END ProgramStart
Ниже приведен пример ассемблерной программы, использующей упрощенные сегментные директивы.
;Эта программа реверсирует введенную строку и отображает реверсируемую;и реверсированную строки на экране дисплея.
;==================================================
MAX_LENGTH EQU 100
STR_REVERS DB MAX_LENGTH DUP (?)
REVERS_STR DB MAX_LENGTH DUP (?)
mov ax,@Data ;Установка регистра DS на
mov ds,ax ;сегмент данных
mov ah,3fh ;Функция DOS считывания из;устройства с логическим номером в bx
mov bx,00 ;Логический номер стандартного
;устройства ввода - клавиатуры
mov cx,MAX_LENGTH ;Считывание до;максимального числа символов в cx
mov dx,OFFSET STR_REVERS;Адресация области;памяти буфера для реверсируемой строки
int 21h ;Прием символов
and ax,ax ;Были ли считаны какие-либо символы
jz Last ;Нет, переход на завершение программы
mov cx,ax ;Записать число введенных символов в cx
mov bx,OFFSET STR_REVERS ;Реверсируемая строка
mov si,OFFSET REVERS_STR ;Реверсированная строка
add si,cx ;Указание на конец буфера
dec si ;реверсированной строки
ReverseLoop: mov al, ;Прием следующего символа и;запись
mov ,al ;символов в обратном порядке
inc bx ;Указание на следующий символ в буфере;реверсируемой строки
dec si ;Указание на предыдущий символ в буфе;ре реверсированной строки
Loop ReverseLoop ;Перенос следующего символа, если;символ есть
mov ah,40h ;Функция DOS записи в устройство
mov bx,1 ;с логическим номером в bx
mov dx, OFFSET REVERS_STR ;Вывод на экран дисплея
int 21h ;этой строки
Last: mov ah,4ch ;Обращение к функции DOS
Int 21h ;для выхода из программы
END ProgReverse ;Конец программы
В рассмотренной программе для ввода реверсируемой и вывода реверсированной строк использовались служебные функции 3fh и 40h MS – DOS, вызываемые через программное прерывание int 21h /15,18/.
Многочисленные примеры программ на языках Турбо ассемблер и Макро ассемблер рассмотрены в /18,19,20/.
Создание ассемблерной программы, как уже было рассмотрено выше, включает этапы редактирования, ассемблирования, компоновки (линкирования) и отладки. Положим, с помощью редактора подготовлен исходный модуль (файл) программы REVERSE.ASM из последнего примера. Для ассемблирования файла REVERSE.ASM вводится следующая командная строка Турбо ассемблера:
Если не задано другое имя файла, в результате ассемблирования получается объектный файл REVERSE.OBJ. Для выполнения компоновки, если после ассемблирования не было сообщений об ошибках или предупреждений, вводится следующая командная строка: TLINK REVERSE
По завершении компоновки, если не было сообщений об ошибках, получается загрузочный файл REVERSE.EXE программы.
Для отладки ассемблерных программ используются различные инструментальные оболочки и сервисные программы.
Контрольные вопросы и задания
1.Какие особенности архитектуры имеет семейство микропроцессоров i8086/8088?
2.В чем суть конвейерного метода выполнения команд? Для каких типов задач конвейерный метод эффективен, а для каких нет?
3.Для эффективной работы конвейера как должны соотноситься длина конвейера и длина программы?
4.Выведите формулу для определения оптимального числа ступеней конвейера.
5. Для решения каких задач применение суперскалярных процессоров неэффективно?
6.Для решения каких задач разработана сегментная организация памяти?
7.Каким образом происходит преобразование логического адреса в физический адрес?
8. Какие модели памяти применяются при программировании на Турбо Ассемблере?
9.Какая структура программы при программировании на Турбо Ассемблере?
10.Какие методы предсказания условных переходов используются в современных процессорах?