Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:assembler_programming_guide-fakhrutdinov_bocharov:01 [2020-05-11 21:17] GreyWolf [1.6.3. Трансляция и сборка разноязыковых модулей] |
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 или макроассемблер [[msx:macro-80_assembler:macro-80_assembler|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 ==== | ||
- | FIXME | ||
- | Как уже говорилось, если мы хотим получить файл типа ''.OBJ'', можно воспользоваться ассемблером DUAD. | + | Как уже говорилось, если мы хотим получить файл типа ''.OBJ'', можно воспользоваться ассемблером [[msx:duad:duad|]]. |
- | Для вызова системы DUAD необходимо перейти в режим [[msx:basic:]] и набрать команду: | + | Для вызова системы [[msx:duad:duad|]] необходимо перейти в режим [[msx:basic:]] и набрать команду: |
<code> | <code> | ||
- | run"DUAD" | + | run"DUAD.BAS" |
</code> | </code> | ||
Строка 93: | Строка 107: | ||
Source : [ файл - исходный текст ] | Source : [ файл - исходный текст ] | ||
List : [ файл для записи листинга ] | List : [ файл для записи листинга ] | ||
- | Object : [ файл для записи оттранслированой программы ] | + | Object : [ файл для записи оттранслированной программы ] |
Label A : [ файл для меток и адресов по алфавиту] | Label A : [ файл для меток и адресов по алфавиту] | ||
Label L : [ файл для меток и адресов по возрастанию адресов ] | Label L : [ файл для меток и адресов по возрастанию адресов ] | ||
Строка 110: | Строка 124: | ||
После этого ассемблер начнет трансляцию и через некоторое время выдаст сообщение "No errors in text" (Нет ошибок в тексте). Это значит, что наша программа написана без ошибок и успешно оттранслирована. Если будут другие сообщения, то транслирование не удалось (причиной может быть ошибка в программе, защита на диске или еще что-то). | После этого ассемблер начнет трансляцию и через некоторое время выдаст сообщение "No errors in text" (Нет ошибок в тексте). Это значит, что наша программа написана без ошибок и успешно оттранслирована. Если будут другие сообщения, то транслирование не удалось (причиной может быть ошибка в программе, защита на диске или еще что-то). | ||
- | Для выхода из системы DUAD на вопрос "Source:" введите | + | Для выхода из системы [[msx:duad:duad|]] на вопрос "Source:" введите |
<code> | <code> | ||
*BASIC | *BASIC | ||
Строка 156: | Строка 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 | ||
Строка 239: | Строка 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> | ||
Строка 252: | Строка 266: | ||
Как Вы могли понять, программа написанная нами выше — не что иное, как обыкновенная задержка во времени. Но надо сказать, что эту задержку при выполнении Вы не заметите. Это объясняется большой скоростью выполнения программ на языке ассемблера. Поэтому для написания задержек обычно используют пару регистров. | Как Вы могли понять, программа написанная нами выше — не что иное, как обыкновенная задержка во времени. Но надо сказать, что эту задержку при выполнении Вы не заметите. Это объясняется большой скоростью выполнения программ на языке ассемблера. Поэтому для написания задержек обычно используют пару регистров. | ||
- | Это мы рассмотрим несколько ниже, а сейчас попробуем написать эту же программу, но "оттранслировав" самостоятельно и записав через BASIC (можно предварительно загрузить в текстовый редактор листинг нашей программы и посмотреть, как она оттранслирована): | + | Это мы рассмотрим несколько ниже, а сейчас попробуем написать эту же программу, но "оттранслировав" самостоятельно и записав через [[msx:basic:]] (можно предварительно загрузить в текстовый редактор листинг нашей программы и посмотреть, как она оттранслирована): |
<code> | <code> | ||
10 DATA 06,40 :REM LD B,40 9000 | 10 DATA 06,40 :REM LD B,40 9000 | ||
Строка 272: | Строка 286: | ||
Как уже говорилось выше, программу типа ''.REL'' нужно обработать редактором связей, чтобы получить соответствующую программу типа ''.COM''. | Как уже говорилось выше, программу типа ''.REL'' нужно обработать редактором связей, чтобы получить соответствующую программу типа ''.COM''. | ||
- | Для запуска программы с расширением ''.COM'' наберите в режиме [[msx:dos|]] её имя без расширения: | + | Для запуска программы с расширением ''.COM'' наберите в режиме [[msx:dos:|]] её имя без расширения: |
<code> | <code> | ||
A>example | A>example | ||
Строка 317: | Строка 331: | ||
No errors in text | No errors in text | ||
</code> | </code> | ||
- | В результате работы BASIC–программы с этой подпрограммой должно получиться число 126. | + | В результате работы [[msx:basic:]]–программы с этой подпрограммой должно получиться число 126. |
Достоинством этого способа передачи данных является возможность передачи и получения из подпрограммы больших массивов информации. | Достоинством этого способа передачи данных является возможность передачи и получения из подпрограммы больших массивов информации. | ||
Строка 512: | Строка 526: | ||
exam | exam | ||
</code> | </code> | ||
+ | |||
---- | ---- | ||
Строка 518: | Строка 533: | ||
- | {{tag>MSX assembler Programming Book_apguidefb on_github}} | + | {{tag>MSX Book_apguidefb on_github}} |