- •1. Вычислительный цикл процессора.
- •2. Вентили и логические элементы.
- •3. Понятие архитектуры и микроархитектуры. Классификация вычислительных средств по архитектуре (классификация Флинна).
- •4. Микропроцессор (мп). Состав и основные функции. Процессоры risc и cisc.
- •5. Архитектура ia-32. Режимы работы процессора.
- •6. Архитектура ia-32. Особенности представления информации.
- •7. Архитектура ia-32. Регистры общего назначения и сегментные регистры.
- •8. Архитектура ia-32. Регистры смещений и регистр флагов.
- •9. Архитектура ia-32. Организация памяти.
- •10. Архитектура ia-32. Организация прерываний.
- •11. Ассемблер. Области применения. Достоинства и недостатки.
- •12. Ассемблер. Структура программы. Модель памяти small.
- •13. Ассемблер. Основные типы предложений.
- •14. Ассемблер. Описание сегмента данных.
- •15. Ассемблер. Способы адресации памяти.
- •16. Ассемблер. Команды пересылки данных. Арифметические команды
- •17. Ассемблер. Команды переходов. Процедуры.
- •18. Ассемблер. Команды управления циклами. Команды прерывания.
- •19. Запоминающие устройства. Иерархичная организация памяти. Основные показатели быстродействия системы памяти.
- •20. Физические основы работы внутренней памяти. Энергозависимая память.
- •21. Внутренняя энергонезависимая память.
- •22. Аппаратно-программные методы ускорения обработки данных. Распараллеливание операции
- •23. Аппаратно-программные методы ускорения обработки данных. Кэширование памяти.
- •24. Кэш прямого отображения. Наборно-ассоциативный и ассоциативный кэш.
- •25. Микроархитектурные особенности процессоров x86 I-V поколений.
- •26. Микроархитектурные особенности процессоров x86 VI поколений.
- •27. Микроархитектура NetBurst и Intel Core.
- •28. Архитектура ia-64.
16. Ассемблер. Команды пересылки данных. Арифметические команды
Основные команды
Команды пересылки данных
MOV dist, src – переслать (скопировать) данные из src в dist
Флаги не меняет.
PUSH src – занести в вершину стека слово из src (из регистра или 2-х ячеек памяти)
POP dst – извлечь из вершины стека слово и поместить его в dst (в регистр или 2 ячейки памяти)
Арифметические команды
ADD dst, src – сложение двоичных чисел. dst = dst + src
dst = r,m
src = r,m,i но нельзя использовать сегментные регистры и одновременно m
Влияет на флаги AF, CF, OF, PF, SF, ZF
SUB dst, src – вычитание двоичных чисел
dst = dst - src
dst = r,m
src = r,m,i но нельзя использовать сегментные регистры и одновременно m
Влияет на флаги AF, CF, OF, PF, SF, ZF
CMP dst, src – сравнить dst с src. Аналогично SUB, но содержимое dst не изменяется.
Флаги CF ZF используются для сравнения чисел без знака, CF, OF, SF, ZF – со знаком.
Команды приращения
INC dst – прибавить 1 к содержимому dst = dst +1
dst = r или m
Влияет на флаги PF, AF, ZF, SF, OF
DEC dst – вычесть 1 из содержимоого dst = dst +1
dst = r или m
Влияет на флаги PF, AF, ZF, SF, OF
Команды умножения
MUL src – умножение беззнаковых чисел.
src = r или m
Если src – байт, то второй множитель будет в AL а результат в AX. Если src – слово, то второй множитель будет в AX, а произведение в DX:AX
Формирует флаги CF, OF
IMUL src – умножение знаковых чисел.
src = r или m
Если src – байт, то второй множитель будет в AL а результат в AX. Если src – слово, то второй множитель будет в AX, а произведение в DX:AX
Формирует флаги CF, OF
Команды деления
DIV src – деление беззнаковых чисел.
src = r или m
Если src – байт, то делимое (слово) будет в AX, частное в AL, а остаток в AH Если src – слово, то делимое (двойное слово) будет в DX:AX, частное в AX, а остаток в DL.
Формирует флаг IF
IDIV src – деление знаковых чисел.
src = r или m
Если src – байт, то делимое (слово) будет в AX, частное в AL, а остаток в AH Если src – слово, то второй множитель (двойное слово) будет в DX:AX, частное в AX, а остаток в DL.
Формирует флаг IF
17. Ассемблер. Команды переходов. Процедуры.
Команды безусловного перехода
JMP opr – перейти на opr
opr может быть: меткой, регистром, содержимым ячейки памяти.
Если метка в том же сегменте памяти, то переход считается внутренним, если в другом сегменте – внешним.
В зависимости от дальности команд с которой и на которую надо перейти, команда JMP имеет различный размер. Команда внутреннего перехода занимает три байта (один байт – код команды и два байта – под смещение относительно сегмента кода той команды, куда нужно перейти). Однако команду JMP можно сократить до двух байт – отведя лишь один байт для информации о том, куда можно прейти. Осуществляется это с помощью префикса SHORT
В адресном байте команды в этом случае хранится число от -128 до +127 – оно указывает на относительное смещение той команды, куда нужно осуществить переход относительно текущей команды. То есть с помощью этой конструкции можно «прыгнуть» всего на 35-40 команд вперед-назад. Но зато и размер команды на один байт меньше.
То есть
JMP SHORT метка
Однако, если осуществляется переход назад и длина перехода укладывается в 128 байт, то транслятор автоматически уменьшает размер команды JMP, даже без префикса SHORT.
Команда внешнего, межсегментного перехода занимает 5 байтов (два байта под сегмент и два под смещение относительно этого сегмента).
Процедуры
Процедуры обрамляются следующими операторами:
Имя процедуры PROC [расстояние]
; тело процедуры
RET [число байтов]
Имя процедуры ENDP
Расстояние: NEAR – процедура находится в том же сегменте кода, FAR – в другом сегменте кода. Если расстояние опущено, то предполагается near.
RET – возврат управления вызвавшей процедуру программе. Она считывает адрес возврата из стека и загружает его в регистры CS и IP (если процедура NEAR, то только IP). Число байт указывает, сколько байтов нужно освободить в стеке после возврата.
Как обратиться к процедуре? В принципе, можно любой командой перехода, включая и JMP. Однако в случае использования процедур важно запомнить то место в основном программе, откуда была вызвана процедура, с тем, чтобы потом к нему вернутся после завершения процедуры (команды RET в процедуре). Для этих целей используется команда
CALL [модификатор] oprnd
oprnd может быть:
именем процедуры
именем регистра, в котором содержится смещение адреса процедуры
переменной, в которой содержится адрес процедуры.
Процедура может размещаться в любом месте программы, но так, чтобы на нее случайным образом не попало управление. Если процедуру просто вставить в общий поток сегмента кода, то процессор будет выполнять команды процедуры непосредственно при выполнении основной программы. Чтобы этого не произошло можно размещать процедуру следующим образом:
- в начале программы (до первой исполняемой команды);
- в конце программы (после команды, возвращающей управление операционной системе);
- внутри основной программы, предусмотрев обход процедуры с помощью команды безусловного перехода JMP.
Команды условной передачи управления
Условная передача управления может быть только внутрисегментной (NEAR) и короткой (SHORT), то есть в пределах ±128 байт от текущей команды условного перехода.
Алгоритм действия такой:
Сначала выполняется команда, которая соответствующим образом меняет регистр флагов, например команда CMP
Затем выполняется одна из команд условного перехода вида
J* имя метка
Которая при определенной комбинации флагов переводит управление на метку, имя которой указано в ней, либо передает управление на следующую за командой условного перехода команду.
Есть 31 команда, но разных всего 17 (так как некоторые попарно совпадают, например «если больше» все равно, что «если не меньше и не равно» ).
Следует различать для знаковых и беззнаковых чисел
Для беззнаковых:
JA/JNBE – переход если выше – если флаги ZF = CF = 0
JAE/JNB – переход если выше или равно CF=0
JB/JNAE – переход если ниже CF=1
JBE/JNA – переход если ниже или равно – если флаги ZF = CF = 1
Для знаковых:
JG/JNLE – переход если больше – если флаги ZF = 0 SF = OF
JGE/JNL – переход если выше или равно SF=OF
JL/JNGE – переход если ниже SF<>OF
JLE/JNG – переход если ниже или равно – если флаги ZF = 1 или SF<>OF
Для прочих проверок:
JE/JZ – переход если равно (или если нуль) ZF=1
JNE/JNZ – переход если не равно (или не нуль) ZF=0
JS – переход, если есть знак (отрицательно) SF=1
JNS – переход, если нет знака (положительно) SF=0
JC – переход, если есть перенос (CF=1)
JNC – переход, если нет переноса (CF=0)
JO – переход, если есть переполнение (OF=1)
JNO – переход, если нет переполнения (OF=0)
JP/JPE – переход, если есть четность PF=1
JNP/JPO – переход, если нет четности PF=0
JCXZ – переход, если содержимое регистра CX равно 0