Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:assembler_programming_guide-fakhrutdinov_bocharov:01 [2020-05-11 18:39] GreyWolf [1.5. Организация связей с программами на языке MSX-BASIC] |
msx:assembler_programming_guide-fakhrutdinov_bocharov:01 [2023-02-04 22:21] (текущий) GreyWolf [1.1. Редактирование текста программы] |
||
---|---|---|---|
Строка 17: | Строка 17: | ||
Кроме команд в тексте программы на языке ассемблера могут встретиться и директивы ассемблеру. Директивы обычно не транслируются, а являются указанием ассемблеру выполнить определенное действие. | Кроме команд в тексте программы на языке ассемблера могут встретиться и директивы ассемблеру. Директивы обычно не транслируются, а являются указанием ассемблеру выполнить определенное действие. | ||
- | Для микропроцессора Z80 применимы ассемблеры DUAD, [[msx:macro-80_assembler:macro-80_assembler|M80]], GEN80, Роботрон-1715 и другие. Кроме различных качественных характеристик они имеют различающиеся наборы директив. | + | Для микропроцессора [[zilog_z80:zilog_z80|Z80]] применимы ассемблеры [[msx:duad:duad|]], [[msx:macro-80_assembler:macro-80_assembler|M80]], [[hisoft_devpac:hisoft_devpac#GEN80|GEN80]], Роботрон-1715 и другие. Кроме различных качественных характеристик они имеют различающиеся наборы директив. |
+ | <WRAP> | ||
Оттранслированная машинная программа обычно может быть представлена в одном из двух форматов — ''.OBJ'' или ''.COM''. | Оттранслированная машинная программа обычно может быть представлена в одном из двух форматов — ''.OBJ'' или ''.COM''. | ||
- | Программы типа ''.OBJ'' загружаются и выполняются в среде [[msx:basic:]] и обычно транслируются с адреса 8000h и выше. Программы типа ''.COM'' работают как задачи операционной системы [[msx:dos|]] и размещаются с адреса 100h. | + | Программы типа ''.OBJ'' загружаются и выполняются в среде [[msx:basic:]] и обычно транслируются с адреса 8000h и выше, для запуска используется команда: |
+ | <WRAP group> | ||
+ | <WRAP half column> | ||
+ | <code> | ||
+ | BLOAD"PROG.OBJ",r | ||
+ | </code> | ||
+ | |||
+ | </WRAP> | ||
+ | |||
+ | <WRAP half column> | ||
+ | . | ||
+ | </WRAP> | ||
+ | </WRAP> | ||
+ | Программы типа ''.COM'' работают как задачи операционной системы [[msx:dos:|]] и размещаются с адреса 100h. | ||
+ | </WRAP> | ||
- | Разные трансляторы могут давать машинный код для микропроцессоров разных типов, например для Z80 или для Intel 8080. | + | Разные трансляторы могут давать машинный код для микропроцессоров разных типов, например для [[zilog_z80:zilog_z80|Z80]] или для Intel 8080. |
Строка 28: | Строка 43: | ||
===== 1.1. Редактирование текста программы ===== | ===== 1.1. Редактирование текста программы ===== | ||
- | Итак, мы хотим написать программу. Для этого надо загрузить текстовый редактор (например: [[msx:tor|TOR]], MIM, SCED, [[msx:ted_mysterysoft:ted_mysterysoft|TED]] или другой). Это можно сделать в [[msx:dos|]], вставив диск с редактором в дисковод и набрав в ответ на приглашение DOS имя редактора: | + | Итак, мы хотим написать программу. Для этого надо загрузить текстовый редактор (например: [[msx:tor:tor|TOR]], [[msx:mim:|MIM]], SCED, [[msx:ted_mysterysoft:ted_mysterysoft|TED]] или другой). Это можно сделать в [[msx:dos:|]], вставив диск с редактором в дисковод и набрав в ответ на приглашение DOS имя редактора: |
<code> | <code> | ||
A>ted | A>ted | ||
Строка 35: | Строка 50: | ||
После загрузки редактора можно начинать набирать программу. | После загрузки редактора можно начинать набирать программу. | ||
- | Если мы хотим получить файл типа ''.OBJ'', то можно воспользоваться ассемблером DUAD. Пример программы для этого транслятора приводится ниже. | + | Если мы хотим получить файл типа ''.OBJ'', то можно воспользоваться ассемблером [[msx:duad:duad|]]. Пример программы для этого транслятора приводится ниже. |
Укажем адрес, с которого нужно оттранслировать нашу программу и с которого она будет загружена в память компьютера. Адрес может быть в интервале от 8000h до DE76h для машины учителя и 8000h - F37Fh для машины ученика. Это можно сделать директивой ассемблера ORG. Например, | Укажем адрес, с которого нужно оттранслировать нашу программу и с которого она будет загружена в память компьютера. Адрес может быть в интервале от 8000h до DE76h для машины учителя и 8000h - F37Fh для машины ученика. Это можно сделать директивой ассемблера ORG. Например, | ||
Строка 75: | Строка 90: | ||
===== 1.2. Ассемблирование программы ===== | ===== 1.2. Ассемблирование программы ===== | ||
- | В примерах мы будем использовать ассемблер системы DUAD фирмы ASCII или макроассемблер M80 (Вы можете использовать любой другой). Название ассемблера можно увидеть в первых строках листинга программы. | + | В примерах мы будем использовать ассемблер системы [[msx:duad:duad|]] фирмы ASCII или макроассемблер [[msx:macro-80_assembler:macro-80_assembler|M80]] (Вы можете использовать любой другой). Название ассемблера можно увидеть в первых строках листинга программы. |
{{anchor:n121}} | {{anchor:n121}} | ||
==== 1.2.1. Ассемблирование в системе DUAD ==== | ==== 1.2.1. Ассемблирование в системе DUAD ==== | ||
- | Как уже говорилось, если мы хотим получить файл типа ".OBJ", можно воспользоваться ассемблером DUAD. | + | Как уже говорилось, если мы хотим получить файл типа ''.OBJ'', можно воспользоваться ассемблером [[msx:duad:duad|]]. |
- | Для вызова системы DUAD необходимо перейти в режим [[msx:basic:]] и набрать команду: | + | Для вызова системы [[msx:duad:duad|]] необходимо перейти в режим [[msx:basic:]] и набрать команду: |
<code> | <code> | ||
- | run"DUAD" | + | run"DUAD.BAS" |
</code> | </code> | ||
Строка 92: | Строка 107: | ||
Source : [ файл - исходный текст ] | Source : [ файл - исходный текст ] | ||
List : [ файл для записи листинга ] | List : [ файл для записи листинга ] | ||
- | Object : [ файл для записи оттранслированой программы ] | + | Object : [ файл для записи оттранслированной программы ] |
Label A : [ файл для меток и адресов по алфавиту] | Label A : [ файл для меток и адресов по алфавиту] | ||
Label L : [ файл для меток и адресов по возрастанию адресов ] | Label L : [ файл для меток и адресов по возрастанию адресов ] | ||
Строка 109: | Строка 124: | ||
После этого ассемблер начнет трансляцию и через некоторое время выдаст сообщение "No errors in text" (Нет ошибок в тексте). Это значит, что наша программа написана без ошибок и успешно оттранслирована. Если будут другие сообщения, то транслирование не удалось (причиной может быть ошибка в программе, защита на диске или еще что-то). | После этого ассемблер начнет трансляцию и через некоторое время выдаст сообщение "No errors in text" (Нет ошибок в тексте). Это значит, что наша программа написана без ошибок и успешно оттранслирована. Если будут другие сообщения, то транслирование не удалось (причиной может быть ошибка в программе, защита на диске или еще что-то). | ||
- | Для выхода из системы DUAD на вопрос "Source:" введите | + | Для выхода из системы [[msx:duad:duad|]] на вопрос "Source:" введите |
<code> | <code> | ||
*BASIC | *BASIC | ||
Строка 141: | Строка 156: | ||
==== 1.2.2. Ассемблирование посредством M80 ==== | ==== 1.2.2. Ассемблирование посредством M80 ==== | ||
- | С помощью ассемблера M80 можно получить программы типа ''.COM''. | + | С помощью ассемблера [[msx:macro-80_assembler:macro-80_assembler|M80]] можно получить программы типа ''.COM''. |
Текст программы, которую мы набирали выше, будет иметь несколько отличающийся вид: | Текст программы, которую мы набирали выше, будет иметь несколько отличающийся вид: | ||
<code> | <code> | ||
Строка 155: | Строка 170: | ||
Первая директива этой программы сообщает ассемблеру, что команды записаны в соответствии с мнемоникой Z80. | Первая директива этой программы сообщает ассемблеру, что команды записаны в соответствии с мнемоникой Z80. | ||
- | После записи текста программы в файл с расширением ''.ASM'', не выходя из [[msx:dos|]] в [[msx:basic:]], наберите команду вида: | + | После записи текста программы в файл с расширением ''.ASM'', не выходя из [[msx:dos:|]] в [[msx:basic:]], наберите команду вида: |
<code> | <code> | ||
A>M80 =example.asm/L | A>M80 =example.asm/L | ||
Строка 199: | Строка 214: | ||
===== 1.3. Редактирование связей и сборка программы ===== | ===== 1.3. Редактирование связей и сборка программы ===== | ||
- | Редактирование связей и сборка программы выполняются после трансляции ассемблером M80. Они осуществляются при помощи редактора связей L80. На этом этапе объединяются воедино все разрозненные части программы, записанные в различных REL–файлах или библиотеках. Могут также быть подключены библиотеки стандартных или дополнительных функций языка C или других языков. | + | Редактирование связей и сборка программы выполняются после трансляции ассемблером [[msx:macro-80_assembler:macro-80_assembler|M80]]. Они осуществляются при помощи редактора связей L80. На этом этапе объединяются воедино все разрозненные части программы, записанные в различных REL–файлах или библиотеках. Могут также быть подключены библиотеки стандартных или дополнительных функций языка C или других языков. |
Результатом редактирования является неперемещаемый объектный код программы, записываемый в файл с расширением ''.CОМ''. | Результатом редактирования является неперемещаемый объектный код программы, записываемый в файл с расширением ''.CОМ''. | ||
Строка 206: | Строка 221: | ||
А>L80 имя,имя/n/e | А>L80 имя,имя/n/e | ||
</code> | </code> | ||
- | Здесь имя — это имя REL–файла, оттранслированного ассемблером M80. | + | Здесь имя — это имя REL–файла, оттранслированного ассемблером [[msx:macro-80_assembler:macro-80_assembler|M80]]. |
- | Задание на редактирование программы, в которой управляющим модулем является функция main, написанная на языке C, обычно производится следующим образом: | + | Задание на редактирование программы, в которой управляющим модулем является функция ''main'', написанная на языке C, обычно производится следующим образом: |
<code> | <code> | ||
А>L80 ck,Осн-Имя,Имя-Файла1[/s],Имя-Файла2[/s],...,clib/s,crun/s,cend,Имя-COM-файла/n/e:xmain | А>L80 ck,Осн-Имя,Имя-Файла1[/s],Имя-Файла2[/s],...,clib/s,crun/s,cend,Имя-COM-файла/n/e:xmain | ||
</code> | </code> | ||
- | Здесь Осн-Имя — это имя REL–файла, содержащего код функции main. REL–файлы ck, clib, crun и cend входят в комплект ASCII C и их подключение обязательно для пользователя, избегающего вникать в тонкости структуры компилятора языка С. | + | Здесь |
+ | ''Осн-Имя'' — это имя REL–файла, содержащего код функции main. REL–файлы ''ck'', ''clib'', ''crun'' и ''cend'' входят в комплект [[msx:ascii_c:ascii_c|ASCII C]] и их подключение обязательно для пользователя, избегающего вникать в тонкости структуры компилятора языка С. | ||
Пользователь должен подключить все REL–файлы, содержащие модули, необходимые для разрешения внешних ссылок. | Пользователь должен подключить все REL–файлы, содержащие модули, необходимые для разрешения внешних ссылок. | ||
Строка 237: | Строка 253: | ||
В случае успешной трансляции мы можем выполнить нашу программу. | В случае успешной трансляции мы можем выполнить нашу программу. | ||
- | Для запуска программы типа ".OBJ" надо выйти в [[msx:basic:]] и загрузить программу командой: | + | Для запуска программы типа ''.OBJ'' надо выйти в [[msx:basic:]] и загрузить программу командой: |
<code> | <code> | ||
- | Bload"example.obj",R | + | BLOAD"example.obj",R |
</code> | </code> | ||
Буква ''R'' обозначает "выполнить". Машина тут же должна выдать Ok. Так как наша программа уже загружена, её можно выполнить снова. Для этого надо определить её как функцию и передать ей управление. | Буква ''R'' обозначает "выполнить". Машина тут же должна выдать Ok. Так как наша программа уже загружена, её можно выполнить снова. Для этого надо определить её как функцию и передать ей управление. | ||
<code> | <code> | ||
- | Dеfusr = &h9000: i = usr(0) | + | DEFUSR = &H9000: I = USR(0) |
</code> | </code> | ||
Строка 250: | Строка 266: | ||
Как Вы могли понять, программа написанная нами выше — не что иное, как обыкновенная задержка во времени. Но надо сказать, что эту задержку при выполнении Вы не заметите. Это объясняется большой скоростью выполнения программ на языке ассемблера. Поэтому для написания задержек обычно используют пару регистров. | Как Вы могли понять, программа написанная нами выше — не что иное, как обыкновенная задержка во времени. Но надо сказать, что эту задержку при выполнении Вы не заметите. Это объясняется большой скоростью выполнения программ на языке ассемблера. Поэтому для написания задержек обычно используют пару регистров. | ||
- | Это мы рассмотрим несколько ниже, а сейчас попробуем написать эту же программу, но "оттранслировав" самостоятельно и записав через BASIC (можно предварительно загрузить в текстовый редактор листинг нашей программы и посмотреть, как она оттранслирована): | + | Это мы рассмотрим несколько ниже, а сейчас попробуем написать эту же программу, но "оттранслировав" самостоятельно и записав через [[msx:basic:]] (можно предварительно загрузить в текстовый редактор листинг нашей программы и посмотреть, как она оттранслирована): |
<code> | <code> | ||
10 DATA 06,40 :REM LD B,40 9000 | 10 DATA 06,40 :REM LD B,40 9000 | ||
Строка 270: | Строка 286: | ||
Как уже говорилось выше, программу типа ''.REL'' нужно обработать редактором связей, чтобы получить соответствующую программу типа ''.COM''. | Как уже говорилось выше, программу типа ''.REL'' нужно обработать редактором связей, чтобы получить соответствующую программу типа ''.COM''. | ||
- | Для запуска программы с расширением ''.COM'' наберите в режиме [[msx:dos|]] её имя без расширения: | + | Для запуска программы с расширением ''.COM'' наберите в режиме [[msx:dos:|]] её имя без расширения: |
<code> | <code> | ||
A>example | A>example | ||
Строка 315: | Строка 331: | ||
No errors in text | No errors in text | ||
</code> | </code> | ||
- | В результате работы BASIC–программы с этой подпрограммой должно получиться число 126. | + | В результате работы [[msx:basic:]]–программы с этой подпрограммой должно получиться число 126. |
Достоинством этого способа передачи данных является возможность передачи и получения из подпрограммы больших массивов информации. | Достоинством этого способа передачи данных является возможность передачи и получения из подпрограммы больших массивов информации. | ||
Строка 440: | Строка 456: | ||
</code> | </code> | ||
Очевидно, что к программам на языке ассемблера, имена которых содержат символ "_" или не имеют на конце "@" при длине менее 6 байт, доступ из С-программ невозможен. | Очевидно, что к программам на языке ассемблера, имена которых содержат символ "_" или не имеют на конце "@" при длине менее 6 байт, доступ из С-программ невозможен. | ||
- | Все глобальные переменные при трансляции С-программы в ассемблерный текст получают описатель PUBLIC, а внешние ссылки — описатель EXTRN. Такое же соглашение работает в ассемблере M80. | + | Все глобальные переменные при трансляции С-программы в ассемблерный текст получают описатель PUBLIC, а внешние ссылки — описатель EXTRN. Такое же соглашение работает в ассемблере [[msx:macro-80_assembler:macro-80_assembler|M80]]. |
{{anchor:n163}} | {{anchor:n163}} | ||
Строка 489: | Строка 505: | ||
Теперь приведем исходный текст программы на языке С, вызывающей эти подпрограммы на языке ассемблера. | Теперь приведем исходный текст программы на языке С, вызывающей эти подпрограммы на языке ассемблера. | ||
<code> | <code> | ||
- | ┌──────────────────────────── | ||
#include <stdio.h> | #include <stdio.h> | ||
main() | main() | ||
Строка 511: | Строка 526: | ||
exam | exam | ||
</code> | </code> | ||
+ | |||
---- | ---- | ||
Строка 517: | Строка 533: | ||
- | {{tag>MSX assembler Programming Book_apguidefb on_github}} | + | {{tag>MSX Book_apguidefb on_github}} |