- •Архитектура эвм и вычислительных систем Организация базовой эвм
- •Регистры алу
- •Разрядность регистров
- •Классификация команд цп
- •Определение данных в цп
- •Целые числа и операции над ними
- •Разветвление в программах
- •Безусловный переход
- •Уловный переход
- •Логические операции
- •Использование подпрогамм и выделение повторяющихся частей кода
- •Использование стека в процедурах. Организация процедуры
- •Адресация и виды адресации
- •Сдвиговые операции
Логические операции
And – логическое «и» – проводится над двумя операндами. С помощью этой команды можно, как правило, установить определенные биты первого операнда в 0
Or – логическое «или» – проводится над двумя операндами. Позволяет установить определенные биты первого операнда в 1
Xor – «исключающее или» – проводится над двумя операндами. Позволяет проверять определенные биты первого операнда.
Использование подпрогамм и выделение повторяющихся частей кода
Повторяющиеся части программ являются, как правило, большим минусом, т.к. код из-за этого загромождается данными и одинаковыми фрагментами, поэтому в таких случаях часто используются процедуры и циклы.
Стек – это конструкция, которая сопутствует каждой программе и является таким же сегментом, как сегмент кода/данных. Со стеком работает 3 регистра:
-
ss – содержит адрес сегмента стека
-
esp/sp – указывает на вершину стека, т.е. содержит адрес самого верхнего элемента всех конструкций
-
ebp/bp – адрес базы кадра стека содержит в себе адрес того элемента стека, к которому необходимо обратиться произвольно
Основные свойства стека:
-
Стек не может превышать размер в 64кб (Только в случае 16и разрядных регистров или в случае использование 16и разрядного ЦП)
-
Стек не может быть больше 4Гб (в случае 32у разрядных регистров)
-
Элементы стека работают по принципу LIFO (Last input First output)
Со стеком можно работать с помощью команд:
-
push <операнд> (выставляет операнд на вершину стека). При вставке каждого следующего значения в стек, стек расширяется в сторону дна, при этом предыдущий верхний элемент не перезаписывается, а всего лишь спускается ниже
-
pop <операнд> (забирает из стека самый верхний элемент и помещает его в операнд). Таким образом верхним элементом стека становится предыдущий
Использование стека в процедурах. Организация процедуры
.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,ucooh
int 21h
OK:
call megatron //call – аргумент, вызов процедуры
mov ax, ucooh //адрес передается стеку
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, то считается, что по умолчанию работаем в сегменте данных !