kopilkaurokov.ru - сайт для учителей

Создайте Ваш сайт учителя Курсы ПК и ППК Видеоуроки Олимпиады Вебинары для учителей

Программирование на языке Ассемблера

Нажмите, чтобы узнать подробности

Программирование на языке Ассемблера
Вы уже знаете о суперспособностях современного учителя?
Тратить минимум сил на подготовку и проведение уроков.
Быстро и объективно проверять знания учащихся.
Сделать изучение нового материала максимально понятным.
Избавить себя от подбора заданий и их проверки после уроков.
Наладить дисциплину на своих уроках.
Получить возможность работать творчески.

Просмотр содержимого документа
«Программирование на языке Ассемблера»

Лекция 2. Ассемблеры

Лекция 2. Ассемблеры

Программирование на языке Ассемблера Язык Ассемблера — система записи программы с детализацией до отдельной машинной команды, позволяющая использовать мнемоническое обозначение команд и символическое задание адресов. Поскольку в разных аппаратных архитектурах разные программно-доступные компоненты (система команд, регистры, способы адресации), язык Ассемблера аппаратно-зависимый. Программы, написанные на языке Ассемблера могут быть перенесены только на вычислительную систему той же архитектуры.
  • Программирование на языке Ассемблера
  • Язык Ассемблера — система записи программы с детализацией до отдельной машинной команды, позволяющая использовать мнемоническое обозначение команд и символическое задание адресов.
  • Поскольку в разных аппаратных архитектурах разные программно-доступные компоненты (система команд, регистры, способы адресации), язык Ассемблера аппаратно-зависимый. Программы, написанные на языке Ассемблера могут быть перенесены только на вычислительную систему той же архитектуры.
Программирование на языке Ассемблера позволяет в максимальной степени использовать особенности архитектуры вычислительной системы. До недавнего времени воспринималась как аксиома, что ассемблерная программа всегда является более эффективной и в смысле быстродействия, и в смысле требований к памяти. Для Intel-архитектуры это и сейчас так. Но это уже не так для RISK-архитектур. Для того, чтобы программа могла эффективно выполняться в вычислительной среде с распараллеливанием на уровне команд, она должна быть определенным образом оптимизирована, то есть, команды должны быть расположены в определенном порядке, допускающим их параллельное выполнение. Программист просто не сможет покомандно оптимизировать всю свою программу. С задачей такой оптимизации более эффективно справляются компиляторы.
  • Программирование на языке Ассемблера позволяет в максимальной степени использовать особенности архитектуры вычислительной системы. До недавнего времени воспринималась как аксиома, что ассемблерная программа всегда является более эффективной и в смысле быстродействия, и в смысле требований к памяти. Для Intel-архитектуры это и сейчас так.
  • Но это уже не так для RISK-архитектур. Для того, чтобы программа могла эффективно выполняться в вычислительной среде с распараллеливанием на уровне команд, она должна быть определенным образом оптимизирована, то есть, команды должны быть расположены в определенном порядке, допускающим их параллельное выполнение. Программист просто не сможет покомандно оптимизировать всю свою программу. С задачей такой оптимизации более эффективно справляются компиляторы.
Доля программ, которые пишутся на языках Ассемблеров в мире, неуклонно уменьшается, прикладное программирование на языках Ассемблеров применяется только по недомыслию. Язык Ассемблера «в чистом виде» применяется только для написания отдельных небольших частей системного ПО: микроядра ОС, самых нижних уровней драйверов — тех частей, которые непосредственно взаимодействуют с реальными аппаратными компонентами. Этим занимается узкий круг программистов, работающих в фирмах, производящих аппаратуру и ОС. Зачем же нам тогда изучать построение Ассемблера? Хотя разработка программ, взаимодействующих с реальными аппаратными компонентами, — редкая задача, в современном программировании при разработке прикладного, а еще более — промежуточного ПО довольно часто применяется технологии виртуальных машин. Для выполнения того или иного класса задач программно моделируется некоторое виртуальное вычислительное устройство, функции которого соответствуют нуждам этого класса задач.
  • Доля программ, которые пишутся на языках Ассемблеров в мире, неуклонно уменьшается, прикладное программирование на языках Ассемблеров применяется только по недомыслию. Язык Ассемблера «в чистом виде» применяется только для написания отдельных небольших частей системного ПО: микроядра ОС, самых нижних уровней драйверов — тех частей, которые непосредственно взаимодействуют с реальными аппаратными компонентами.
  • Этим занимается узкий круг программистов, работающих в фирмах, производящих аппаратуру и ОС. Зачем же нам тогда изучать построение Ассемблера?
  • Хотя разработка программ, взаимодействующих с реальными аппаратными компонентами, — редкая задача, в современном программировании при разработке прикладного, а еще более — промежуточного ПО довольно часто применяется технологии виртуальных машин. Для выполнения того или иного класса задач программно моделируется некоторое виртуальное вычислительное устройство, функции которого соответствуют нуждам этого класса задач.
Для управления таким устройством для него может быть создан соответствующий язык команд. (Широко известные примеры: MI AS/400, JVM.) Говоря шире, любую программу можно представить себе как виртуальное «железо», решающее конкретную задачу. (Конечный пользователь обычно не видит разницы между программой и аппаратурой и часто говорит не «мне программа выдала то-то», а «мне компьютер выдал то-то»). В некоторых случаях интерфейс программы удобно представить в виде системы команд, а следовательно, нужен соответствующий Ассемблер. (Это, конечно, относится не к программам «для чайников», а к инструментальным средствам программистов, системам моделирования).
  • Для управления таким устройством для него может быть создан соответствующий язык команд. (Широко известные примеры: MI AS/400, JVM.) Говоря шире, любую программу можно представить себе как виртуальное «железо», решающее конкретную задачу. (Конечный пользователь обычно не видит разницы между программой и аппаратурой и часто говорит не «мне программа выдала то-то», а «мне компьютер выдал то-то»). В некоторых случаях интерфейс программы удобно представить в виде системы команд, а следовательно, нужен соответствующий Ассемблер. (Это, конечно, относится не к программам «для чайников», а к инструментальным средствам программистов, системам моделирования).
Предложения языка Ассемблера

Предложения языка Ассемблера

Предложения языка Ассемблера описывают команды или псевдокоманды (директивы). Предложения-команды задают машинные команды вычислительной системы; обработка Ассемблером команды приводит к генерации машинного кода. Обработка псевдокоманды не приводит к непосредственной генерации кода, псевдокоманда управляет работой самого Ассемблера. Для одной и той же аппаратной архитектуры могут быть построены разные Ассемблеры, в которых команды будут обязательно одинаковые, но псевдокоманды могут быть разные.
  • Предложения языка Ассемблера описывают команды или псевдокоманды (директивы). Предложения-команды задают машинные команды вычислительной системы; обработка Ассемблером команды приводит к генерации машинного кода. Обработка псевдокоманды не приводит к непосредственной генерации кода, псевдокоманда управляет работой самого Ассемблера. Для одной и той же аппаратной архитектуры могут быть построены разные Ассемблеры, в которых команды будут обязательно одинаковые, но псевдокоманды могут быть разные.
Во всех языках Ассемблеров каждое новое предложение языка начинается с новой строки. Каждое предложение, как правило, занимает одну строку, хотя обычно допускается продолжение на следующей строке/строках. Формат записи предложений языка м.б. жесткий или свободный. При записи в жестком формате составляющие предложения должны располагаться в фиксированных позициях строки. (Например: метка должна располагаться в позициях 1-8, позиция 9 — пустая, позиции 10-12 — мнемоника команды, позиция 13 — пустая, начиная с позиции 14 — операнды, позиция 72 — признак продолжения). Обычно для записи программ при жестком формате создаются бланки. Жесткий формат удобен для обработки Ассемблером (удобен и для чтения). Свободный формат допускает любое количество пробелов между составляющими предложения.
  • Во всех языках Ассемблеров каждое новое предложение языка начинается с новой строки. Каждое предложение, как правило, занимает одну строку, хотя обычно допускается продолжение на следующей строке/строках. Формат записи предложений языка м.б. жесткий или свободный. При записи в жестком формате составляющие предложения должны располагаться в фиксированных позициях строки. (Например: метка должна располагаться в позициях 1-8, позиция 9 — пустая, позиции 10-12 — мнемоника команды, позиция 13 — пустая, начиная с позиции 14 — операнды, позиция 72 — признак продолжения). Обычно для записи программ при жестком формате создаются бланки. Жесткий формат удобен для обработки Ассемблером (удобен и для чтения).
  • Свободный формат допускает любое количество пробелов между составляющими предложения.
В общих случаях предложения языка Ассемблера состоят из следующих компонент: метка или имя; мнемоника; операнды; комментарии. метка или имя; мнемоника; операнды; комментарии. Метка или имя является необязательным компонентом. Не во всех языках Ассемблеров эти понятия различаются. Если они различаются (например, MASM), то метка — точка программы, на которую передается управление, следовательно, метка стоит в предложении, содержащем команду; имя — имя переменной программы, ячейки памяти, следовательно, имя стоит в предложении, содержащем псевдокоманду резервирования памяти или определения константы. В некоторых случаях метка и имя могут отличаться даже синтаксически, так, в MASM/ TASM после метки ставится двоеточие, а после имени — нет.
  • В общих случаях предложения языка Ассемблера состоят из следующих компонент:
  • метка или имя; мнемоника; операнды; комментарии.
  • метка или имя;
  • мнемоника;
  • операнды;
  • комментарии.
  • Метка или имя является необязательным компонентом. Не во всех языках Ассемблеров эти понятия различаются. Если они различаются (например, MASM), то метка — точка программы, на которую передается управление, следовательно, метка стоит в предложении, содержащем команду; имя — имя переменной программы, ячейки памяти, следовательно, имя стоит в предложении, содержащем псевдокоманду резервирования памяти или определения константы. В некоторых случаях метка и имя могут отличаться даже синтаксически, так, в MASM/ TASM после метки ставится двоеточие, а после имени — нет.
