Инструменты пользователя

Инструменты сайта


msx:assembler_programming_guide-fakhrutdinov_bocharov:03

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
msx:assembler_programming_guide-fakhrutdinov_bocharov:03 [2020-05-15 22:13]
GreyWolf [3.1.3. Условная генерация]
msx:assembler_programming_guide-fakhrutdinov_bocharov:03 [2020-11-25 09:56] (текущий)
GreyWolf
Строка 166: Строка 166:
                            ENDIF                            ENDIF
 </​code>​ </​code>​
-Команды-ассемблера-1 генерируются,​ если условие истинно,​ команды-ассемблера-2 генерируются,​ если условие ложно.+''​Команды-ассемблера-1'' ​генерируются,​ если условие истинно, ​''​команды-ассемблера-2'' ​генерируются,​ если условие ложно.
  
 Команды условной генерации применяются обычно,​ когда одна и та же исходная программа должна быть настраиваемой на различные условия эксплуатации. Изменив несколько строк в начале программы и перетранслировав её, можно получить объектный код, рассчитанный например,​ на другой тип машины или другую её конфигурацию. Команды условной генерации применяются обычно,​ когда одна и та же исходная программа должна быть настраиваемой на различные условия эксплуатации. Изменив несколько строк в начале программы и перетранслировав её, можно получить объектный код, рассчитанный например,​ на другой тип машины или другую её конфигурацию.
Строка 254: Строка 254:
 Однако адрес может быть как абсолютным,​ так и заданным относительно данных,​ кодов или общей памяти. Относительный адрес задает смещение к абсолютному стартовому адресу. Однако адрес может быть как абсолютным,​ так и заданным относительно данных,​ кодов или общей памяти. Относительный адрес задает смещение к абсолютному стартовому адресу.
  
-Тип адресации задается директивами ассемблеру — ASEG, CSEG, DSEG, COMMON.+Тип адресации задается директивами ассемблеру — ''​ASEG''​''​CSEG''​''​DSEG''​''​COMMON''​.
  
 ==== Определение абсолютного сегмента ==== ==== Определение абсолютного сегмента ====
  
-Директива ASEG задает абсолютный режим адресации. При этом генерируются абсолютные коды, жестко привязанные к одному участку памяти.+Директива ​''​ASEG'' ​задает абсолютный режим адресации. При этом генерируются абсолютные коды, жестко привязанные к одному участку памяти.
  
-После директивы ASEG директива ORG должна использоваться с аргументом 103h или больше,​ причем она задаёт абсолютный адрес трансляции.+После директивы ​''​ASEG'' ​директива ​''​ORG'' ​должна использоваться с аргументом 103h или больше,​ причем она задаёт абсолютный адрес трансляции.
  
 ==== Определение сегмента относительно кодов ==== ==== Определение сегмента относительно кодов ====
Строка 277: Строка 277:
 ==== Определение сегмента относительно данных ==== ==== Определение сегмента относительно данных ====
  
-Для задания этого режима адресации используется директива DSEG. Признаком этого режима трансляции являются двойные кавычки после адреса (%% " %%).+Для задания этого режима адресации используется директива ​''​DSEG''​. Признаком этого режима трансляции являются двойные кавычки после адреса (%% " %%).
  
-Как и в режиме CSEG, устанавливается то значение счетчика адреса,​ которое было последним в режиме DSEG, а директива ORG задает относительное смещение адреса.+Как и в режиме ​''​CSEG''​, устанавливается то значение счетчика адреса,​ которое было последним в режиме ​''​DSEG''​, а директива ​''​ORG'' ​задает относительное смещение адреса.
  
-Для установки абсолютного адреса в сборщике используется ключ /D.+Для установки абсолютного адреса в сборщике используется ключ ​''​/D''​.
  
 ==== Определение блока общей области ==== ==== Определение блока общей области ====
Строка 303: Строка 303:
 Ниже приводится пример программы,​ использующей некоторые директивы управления адресами. Эта программа работает посредством обработки прерываний от таймера (60 раз в секунду). Напомним,​ что по этому прерыванию центральный процессор выполняет подпрограмму обработки прерывания,​ находящуюся по адресу 0038h. Ниже приводится пример программы,​ использующей некоторые директивы управления адресами. Эта программа работает посредством обработки прерываний от таймера (60 раз в секунду). Напомним,​ что по этому прерыванию центральный процессор выполняет подпрограмму обработки прерывания,​ находящуюся по адресу 0038h.
  
-Как и любая другая подпрограмма обработки прерывания,​ она начинается с сохранения регистров (путем засылки их в стек), затем вызывается ловушка этого прерывания (0FD9Ah), в которой вначале находится команда возврата (RET).+Как и любая другая подпрограмма обработки прерывания,​ она начинается с сохранения регистров (путем засылки их в стек), затем вызывается ловушка этого прерывания (0FD9Ah), в которой вначале находится команда возврата (''​RET''​).
  
