
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Режимы адресации
В командах обработки данных (арифметические и логические команды) формируются адреса операндов, которые указывают местоположение данных в памяти. В командах управления определяются адреса команд, которым передается управление, т. е. адреса переходов.
Способ определения адреса перехода или адреса операнда называется режимом адресации.
В предыдущем пункте мы рассмотрели три способа адресации операндов, которые необходимы для изложения нижеследующего материала. Другие способы адресации будем рассматривать далее по мере необходимости изложения материала.
Команда сложения add
Команды сложения и вычитания являются базовыми при построении ЭВМ, и потому в алгоритме их выполнения заложено формирование всех признаков результата (6 признаков).
OF DF IF SF ZF AF PF CF
┌──┬──┬──┬──┬──┬──┬──┬──┐
ADD ОР1,ОР2 Сложение чисел со знаком │ F│ │ │ F│ F│ F│ F│ F│
└──┴──┴──┴──┴──┴──┴──┴──┘
ОР1:=ОР1+ОР2
ADD mem/reg,mem/reg
ADD AL,BL; AL= 35 = 23h = 0.0100011b +
; BL= -39 = -27h = 1.1011001b
----------
OF SF ZF AF PF CF 1.1111100b дк
┌──┬──┬──┬──┬──┬──┐ ----------
│ 0│ 1│ 0│ *│ 1│ 0│ 1.0000100b пк = -4
└──┴──┴──┴──┴──┴──┘
Рассмотрим порядок формирования флагов результата. Флаг AF не рассматриваем, т.к. он определяется верно только в командах двоично-десятичной арифметики, а мы изучаем команды для целых чисел. При сложении чисел нет переноса из знакового разряда, поэтому CF=0. В поле результата 1.1111100b ДК четное количество единичных бит (6), поэтому PF=1. Результат не равен 0, поэтому ZF=0. Результат отрицательный SF=1. Флаг OF=0, т.к. переполнения при сложении не было. В нашем примере складывались числа с разными знаками, что исключает возможность переполнения.
Переполнение возможно, если складываются числа с одинаковыми знаками. При этом на переполнение будет указывать знаковый разряд результата – знак результата не равен знаку операндов.
Ниже рассмотрен пример сложения чисел 100+100=200. Диапазон для чисел со знаком в формате байта (-128..127), результат выходит за пределы диапазона. Слагаемые имели знак '+', а в знаковом разряде результата 1
AL= 100 = 64h = 0.1100100b +
BL= 100 = 64h = 0.1100100b
----------
1.1001000b перенос в знак =1
перенос из знака =0
OF SF ZF AF PF CF Флаги формируются в соответствии формирования
┌──┬──┬──┬──┬──┬──┐ чисел со знаком.
│ 1│ 1│ 0│ *│ 0│ 0│
└──┴──┴──┴──┴──┴──┘
Однако эта команда используется для сложения чисел без знака, флаги формируются аппаратно по тому же алгоритму и только программист может правильно интерпретировать результат, а именно: произошло переполнение или нет.
Сложение чисел без знака:
AL=150=96h=10010110b +
BL=150=96h=10010110b
---------------
1.00101100b = 44<>300
Диапазон для чисел без знака в формате байта (0..255), результат выходит за пределы диапазона.
Флаги формируются по тому же принципу, а анализируется результат по другому.
OF SF ZF AF PF CF Т. к. программист предполагал, что склады-
┌──┬──┬──┬──┬──┬──┐ вает числа без знака, судить о переполне-
│ 1│ 0│ 0│ *│ 0│ 1│ нии надо по значению флага CF. В данном
└──┴──┴──┴──┴──┴──┘ случае CF = 1, произошло переполнение и
результат неверный.