Однако, физический смысл и метки, и имени — одинаков, это — адрес памяти. Во всех случаях, когда Ассемблер встречает в программе имя или метку, он заменяет ее на адрес той ячейки памяти, к которую имя/метка именует. Правила формирования имен/меток совпадают с таковыми для языков программирования. В некоторых Ассемблерах (HLAM S/390) не делается различия между меткой и именем. В языке должны предусматриваться некоторые специальные правила, позволяющие Ассемблеру распознать и выделить метку/имя, например: метка/имя должна начинаться в 1-й позиции строки если метки/имени нет, то в 1-й позиции должен быть пробел, или за меткой/именем должно следовать двоеточие, и т.п. метка/имя должна начинаться в 1-й позиции строки если метки/имени нет, то в 1-й позиции должен быть пробел, или за меткой/именем должно следовать двоеточие, и т.п.
  • Однако, физический смысл и метки, и имени — одинаков, это — адрес памяти. Во всех случаях, когда Ассемблер встречает в программе имя или метку, он заменяет ее на адрес той ячейки памяти, к которую имя/метка именует.
  • Правила формирования имен/меток совпадают с таковыми для языков программирования. В некоторых Ассемблерах (HLAM S/390) не делается различия между меткой и именем.
  • В языке должны предусматриваться некоторые специальные правила, позволяющие Ассемблеру распознать и выделить метку/имя, например:
  • метка/имя должна начинаться в 1-й позиции строки если метки/имени нет, то в 1-й позиции должен быть пробел, или за меткой/именем должно следовать двоеточие, и т.п.
  • метка/имя должна начинаться в 1-й позиции строки
  • если метки/имени нет, то в 1-й позиции должен быть пробел, или за меткой/именем должно следовать двоеточие, и т.п.
Мнемоника — символическое обозначение команды/псевдокоманды. Операнды — один или несколько операндов, обычно разделяемые запятыми. Операндами команд являются имена регистров, непосредственные операнды, адреса памяти (задаваемые в виде констант, литералов, символических имен или сложных выражений, включающих специальный синтаксис). Операнды псевдокоманд могут быть сложнее и разнообразнее. Комментарии — любой текст, который игнорируется Ассемблером. Комментарии располагаются в конце предложения и отделяются от текста предложения, обрабатываемого Ассемблером, каким-либо специальным символом (в некоторых языках — пробелом). Всегда предусматривается возможность строк, содержащих только комментарий, обычно такие строки содержат специальный символ в 1-й позиции.
  • Мнемоника — символическое обозначение команды/псевдокоманды.
  • Операнды — один или несколько операндов, обычно разделяемые запятыми. Операндами команд являются имена регистров, непосредственные операнды, адреса памяти (задаваемые в виде констант, литералов, символических имен или сложных выражений, включающих специальный синтаксис). Операнды псевдокоманд могут быть сложнее и разнообразнее.
  • Комментарии — любой текст, который игнорируется Ассемблером. Комментарии располагаются в конце предложения и отделяются от текста предложения, обрабатываемого Ассемблером, каким-либо специальным символом (в некоторых языках — пробелом). Всегда предусматривается возможность строк, содержащих только комментарий, обычно такие строки содержат специальный символ в 1-й позиции.
Константы — могут представлять непосредственные операнды или абсолютные адреса памяти. Применяются 10-е, 8-е, 16-е, 2-е, символьные константы. Непосредственные операнды — записываются в сам код команды. Имена — адреса ячеек памяти.
  • Константы — могут представлять непосредственные операнды или абсолютные адреса памяти. Применяются 10-е, 8-е, 16-е, 2-е, символьные константы.
  • Непосредственные операнды — записываются в сам код команды.
  • Имена — адреса ячеек памяти.
При трансляции Ассемблер преобразует имена в адреса. Способ преобразования имени в значение зависит от принятых способов адресации. Как правило, в основным способом адресации в машинных языках является адресация относительная: адрес в команде задается в виде смещения относительно какого-то базового адреса, значение которого содержится в некотором базовом регистре. В качестве базового могут применяться либо специальные регистры (DS, CS в Intel) или регистры общего назначения (S/390). Литералы — записанные в особой форме константы. Концептуально литералы — те же имена. При появлении в программе литерала Ассемблер выделяет ячейку памяти и записывает в нее заданную в литерале константу. Далее все появления этого литерала Ассемблер заменяет на обращения по адресу этой ячейки. Таким образом, литеральные константы, хранятся в памяти в одном экземпляре, независимо от числа обращений к ним. Специальный синтаксис — явное описание способа адресации (например, указание базового регистра и смещения).
  • При трансляции Ассемблер преобразует имена в адреса. Способ преобразования имени в значение зависит от принятых способов адресации. Как правило, в основным способом адресации в машинных языках является адресация относительная: адрес в команде задается в виде смещения относительно какого-то базового адреса, значение которого содержится в некотором базовом регистре. В качестве базового могут применяться либо специальные регистры (DS, CS в Intel) или регистры общего назначения (S/390).
  • Литералы — записанные в особой форме константы. Концептуально литералы — те же имена. При появлении в программе литерала Ассемблер выделяет ячейку памяти и записывает в нее заданную в литерале константу. Далее все появления этого литерала Ассемблер заменяет на обращения по адресу этой ячейки. Таким образом, литеральные константы, хранятся в памяти в одном экземпляре, независимо от числа обращений к ним.
  • Специальный синтаксис — явное описание способа адресации (например, указание базового регистра и смещения).
Регистры Программа в машинном коде состоит из различных сегментов для определения данных, для машинных команд и для сегмента, названного стеком, для хранения адресов. Для выполнения арифметических действий, пересылки данных и адресации компьютер имеет ряд регистров. Для выполнения программ компьютер временно записывает программу и данные в основную память. Компьютер имеет также ряд pегистров, которые он использует для временных вычислений.
  • Регистры
  • Программа в машинном коде состоит из различных сегментов для определения данных, для машинных команд и для сегмента, названного стеком, для хранения адресов. Для выполнения арифметических действий, пересылки данных и адресации компьютер имеет ряд регистров.
  • Для выполнения программ компьютер временно записывает программу и данные в основную память. Компьютер имеет также ряд pегистров, которые он использует для временных вычислений.
Биты и байты Минимальной единицей информации в компьютере является бит. Бит может быть выключен, так что его значение есть нуль, или включен, тогда его значение равно единице. Единственный бит не может представить много информации в отличие от группы битов. Группа из девяти битов представляет собой байт; восемь битов которого содержат данные и один бит — контроль на четность. Восемь битов обеспечивают основу для двоичной арифметики и для представления символов, таких как буква A или символ * . Восемь битов дают 256 различных комбинаций включенных и выключенных состояний: от «все выключены» (00000000) до «все включены» (11111111). Например, сочетание включенных и выключенных битов для представления буквы A выглядит как 01000001, а для cимвола * — 00101010 (это можно не запоминать). Каждый байт в памяти компьютера имеет уникальный адрес, начиная с нуля.
  • Биты и байты
  • Минимальной единицей информации в компьютере является бит. Бит может быть выключен, так что его значение есть нуль, или включен, тогда его значение равно единице. Единственный бит не может представить много информации в отличие от группы битов.
  • Группа из девяти битов представляет собой байт; восемь битов которого содержат данные и один бит — контроль на четность. Восемь битов обеспечивают основу для двоичной арифметики и для представления символов, таких как буква A или символ * . Восемь битов дают 256 различных комбинаций включенных и выключенных состояний: от «все выключены» (00000000) до «все включены» (11111111). Например, сочетание включенных и выключенных битов для представления буквы A выглядит как 01000001, а для cимвола * — 00101010 (это можно не запоминать). Каждый байт в памяти компьютера имеет уникальный адрес, начиная с нуля.
Требование контроля на четность заключается в том, что количество включенных битов в байте всегда должно быть не четно. Контрольный бит для буквы A будет иметь значение единица, а для символа * — ноль. Когда команда обращается к байту в памяти, компьютер проверяет этот байт. В случае, если число включенных битов является четным, система выдает сообщение об ошибке. Ошибка четности может явится результатом сбоя оборудования или случайным явлением, в любом случае, это бывает крайне редко.
  • Требование контроля на четность заключается в том, что количество включенных битов в байте всегда должно быть не четно. Контрольный бит для буквы A будет иметь значение единица, а для символа * — ноль. Когда команда обращается к байту в памяти, компьютер проверяет этот байт. В случае, если число включенных битов является четным, система выдает сообщение об ошибке. Ошибка четности может явится результатом сбоя оборудования или случайным явлением, в любом случае, это бывает крайне редко.
Откуда компьютер «знает», что значения бит 01000001 представляют букву A ? Когда на клавиатуре нажата клавиша A , система принимает сигнал от этой конкретной клавиши в байт памяти. Этот сигнал устанавливает биты в значения 01000001 . Можно переслать этот байт в памяти и, если передать его на экран или принтер, то будет сгенерирована буква A . По соглашению биты в байте пронумерованы от 0 до 7 справа налево: Номера бит: 7 6 5 4 3 2 1 0 Значения бит: 0 1 0 0 0 0 0 0 Число 2 в десятой степени равно 1024, что составляет один килобайт и обозначается буквой К . Например, компьютер с памятью в 512 К содержит 512 х 1024, то есть, 524288 байт. Процессор в PC и в совместимых моделях использует 16-битовую архитектуру, поэтому он имеет доступ к 16-битовым значениям как в памяти, так и в регистрах. 16-битовое (двухбайтовое) поле называется словом. Биты в слове пронумерованы от 0 до 15 справа налево.
  • Откуда компьютер «знает», что значения бит 01000001 представляют букву A ? Когда на клавиатуре нажата клавиша A , система принимает сигнал от этой конкретной клавиши в байт памяти. Этот сигнал устанавливает биты в значения 01000001 . Можно переслать этот байт в памяти и, если передать его на экран или принтер, то будет сгенерирована буква A .
  • По соглашению биты в байте пронумерованы от 0 до 7 справа налево:
  • Номера бит: 7 6 5 4 3 2 1 0
  • Значения бит: 0 1 0 0 0 0 0 0
  • Число 2 в десятой степени равно 1024, что составляет один килобайт и обозначается буквой К . Например, компьютер с памятью в 512 К содержит 512 х 1024, то есть, 524288 байт. Процессор в PC и в совместимых моделях использует 16-битовую архитектуру, поэтому он имеет доступ к 16-битовым значениям как в памяти, так и в регистрах. 16-битовое (двухбайтовое) поле называется словом. Биты в слове пронумерованы от 0 до 15 справа налево.