-При инициализации наша программа перемещает свой код в область,​ начиная с адреса 4000h (которая интерпретатором языка ​BASIC не используется) и через ловушку прерывания устанавливает+При инициализации наша программа перемещает свой код в область,​ начиная с адреса 4000h (которая интерпретатором языка ​[[msx:​basic:​|]] ​не используется) и через ловушку прерывания устанавливает
 точку входа. точку входа.
  
-Суть самой программы заключается в том, что она два раза в секунду печатает системное время в правом верхнем углу экрана (SCREEN 0, WIDTH 80). Мы уже сказали,​ что используемое прерывание происходит 60 раз в секунду (во всей доступной авторам литературе указывается число 50), т.е. каждый тридцатый вызов этого прерывания указывает на то, что прошло 1/2 секунды.+Суть самой программы заключается в том, что она два раза в секунду печатает системное время в правом верхнем углу экрана (''​SCREEN 0''​''​WIDTH 80''​). Мы уже сказали,​ что используемое прерывание происходит 60 раз в секунду (во всей доступной авторам литературе указывается число 50), т.е. каждый тридцатый вызов этого прерывания указывает на то, что прошло 1/2 секунды.
  
 Наша программа имеет счетчик,​ который увеличивается при каждом вызове подпрограммы обработки прерывания (поскольку сначала выполняется наша подпрограмма,​ а затем уже подпрограмма обработки прерывания),​ и если этот счетчик получает значение 29, то он обнуляется и выводится новое время. Наша программа имеет счетчик,​ который увеличивается при каждом вызове подпрограммы обработки прерывания (поскольку сначала выполняется наша подпрограмма,​ а затем уже подпрограмма обработки прерывания),​ и если этот счетчик получает значение 29, то он обнуляется и выводится новое время.
Строка 478: Строка 478:
                 RET                 RET
                 END                 END
-<​code>​+</code>
 После его трансляции [[msx:​macro-80_assembler:​macro-80_assembler|M80]] получим:​ После его трансляции [[msx:​macro-80_assembler:​macro-80_assembler|M80]] получим:​
 <​code>​ <​code>​
Строка 589: Строка 589:
 ==== Дополнительные возможности макрокоманд ==== ==== Дополнительные возможности макрокоманд ====
  
-Во время компиляции можно использовать так называемые переменные времени компиляции. Для присваивания значения такой переменной используется директива SET:+Во время компиляции можно использовать так называемые переменные времени компиляции. Для присваивания значения такой переменной используется директива ​''​SET''​: 
 +<WRAP group> 
 +<WRAP half column>
 <​code>​ <​code>​
-имя SET выражение.+имя SET выражение
 </​code>​ </​code>​
 +</​WRAP>​
 +
 +<WRAP half column>
 +.
 +</​WRAP>​
 +</​WRAP>​
 +
  
 Для управления печатью листинга макроассемблера можно использовать директивы:​ Для управления печатью листинга макроассемблера можно использовать директивы:​
-  * LALL — выводит полный текст макрорасширения;​ +  * ''​LALL'' ​— выводит полный текст макрорасширения;​ 
-  * SALL — только объектный код расширения без текста;​ +  * ''​SALL'' ​— только объектный код расширения без текста;​ 
-  * XALL — выводит те строки,​ которые генерируют текст.+  * ''​XALL'' ​— выводит те строки,​ которые генерируют текст.
  
 Операции:​ Операции:​
-  * & — связывание метки и параметра,​ например,​ ERROR&​X;​+  * & — связывание метки и параметра,​ например, ​''​ERROR&X''​;
   * ;; — макрокомментарий;​   * ;; — макрокомментарий;​
   * ! — означает,​ что за ним — литерал. Например,​ "​!;"​ означает символ точка с запятой.   * ! — означает,​ что за ним — литерал. Например,​ "​!;"​ означает символ точка с запятой.
-  * % — преобразование выражения в число. Например,​ %X+Y.+  * % — преобразование выражения в число. Например,​ %X+Y'.
  
  
Строка 612: Строка 621:
  
 Желаем Вам успехов в программировании и надеемся,​ что эта книга предоставила Вам ответы на многие вопросы,​ касающиеся системы MSX-2. Авторы будут благодарны за все замечания и предложения по содержанию книги. Желаем Вам успехов в программировании и надеемся,​ что эта книга предоставила Вам ответы на многие вопросы,​ касающиеся системы MSX-2. Авторы будут благодарны за все замечания и предложения по содержанию книги.
- 
  
 ---- ----
Строка 619: Строка 627:
  
  
-{{tag>​MSX ​assembler Programming ​Book_apguidefb on_github}}+{{tag>​MSX Book_apguidefb on_github}}
  
msx/assembler_programming_guide-fakhrutdinov_bocharov/03.1589569985.txt.gz · Последние изменения: 2020-05-15 22:13 — GreyWolf