С увеличением длины программы все труднее становится запомнить коды различных операций. Некоторую помощь в этом отношении оказывают мнемонические обозначения.
Язык символического кодирования команд называется ассемблером.
Язык ассемблер – это язык, в котором каждое высказывание соответствует ровно одной машинной команде.
Ассемблированием называется преобразование программы с языка ассемблера, т. е. подготовка программы на машинном языке путем замены символических имен операций на машинные коды, а символических адресов – на абсолютные или относительные номера, а также включение библиотечных программ и генерация последовательностей символических команд путем указания конкретных параметров в микрокомандах. Данная программа обычно размещается в ПЗУ или вводится в ОЗУ с некоторого внешнего носителя.
Язык ассемблер имеет несколько особенностей, отличающих его от языков высокого уровня:
1. Это взаимно однозначное соответствие между высказываниями языка ассемблера и машинными командами.
Урок 17. Язык ассемблера. Основы
2. Программист на языке ассемблера имеет доступ ко всем объектам и командам, присутствующим на целевой машине.
Представление об основах программирования на машинно-ориентированных языках полезно для:
— лучшего понимания архитектуры ПК и более грамотного использования компьютеров;
— для разработки более рациональных структур алгоритмов программ решения прикладных задач;
— возможности просмотра и корректировки исполняемых программ с расширением .exe и .com, компилированных с любых языков высокого уровня, в случае утраты исходных программ (вызвав указанные программы в отладчик программы DEBUG и декомпилировав их отображение на языке ассемблера);
— составления программ решения наиболее ответственных задач (программа, составленная на машинно-ориентированном языке, обычно эффективнее – короче и быстрее процентов на 30-60 программ, полученных в результате трансляции с языков высокого уровня)
— для реализации процедур, включаемых в основную программу в виде отдельных фрагментов в том случае, если они не могут быть реализованы ни на используемом языке высокого уровня, ни с использованием служебных процедур ОС.
Программа на языке ассемблера может работать только на ЭВМ одного семейства, а программа, написанная на языке высокого уровня, потенциально может работать на разных машинах.
Алфавит языка ассемблера составляют символы ASCII.
Числа только целые. Различают:
— двоичные числа, заканчиваются буквой В;
— десятичные числа, заканчиваются буквой D;
— шестнадцатеричные числа, заканчиваются буквой Н.
Оперативная память, регистры, представление данных
Для определённой серии МП используется индивидуальный язык составления программ – язык ассемблер.
Язык ассемблер занимает промежуточное положение между машинными кодами и языками высокого уровня. Программировать на этом языке проще. Программа на языке ассемблер более рационально использует возможности конкретной машины (точнее МП), чем программа на языке высокого уровня (который более прост для программиста, чем ассемблер).
Урок №0. Почему важно уметь программировать на языке Assembler.
Основные принципы программирования на машинно-ориентированных языках рассмотрим на примере языка ассемблер для МП КР580ВМ80. Для программирования на языке используется общая методика. Конкретные же технические приемы записи программ связаны с особенностями архитектуры и системы команд целевого МП.
Программная модель микропроцессорной системы на основе МП КР580ВМ80
Программная модель МПС в соответствии с рисунком 1
МП Порты Память
B | C | 05H | 07FF | Управляющая программа (монитор) | ПЗУ |
D | E | 06H | |||
H | L | 07H | Демонстрационные программы | ||
А | FL | 0AFF | Область адресов для записи исследуемых программ | ОЗУ | |
SP | |||||
PC | 0B00 0BB0 | Для записи данных исследуемых программ Cтек |
S | Z | AC | P | C |
FL
Рисунок 1
С точки зрения программиста МП КР580ВМ80 имеет следующие программно-доступные регистры.
А– 8-битовый регистр аккумулятор. Является главным регистром МП. Любая операция, выполняемая в АЛУ, предполагает размещение одного из операндов, подлежащих обработке, в аккумуляторе. Результат операции в АЛУ тоже обычно хранится в А.
B, C, D, E, H, L – 8-битовые регистры общего назначения (РОН). Внутренняя память МП. Предназначены для хранения обрабатываемой информации, а также результатов операции. При обработке 16-разрядных слов из регистров образуют пары BC, DE, HL, причем сдвоенный регистр называется первой буквой – B, D, H. В регистровой паре старшим является первый регистр. Особым свойством обладают регистры H, L, используемые как для хранения данных, так и для хранения 16-разрядных адресов ячеек ОЗУ.
FL– регистр флагов (регистр признаков) 8-битовый регистр, в котором сохраняются пять признаков результата выполнения арифметических и логических операций в МП. Формат FL в соответствии с рисунком
Разряд С ( CY — carry) — перенос, устанавливается в 1, если был перенос из старшего разряда байта при выполнении арифметических операций.
Разряд Р (parity) – четность, устанавливается в 1, если число единиц в разрядах результата четно.
Разряд АС – дополнительный перенос, предназначен для хранения значения переноса из младшей тетрады результата.
Разряд Z (нуль) – устанавливается в 1, если результат операции равен 0.
Разряд S (знак) – устанавливается в 1, если результат отрицательный, и в 0, если результат положительный.
SP–- указатель стека, 16-разрядный регистр, предназначен для хранения адреса ячейки памяти, куда был записан последний введенный в стек байт.
РС – программный счетчик (счетчик команд), 16-разрядный регистр, предназначен для хранения адреса следующей выполняемой команды. Содержимое счетчика команд автоматически увеличивается на 1 сразу же после выборки очередного байта команды.
В начальной области памяти адреса 0000Н – 07FF располагается управляющая программа и демонстрационные программы. Это область ПЗУ.
0800 – 0АFF — область адресов для записи исследуемых программ. (ОЗУ).
0В00 – 0ВВ0 — область адресов для записи данных. (ОЗУ).
0ВВ0 – начальный адрес стека. (ОЗУ).
Стек – специально организованная область ОЗУ, предназначенная для временного хранения данных или адресов. Число, записанное в стек последним, извлекается из него первым. Указатель стека хранит адрес последней ячейки стека, в которой записана информация. При вызове подпрограммы в стеке автоматически сохраняется адрес возврата в основную программу. Как правило, в начале каждой подпрограммы сохраняются в стеке содержимое всех задействованных при ее выполнении регистров, а в конце подпрограммы восстанавливают их из стека.
Формат данных и структура команд языка ассемблер
Память МП КР580ВМ80 представляет собой массив 8-ьитных слов, называемых байтами, Каждый байт имеет свой 16-разрядный адрес, определяющий его положение в последовательности ячеек памяти. МП может адресовать 65536 байт памяти, которая может содержать как в ПЗУ, так и в ОЗУ.
Формат данных
Данные хранятся в памяти в виде 8-битных слов:
D7 D6 D5 D4 D3 D2 D1 D0
Младшим битом является бит 0, старшим – бит 7.
Команда характеризуется форматом, т. е. числом отведенных для нее разрядов, которые разделены побайтно на определенные функциональные поля.
Формат команд
Команды МП КР580ВМ80 имеют одно, двух или трехбайтный формат. Многобайтные команды должны быть размещены в соседних ЯП. Формат команды зависит от особенностей выполняемой операции.
Первый байт команды содержит код операции, записанный в мнемоническом виде.
Он определяет формат команды и те действия, которые должны быть выполнены МП над данными в процессе ее выполнения, и способ адресации, а также может содержать информацию о нахождении данных.
Во втором и третьем байтах могут находиться данные, над которыми производятся операции, или адреса, указывающие местонахождение данных. Данные, над которыми производятся действия, называются операндами.
Формат однобайтовой команды в соответствии с рисунком 2
Код операции |
Рисунок 2
Формат двухбайтовой команды в соответствии с рисунком 3
Код операции |
Операнд (адрес) |
Рисунок 3
Формат трехбайтовой команды в соответствии с рисунком 4
Код операции |
Адрес (операнд). Младший байт адреса |
Адрес (операнд). Старший байт адреса |
Рисунок 4
В командах на языке ассемблера код операции имеет сокращённую форму записи английских слов – мнемоническое обозначение. Мнемоника (от греческого mnemonic – искусство запоминания) позволяет легче запомнить команды по их функциональному назначению.
Перед исполнением исходная программа переводится с помощью программы трансляции, называемой ассемблером, на язык кодовых комбинаций – машинный язык, в таком виде размещается в памяти МП и далее используется при выполнении команды.
Методы адресации
Все коды операндов (входные и выходные) должны где-то располагаться. Они могут находиться во внутренних регистрах МП (наиболее удобный и быстрый вариант). Они могут располагаться в системной памяти (самый распространенный вариант). Наконец, они могут находиться в устройствах ввода-вывода (наиболее редкий случай). Определение места положения операндов производится кодом команды.
Существуют разные методы, с помощью которых код команды может определить, откуда брать входной операнд и куда помещать выходной операнд. Эти методы называются методами адресации.
Для МП КР580ВМ80 существуют следующие методы адресации:
Непосредственная адресация предполагает, что операнд (входной) находится в памяти непосредственно за кодом команды. Операнд обычно представляет собой константу, которую надо куда-то переслать, к чему-то прибавить и т. д. данные содержатся во втором или во втором и третьем байтах команды, причем младший байт данных находится во втором байте команды, а старший – в третьем байте команды.
Прямая (она же абсолютная) адресация предполагает, что операнд (входной или выходной) находится в памяти по адресу, код которого находится внутри программы сразу же за кодом команды. Используется в трехбайтовых командах.
Регистроваяадресация предполагает, что операнд (входной или выходной) находится во внутреннем регистре МП. Используется в однобайтовых командах
Косвенная(неявная)адресация предполагает, что во внутреннем регистре МП находится не сам операнд, а его адрес в памяти.
Стековая адресация предполагает, что команда не содержит адрес. Адресация к ячейкам памяти по содержимому 16-разрядного регистра SP (указателя стека).
Система команд
Система команд МП – это полный перечень элементарных действий, которые способен производить МП. Управляемый этими командами МП выполняет простые действия, такие как элементарные арифметические и логические операции, пересылку данных, сравнение двух величин и др. Число команд МП КР580ВМ80 — 78 (с учетом модификаций 244).
Различают следующие группы команд:
— команды ввода-вывода, управления и работы со стеком.
Символы и сокращения, применяемые при описании команд и составлении программ
Символ | Сокращение |
ADDR | 16-битовый адрес |
DATA | 8-битовые данные |
DATA 16 | 16-битовые данные |
PORT | 8-битовый адрес УВВ (устройства ввода-вывода) |
BYTE 2 | Второй байт команды |
BYTE 3 | Третий байт команды |
R, R1, R2 | Один из регистров: A, B, C, D, E, H, L |
RP | Одна из регистровых пар: В — задает пару ВС; D — задает пару DE; H – задает пару HL |
RH | Первый регистр пары |
RL | Второй регистр пары |
Λ | Логическое умножение |
V | Логическое сложение |
![]() |
Сложение по модулю два |
М | Ячейка памяти, адрес которой задаёт содержимое регистровой пары HL, т. е. М = (HL) |
Источник: www.megapredmet.ru
Язык ассемблера. Особенности, макросы, формат операторов, псевдокоманды. Часть 1.
Введение.
Язык, на котором написана исходная программа, называется входным языком, а язык, на который она переводится для исполнения процессором, — выходным языком. Процесс преобразования входного языка в выходной язык называется трансляцией. Так как процессоры способны выполнять программы на машинном языке двоичных кодов, который не используется для программирования, то необходима трансляция всех исходных программ. Известны два способа трансляции: компиляция и интерпретация.
При компиляции исходная программа сначала полностью переводится в эквивалентную программу на выходном языке, называемую объектной программой, а затем выполняется. Этот процесс реализуется с помощью специальной программы, называемой компилятором. Компилятор, для которого входной язык является символической формой представления машинного (выходного) языка двоичных кодов, называется ассемблером.
При интерпретации каждая строка текста исходной программы анализируется (интерпретируется) и указанная в ней команда сразу выполняется. Реализация такого способа возлагается на программу–интерпретатор. Интерпретация занимает длительное время. Для повышения ее эффективности вместо обработки каждой строки интерпретатор предварительно осуществляет преобразование всех командных строк в символы (
). Сформированная последовательность символов используется для выполнения возложенных на исходную программу функций.
Рассматриваемый ниже язык ассемблера реализуется с помощью компиляции.
Основные особенности ассемблера:
● вместо двоичных кодов в языке используются символьные имена — мнемоника. Например, для команды сложения (
и т. д. Символьные имена используются и для адресации ячеек памяти. Для программирования на языке ассемблера вместо двоичных кодов и адресов нужно знать только символические названия, которые ассемблер транслирует в двоичные коды;
● каждое высказывание соответствует одной машинной команде (коду), т. е. существует взаимно однозначное соответствие между машинными командами и операторами в программе на языке ассемблера;
● язык обеспечивает доступ ко всем объектам и командам. Языки высокого уровня такой способностью не обладают. Например, язык ассемблера позволяет выполнить проверку бита регистра флагов, а язык высокого уровня (например,
) такой способностью не обладает. Отметим, что языки для системного программирования (например, С) часто занимают промежуточное положение. С точки зрения возможностей доступа они ближе к языку ассемблера, однако обладают синтаксисом языка высокого уровня;
● язык ассемблера не является универсальным языком. Для каждой определенной группы микропроцессоров имеется свой ассемблер. Языки высокого уровня лишены этого недостатка.
В отличие от языков высокого уровня написание и отладка программы на языке ассемблера занимает много времени. Несмотря на это, язык ассемблера получил широкое распространение в силу следующих обстоятельств:
● составленная на языке ассемблера программа имеет значительно меньшие размеры и работает гораздо быстрее, чем программа, написанная на языке высокого уровня. Для некоторых приложений эти показатели играют первостепенную роль, например, многие системные программы (в том числе компиляторы), программы в кредитных карточках, сотовых телефонах, драйверах устройств и др.;
● некоторым процедурам требуется полный доступ к аппаратному обеспечению, что обычно невозможно осуществить на языке высокого уровня. К этому случаю относятся прерывания и обработчики прерываний в операционных системах, а также контроллеры устройств во встроенных системах, работающих в режиме реального времени.
В большинстве программ лишь небольшой процент всего кода отвечает за большой процент времени выполнения программы. Обычно 1% программы отвечает за 50% времени выполнения, а 10% программы отвечает за 90% времени выполнения. Поэтому для написания конкретной программы в реальных условиях используется как ассемблер, так и один из языков высокого уровня.
Формат оператора в языке ассемблера.
Программа на языке ассемблера представляет собой список команд (высказываний, предложений), каждая из которых занимает отдельную строку и содержит четыре поля: поле метки, поле операции, поле операндов и поле комментариев. Для каждого поля отводится отдельная колонка.
Для поля метки отводится колонка 1. Метка является символическим именем, или идентификатором, адреса памяти. Она необходима для того, чтобы можно было:
● совершить условный или безусловный переход к команде;
● получить доступ к месту, где хранятся данные.
Такие высказывания снабжаются меткой. Для обозначения имени используются (прописные) буквы английского алфавита и цифры. В начале имени должна стоять буква, в конце — разделитель в виде двоеточия. Метку с двоеточием можно писать на отдельной строке, а код операции — на следующей строке в колонке 2, что упрощает работу компилятора. Отсутствие двоеточия не позволяет отличить метку от кода операции, если они расположены на отдельных строках.
В некоторых версиях языка ассемблера двоеточия ставятся только после меток команд, но не после меток данных, а длина метки может быть ограничена 6 или 8 символами.
В поле метки не должно встречаться одинаковых имен, так как метка ассоциируется с адресами команд. Если в процессе выполнения программы отсутствует необходимость вызова команды или данных из памяти, то поле метки остается пустым.
Поле кода операции.
Это поле содержит мнемокод команды или псевдокоманды (см. ниже). Мнемокод команд выбирается разработчиками языка. В языке ассемблера
для загрузки регистра из памяти выбрана мнемоника
), а для сохранения содержимого регистра в памяти — мнемоника
). В языках ассемблера
для обеих операций можно использовать одно имя, соответственно
. Если выбор названий мнемоник может быть произвольным, то необходимость использования двух машинных команд обусловлено архитектурой процессоров
Мнемоника регистров также зависит от версии ассемблера (табл. 5.2.1).
Здесь располагается дополнительная информация, необходимая для выполнения операции. В поле операндов для команд перехода указан адрес, куда нужно совершить переход, а также заданы адреса и регистры, которые являются операндами для машинной команды. В качестве примера приведем операнды, которые могут быть использованы для 8–разрядных процессоров
представленные в различных системах счисления. Для обозначения используемой системы счисления за константой следует одна из латинских букв: В,
— соответственно двоичная, восьмеричная, шестнадцатеричная, десятичная системы счисления (
можно не записывать). Если первой цифрой шестнадцатеричного числа являются А, В, С,
, то впереди добавляется незначащий 0 (нуль);
● коды внутренних регистров микропроцессора и ячейки памяти
М (источников или приемников информации) в виде букв А, В, С,
, М или их адреса в любой системе счисления (например, 10В — адрес регистра
в двоичной системе);
для регистровых пар ВС,
, Н; для пары аккумулятора и регистра признаков —
; для счетчика команд —
;для указателя стека —
● метки, указывающие адреса операндов или следующих команд в условных
(при выполнении условия) и безусловных переходах. Например, операнд М1 в команде
означает необходимость безусловного перехода к команде, адрес которой в поле метки отмечен идентификатором М1;
которые строятся путем связывания рассмотренных выше данных с помощью арифметических и логических операторов. Отметим, что способ резервирования пространства для данных зависит от версии языка. Разработчики языка ассемблера для
— определить слово), а позднее ввели альтернативный вариант .
который с самого начала был в языке для процессоров
Процессоры обрабатывают операнды разной длины. Для ее определения разработчики ассемблера приняли разные решения, например:
II регистры разной длины имеют разные названия: ЕАХ — для размещения 32–битных операндов (тип
); АХ — для 16–битных (тип
и АН — для 8–битных (тип
к каждому коду операции прибавляются суффиксы: суффикс
; суффикс «.В» для типа
для операндов разной длины используются разные коды операций, например, для загрузки байта, полуслова (
) и слова в 64–битный регистр используются коды операций
В этом поле приводятся пояснения о действиях программы. Комментарии не влияют на работу программы и предназначены человеку. Они могут понадобиться для модификации программы, которая без таких комментариев может быть совершенно непонятна даже опытным программистам. Комментарий начинается с символа и используется для пояснения и документирования программ. Начальным символом комментария могут служить:
● точка с запятой (;) в языках для процессоров фирмы
● восклицательный знак (!) в языках для
Каждая отдельная строка, отведенная под комментарий, предваряется начальным символом.
В языке ассемблера можно выделить два основных вида команд:
● базовые команды, являющиеся эквивалентом машинного кода процессора. Эти команды выполняют всю предусмотренную программой обработку;
● псевдокоманды, или директивы, предназначенные для обслуживания процесса трансляции программы на язык кодовых комбинаций. В качестве примера в табл. 5.2.2 приведены некоторые псевдокоманды из ассемблера
.
При программировании встречаются ситуации, когда согласно алгоритму одну и ту же цепочку команд необходимо многократно повторить. Для выхода из этой ситуации можно:
● писать нужную последовательность команд всякий раз, когда она встречается. Такой подход приводит к увеличению объема программы;
● оформить эту последовательность в процедуру (подпрограмму) и вызывать ее при необходимости. Такой выход имеет свои недостатки: каждый раз придется выполнять специальную команду вызова процедуры и команду возврата, что при короткой и часто используемой последовательности может сильно снизить скорость работы программы.
Наиболее простой и эффективный способ многократного повторения цепочки команд состоит в использовании макроса, который можно представить как псевдокоманду, предназначенную для повторной трансляции часто встречающейся в программе группы команд.
Макрос, или макрокоманда, характеризуется тремя аспектами: макроопределением, макрообращением и макрорасширением.
— это обозначение многократно повторяемой последовательности команд программы, используемое для ссылок в тексте программы.
Макроопределение имеет следующую структуру:
Список выражений ; Макроопределение
В приведенной структуре макроопределения можно выделить три части:
макроса, включающий в себя имя
и набор параметров;
● отмеченное точками тело макроса;
Набор параметров макроопределения содержит перечень всех параметров, приведенных в поле операнда для выбранной группы команд. Если эти параметры приведены в программе ранее, то их в заголовке макроопределения можно не указывать.
Для повторного ассемблирования выбранной группы команд используется обращение, состоящее из имени
макрокоманды и перечня параметров с другими значениями.
Когда в процессе компиляции ассемблер встречает макроопределение, он сохраняет его в таблице макроопределений. При последующих появлениях в программе имени (
) макроса ассемблер замещает его телом макроса.
Использование имени макроса в качестве кода операции называется макро–обращением (макровызовом), а его замещение телом макроса — макрорасширением.
Если программу представить как последовательность символов (букв, цифр, пробелов, знаков пунктуации и возврата каретки для перехода на новую строку), то макрорасширение состоит в замене одних цепочек из этой последовательности другими цепочками.
Макрорасширение происходит во время процесса ассемблирования, а не во время выполнения программы. Способы манипулирования цепочками символов возлагается на макросредства.
Процесс ассемблирования осуществляется в два прохода:
● на первом проходе сохраняются все макроопределения, а макровызовы расширяются. При этом исходная программа считывается и преобразуется в программу, в которой удалены все макроопределения, а каждый макровызов замещен телом макроса;
● на втором проходе обрабатывается полученная программа без макросов.
Макросы с параметрами.
Для работы с повторяющимися последовательностями команд, параметры которых могут принимать различные значения, предусмотрены макроопределения:
● с фактическими параметрами, которые помещаются в поле операндов макро-обращения;
● с формальными параметрами. В процессе расширения макроса каждый формальный параметр, появляющийся в теле макроса, замещается соответствующим фактическим параметром.
использования макросов с параметрами.
В программе 1 приведено две похожих последовательности команд, отличающихся тем, что первая из них меняет местами Р и
В программе 2 включен макрос с двумя формальными параметрами Р1 и Р2. Во время расширения макроса каждый символ Р1 внутри тела макроса замещается первым фактическим параметром (Р,
), а символ Р2 замещается вторым фактическим параметром (
) из программы № 1. В макровызове
Источник: pue8.ru
Структура программы на языке ассемблера и ее описание
Программа, написанная на языке ассемблера, может состоять из нескольких частей, называемых модулями. В каждом модуле могут быть определены один или несколько сегментов данных, стека и кода. Любая законченная программа на ассемблере должна включать один главный, или основной, модуль, с которого начинается ее выполнение. Модуль может содержать сегменты кода, сегменты данных и стека, объявленные при помощи соответствующих директив. Перед объявлением сегментов нужно указать модель памяти при помощи директивы .MODEL.
Пример «ничего не делающей» программы на языке ассемблера:
.MODEL FLAT, STDCALL
В данной программе представлена всего одна команда микропроцессора. Эта команда RET. Она обеспечивает правильное окончание работы программы. В общем случае эта команда используется для выхода из процедуры.
Остальная часть программы относится к работе транслятора.
.686P — разрешены команды защищенного режима Pentium 6 (Pentium II). Данная директива выбирает поддерживаемый набор команд ассемблера, указывая модель процессора. Буква P, указанная в конце директивы, сообщает транслятору о работе процессора в защищенном режиме.
.MODEL FLAT, stdcall — плоская модель памяти. Эта модель памяти используется в операционной системе Windows. stdcall
.DATA — сегмент программы, содержащий данные.
.CODE — блок программы, содержащей код.
START — метка. В ассемблере метки играют большую роль, что не скажешь о современных языках высокого уровня.
END START — конец программы и сообщение транслятору, что начинать выполнение программы надо с метки START.
Каждый модуль должен содержать директиву END, отмечающую конец исходного кода программы. Все строки, которые следуют за директивой END, игнорируются. Если опустить директиву END, то генерируется ошибка.
Метка, указанная после директивы END, сообщает транслятору имя главного модуля, с которого начинается выполнение программы. Если программа содержит один модуль, метку после директивы END можно не указывать.
Организация цикла с помощью loop
Для организации циклов со счетчиком: loop / loope / loopne . Эти команды используют в качестве счетчика регистр cx, они сами уменьшают его значение после каждой итерации цикла и сравнивают после уменьшения с нулём.
Команда loop выполняет следующие действия:
• уменьшает регистр cx ;
• сравнивает cx с нулем, если cx >0, то управление передается на метку перехода (продолжаем цикл).
Команды loope/loopne позволяют выйти из цикла по дополнительному условию.
Примечание: при написании вложенных циклов loop , необходимо помнить, что все они используют для счетчика один и тот же регистр – cx . Для правильной работы необходимо сохранить счетчик внешнего цикла ( push cx ) до инициализации внутреннего и восстановить его ( pop cx ) после команды loop внутреннего цикла.
Инкремент и декремент
Инкремент – операция во многих языках программирования, увеличивающая переменную. Обратную операцию называют декремент. Чаще всего унарная операция приводит переменную к следующему элементу базового типа (то есть для целых чисел – увеличивает на 1, для символьного типа даёт следующий символ в некоторой таблице символов и т.п.)
inc операнд — операция инкремента, то есть увеличения значения операнда на 1;
операнд = операнд +1
66. Раздельная трансляция: назначение, варианты компоновки
В соответствии с принципами модульного программирования большие программы надо разрывать на модули, из которых потом создается единая программа.
Существует 4 варианта компоновки программ.
Вариант 1. Основная программа Pr1 имеет сегменты:
Результаты возвращаются через регистры. Дополнительная программа имеет только сегмент кода. При компоновке получаем 2 разных сегмента кода. Для этого используется модель памяти medium.
Аналогичен первому варианту, но в результате компоновки необходимо получить один объединенный кодовый сегмент. Для этого нужно использовать модель памяти small.
Дополнительная программа использует данные из основной программы, записанные в сегменте данных. В основной программе они имеют вид PUBLIC. В дополнительной extra и word.
Вариант 4. Обмен данными через стек
67. !Высказывания, виды высказываний. Логические переменные и функции
Высказывание — это повествовательное предложение, про которое можно определенно сказать истинно оно или ложно (истина (логическая 1), ложь (логический 0)).
Источник: megaobuchalka.ru