ASCII Для целей стандартизации в микрокомпьютерах используется aмериканский национальный стандартный код для обмена информацией ASCII (American National Standard Code for Information Interchange). Читается как «аски» код. Именно по этой причине комбинация бит 01000001 обозначает букву A. Наличие стандартного кода облегчает обмен данными между различными устройствами компьютера. 8-битовый расширенный ASCII-код, используемый в PC обеспечивает представление 256 символов, включая символы для национальных алфавитов.
  • ASCII
  • Для целей стандартизации в микрокомпьютерах используется aмериканский национальный стандартный код для обмена информацией ASCII (American National Standard Code for Information Interchange). Читается как «аски» код. Именно по этой причине комбинация бит 01000001 обозначает букву A.
  • Наличие стандартного кода облегчает обмен данными между различными устройствами компьютера. 8-битовый расширенный ASCII-код, используемый в PC обеспечивает представление 256 символов, включая символы для национальных алфавитов.
Двоичные числа Так как компьютер может различить только нулевое и единичное состояние бита, то он работает системе исчисления с базой 2 или в двоичной системе. Фактически бит унаследовал cвое название от английского «Binary digit» (двоичная цифра). Сочетанием двоичных цифр (битов) можно представить любое значение. Значение двоичного числа определяется относительной позицией каждого бита и наличием единичных битов. Самый правый бит имеет весовое значение 1, следующая цифра влево — 2, следующая — 4 и так далее. Общая сумма для восьми единичных битов в данном случае составит 1+2+4+...+128, или 255 (2 в восьмой степени — 1).
  • Двоичные числа
  • Так как компьютер может различить только нулевое и единичное состояние бита, то он работает системе исчисления с базой 2 или в двоичной системе. Фактически бит унаследовал cвое название от английского «Binary digit» (двоичная цифра).
  • Сочетанием двоичных цифр (битов) можно представить любое значение. Значение двоичного числа определяется относительной позицией каждого бита и наличием единичных битов.
  • Самый правый бит имеет весовое значение 1, следующая цифра влево — 2, следующая — 4 и так далее. Общая сумма для восьми единичных битов в данном случае составит 1+2+4+...+128, или 255 (2 в восьмой степени — 1).
Для двоичного числа 01000001 единичные биты представляют значения 1 и 64, то есть, 65. Но 01000001 представляет также букву A! Действительно, здесь момент, который необходимо четко уяснить. Биты 01000001 могут представлять как число 65, так и букву A: если программа определяет элемент данных для арифметических целей, то 01000001 представляет двоичное число эквивалентное десятичному числу 65; если программа определяет элемент данных (один или более смежных байт), имея в виду описательный характер, как, например, заголовок, тогда 01000001 представляет собой букву или «строку». если программа определяет элемент данных для арифметических целей, то 01000001 представляет двоичное число эквивалентное десятичному числу 65; если программа определяет элемент данных (один или более смежных байт), имея в виду описательный характер, как, например, заголовок, тогда 01000001 представляет собой букву или «строку».
  • Для двоичного числа 01000001 единичные биты представляют значения 1 и 64, то есть, 65. Но 01000001 представляет также букву A! Действительно, здесь момент, который необходимо четко уяснить. Биты 01000001 могут представлять как число 65, так и букву A:
  • если программа определяет элемент данных для арифметических целей, то 01000001 представляет двоичное число эквивалентное десятичному числу 65; если программа определяет элемент данных (один или более смежных байт), имея в виду описательный характер, как, например, заголовок, тогда 01000001 представляет собой букву или «строку».
  • если программа определяет элемент данных для арифметических целей, то 01000001 представляет двоичное число эквивалентное десятичному числу 65;
  • если программа определяет элемент данных (один или более смежных байт), имея в виду описательный характер, как, например, заголовок, тогда 01000001 представляет собой букву или «строку».
При программировании это различие становится понятным, так как назначение каждого элемента данных определено. Двоичное число не ограничено только восемью битами. Процессор может использовать 16-битовую архитектуру, в этом случае он автоматически оперирует с 16-битовыми числами. 2 в степени 16 минус 1 дает значение 65535, а немного творческого программирования позволит обрабатывать числа до 32 бит (2 в степени 32 минус 1 равно 4294967295) и даже больше.
  • При программировании это различие становится понятным, так как назначение каждого элемента данных определено.
  • Двоичное число не ограничено только восемью битами. Процессор может использовать 16-битовую архитектуру, в этом случае он автоматически оперирует с 16-битовыми числами. 2 в степени 16 минус 1 дает значение 65535, а немного творческого программирования позволит обрабатывать числа до 32 бит (2 в степени 32 минус 1 равно 4294967295) и даже больше.
Двоичная арифметика Компьютер выполняет арифметические действия только в двоичном формате. Поэтому программист на языке Ассемблера должен быть знаком с двоичным форматом и двоичным сложением: 0 + 0 = 0 1 + 0 = 1 1 + 1 = 10 1 + 1 + 1 = 11
  • Двоичная арифметика
  • Компьютер выполняет арифметические действия только в двоичном формате. Поэтому программист на языке Ассемблера должен быть знаком с двоичным форматом и двоичным сложением:
  • 0 + 0 = 0
  • 1 + 0 = 1
  • 1 + 1 = 10
  • 1 + 1 + 1 = 11
Отрицательные числа Все представленные выше двоичные числа имеют положительные значения, что обозначается нулевым значением самого левого (старшего) разряда. Отрицательные двоичные числа содержат единичный бит в старшем разряде и выражаются двоичным дополнением. То есть, для представления отрицательного двоичного числа необходимо инвертировать все биты и прибавить 1. Рассмотрим пример: Число 65: 01000001 Инверсия: 10111110 Плюс 1: 10111111 (равно -65).
  • Отрицательные числа
  • Все представленные выше двоичные числа имеют положительные значения, что обозначается нулевым значением самого левого (старшего) разряда. Отрицательные двоичные числа содержат единичный бит в старшем разряде и выражаются двоичным дополнением. То есть, для представления отрицательного двоичного числа необходимо инвертировать все биты и прибавить 1.
  • Рассмотрим пример:
  • Число 65: 01000001
  • Инверсия: 10111110
  • Плюс 1: 10111111 (равно -65).
В случае, если прибавить единичные значения к числу 10111111, 65 не получится. Фактически двоичное число считается отрицательным, если его старший бит равен 1. Для определения абсолютного значения отрицательного двоичного числа, необходимо повторить предыдущие операции: инвертировать все биты и прибавить 1: Двоичное значение: 10111111 Инверсия: 01000000 Плюс 1: 01000001 (равно +65). Сумма +65 и -65 должна составить ноль: 01000001 (+65) + 10111111 (-65) = (1) 00000000
  • В случае, если прибавить единичные значения к числу 10111111, 65 не получится.
  • Фактически двоичное число считается отрицательным, если его старший бит равен 1. Для определения абсолютного значения отрицательного двоичного числа, необходимо повторить предыдущие операции: инвертировать все биты и прибавить 1:
  • Двоичное значение: 10111111
  • Инверсия: 01000000
  • Плюс 1: 01000001 (равно +65).
  • Сумма +65 и -65 должна составить ноль:
  • 01000001 (+65) + 10111111 (-65) = (1) 00000000
Все восемь бит имеют нулевое значение. Перенос единичного бита влево потерян. Однако, если был перенос в знаковый pазряд и из разрядной сетки, то результат является корректным. Двоичное вычитание выполняется просто: инвертируется знак вычитаемого и складываются два числа. Вычтем, например, 42 из 65. Двоичное представление для 42 есть 00101010, и его двоичное дополнение: — 11010110: 65 01000001 +(-42) 11010110 = 23 (1) 00010111 Результат 23 является корректным. В рассмотренном примере произошел перенос в знаковый разряд и из разрядной сетки.
  • Все восемь бит имеют нулевое значение. Перенос единичного бита влево потерян. Однако, если был перенос в знаковый pазряд и из разрядной сетки, то результат является корректным.
  • Двоичное вычитание выполняется просто: инвертируется знак вычитаемого и складываются два числа. Вычтем, например, 42 из 65. Двоичное представление для 42 есть 00101010, и его двоичное дополнение: — 11010110:
  • 65 01000001 +(-42) 11010110 = 23 (1) 00010111
  • Результат 23 является корректным. В рассмотренном примере произошел перенос в знаковый разряд и из разрядной сетки.
В случае, если справедливость двоичного дополнения не сразу понятна, рассмотрим следующие задачи: Какое значение необходимо прибавить к двоичному числу 00000001, чтобы получить число 00000000? В терминах десятичного исчисления ответом будет -1. Для двоичного рассмотрим 11111111: 00000001 11111111 Результат: (1) 00000000 Игнорируя перенос (1), можно видеть, что двоичное число 11111111 эквивалентно десятичному -1 и соответственно: 0 00000000 -(+1) -00000001 -1 11111111
  • В случае, если справедливость двоичного дополнения не сразу понятна, рассмотрим следующие задачи: Какое значение необходимо прибавить к двоичному числу 00000001, чтобы получить число 00000000? В терминах десятичного исчисления ответом будет -1. Для двоичного рассмотрим 11111111:
  • 00000001 11111111 Результат: (1) 00000000
  • Игнорируя перенос (1), можно видеть, что двоичное число 11111111 эквивалентно десятичному -1 и соответственно:
  • 0 00000000 -(+1) -00000001 -1 11111111
Можно видеть также каким образом двоичными числами предcтавлены уменьшающиеся числа: +3 00000011 +2 00000010 +1 00000001 0 00000000 -1 11111111 -2 11111110 -3 11111101 Фактически нулевые биты в отрицательном двоичном числе определяют его величину: рассмотрите позиционные значения нулевых битов как если это были единичные биты, сложите эти значения и прибавьте единицу.
  • Можно видеть также каким образом двоичными числами предcтавлены уменьшающиеся числа:
  • +3 00000011
  • +2 00000010
  • +1 00000001
  • 0 00000000
  • -1 11111111
  • -2 11111110
  • -3 11111101
  • Фактически нулевые биты в отрицательном двоичном числе определяют его величину: рассмотрите позиционные значения нулевых битов как если это были единичные биты, сложите эти значения и прибавьте единицу.
