4. Команды пересылки и арифметические команды.ppt
- Количество слайдов: 63
Команды пересылки и арифметические команды Лекция 4
План лекции Команды пересылки данных n Косвенная адресация памяти n Команды работы со стеком n Команды сложения n Команды вычитания n Команды умножения n Команды деления n Команды распространения знака n
Команды пересылки данных
Команды пересылки данных n Команда MOV: MOV Приемник, Источник n Приемник = Источник
Команды пересылки данных Приемник – регистр или переменная n Источник – регистр, переменная или константа n Переменная в Ассемблере – это адрес ячейки памяти n Невозможно переслать данные напрямую из переменной в переменную (только через регистры) n
Команды пересылки данных Длина операндов должна быть одинаковая n Если длина разная, используется директива PTR: n ¨ BYTE PTR a – переменная а рассматривается как однобайтовая ¨ WORD PTR a+2 – содержимое ячейки памяти по адресу а+2 рассматривается как двухбайтовая величина
Команды пересылки данных n Команда XCHG: XCHG Приемник, Источник Приемник, источник – регистр или переменная n Две переменных быть не могут n
Команды пересылки данных n Команда LEA – загружает в регистр адрес ячейки памяти: LEA Приемник, Источник Load Effective Address n Приемник – регистр (16 или 32 -разрядный) n Источник – переменная n
Команды пересылки данных n a Пример: DW LEA 1000 EAX, a
Косвенная адресация памяти
Косвенная адресация памяти n a Примеры 1 и 2: DD LEA MOV 100 EBX, a EAX, [EBX]
Косвенная адресация памяти
Косвенная адресация памяти
Косвенная адресация памяти n Пример: MOV BYTE PTR [EBX], 100 WORD PTR [EBX], 100
Косвенная адресация памяти
Косвенная адресация памяти
Команды работы со стеком
Команды работы со стеком PUSH – сохранить информацию в стеке n POP – извлечь информацию из стека n PUSHAD – помещает в стек все основные регистры процессора: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI n POPAD – извлекает указанные регистры из стека в обратном порядке n
Команды работы со стеком n ESP – указатель стека, изменяется в сторону младших адресов
Команды работы со стеком n Примеры 3 и 4:
Команды работы со стеком a DD ? b DW ? d DD ? PUSH POP PUSH MOV POP EAX // поместить в стек 4 байта a AX // поместить в стек 2 байта b 100 h EAX, [ESP] // прямой доступ к стеку d, EAX
Команды работы со стеком n Необходимо следить за последовательностью операций со стеком, чтобы избежать ошибок: PUSH. . . POP AX EAX
Арифметические команды
Команды сложения складывают в двоичной системе сложения n Командам безразлично, знаковые это числа или нет n
Команды сложения В результате команд устанавливаются следующие флаги: n CF = 1 – бит переноса есть n PF = 1 – четное число единиц n SF = 1 – старший (знаковый) бит = 1 n ZF = 1 – результат равен нулю n OF = 1 – переполнение имеет место
Команды сложения n Переполнение имеет место, если знаки операндов одинаковы, а знак результата не совпадает со знаком операндов
Команды сложения Примеры сложения: n 4‑разрядные знаковые числа n Диапазон?
Команды сложения Примеры сложения: n 4‑разрядные знаковые числа n Диапазон? n (+5) + (– 5) = ?
Команды сложения Примеры сложения: n 4‑разрядные знаковые числа n Диапазон? n (+5) + (– 5) = ? n (+5) + (+4) = ?
Команды сложения Примеры сложения: n 4‑разрядные знаковые числа n Диапазон? n (+5) + (– 5) = ? n (+5) + (+4) = ? n (– 5) + (– 4) = ?
Команды сложения n Команда ADD (Addition) ADD Приемник, Источник ¨ Приемник = Приемник + Источник ¨ Приемник – регистр, переменная ¨ Источник – регистр, переменная, константа ¨ Невозможно чтобы оба операнда были переменными
Команды сложения a b d DW DW DW MOV ADD MOV 100 ? AX, a BX, b AX, BX d, AX
Команды сложения n Необходимо следить, чтобы результат попадал в диапазон типа! ¨ контроль слагаемых ¨ контроль флага переполнения OF
Команды сложения n Команда ADC ADС Приемник, Источник ¨ Addition with Carry flag ¨ Приемник = Приемник + Источник + CF ¨ Используется для сложения чисел большой разрядности
Команды сложения n Пример. Сложить два 16 -разрядных числа с использованием 8 -разрядных регистров
Команды сложения a DW b DW MOV MOV ADD ADC 1000 2000 AL, BYTE PTR a AH, BYTE PTR a + 1 BL, BYTE PTR b BH, BYTE PTR b + 1 AL, BL AH, BH
Команды сложения n Команда INC Операнд ¨ Increment ¨ Операнд = Операнд + 1 ¨ Операнд – регистр или переменная
Команды вычитания n Команда SUB Приемник, Источник ¨ Subtract – вычитание ¨ Приемник = Приемник – Источник
Команды вычитания n Команда SBB Приемник, Источник ¨ Subtract with Borrow CF ¨ Приемник = Приемник – Источник – CF
Команды вычитания n Команда DEC Операнд ¨ Decrement ¨ Операнд = Операнд – 1
Команда сравнения n Команда CMP (Compare) CMP Приемник, Источник ¨ Приемник – Источник ¨ Команда не изменяет приемник, но при выполнении команды флаги меняются ¨ Используется в командах условного перехода
Команда изменения знака n Команда NEG Приемник ¨ Negative – изменение знака ¨ Приемник = –Приемник ¨ Приемник – регистр или переменная
Команды умножения n Команда MUL Операнд ¨ Умножение – Multiply ¨ беззнаковое умножение
Команды умножения 1) Если операнд однобайтовый AX : = AL * Операнд 2) Если операнд двухбайтовый
Команды умножения n Может ли быть переполнение, как при сложении?
Команды умножения Длина произведения всегда в два раза больше длины множителей! n Если произведение помещается в размер множителей (например EDX=0), то CF = OF = 0 Иначе, CF = OF = 1 n Остальные флаги не определены n
Команды умножения n Команда IMUL (1) IMUL Операнд ¨ Integer multiply ¨ Знаковое умножение ¨ Формат совпадает с MUL
Команды умножения n Команда IMUL (2) IMUL Операнд 1, Операнд 2 ¨ Операнд 1 = Операнд 1 * Операнд 2 ¨ Операнд 1 – регистр (16 или 32 -разрядный) ¨ Операнд 2 – регистр, переменная, константа ¨ Длина второго операнда (кроме констант) должна совпадать с длиной первого
Команды умножения n Команда IMUL (3) IMUL Операнд 1, Операнд 2, Операнд 3 ¨ Операнд 1 = Операнд 2 * Операнд 3 ¨ Операнд 1 – регистр (16 или 32 -разрядный) ¨ Операнд 2 – регистр или переменная ¨ Операнд 3 – константа ¨ Размер всех операндов должен быть одинаков
Команды умножения n Использовать двух- и трехадресную формы можно только в том случае, если результат точно помещается в операнд-приемник!
Команды умножения n Пример умножения: проект MUL
Команды деления n Команда DIV: DIV Делитель ¨ Беззнаковое деление ¨ Операнд – регистр или переменная ¨ Константы не допускаются!
Команды деления n Команда IDIV: IDIV Делитель ¨ Знаковое деление ¨ Операнд – регистр или переменная ¨ Константы не допускаются!
Команды деления n Таблица операндов для команд деления
Команды деления n Устанавливаются флаги CF = OF = 1, если: ¨ происходит деление на ноль ¨ частное не помещается в отведенный для него регистр n В обоих случаях вырабатывается прерывание «Деление на ноль» и выполнение программы останавливается
Команды деления a WORD ? b DWORD ? rez WORD ? ost WORD ? div_16 PROC MOV AX, WORD PTR b MOV DX, WORD PTR b+2 DIV a MOV rez, AX MOV ost, DX RET div_16 ENDP
Команды распространения знака n a b Пример: правильно? DW ? MOV AX, a MOV CX, 10 DIV CX MOV b, AX
Команды распространения знака n Делимое не подготовлено к делению!
Команды распространения знака n При делении беззнаковых чисел нужно в старшую часть делимого занести ноль: MOV DX, 0 или лучше: XOR DX, DX
Команды распространения знака n n n При делении знаковых чисел следует распространить знак Команды распространения знака копируют знаковый бит в старшую часть операнда Если знаковый бит равен нулю, то старшая часть заполняется нулями, если знаковый бит равен единице, то старшая часть заполняется единицами
Команды распространения знака n CBW (Convert Byte To Word): AL → AX n CWD (Convert Word To Double word): AX →
Команды распространения знака n CDQ (Convert Double word To Quad Word): EAX →
Команды распространения знака Пример: (+51): Byte → Word (CBW) : n 0011 → 0000 0011 (– 51): Byte → Word (CBW) : 1100 1101 → 1111 1100 1101