- •2 Способы задания операндов команды.
- •3 Понятие процедуры. Назначение, структура и механизм работы.
- •4. Обмен данными между процедурой и вызывающей программой.
- •7. Особенности написания com и exe программ на Ассемблере
- •9. Директивы описания данных db, dw, dd. Оператор dup. Примеры.
- •10. Директивы assume, org, end
- •13 Основные виды адресации к памяти. Прямая, косвенная базовая и индексная адресация
- •14. Команды пересылки данных mov, xchg и их преобразования
- •15. Построение исходного модуля программы
- •16. Понятие метки. Использование типа метки Short.
- •17. Команды условного перехода, использование команды cmp.
- •18. Понятие и формат макрокоманд. Примеры макрокоманд.
- •19. Организация циклов на Ассемблере Loop, Loope, Loopne.
- •20. Работа со стеком. Команды работы со стеком push, pop, pusha, popa.
- •21. Команды lea, lds и les
- •22. Написание комментариев. Использование констант в различных системах счисления. Работа с флагами.
- •23. Команды сдвига shr, shl, rcl, rcr, rol, ror. Их работа и примеры использования.
- •24. Три вида команд безусловного перехода jmp ***. Особенности их использования
20. Работа со стеком. Команды работы со стеком push, pop, pusha, popa.
PUSH – помещает в стек значение 16- или 32-разрядного операнда, уменьшая перед этим значение регистра ESP, соответственно, на 2 или на 4.
POP – копирует содержимое вершины стека, на которую указывает регистр ESP, в 16- или 32-разрядный операнд, указанный в команде, а затем прибавляет к регистру ESP, соответственно, число 2 или 4.
PUSHA – сохраняет в стеке значение всех 16-разрядных регистров общего назначения в следующем порядке: AX, CX, DX, BX, SP (значение до выполнения команды), BP, SI, DI.
POPA – восстанавливает из стека значения указанных регистров в обратном порядке, т.е. DI, SI, BP, SP, BX, DX, CX, AX.
21. Команды lea, lds и les
Команды LEA, LDS и LES предназначены для загрузки эффективного адреса.
Команда LEA извлекает из памяти 16-битовый адрес и помещает его в один из общих регистров. Практически эта команда дублирует один из вариантов команды MOV, но выполняется быстрее.
Команда LDS извлекает из памяти 32-битовый адрес и помещает первое считанное из памяти слово в заданный общий регистр, а второе - в сегментный регистр DS.
Команда LES извлекает из памяти 32-битовый адрес и помещает первое считанное из памяти слово в заданный общий регистр, а второе - в сегментный регистр ES.
Обычно в команде LDS указывается регистр SI, а в команде LES регистр DI.
Формат команд:
LEA reg, mem
LDS reg, mem
LES reg, mem
22. Написание комментариев. Использование констант в различных системах счисления. Работа с флагами.
1)Комментарий всегда начинается с точки с запятой.
2)Константа - это численное значение, вычисляемое во время ассемблирования по заданному выражению.
Численные константы допускается представлять в системах счисления с основаниями 2, 8, 10 и 16. За младшей цифрой должен находиться однобуквенный дескриптор системы счисления: B - двоичная, O или Q - восьмеричная, D (необязательно) - десятичная, H-шестнадцатиричная. Шестнадцатиричная константа должна быть дополнена слева незначащим нулем.
3) http://www.osinavi.ru/asm/5.php
23. Команды сдвига shr, shl, rcl, rcr, rol, ror. Их работа и примеры использования.
Функции сдвига (сдвиг логический операнда влево/вправо)
SHL операнд, количество_сдвигов
SHR операнд, количество_сдвигов
SHL и SHR сдвигают биты операнда (регистр/память) влево или вправо соответственно на один разряд.
Указанное выше действие повторяется количество раз, равное значению второго операнда.
Пример:
; al = 01011011 (двоичное)
shr al, 3
Это означает: сдвиг всех битов регистра al на 3 разряда вправо. Так что al станет 00001011. Биты слева заполняются нулями, а биты справа выдвигаются. Последний выдвинутый бит, становится значением флага переноса cf.
Бит переноса это бит флагового регистра процессора. Этот регистр не такой как eax или ecx, к которому вы можете непосредственно обращаться (хотя есть опкоды, которые это делают), его содержание, зависит от результатов многих команд. Об этом я вам расскажу позже, единственное, что вы должны сейчас запомнить, это то, что флаг переноса это бит во флаговом регистре и что он может быть установлен (т.е. равен 1) или сброшен (равен 0).
Команда shl такая же, как и shr, но сдвигает влево.
; bl = 11100101 (двоичное)
shl bl, 2
После выполнения команды регистр bl будет равен 10010100 (двоичное). Два последних бита заполнились нулями, флаг переноса установлен, потому, что последний выдвинутый слева бит был равен 1
Здесь есть еще два других опкода: (сдвиг арифметический операнда влево/вправо)
SAL операнд, количество_сдвигов
SAR операнд, количество_сдвигов
Команда SAL такая же, как SHL, а вот SAR не совсем такая, как SHR. Команда SAR также, как и SHR сдвигает все биты операнда вправо на один разряд, при этом выдвигаемый справа бит становится значением флага переноса cf.
Обратите внимание: одновременно слева в операнд вдвигается не нулевой бит, как в SHR, а значение старшего бита операнда. Пример:
al = 10100110
sar al, 3
al = 11110100
sar al, 2
al = 11111101
bl = 00100110
sar bl, 3
bl = 00000010
Циклический сдвиг
rol операнд, количество_сдвигов ; циклический сдвиг операнда влево
ror операнд, количество_сдвигов ; циклический сдвиг операнда вправо
rcl операнд, количество_сдвигов ; циклический сдвиг операнда влево через флаг переноса
rcr операнд, количество_сдвигов ; циклический сдвиг операнда вправо через флаг переноса
Циклический сдвиг напоминает смещение, выдвигаемые биты, снова вдвигаются с другой стороны:
Пример: команды ror (циклический сдвиг вправо)
Как видно из рисунка выше, биты вращаются, то есть каждый бит, который выталкивается снова вставляется с другой стороны. Флаг переноса cf содержит значение последнего выдвинутого бита.
RCL и RCR сдвигают все биты операнда влево (для RCL) или вправо (для RCR) на один разряд, при этом старший(для RCL) или младший(для RCR) бит становится значением флага переноса cf; одновременно старое значение флага переноса cf вдвигается в операнд справа(для RCL) или слева(для RCR) и становится значением младшего(для RCL) или старшего(для RCR) бита операнда. Указанные действия повторяются количество раз, равное значению второго операнда.
ROL и ROR сдвигают все биты операнда влево(для ROL) или вправо(для ROR) на один разряд, при этом старший(для ROL) или младший(для ROR) бит операнда вдвигается в операнд справа(для ROL) или слева(для ROR) и становится значением младшего(для ROL) или старшего(для ROR) бита операнда; одновременно выдвигаемый бит становится значением флага переноса cf. Указанные действия повторяются количество раз, равное значению второго операнда.