Шестнадцатеричное представление Представим, что необходимо просмотреть содержимое некотоpых байт в памяти. Требуется oпределить содержимое четырех последовательных байт (двух слов), которые имеют двоичные значения. Так как четыре байта включают в себя 32 бита, то специалисты разработали «стенографический» метод представления двоичных данных. По этому методу каждый байт делится пополам и каждые полбайта выражаются соответствующим значением. Рассмотрим следующие четыре байта: Двоичное: 0101 1001 0011 0101 1011 1001 1100 1110 Десятичное: 5 9 3 5 11 9 12 14 Так как здесь для некоторых чисел требуется две цифры, расширим систему счисления так, чтобы 10=A, 11=B, 12=C, 13=D, 14=E, 15=F. Таким образом получим более сокращенную форму, которая представляет содержимое вышеуказанных байт: 59 35 B9 CE
  • Шестнадцатеричное представление
  • Представим, что необходимо просмотреть содержимое некотоpых байт в памяти. Требуется oпределить содержимое четырех последовательных байт (двух слов), которые имеют двоичные значения. Так как четыре байта включают в себя 32 бита, то специалисты разработали «стенографический» метод представления двоичных данных. По этому методу каждый байт делится пополам и каждые полбайта выражаются соответствующим значением. Рассмотрим следующие четыре байта:
  • Двоичное: 0101 1001 0011 0101 1011 1001 1100 1110
  • Десятичное: 5 9 3 5 11 9 12 14
  • Так как здесь для некоторых чисел требуется две цифры, расширим систему счисления так, чтобы 10=A, 11=B, 12=C, 13=D, 14=E, 15=F. Таким образом получим более сокращенную форму, которая представляет содержимое вышеуказанных байт:
  • 59 35 B9 CE
Такая система счисления включает «цифры» от 0 до F, и так как таких цифр 16, она называется шестнадцатеричным представлениeм. Шестнадцатеричный формат нашел большое применение в языке Ассемблера. В листингах ассемблирования программ в шестнадцатеричном формате показаны все адреса, машинные коды команд и содержимое констант. Также для отладки при использовании программы DOS DEBUG адреса и содержимое байтов выдается в шестнадцатеричном формате. В случае, если немного поработать с шестнадцатеричным форматом, то можно быстро привыкнуть к нему. Рассмотрим несколько простых примеров шестнадцатеричной арифметики. Следует помнить, что после шестнадцатеричного числа F следует шестнадцатеричное 10, что равно десятичному числу 16.
  • Такая система счисления включает «цифры» от 0 до F, и так как таких цифр 16, она называется шестнадцатеричным представлениeм.
  • Шестнадцатеричный формат нашел большое применение в языке Ассемблера. В листингах ассемблирования программ в шестнадцатеричном формате показаны все адреса, машинные коды команд и содержимое констант. Также для отладки при использовании программы DOS DEBUG адреса и содержимое байтов выдается в шестнадцатеричном формате.
  • В случае, если немного поработать с шестнадцатеричным форматом, то можно быстро привыкнуть к нему. Рассмотрим несколько простых примеров шестнадцатеричной арифметики. Следует помнить, что после шестнадцатеричного числа F следует шестнадцатеричное 10, что равно десятичному числу 16.
Заметьте также, что шестнадцатеричное 20 эквивалентно десятичному 32, шестнадцатеричное 100 — десятичному 256 и шестнадцатеричное 100 — десятичному 4096. Шестнадцатеричные числа записываются, например, как шест. 4B , двоичные числа как дв.01001011 , а десятичные числа, как 75 (отсутствие какого-либо описания предполагает десятичное число). Для индикации шестнадцатеричные числа в ассемблерной программе непосредственно после числа ставится символ H , например, 25H (десятичное значение 37). Шестнадцатеричное число всегда начинается с деcятичной цифры от 0 до 9, таким образом, B8H записывается как 0B8H .
  • Заметьте также, что шестнадцатеричное 20 эквивалентно десятичному 32, шестнадцатеричное 100 — десятичному 256 и шестнадцатеричное 100 — десятичному 4096.
  • Шестнадцатеричные числа записываются, например, как шест. 4B , двоичные числа как дв.01001011 , а десятичные числа, как 75 (отсутствие какого-либо описания предполагает десятичное число). Для индикации шестнадцатеричные числа в ассемблерной программе непосредственно после числа ставится символ H , например, 25H (десятичное значение 37). Шестнадцатеричное число всегда начинается с деcятичной цифры от 0 до 9, таким образом, B8H записывается как 0B8H .
Сегменты Сегментом называется область, которая начинается на границе параграфа, то есть, по любому адресу, который делится на 16 без остатка. Хотя сегмент может располагаться в любом месте памяти и иметь размер до 64 Кбайт, он требует столько памяти, cколько необходимо для выполнения программы. Сегмент кодов Сегмент кодов содержит машинные команды, которые будут выполняться. Обычно первая выполняемая команда находится в начале этого сегмента и операционная система передает управление по адресу данного сегмента для выполнения программы. Регистр сегмента кодов (CS) адресует данный сегмент. Сегмент данных Сегмент данных содержит определенные данные, константы и рабочие области, необходимые программе. Регистр сегмента данных (DS) адресует данный сегмент.
  • Сегменты
  • Сегментом называется область, которая начинается на границе параграфа, то есть, по любому адресу, который делится на 16 без остатка. Хотя сегмент может располагаться в любом месте памяти и иметь размер до 64 Кбайт, он требует столько памяти, cколько необходимо для выполнения программы.
  • Сегмент кодов
  • Сегмент кодов содержит машинные команды, которые будут выполняться. Обычно первая выполняемая команда находится в начале этого сегмента и операционная система передает управление по адресу данного сегмента для выполнения программы.
  • Регистр сегмента кодов (CS) адресует данный сегмент.
  • Сегмент данных
  • Сегмент данных содержит определенные данные, константы и рабочие области, необходимые программе. Регистр сегмента данных (DS) адресует данный сегмент.
Сегмент стека Стек содержит адреса возврата как для программы для возврата в операционную систему, так и для вызовов подпрограмм для возврата в главную программу. Регистр сегмента стека (SS) адресует данный сегмент. Еще один сегментный регистр, регистр дополнительного сегмента (ES), предназначен для специального использования. Последовательность регистров и сегментов на практике может быть иной.
  • Сегмент стека
  • Стек содержит адреса возврата как для программы для возврата в операционную систему, так и для вызовов подпрограмм для возврата в главную программу. Регистр сегмента стека (SS) адресует данный сегмент.
  • Еще один сегментный регистр, регистр дополнительного сегмента (ES), предназначен для специального использования. Последовательность регистров и сегментов на практике может быть иной.
Три сегментных регистра содержат начальные адреса соответствующих сегментов и каждый сегмент начинается на границе параграфа. Внутри программы все адреса памяти относительны к началу cегмента. Такие адреса называются смещением от начала сегмента. Двухбайтовое смещение (16-бит) может быть в пределах от шест.0000 до шест.FFFF или от 0 до 65535. Для обращения к любому адресу в программе, компьютер складывает адрес в регистре сегмента и смещение. Например, первый байт в сегменте кодов имеет смещение 0, второй байт — 01 и так далее до смещения 65535.
  • Три сегментных регистра содержат начальные адреса соответствующих сегментов и каждый сегмент начинается на границе параграфа.
  • Внутри программы все адреса памяти относительны к началу cегмента. Такие адреса называются смещением от начала сегмента. Двухбайтовое смещение (16-бит) может быть в пределах от шест.0000 до шест.FFFF или от 0 до 65535. Для обращения к любому адресу в программе, компьютер складывает адрес в регистре сегмента и смещение. Например, первый байт в сегменте кодов имеет смещение 0, второй байт — 01 и так далее до смещения 65535.
В качестве примера адресации, допустим, что регистр сегмента данных содержит шест.045F и некоторая команда обращается к ячейке памяти внутри сегмента данных со смещением 0032. Несмотpя на то, что регистр сегмента данных содержит 045F, он указывает на адрес 045F0, то есть, на границе параграфа. Действительный адрес памяти поэтому будет следующий: Адрес в DS: 045F0 Смещение: 0032 Реальный адрес: 04622
  • В качестве примера адресации, допустим, что регистр сегмента данных содержит шест.045F и некоторая команда обращается к ячейке памяти внутри сегмента данных со смещением 0032. Несмотpя на то, что регистр сегмента данных содержит 045F, он указывает на адрес 045F0, то есть, на границе параграфа. Действительный адрес памяти поэтому будет следующий:
  • Адрес в DS: 045F0
  • Смещение: 0032
  • Реальный адрес: 04622
Каким образом процессоры адресуют память в один миллион байт? В регистре содержится 16 бит. Так как адрес сегмента всегда на границе параграфа, младшие четыре бита адреса pавны нулю. Шест.FFF0 позволяет адресовать до 65520 (плюс смещение) байт. Но специалисты решили, что нет смысла иметь место для битов, которые всегда равны нулю. Поэтому адрес хранится в cегментном регистре как шест. nnnn, а компьютер полагает, что имеются еще четыре нулевых младших бита (одна шест. цифра), то есть, шест.nnnn0. Таким образом, шест.FFFF0 позволяет адресовать до 1048560 байт. В случае, если вы сомневаeтесь, то декодируйте каждое шест.F как двоичное 1111, учтите нулевые биты и сложите значения для единичных бит.
  • Каким образом процессоры адресуют память в один миллион байт?
  • В регистре содержится 16 бит. Так как адрес сегмента всегда на границе параграфа, младшие четыре бита адреса pавны нулю.
  • Шест.FFF0 позволяет адресовать до 65520 (плюс смещение) байт. Но специалисты решили, что нет смысла иметь место для битов, которые всегда равны нулю.
  • Поэтому адрес хранится в cегментном регистре как шест. nnnn, а компьютер полагает, что имеются еще четыре нулевых младших бита (одна шест. цифра), то есть, шест.nnnn0. Таким образом, шест.FFFF0 позволяет адресовать до 1048560 байт.
  • В случае, если вы сомневаeтесь, то декодируйте каждое шест.F как двоичное 1111, учтите нулевые биты и сложите значения для единичных бит.
Расширение набора команд Команды делятся на следующие группы: арифметические; логические; передачи данных; перехода; пропуска; вызова подпрограммы; возврата из подпрограммы; смешанные. арифметические; логические; передачи данных; перехода; пропуска; вызова подпрограммы; возврата из подпрограммы; смешанные.
  • Расширение набора команд
  • Команды делятся на следующие группы:
  • арифметические; логические; передачи данных; перехода; пропуска; вызова подпрограммы; возврата из подпрограммы; смешанные.
  • арифметические;
  • логические;
  • передачи данных;
  • перехода;
  • пропуска;
  • вызова подпрограммы;
  • возврата из подпрограммы;
  • смешанные.
Типы операндов для каждого типа команд обсуждаются в соответствующем порядке: байт; слово; десятичный операнд; разряд; число; составной операнд. байт; слово; десятичный операнд; разряд; число; составной операнд.
  • Типы операндов для каждого типа команд обсуждаются в соответствующем порядке:
  • байт; слово; десятичный операнд; разряд; число; составной операнд.
  • байт;
  • слово;
  • десятичный операнд;
  • разряд;
  • число;
  • составной операнд.
