- •Архитектура эвм и вычислительных систем Организация базовой эвм
- •Регистры алу
- •Разрядность регистров
- •Классификация команд цп
- •Определение данных в цп
- •О mov ax,29 mov ah,10 (т.К. Не превышает, кодируется) mov ax,65536 перации передачи данных
- •Целые числа и операции над ними
- •Разветвление в программах
- •Безусловный переход
- •Уловный переход
- •Логические операции
- •Использование подпрогамм и выделение повторяющихся частей кода
- •Использование стека в процедурах. Организация процедуры
- •Адресация и виды адресации
- •Сдвиговые операции
Использование стека в процедурах. Организация процедуры
.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
Адресация и виды адресации
Адресация – принцип обращения к операнду в памяти.
Регистровая адресация – метод адресации, при котором второй операнд находится в регистре
Непосредственная адресация – принцип, при котором в качестве второго операнда пишется фактическое значение
Прямая адресация – принцип, при котором в качестве второго операнда указывается конкретный адрес памяти, по которому этот операнд расположен
Адрес операндов памяти состоит из адреса сегмента + адреса смещения внутри сегмента. Адрес сегмента находится в сегментом регистре, а смещение – тот адрес, который отсчитывается от адреса сегмента. Если какой-либо другой сегментный регистр будет содержать адрес сегмента, то нужно явно указывать при адресации этот сегмент: .code / num 1 dw 4 / mov ax, cx:num1. Обратная операция при прямой адресации так же возможна, если, например, нужно записать число из регистра в поле памяти:
.data
num 1 dw 4
.code
start:
mov ax,9
mov num1,ax
Регистровая / косвенная (без индексная) – этот вид адресации является косвенным, т.к. в качестве адреса будет использоваться регистр, содержащий этот адрес. Такой регистр должен быть помещен в квадратные скобки []
! В качестве регистров, содержащих адреса, в этом типе используются bx, bp !
! Если же в качестве регистров, содержащих адреса использоватьsi, di адресация будет индексной !
Команды получения адреса значения в памяти:
Offset – позволяет получить адрес интересующего сегмента
Lea – загрузка эффективного адреса
.data
Num1 dw8
.code
Start
Mov ax,14
Mov bx,6
Mov ds:[bx],ax
Регистровая косвенная со смещением – применяются все те же правила, что и в предыдущем виде адресации, только адрес вычисляется за счет суммы баз или индекса регистра и искать значение, по которому нужно сместиться (варианты записи):
[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 – в обратную сторону