Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ас(1).docx
Скачиваний:
39
Добавлен:
11.02.2015
Размер:
897.48 Кб
Скачать

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. Указанные действия повторяются количество раз, равное значению второго операнда.