При обсуждении способов адресации используется следующий порядок: прямая; косвенная; непосредственная; индексная; регистровая; автоиндексирование с предварительным увеличением адреса; автоиндексирование с предварительным уменьшением адреса; автоиндексирование с последующем уменьшением адреса; косвенная с предварительным индексированием; косвенная с последующем индексированием. прямая; косвенная; непосредственная; индексная; регистровая; автоиндексирование с предварительным увеличением адреса; автоиндексирование с предварительным уменьшением адреса; автоиндексирование с последующем уменьшением адреса; косвенная с предварительным индексированием; косвенная с последующем индексированием.
  • При обсуждении способов адресации используется следующий порядок:
  • прямая; косвенная; непосредственная; индексная; регистровая; автоиндексирование с предварительным увеличением адреса; автоиндексирование с предварительным уменьшением адреса; автоиндексирование с последующем уменьшением адреса; косвенная с предварительным индексированием; косвенная с последующем индексированием.
  • прямая;
  • косвенная;
  • непосредственная;
  • индексная;
  • регистровая;
  • автоиндексирование с предварительным увеличением адреса;
  • автоиндексирование с предварительным уменьшением адреса;
  • автоиндексирование с последующем уменьшением адреса;
  • косвенная с предварительным индексированием;
  • косвенная с последующем индексированием.
Арифметические команды В эту группу включены следующие команды: сложение; сложение с флагом переноса; вычитание; вычитание при перестановке операндов; вычитание с флагом переноса (заем); увеличение на 1; уменьшение на 1; умножение; деление; сравнение; получение дополнения до двух (отрицательного числа); расширение. сложение; сложение с флагом переноса; вычитание; вычитание при перестановке операндов; вычитание с флагом переноса (заем); увеличение на 1; уменьшение на 1; умножение; деление; сравнение; получение дополнения до двух (отрицательного числа); расширение. Для удобства те команды, принадлежность которых к конкретной категории неясна, повторяются во всех категориях, к которым они могли бы быть отнесены.
  • Арифметические команды
  • В эту группу включены следующие команды:
  • сложение; сложение с флагом переноса; вычитание; вычитание при перестановке операндов; вычитание с флагом переноса (заем); увеличение на 1; уменьшение на 1; умножение; деление; сравнение; получение дополнения до двух (отрицательного числа); расширение.
  • сложение;
  • сложение с флагом переноса;
  • вычитание;
  • вычитание при перестановке операндов;
  • вычитание с флагом переноса (заем);
  • увеличение на 1;
  • уменьшение на 1;
  • умножение;
  • деление;
  • сравнение;
  • получение дополнения до двух (отрицательного числа);
  • расширение.
  • Для удобства те команды, принадлежность которых к конкретной категории неясна, повторяются во всех категориях, к которым они могли бы быть отнесены.
Логические команды Эта группа включает следующие команды: логическое И логическое ИЛИ логическое исключающее ИЛИ логическое НЕ (дополнение) сдвиг циклический сдвиг проверку. логическое И логическое ИЛИ логическое исключающее ИЛИ логическое НЕ (дополнение) сдвиг циклический сдвиг проверку. Она включает также те арифметические команды (такие, как сложение с аккумулятора с самим собой), которые выполняют логические функции.
  • Логические команды
  • Эта группа включает следующие команды:
  • логическое И логическое ИЛИ логическое исключающее ИЛИ логическое НЕ (дополнение) сдвиг циклический сдвиг проверку.
  • логическое И
  • логическое ИЛИ
  • логическое исключающее ИЛИ
  • логическое НЕ (дополнение)
  • сдвиг
  • циклический сдвиг
  • проверку.
  • Она включает также те арифметические команды (такие, как сложение с аккумулятора с самим собой), которые выполняют логические функции.
Команды передачи данных Эта группа включает команды: загрузки; запоминания; пересылки; обмена; ввода; вывода; очистки; установки. загрузки; запоминания; пересылки; обмена; ввода; вывода; очистки; установки. Кроме того, она включает арифметические команды (такие как вычитание аккумулятора из самого себя), которые заносят определенное значение или содержимое какого-либо регистра в аккумулятора или другой регистр назначения, не изменяя при этом данных.
  • Команды передачи данных
  • Эта группа включает команды:
  • загрузки; запоминания; пересылки; обмена; ввода; вывода; очистки; установки.
  • загрузки;
  • запоминания;
  • пересылки;
  • обмена;
  • ввода;
  • вывода;
  • очистки;
  • установки.
  • Кроме того, она включает арифметические команды (такие как вычитание аккумулятора из самого себя), которые заносят определенное значение или содержимое какого-либо регистра в аккумулятора или другой регистр назначения, не изменяя при этом данных.
Команды перехода Эта группа включает следующие виды переходов: Команды безусловного перехода Перейти косвенно; Перейти по индексу, предполагая, что базовый адрес таблицы адресов находится в регистрах Н и L , а индекс в аккумуляторе; Перейти и связать, то есть, передать управление по адресу DEST , сохранив текущее состояние счетчика команд в регистрах Н и L . Перейти косвенно; Перейти по индексу, предполагая, что базовый адрес таблицы адресов находится в регистрах Н и L , а индекс в аккумуляторе; Перейти и связать, то есть, передать управление по адресу DEST , сохранив текущее состояние счетчика команд в регистрах Н и L .
  • Команды перехода
  • Эта группа включает следующие виды переходов:
  • Команды безусловного перехода
  • Перейти косвенно; Перейти по индексу, предполагая, что базовый адрес таблицы адресов находится в регистрах Н и L , а индекс в аккумуляторе; Перейти и связать, то есть, передать управление по адресу DEST , сохранив текущее состояние счетчика команд в регистрах Н и L .
  • Перейти косвенно;
  • Перейти по индексу, предполагая, что базовый адрес таблицы адресов находится в регистрах Н и L , а индекс в аккумуляторе;
  • Перейти и связать, то есть, передать управление по адресу DEST , сохранив текущее состояние счетчика команд в регистрах Н и L .
  • Команды условного перехода
  • Перейти при равенстве нулю; Перейти при неравенстве нулю; Перейти, если значения равны; Перейти, если значения не равны; Перейти, если значение положительное; Перейти, если значение отрицательное; Переходы с учетом знака; Перейти, если больше (без учета знака), то есть, если операнды не равны и при сравнении не требуется заема; Перейти, если значение не больше (без учета знака), то есть, если сравниваемые операнды равны или при их сравнении требуется заем; Перейти, если значение меньше (без учета знака), то есть, если сравнение без знака требует заема; Перейти, если значение не меньше (без учета знака), то есть, если сравнение без знака не требует заема.
  • Перейти при равенстве нулю;
  • Перейти при неравенстве нулю;
  • Перейти, если значения равны;
  • Перейти, если значения не равны;
  • Перейти, если значение положительное;
  • Перейти, если значение отрицательное;
  • Переходы с учетом знака;
  • Перейти, если больше (без учета знака), то есть, если операнды не равны и при сравнении не требуется заема;
  • Перейти, если значение не больше (без учета знака), то есть, если сравниваемые операнды равны или при их сравнении требуется заем;
  • Перейти, если значение меньше (без учета знака), то есть, если сравнение без знака требует заема;
  • Перейти, если значение не меньше (без учета знака), то есть, если сравнение без знака не требует заема.
Команды пропуска Команда пропуска может быть выполнена с помощью команды перехода с соответствующем адресом назначения. Этот адрес назначения должен указывать на команду, следующую после той, которая стоит непосредственно за командой перехода. Действительное число пропускаемых байтов будет меняться, так как команды могут иметь длину 1-3 байта. Команды вызова подпрограмм и возврата из подпрограмм Команда безусловного вызова Косвенный вызов может быть выполнен с помощью обращения к промежуточной подпрограмме, которая переходит косвенно на вызываемую подпрограмму.
  • Команды пропуска
  • Команда пропуска может быть выполнена с помощью команды перехода с соответствующем адресом назначения.
  • Этот адрес назначения должен указывать на команду, следующую после той, которая стоит непосредственно за командой перехода.
  • Действительное число пропускаемых байтов будет меняться, так как команды могут иметь длину 1-3 байта.
  • Команды вызова подпрограмм и возврата из подпрограмм
  • Команда безусловного вызова
  • Косвенный вызов может быть выполнен с помощью обращения к промежуточной подпрограмме, которая переходит косвенно на вызываемую подпрограмму.
Команда условного вызова Условный вызов подпрограммы может быть выполнен с помощью последовательностей команд для условного перехода. Единственное отличие состоит в том, что команды перехода к действительным адресам назначения должны быть заменены на команды вызова подпрограмм. Команды возврата из подпрограмм разделяются на: Команды безусловного возврата Команды условного возврата Команды возврата с пропуском Команды возврата после прерывания Команды безусловного возврата Команды условного возврата Команды возврата с пропуском Команды возврата после прерывания
  • Команда условного вызова
  • Условный вызов подпрограммы может быть выполнен с помощью последовательностей команд для условного перехода.
  • Единственное отличие состоит в том, что команды перехода к действительным адресам назначения должны быть заменены на команды вызова подпрограмм.
  • Команды возврата из подпрограмм разделяются на:
  • Команды безусловного возврата Команды условного возврата Команды возврата с пропуском Команды возврата после прерывания
  • Команды безусловного возврата
  • Команды условного возврата
  • Команды возврата с пропуском
  • Команды возврата после прерывания
Смешанные команды В эту категорию входят следующие команды: нет операции запись в стек получение из стека останов ожидание захват (программное прерывание) другие, не попавшие в описание ранее категории команд. нет операции запись в стек получение из стека останов ожидание захват (программное прерывание) другие, не попавшие в описание ранее категории команд.
  • Смешанные команды
  • В эту категорию входят следующие команды:
  • нет операции запись в стек получение из стека останов ожидание захват (программное прерывание) другие, не попавшие в описание ранее категории команд.
  • нет операции
  • запись в стек
  • получение из стека
  • останов
  • ожидание
  • захват (программное прерывание)
  • другие, не попавшие в описание ранее категории команд.
Способы адресации

Способы адресации

