Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Arhitektura_EVM_i_vychislitelnyh_sistem.doc
Скачиваний:
0
Добавлен:
30.07.2019
Размер:
126.98 Кб
Скачать

Использование стека в процедурах. Организация процедуры

.code

megatron proc //megatron – название процедуры, proc – служебное слово

mov ax,z

add ax,4

ret

megatron endp //конец процедуры

start: //точка входа, до – программа, но она не выполняется

mov ax,@data //совмещение сегмента данных с сегментом кода

mov ds,ax

mov bx,2

mov cx,2

cmp bx,dx //Сравнение посредствам вычитания. Если 0 => флажок поднимается

je ok

mov ax, 4C00h

int 21h

OK:

call megatron //call – аргумент, вызов процедуры

mov ax, 4C00h//адрес передается стеку

int 21h

Адресация и виды адресации

Адресация – принцип обращения к операнду в памяти.

  1. Регистровая адресация – метод адресации, при котором второй операнд находится в регистре

  2. Непосредственная адресация – принцип, при котором в качестве второго операнда пишется фактическое значение

  3. Прямая адресация – принцип, при котором в качестве второго операнда указывается конкретный адрес памяти, по которому этот операнд расположен

Адрес операндов памяти состоит из адреса сегмента + адреса смещения внутри сегмента. Адрес сегмента находится в сегментом регистре, а смещение – тот адрес, который отсчитывается от адреса сегмента. Если какой-либо другой сегментный регистр будет содержать адрес сегмента, то нужно явно указывать при адресации этот сегмент: .code / num 1 dw 4 / mov ax, cx:num1. Обратная операция при прямой адресации так же возможна, если, например, нужно записать число из регистра в поле памяти:

.data

num 1 dw 4

.code

start:

mov ax,9

mov num1,ax

  1. Регистровая / косвенная (без индексная) – этот вид адресации является косвенным, т.к. в качестве адреса будет использоваться регистр, содержащий этот адрес. Такой регистр должен быть помещен в квадратные скобки []

! В качестве регистров, содержащих адреса, в этом типе используются bx, bp !

! Если же в качестве регистров, содержащих адреса использоватьsi, di адресация будет индексной !

Команды получения адреса значения в памяти:

  1. Offset – позволяет получить адрес интересующего сегмента

  2. Lea – загрузка эффективного адреса

.data

Num1 dw8

.code

Start

Mov ax,14

Mov bx,6

Mov ds:[bx],ax

  1. Регистровая косвенная со смещением – применяются все те же правила, что и в предыдущем виде адресации, только адрес вычисляется за счет суммы баз или индекса регистра и искать значение, по которому нужно сместиться (варианты записи):

  • [bx]+4

  • 4[bx]

  • 4+[bx]

! Если в качестве регистра, содержащего адрес использовать bx, si, di, то считается, что по умолчанию работаем в сегменте данных !

Сдвиговые операции

Сдвиговые операции делятся на линейные сдвиговые операции и циклические сдвиговые операции (линейный сдвиг и циклический сдвиг)

Линейный сдвиг

Существует 2 вида линейных сдвигов: логический и математический. Логический линейный сдвиг делится на левый и правый линейный логический сдвиг.

Линейный логический левый сдвиг (Shl):

Shl <операнд><операнд> - первый операнд – это, как правило, регистр, значение в котором будет сдвигаться влево, второй – количество битов, на которой буде сдвинуто значение первого операнда. В качестве второго операнда обычно указывают регистр cl (используется только 5 битов этого регистра (число 31), который и содержит число сдвигаемых битов первого операнда). Каждый раз, когда значение сдвигается на один бит влево, то с правой стороны выдвигается 0, а бит слева попадает во флаг cf.

Например:

  • 00001010 (первый операнд), значащая часть: 1010, сдвигаем на один бит: 00010100.

  • 100000010, единица переносится в cf: 00000100 cf = 1.

Правый логический сдвиг (shr): сдвиг происходит направо.

С помощью данной операции можно обнулить флаг. Сдвиговыми операциями нельзя делить нечетные числа. При делении и умножении сдвигами тратиться не много тактов ЦП. При работе со знаковыми числами знак не сохраняется.

Линейный математический сдвиг: делится на левый (SAL) и правый (SRL).

SAL выполняет ту же саму операцию, что и логический левый диск и, во многих случаях, операция SAL преобразуется в shl.

SRL: его особенностью является то, что он сохраняет знак.

Циклический сдвиг бывает 2х типов - циклический сдвиг и циклический сдвиг с использованиеv CF. Циклический сдвиг может быть циклическим сдвигом левым (rol) и правым. Этот сдвиг отличается от линейного тем, что сдвигаемый, например, в лево бит затем будет перенесен в начало. Правый циклический сдвиг – то же самое в обратную сторону. Циклический сдвиг с использованием флага CF: левый (rcl) – левый циклический сдвиг с использованием флага переноса. RCR – в обратную сторону