
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Структура машинного оператора
{ Метка: } { Префикс } Мнемоника { Операнды } { ;Комментарии }
Элементы, заключенные в круглые скобки могут отсутствовать.
МЕТКА в процессе трансляции принимает значение адреса соответствующей команды. Метки как операнды присутствуют в операторах управления.
ПРЕФИКС – его наличие позволяет сформировать один из префиксных байт: блокировки LOCK или повторения REP.
МНЕМОНИКА – символические обозначения команд процессора. Например: ADD, SUB и т. д.
ОПЕРАНДЫ: MOV AX,data[SI] – два операнда
DEC AX – один операнд
XLAT – нет операндов
Комментарии – произвольный текст, который следует за точкой с запятой.
Директивы ассемблера
Директивы ассемблера и операторы определения данных имеют несколько иной формат, чем машинные операторы.
{ символическое имя } Директива { Операнды } { ;Комментарии }
СИМВОЛИЧЕСКОЕ ИМЯ – по своему смыслу близко к метке, т. е. задаёт имя директиве, например заголовок процедуры. Однако после трансляции символические имена, как и сами директивы в программе отсутствуют.
ДИРЕКТИВА – определяет действие, также как и мнемоника. Однако это действие выполняет ассемблер при трансляции программы.
Идентификаторы включают буквы, цифры и специальные символы: ? @ _ $; начинаются с буквы или с специального символа. Идентификаторы – это метки, имена в директивах ассемблера и имена переменных в операторах распределения данных (а также имена операндов в командных операторах).
Регистры – имеют стандартные имена. Регистрам приписаны стандартные типы:
тип BYTE – AL,AH,BL,BH,CL,CH,DL,DH;
тип WORD – AX,BX,CX,DX,BP,SP,SI,DI,CS,DS,SS,ES.
Директивы определения данных
[ Имя ] Dn выражение
A DB ? ; переменная A размером один байт не инициализирована;
B DB 10 DUP(?) ;переменная B - поле из 10 неинициализированных байтов;
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
Поле B │ * │ * │ * │ * │ * │ * │ * │ * │ * │ * │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
C DB 10 DUP(0) ;переменная C – поле из 10 нулевых байтов;
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
Поле C │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
D DB 'Группа ВТИ' ;символьная строка.
Символьные строки задаются только директивой DB.
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
Поле D │ Г │ р │ у │ п │ п │ а │ │ В │ Т │ И │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
E DB -85 ;короткое целое со знаком.
Десятичная константа может задавать числа со знаком в диапазоне от -128 до 127. Например,
E DB -180
Число -180 может быть представлено только в слове FF4Ch. При этом старший байт отбрасывается. 4Ch = 76 в десятичной.
Если число больше 255, то выдается ошибка "Value out of range".
F DB 10b ;эквивалентно: F DB 2
1 DB -10b ;эквивалентно: F1 DB -2
Для двоичных чисел диапазон от 0b до 11111111b.
L DB 5Fh ;шестнадцатеричная константа;
L1 DB -5Fh
Диапазон шестнадцатеричных чисел от 0h до FFh.
Директива DB определяет и константы и начальные значения переменных. Константы не защищены от изменения значений, и в процессе работы могут быть использованы как переменные.
Типы ассемблера – BYTE и WORD. Здесь отсутствует разделение между BYTE и SHORTINT, WORD и INTEGER. и поэтому может возникнуть ряд проблем:
A2 DB 200; C8h
Если рассматривать это число как число без знака, то оно соответствует 200, а если учитывать знак, то -56
A3 DB 0F1h; F1h
A4 DB 011011b; 1Bh
A5 DB -011011b; E5h
A6 DB -200; 38h=56dec – поле определено неверно
A7 DB 300; -Out of Range (300>255)