Косвенная адресация Косвенную адресацию можно выполнить с помощью загрузки косвенных адресов в регистры Н и L , используя команду LHLD . После этого обращение к регистру М является эквивалентом косвенной операции. Таким образом, этот процесс всегда включает два шага. Кроме того, можно использовать также пары регистров В и D в командах LDAX и STAX . Индексная адресация Индексную адресацию можно выполнить, добавляя индекс с помощью команды DAD к базе. Понятно, что программное сложение требует дополнительного времени выполнения. Предувеличение При предувеличении адресный регистр перед использованием автоматически увеличивается. Предувеличение может быть реализовано с помощью увеличения пары регистров перед ее использованием в качестве адреса.
  • Косвенная адресация
  • Косвенную адресацию можно выполнить с помощью загрузки косвенных адресов в регистры Н и L , используя команду LHLD . После этого обращение к регистру М является эквивалентом косвенной операции.
  • Таким образом, этот процесс всегда включает два шага. Кроме того, можно использовать также пары регистров В и D в командах LDAX и STAX .
  • Индексная адресация
  • Индексную адресацию можно выполнить, добавляя индекс с помощью команды DAD к базе. Понятно, что программное сложение требует дополнительного времени выполнения.
  • Предувеличение
  • При предувеличении адресный регистр перед использованием автоматически увеличивается.
  • Предувеличение может быть реализовано с помощью увеличения пары регистров перед ее использованием в качестве адреса.
Послеувеличение При послеувеличении адресный регистр после использования в команде автоматически увеличивается. Послеувеличение может быть реализовано с помощью увеличения пары регистров после ее использования в качестве адреса. Предуменьшение При предуменьшении адресный регистр перед использованием автоматически уменьшается. Предуменьшение может быть выполнено с помощью уменьшения пары регистров перед ее использованием в качестве адреса. Послеуменьшение При послеуменьшении адресный регистр после использования автоматически уменьшается. Послеуменьшение может быть выполнено с помощью уменьшения пары регистров после использования ее в качестве адреса.
  • Послеувеличение
  • При послеувеличении адресный регистр после использования в команде автоматически увеличивается.
  • Послеувеличение может быть реализовано с помощью увеличения пары регистров после ее использования в качестве адреса.
  • Предуменьшение
  • При предуменьшении адресный регистр перед использованием автоматически уменьшается.
  • Предуменьшение может быть выполнено с помощью уменьшения пары регистров перед ее использованием в качестве адреса.
  • Послеуменьшение
  • При послеуменьшении адресный регистр после использования автоматически уменьшается.
  • Послеуменьшение может быть выполнено с помощью уменьшения пары регистров после использования ее в качестве адреса.
Косвенная адресация с предварительным индексированием (предындексирование) При предындексировании процессор должен сначала вычислить индексный адрес, а затем использовать этот адрес косвенно. Так как таблица, для которой производится индексирование, должна содержать двухбайтные косвенные адреса, индексирование должно сопровождаться умножением на 2. Косвенная адресация с последующим индексированием (послеиндексирование) При послеиндексировании процессор должен сначала получить косвенный адрес, а затем использовать его как базу для индексирования.
  • Косвенная адресация с предварительным индексированием (предындексирование)
  • При предындексировании процессор должен сначала вычислить индексный адрес, а затем использовать этот адрес косвенно.
  • Так как таблица, для которой производится индексирование, должна содержать двухбайтные косвенные адреса, индексирование должно сопровождаться умножением на 2.
  • Косвенная адресация с последующим индексированием (послеиндексирование)
  • При послеиндексировании процессор должен сначала получить косвенный адрес, а затем использовать его как базу для индексирования.
Директивы Директивы являются указаниями Ассемблеру о том, как проводить ассемблирование. Директив может быть великое множество. В 1-м приближении мы рассмотрим лишь несколько практически обязательных директивы (мнемоники директив везде — условные, в конкретных Ассемблерах те же по смыслу директивы могут иметь другие мнемоники). EQU Определение имени Перед этой директивой обязательно стоит имя. Операнд этой директивы определяет значение имени. Операндом может быть и выражение, вычисляемое при ассемблировании. Имя может определяться и через другое имя, определенное выше. Как правило, не допускается определение имени со ссылкой вперед.
  • Директивы
  • Директивы являются указаниями Ассемблеру о том, как проводить ассемблирование.
  • Директив может быть великое множество. В 1-м приближении мы рассмотрим лишь несколько практически обязательных директивы (мнемоники директив везде — условные, в конкретных Ассемблерах те же по смыслу директивы могут иметь другие мнемоники).
  • EQU Определение имени
  • Перед этой директивой обязательно стоит имя. Операнд этой директивы определяет значение имени.
  • Операндом может быть и выражение, вычисляемое при ассемблировании. Имя может определяться и через другое имя, определенное выше. Как правило, не допускается определение имени со ссылкой вперед.
DD Определение данных Выделяются ячейки памяти и в них записываются значения, определяемые операндом директивы. Перед директивой может стоять метка/имя. Как правило, одной директивой могут определяться несколько объектов данных. В конкретных Ассемблерах может существовать либо одна общая директива DD, тогда тип данных, размещаемых в памяти определяется формой записи операндов, либо несколько подобных директив — для разных типов данных. В отличие от других, эта директива приводит непосредственной к генерации некоторого выходного кода — значений данных.
  • DD Определение данных
  • Выделяются ячейки памяти и в них записываются значения, определяемые операндом директивы.
  • Перед директивой может стоять метка/имя. Как правило, одной директивой могут определяться несколько объектов данных.
  • В конкретных Ассемблерах может существовать либо одна общая директива DD, тогда тип данных, размещаемых в памяти определяется формой записи операндов, либо несколько подобных директив — для разных типов данных.
  • В отличие от других, эта директива приводит непосредственной к генерации некоторого выходного кода — значений данных.
BSS Резервирование памяти Выделяются ячейки памяти, но значения в них не записываются. Объем выделяемой памяти определяется операндом директивы. Перед директивой может стоять метка/имя. END Конец программного модуля Указание Ассемблеру на прекращение трансляции. Обычно в модуле, являющемся главным (main) операндом этой директивы является имя точки, на которую передается управление при начале выполнения программы. Во всех других модулях эта директива употребляется без операндов.
  • BSS Резервирование памяти
  • Выделяются ячейки памяти, но значения в них не записываются. Объем выделяемой памяти определяется операндом директивы.
  • Перед директивой может стоять метка/имя.
  • END Конец программного модуля
  • Указание Ассемблеру на прекращение трансляции. Обычно в модуле, являющемся главным (main) операндом этой директивы является имя точки, на которую передается управление при начале выполнения программы. Во всех других модулях эта директива употребляется без операндов.
Директивы определения данных Сегмент данных предназначен для определения констант, рабочих полей и областей для ввода-вывода. В соответствии с имеющимися директивами в Ассемблере разрешено определение данных различной длины: например, директива DB определяет байт, а директива DW oпределяет слово. Элемент данных может содержать непосредственное значение или константу, определенную как символьная строка или как числовое значение. Другим способом определения константы является непосредственное значение, то есть, указанное прямо в ассемблерной команде, например: MOV AL,20H В этом случае шестнадцатеричное число 20 становится частью машинного объектного кода. Непосредственное значение ограничено oдним байтом или одним словом, но там, где оно может быть применено, оно является более эффективным, чем использование конcтанты.
  • Директивы определения данных
  • Сегмент данных предназначен для определения констант, рабочих полей и областей для ввода-вывода. В соответствии с имеющимися директивами в Ассемблере разрешено определение данных различной длины: например, директива DB определяет байт, а директива DW oпределяет слово. Элемент данных может содержать непосредственное значение или константу, определенную как символьная строка или как числовое значение.
  • Другим способом определения константы является непосредственное значение, то есть, указанное прямо в ассемблерной команде, например:
  • MOV AL,20H
  • В этом случае шестнадцатеричное число 20 становится частью машинного объектного кода. Непосредственное значение ограничено oдним байтом или одним словом, но там, где оно может быть применено, оно является более эффективным, чем использование конcтанты.
Ассемблер обеспечивает два способа определения данных: во-первых, через указание длины данных и, во-вторых, по их cодержимому. Рассмотрим основной формат определения данных: [имя] Dn выражение Имя элемента данных не обязательно (это указывается квадратными скобками), но если в программе имеются ссылки на некоторый элемент, то это делается посредством имени. Для определения элементов данных имеются следующие директивы: DB (байт), DW (слово), DD (двойное слово), DQ (учетверенное слово) и DT (десять байт).
  • Ассемблер обеспечивает два способа определения данных: во-первых, через указание длины данных и, во-вторых, по их cодержимому. Рассмотрим основной формат определения данных:
  • [имя] Dn выражение
  • Имя элемента данных не обязательно (это указывается квадратными скобками), но если в программе имеются ссылки на некоторый элемент, то это делается посредством имени.
  • Для определения элементов данных имеются следующие директивы: DB (байт), DW (слово), DD (двойное слово), DQ (учетверенное слово) и DT (десять байт).
Выражение может содержать константу, например: FLD1 DB 25 или знак вопроса для неопределенного значения, например FLDB DB ? Выражение может содержать несколько констант, разделенных запятыми и ограниченными только длиной строки: FLD3 DB 11, 12, 13, 14, 15, 16, ... Ассемблер определяет эти константы в виде последовательности cмежных байт. Ссылка по имени FLD3 указывает на первую константу, 11, по FLD3+1 — на вторую, 12. (FLD3 можно представить как FLD3+0). Например команда
  • Выражение может содержать константу, например:
  • FLD1 DB 25
  • или знак вопроса для неопределенного значения, например
  • FLDB DB ?
  • Выражение может содержать несколько констант, разделенных запятыми и ограниченными только длиной строки:
  • FLD3 DB 11, 12, 13, 14, 15, 16, ...
  • Ассемблер определяет эти константы в виде последовательности cмежных байт.
  • Ссылка по имени FLD3 указывает на первую константу, 11, по FLD3+1 — на вторую, 12. (FLD3 можно представить как FLD3+0). Например команда
MOV AL,FLD3+3 загружает в регистр AL значение 14 (шест. 0E). Выражение допускает также повторение константы в следующем формате: [имя] Dn число-повторений DUP (выражение) ... Следующие три примера иллюстрируют повторение: DW 10 DUP(?) ;Десять неопределенных слов DB 5 DUP(14) ;Пять байт, содержащих шест.14 DB 3 DUP(4 DUP(8));Двенадцать восьмерок В третьем примере сначала генерируется четыре копии десятичной 8 (8888), и затем это значение повторяется три раза, давая в pезультате двенадцать восьмерок. Выражение может содержать символьную строку или числовую константу.
  • MOV AL,FLD3+3
  • загружает в регистр AL значение 14 (шест. 0E). Выражение допускает также повторение константы в следующем формате:
  • [имя] Dn число-повторений DUP (выражение) ...
  • Следующие три примера иллюстрируют повторение:
  • DW 10 DUP(?) ;Десять неопределенных слов
  • DB 5 DUP(14) ;Пять байт, содержащих шест.14
  • DB 3 DUP(4 DUP(8));Двенадцать восьмерок
  • В третьем примере сначала генерируется четыре копии десятичной 8 (8888), и затем это значение повторяется три раза, давая в pезультате двенадцать восьмерок.
  • Выражение может содержать символьную строку или числовую константу.
Символьные строки Символьная строка используются для описания данных, таких как, например, имена людей или заголовки страниц. Содержимое строки oтмечается одиночными кавычками, например, 'PC' или двойными кавычками —
  • Символьные строки
  • Символьная строка используются для описания данных, таких как, например, имена людей или заголовки страниц. Содержимое строки oтмечается одиночными кавычками, например, 'PC' или двойными кавычками — "PC".
  • Ассемблер переводит символьные строки в объектный код в обычном формате ASCII.
  • Символьная строка определяется только директивой DB, в котоpой указывается более двух символов в нормальной последовательности слева направо. Следовательно, директива DB представляет единственно возможный формат для определения символьных данных.
Числовые константы Числовые константы используются для арифметических величин и для aдресов памяти. Для описания константы кавычки не ставятся. Ассемблер преобразует все числовые константы в шестнадцатеричные и записывает байты в объектном коде в обратной последовательности — справа налево. Ниже показаны различные числовые форматы. Десятичный формат Десятичный формат допускает десятичные цифры от 0 до 9 и обозначается последней буквой D, которую можно не указывать, например, 125 или 125D. Несмотря на то, что Ассемблер позволяет кодирование в десятичном формате, он преобразует эти значения в шест. объектный код. Например, десятичное число 125 преобразуется в шест.7D.
  • Числовые константы
  • Числовые константы используются для арифметических величин и для aдресов памяти. Для описания константы кавычки не ставятся. Ассемблер преобразует все числовые константы в шестнадцатеричные и записывает байты в объектном коде в обратной последовательности — справа налево. Ниже показаны различные числовые форматы.
  • Десятичный формат
  • Десятичный формат допускает десятичные цифры от 0 до 9 и обозначается последней буквой D, которую можно не указывать, например, 125 или 125D. Несмотря на то, что Ассемблер позволяет кодирование в десятичном формате, он преобразует эти значения в шест. объектный код. Например, десятичное число 125 преобразуется в шест.7D.
Шестнадцатеричный формат Шестнадцатеричный формат допускает шест. цифры от 0 до F и обозначается последней буквой H. Так как Ассемблер полагает, что с буквы начинаются идентификаторы, то первой цифрой шест. константы должна быть цифра от 0 до 9. Например, 2EH или 0FFFH, которые Ассемблер преобразует соответственно в 2E и FF0F (байты во втором примере записываются в объектный код в обратной последовательности). Двоичный формат Двоичный формат допускает двоичные цифры 0 и 1 и обозначается последней буквой B. Двоичный формат обычно используется для более четкого представления битовых значений в логических командах AND, OR, XOR и TEST. Десятичное 12, шест. C и двоичное 1100B все генерируют один и тот же код: шест. 0C или двоичное 0000 1100 в зависимости от того, как вы рассматриваете содержимое байта.
  • Шестнадцатеричный формат
  • Шестнадцатеричный формат допускает шест. цифры от 0 до F и обозначается последней буквой H.
  • Так как Ассемблер полагает, что с буквы начинаются идентификаторы, то первой цифрой шест. константы должна быть цифра от 0 до 9. Например, 2EH или 0FFFH, которые Ассемблер преобразует соответственно в 2E и FF0F (байты во втором примере записываются в объектный код в обратной последовательности).
  • Двоичный формат
  • Двоичный формат допускает двоичные цифры 0 и 1 и обозначается последней буквой B. Двоичный формат обычно используется для более четкого представления битовых значений в логических командах AND, OR, XOR и TEST. Десятичное 12, шест. C и двоичное 1100B все генерируют один и тот же код: шест. 0C или двоичное 0000 1100 в зависимости от того, как вы рассматриваете содержимое байта.
Восьмеричный формат Восьмеричный формат допускает восьмеричные цифры от 0 до 7 и обозначается последней буквой Q или O, например, 253Q. На сегодня восьмеричный формат используется весьма редко. Десятичный формат с плавающей точкой Этот формат поддерживается только Ассемблером МASM. При записи символьных и числовых констант следует помнить, что, например, символьная константа, определенная как DB '12', представляет символы ASCII и генерирует шест.3132, а числовая константа, oпределенная как DB 12, представляет двоичное число и генерирует шест.0C.
  • Восьмеричный формат
  • Восьмеричный формат допускает восьмеричные цифры от 0 до 7 и обозначается последней буквой Q или O, например, 253Q. На сегодня восьмеричный формат используется весьма редко.
  • Десятичный формат с плавающей точкой
  • Этот формат поддерживается только Ассемблером МASM. При записи символьных и числовых констант следует помнить, что, например, символьная константа, определенная как DB '12', представляет символы ASCII и генерирует шест.3132, а числовая константа, oпределенная как DB 12, представляет двоичное число и генерирует шест.0C.
Директива определения байта (DB) Из различных директив, определяющих элементы данных, наиболее полезной является DB (определить байт). Символьное выражение в диpективе DB может содержать строку символов любой длины, вплоть до конца строки. Объектный код показывает символы кода ASCII для каждого байта. Шест.20 представляет символ пробела. Числовое выражение в директиве DB может содержать одну или более однобайтовых констант. Один байт выражается двумя шест. цифpами. Наибольшее положительное шест. число в одном байте это 7F, все «большие» числа от 80 до FF представляют отрицательные значения. В десятичном исчислении эти пределы выражаются числами +127 и -128.
  • Директива определения байта (DB)
  • Из различных директив, определяющих элементы данных, наиболее полезной является DB (определить байт). Символьное выражение в диpективе DB может содержать строку символов любой длины, вплоть до конца строки. Объектный код показывает символы кода ASCII для каждого байта. Шест.20 представляет символ пробела.
  • Числовое выражение в директиве DB может содержать одну или более однобайтовых констант. Один байт выражается двумя шест. цифpами.
  • Наибольшее положительное шест. число в одном байте это 7F, все «большие» числа от 80 до FF представляют отрицательные значения. В десятичном исчислении эти пределы выражаются числами +127 и -128.
Директива определения слова (DW) Директива DW определяет элементы, которые имеют длину в одно слово (два байта). Символьное выражение в DW ограничено двумя символами, которые Ассемблер представляет в объектном коде так, что, например, 'PC' становится 'CP'. Для определения символьных строк директива DW имеет ограниченное применение. Числовое выражение в DW может содержать одно или более двухбайтовых констант. Два байта представляются четырьмя шест. цифрами. Наибольшее положительное шест. число в двух байтах это 7FFF; все «большие» числа от 8000 до FFFF представляют отрицательные значения. В десятичном исчислении эти пределы выражаются числами +32767 и -32768. Для форматов директив DW, DD и DQ Ассемблер преобразует константы в шест. объектный код, но записывает его в обратной последовательности. Таким образом десятичное значение 12345 преобразуется в шест.3039, но записывается в объектном коде как 3930.
  • Директива определения слова (DW)
  • Директива DW определяет элементы, которые имеют длину в одно слово (два байта). Символьное выражение в DW ограничено двумя символами, которые Ассемблер представляет в объектном коде так, что, например, 'PC' становится 'CP'. Для определения символьных строк директива DW имеет ограниченное применение.
  • Числовое выражение в DW может содержать одно или более двухбайтовых констант. Два байта представляются четырьмя шест. цифрами. Наибольшее положительное шест. число в двух байтах это 7FFF; все «большие» числа от 8000 до FFFF представляют отрицательные значения. В десятичном исчислении эти пределы выражаются числами +32767 и -32768. Для форматов директив DW, DD и DQ Ассемблер преобразует константы в шест. объектный код, но записывает его в обратной последовательности. Таким образом десятичное значение 12345 преобразуется в шест.3039, но записывается в объектном коде как 3930.
Директива определения двойного слова (DD) Директива DD определяет элементы, которые имеют длину в два cлова (четыре байта). Числовое выражение может содержать одну или более констант, каждая из которых имеет максимум четыре байта (восемь шест. цифр). Наибольшее положительное шест. число в четырех байтах это 7FFFFFFF; все «большие» числа от 80000000 до FFFFFFFF представляют отрицательные значения. В десятичном исчислении эти пределы выражаются числами +2147483647 и -2147483648. Ассемблер преобразует все числовые константы в директиве DD в шест. представление, но записывает объектный код в обратной последовательности. Таким образом десятичное значение 12345 преобразуется в шест.00003039, но записывается в oбъектном коде как 39300000. Символьное выражение директивы DD ограничено двумя символами. Ассемблер преобразует символы и выравнивает их слева в четырехбайтовом двойном слове, как показано в поле FLD2DD в объектном коде.
  • Директива определения двойного слова (DD)
  • Директива DD определяет элементы, которые имеют длину в два cлова (четыре байта). Числовое выражение может содержать одну или более констант, каждая из которых имеет максимум четыре байта (восемь шест. цифр).
  • Наибольшее положительное шест. число в четырех байтах это 7FFFFFFF; все «большие» числа от 80000000 до FFFFFFFF представляют отрицательные значения.
  • В десятичном исчислении эти пределы выражаются числами +2147483647 и -2147483648.
  • Ассемблер преобразует все числовые константы в директиве DD в шест. представление, но записывает объектный код в обратной последовательности.
  • Таким образом десятичное значение 12345 преобразуется в шест.00003039, но записывается в oбъектном коде как 39300000.
  • Символьное выражение директивы DD ограничено двумя символами. Ассемблер преобразует символы и выравнивает их слева в четырехбайтовом двойном слове, как показано в поле FLD2DD в объектном коде.
Директива определения учетверенного слова (DQ) Директива DQ определяет элементы, имеющие длину четыре слова (восемь байт). Числовое выражение может содержать одну или более констант, каждая из которых имеет максимум восемь байт или 16 шест. цифр. Наибольшее положительное шест. число — это семерка и 15 цифр F. Для получения представления о величине этого числа, покажем, что шест. 1 и 15 нулей эквивалентен следующему десятичному числу: 1152921504606846976 Ассемблер преобразует все числовые константы в директиве DQ в шест. представление, но записывает объектный код в обратной последовательности, как и в директивах DD и DW. Обработка Ассемблером символьных строк в директиве DQ aналогична директивам DD и DW.
  • Директива определения учетверенного слова (DQ)
  • Директива DQ определяет элементы, имеющие длину четыре слова (восемь байт). Числовое выражение может содержать одну или более констант, каждая из которых имеет максимум восемь байт или 16 шест. цифр. Наибольшее положительное шест. число — это семерка и 15 цифр F. Для получения представления о величине этого числа, покажем, что шест. 1 и 15 нулей эквивалентен следующему десятичному числу:
  • 1152921504606846976
  • Ассемблер преобразует все числовые константы в директиве DQ в шест. представление, но записывает объектный код в обратной последовательности, как и в директивах DD и DW.
  • Обработка Ассемблером символьных строк в директиве DQ aналогична директивам DD и DW.
Директива определения десяти байт (DT) Директива DT определяет элементы данных, имеющие длину в десять байт. Назначение этой директивы связано с «упакованными десятичными» числовыми величинами. По директиве DT генерируются различные константы, в зависимости от версии Ассемблера.
  • Директива определения десяти байт (DT)
  • Директива DT определяет элементы данных, имеющие длину в десять байт.
  • Назначение этой директивы связано с «упакованными десятичными» числовыми величинами.
  • По директиве DT генерируются различные константы, в зависимости от версии Ассемблера.
Непосредственные операнды Ранее было показано использование непосредственных операндов. Команда: MOV AX,0123H пересылает непосредственную шест. константу 0123 в регистр AX. Трехбайтный объектный код для этой команды есть B82301, где B8 обозначает «переслать непосредственное значение в регистр AX», a следующие два байта содержат само значение. Многие команды имеют два операнда: первый может быть регистр или адрес памяти, а второй — непосредственная константа. Использование непосредственного операнда более эффективно, чем oпределение числовой константы в сегменте данных и организация cсылки на нее в операнде команды MOV, например, Сегмент данных: AMT1 DW 0123H Сегмент кодов: MOV AX,AMT1
  • Непосредственные операнды
  • Ранее было показано использование непосредственных операндов. Команда:
  • MOV AX,0123H
  • пересылает непосредственную шест. константу 0123 в регистр AX.
  • Трехбайтный объектный код для этой команды есть B82301, где B8 обозначает «переслать непосредственное значение в регистр AX», a следующие два байта содержат само значение.
  • Многие команды имеют два операнда: первый может быть регистр или адрес памяти, а второй — непосредственная константа.
  • Использование непосредственного операнда более эффективно, чем oпределение числовой константы в сегменте данных и организация cсылки на нее в операнде команды MOV, например,
  • Сегмент данных: AMT1 DW 0123H
  • Сегмент кодов: MOV AX,AMT1
Длина непосредственных операндов Длина непосредственной константы зависит от длины первого операнда. Например, следующий непосредственный операнд является двухбайтовым, но регистр AL имеет только один байт: MOV AL,0123H (ошибка) Однако, если непосредственный операнд короче, чем получающий операнд, как в следующем примере ADD AX,25H (нет ошибки) то Ассемблер расширяет непосредственный операнд до двух байт, 0025 и записывает объектный код в виде 2500.
  • Длина непосредственных операндов
  • Длина непосредственной константы зависит от длины первого операнда. Например, следующий непосредственный операнд является двухбайтовым, но регистр AL имеет только один байт:
  • MOV AL,0123H (ошибка)
  • Однако, если непосредственный операнд короче, чем получающий операнд, как в следующем примере
  • ADD AX,25H (нет ошибки)
  • то Ассемблер расширяет непосредственный операнд до двух байт, 0025 и записывает объектный код в виде 2500.
Непосредственные форматы Непосредственная константа может быть шестнадцатеричной, например, 0123H; десятичной, например, 291 (которую Ассемблер конвертирует в шест.0123); или двоичной, например, 100100011В (которая преобразуется в шест. 0123). Ниже приведен список команд, которые допускают непосредственные операнды: Команды пересылки и сравнения MOV, CMP. Арифметические команды ADC, ADD, SBB, SUB. Команды сдвига RCL, RCR, ROL, ROR, SHL, SAR, SHR. Логические команды AND, OR, TEST, XOR. Для создания элементов, длиннее чем два байта, можно использовать цикл или строковые команды.
  • Непосредственные форматы
  • Непосредственная константа может быть шестнадцатеричной, например, 0123H; десятичной, например, 291 (которую Ассемблер конвертирует в шест.0123); или двоичной, например, 100100011В (которая преобразуется в шест. 0123). Ниже приведен список команд, которые допускают непосредственные операнды:
  • Команды пересылки и сравнения
  • MOV, CMP.
  • Арифметические команды
  • ADC, ADD, SBB, SUB.
  • Команды сдвига
  • RCL, RCR, ROL, ROR, SHL, SAR, SHR.
  • Логические команды
  • AND, OR, TEST, XOR.
  • Для создания элементов, длиннее чем два байта, можно использовать цикл или строковые команды.
Директива EQU Директива EQU не определяет элемент данных, но определяет значение, которое может быть использовано для постановки в других командах. Предположим, что в сегменте данных закодирована следующая директива EQU: TIMES EQU 10 Имя, в данном случае TIMES, может быть представлено любым допустимым в Ассемблере именем. Теперь, в какой бы команде или директиве не использовалось слово TIMES Ассемблер подставит значение 10. Например, Ассемблер преобразует директиву FIELDA DB TIMES DUP (?) в FIELDA DB 10 DUP (?) Имя, связанное с некоторым значением с помощью директивы EQU, может использоваться в командах, например: COUNTR EQU 05 ... MOV CX,COUNTR Ассемблер заменяет имя COUNTR в команде MOV на значение 05, cоздавая операнд с непосредственным значением, как если бы было закодировано: MOV CX,05 ;Ассемблер подставляет 05
  • Директива EQU
  • Директива EQU не определяет элемент данных, но определяет значение, которое может быть использовано для постановки в других командах. Предположим, что в сегменте данных закодирована следующая директива EQU:
  • TIMES EQU 10
  • Имя, в данном случае TIMES, может быть представлено любым допустимым в Ассемблере именем. Теперь, в какой бы команде или директиве не использовалось слово TIMES Ассемблер подставит значение 10. Например, Ассемблер преобразует директиву
  • FIELDA DB TIMES DUP (?) в FIELDA DB 10 DUP (?)
  • Имя, связанное с некоторым значением с помощью директивы EQU, может использоваться в командах, например:
  • COUNTR EQU 05 ...
  • MOV CX,COUNTR
  • Ассемблер заменяет имя COUNTR в команде MOV на значение 05, cоздавая операнд с непосредственным значением, как если бы было закодировано:
  • MOV CX,05 ;Ассемблер подставляет 05
Здесь преимущество директивы EQU заключается в том, что многие команды могут использовать значение, определенное по имени COUNTR. В случае, если это значение должно быть изменено, то изменению подлежит лишь одна директива EQU. Естественно, что использование директивы EQU разумно лишь там, где подстановка имеет смысл для Ассемблера. В директиве EQU можно использовать символические имена: 1. TP EQU TOTALPAY 2. MPY EQU MUL Первый пример предполагает, что в сегменте данных программы опpеделено имя TOTALPAY. Для любой команды, содержащей операнд TP, Ассемблер заменит его на адрес TOTALPAY. Второй пример показывает возможность использования в программе слова MPY вместо обычного мнемокода MUL.
  • Здесь преимущество директивы EQU заключается в том, что многие команды могут использовать значение, определенное по имени COUNTR. В случае, если это значение должно быть изменено, то изменению подлежит лишь одна директива EQU. Естественно, что использование директивы EQU разумно лишь там, где подстановка имеет смысл для Ассемблера. В директиве EQU можно использовать символические имена:
  • 1. TP EQU TOTALPAY
  • 2. MPY EQU MUL
  • Первый пример предполагает, что в сегменте данных программы опpеделено имя TOTALPAY. Для любой команды, содержащей операнд TP, Ассемблер заменит его на адрес TOTALPAY. Второй пример показывает возможность использования в программе слова MPY вместо обычного мнемокода MUL.


Получите в подарок сайт учителя

Предмет: Прочее

Категория: Презентации

Целевая аудитория: Прочее

Скачать
Программирование на языке Ассемблера

Автор: Агафонова Елена Михайловна

Дата: 14.11.2022

Номер свидетельства: 617328

Похожие файлы

object(ArrayObject)#863 (1) {
  ["storage":"ArrayObject":private] => array(6) {
    ["title"] => string(90) "Практические работы на языке программирования C# "
    ["seo_title"] => string(54) "praktichieskiie-raboty-na-iazykie-proghrammirovaniia-c"
    ["file_id"] => string(6) "232416"
    ["category_seo"] => string(11) "informatika"
    ["subcategory_seo"] => string(7) "prochee"
    ["date"] => string(10) "1442840729"
  }
}
object(ArrayObject)#885 (1) {
  ["storage":"ArrayObject":private] => array(6) {
    ["title"] => string(77) "Вредоносные программы и их классификация "
    ["seo_title"] => string(46) "vriedonosnyie-proghrammy-i-ikh-klassifikatsiia"
    ["file_id"] => string(6) "230273"
    ["category_seo"] => string(11) "informatika"
    ["subcategory_seo"] => string(5) "uroki"
    ["date"] => string(10) "1442067562"
  }
}
object(ArrayObject)#863 (1) {
  ["storage":"ArrayObject":private] => array(6) {
    ["title"] => string(58) "урок "Внутреннее устройство ПК" "
    ["seo_title"] => string(32) "urok-vnutriennieie-ustroistvo-pk"
    ["file_id"] => string(6) "107138"
    ["category_seo"] => string(11) "informatika"
    ["subcategory_seo"] => string(11) "presentacii"
    ["date"] => string(10) "1403173086"
  }
}


Получите в подарок сайт учителя

Видеоуроки для учителей

Курсы для учителей

ПОЛУЧИТЕ СВИДЕТЕЛЬСТВО МГНОВЕННО

Добавить свою работу

* Свидетельство о публикации выдается БЕСПЛАТНО, СРАЗУ же после добавления Вами Вашей работы на сайт

Удобный поиск материалов для учителей

Проверка свидетельства