- •Московский государственный институт электроники и математики
- •Архитектура эвм и систем
- •Содержание
- •Основные сокращения:
- •Введение
- •Конвейер команд
- •Архитектура эвм и языки программирования
- •Аппаратное и программное обеспечение для разработки системы контроля и управления объектами
- •Функциональная структура эвм Фон-Неймана
- •Каноническая структура эвм Фон-Неймана
- •Процессор
- •Вычислитель
- •Спецпроцессор
- •Определение эвм
- •Реализация моделей вычислителя
- •Понятие архитектуры эвм
- •Определение и понятия архитектуры эвм
- •Общее определение архитектуры средств обработки информации
- •Семейство эвм
- •Архитектурное сходство и родство представителей семейства
- •Поколения эвм
- •Показатель эффективности архитектурных свойств эвм.
- •Первое поколение (1949-1951[формирование поколений])
- •Второе поколение (1955-1966[формирование поколений])
- •Третье поколение эвм (1963 – 1965[формирование поколений])
- •О новшествах в машинах 3-его поколения:
- •Сравнительные характеристики эвм 1-3го поколения.
- •Конструктивно-технологический и функциональный признаки свт.
- •Признаки поколения свт.
- •Понятие архитектуры современного x86-процессора
- •Архитектура как совместимость с кодом
- •Архитектура как характеристика семейства процессоров
- •64-Битные расширения классической x86 (ia32) архитектуры
- •Процессорное ядро
- •Различия между ядрами одной микроархитектуты
- •Ревизии
- •Частота работы ядра
- •Микроархитектура процессоров Intel Itanium 2
- •Языки программирования
- •Поколения языков программирования
- •Первое поколение
- •Второе поколение
- •Третье поколение
- •Четвертое поколение.
- •Пятое поколение.
- •Классификация языков программирования
- •Парадигмы программирования.
- •Степень абстракции.
- •Распространенные языки программирования
- •Почему не существует «идеальных» языков программирования
- •Ассемблер
- •Архитектура микропроцессоров ia-32.
- •Введение.
- •Регистры и структура памяти ia-32
- •Команды ia-32
- •Литература
Команды ia-32
Условные и безусловные переходы:
(31 команда)
JA JAE JB JBE JC |
Jump если больше: Jump если больше/равно: Jump если меньше: Jump if меньше/равно: Jump если Carry: |
CF=0 и ZF=0 CF=0 CF=1 CF=1 или ZF=1 CF=1 | |
JCXZ JE JECXZ JG JGE JL JLE JNA JNAE
|
Jump если CX=0 Jump если равно: Jump если ECX=0 Jump если больше: Jump если больше/равно: Jump если меньше: Jump если меньше/равно: Jump если не больше: Jump если не больше/равно:
|
CX=0 ZF=1 ECX=0 ZF=0 и SF>=OF SF=OF SF <=OF ZF=1 и SF <=OF CF=1 и ZF=1 CF=1
| |
JNB JNBE JNC JNE JNG JNGE JNL JNLE JNO JNP
|
Jump если не меньше: Jump если не меньше/равно: Jump если не Carry: Jump если не равно: Jump если не больше: Jump если не больше/равно: Jump если не меньше: Jump если не меньше/равно: Jump если не переполнение: Jump если нечетный:
|
CF=0 CF=0 и ZF>=0 CF=0 ZF=0 ZF=1 или SF <> OF SF <=OF SF=OF ZF=0 и SF>=OF OF=0 PF=0 | |
JNS JNZ JO JP JS JZ JMP
|
Jump если не знак: Jump если не ноль: Jump если переполнение: Jump если четный: Jump если знак: Jump если ноль: безусловный переход
|
SF=0 ZF=0 OF=1 PF=1 SF=1 ZF=1
|
Циклы:
(5 команд)
LOOP/LOOPE/LOOPNE/LOOPNZ/LOOPZ <адрес>- петли со счетчиком СХ.Уменьшают СХ на единицу, затем совершают переход на адрес, указанный в качестве аргумента. Когда ЕСХ=0, переход не осуществляется, и программа исполняется дальше. Переменные (-E, -NE, -NZ, -Z) осуществляют переход только если СХ=0, и выполнены условия флаг Z процессора.
LOOP LOOPE LOOPNE LOOPNZ LOOPZ |
Безусловный переход Цикл если равно Цикл если не равно Цикл если не равно 0 Цикл если равно 0 |
CX!=0 или Z=1 CX!=0 или Z=0 CX!=0 или Z=0 CX!=0 или Z=1 |
Повтор строковых команд:
(5 команд)
REP/REPE/REPZ/REPNE/REPNZ <команда> - повторяет команду, данную в качестве аргумента до тех пор, пока СХ не будет равен 0, или пока флаг Z процессора не будет 1, 1, 0, 0 соответственно. Команда должна быть строковой операцией, например, CMPS, INS, LODS, MOVS, OUTS, SCAS, или STOS.
REP REPE REPNE REPNZ REPZ |
Безусловный повтор Повторить если равно Повторить если не равно Повторить если не равно 0 Повторить если равно 0 |
CX!=0 или Z=1 CX!=0 или Z=0 CX!=0 или Z=0 CX!=0 или Z=1 |
Возврат из CALL:
(3 команды)
RET/RETF/RETN - процедура возврата из CALL. Передает управление на адрес возврата, находящийся в стеке. Цифровой параметр этих функций указывает число байт или слов (в зависимости от кода: 16-ти или 32-х битный), которое "выбрасывается" из стека после возврата. RETF - это "дальний возврат", а RETN - "ближний возврат". Разница в том, что первый использует CS:IP для возврата, а второй только IP.
Операции сравнения:
(5 команд)
CMP <назначение>, <источник> - сравнивает "назначение" и "источник", в результате меняется состояние флагов процессора. Назначение может быть регистром или адресом памяти, источник - регистром, адресом памяти или числом.
CMPS CMPSB CMPSW CMPSD |
Сравнивает строки Сравнить строковый байт Сравнить слов Сравнить двойное слово |
Меняется состояние флагов процессора
|
TEST <назначение>, <источник> - логическое побитовое сравнение. В результате меняется состояние флагов процессора. Назначение может быть регистром или адресом памяти, источник - регистр или число.
Математические операции:
(18 команд)
ADC
|
ADC <назначение>, <источник> - сложение с установкой флага Carry. Хранит результат в назначении. Используется для сложения двух регистров (ADC edx,eax), регистра с регистром/адресом памяти/числом (ADC edx, eax/[...]/09h), адреса памяти с регистром/адресом памяти/числом (ADC [.....], eax/[.....]/09h).
|
ADD
|
ADD <назначение>, <источник> - сложение источника с назначением. Результат сохраняется в назначении . Используется для сложения двух регистров (ADC edx,eax), регистра с регистром/адресом памяти/числом (ADC edx, eax/[...]/09h), адреса памяти с регистром/адресом памяти/числом (ADC [.....], eax/[.....]/09h).
|
DEC
|
DEC <назначение> - уменьшает на 1 значение регистра или адреса памяти.
|
DIV/IDIV
|
DIV/IDIV <источник> - делит АХ на источник , если источник - байт, DX:AX на источник , если источник - слово, и EDX:EAX на источник , если источник - двойное слово. Значение хранится в AL, AX или EAХ. Источником может быть регистр или значение памяти.
|
IMUL
|
IMUL <назначение>, <источник> - умножение. Если определен только источник , то AL умножается на источник , если источник - байт; АХ умножается на источник , если источник - слово; или ЕАХ умножается на источник , если источник - двойное слово. Результат записывается в AX, DX:AX, или EDX:EAX соответственно. Источник может быть регистром или значением памяти. Если определены оба аргумента, то назначение умножается на источник , результат записывается в назначение . Назначение может быть регистром или значением памяти, а источник должен быть числом.
|
INC
|
INC <аргумент> - увеличивает аргумент на 1; аргументом может быть регистр или значение памяти.
|
MUL
|
MUL <источник> - умножение. AL умножается на источник , если источник - байт, АХ умножается на источник , если источник - слово, или ЕАХ умножается на источник , если источник - двойное слово. Результат записывается в AX, DX:AX, или EDX:EAX соответственно. Источник может быть регистром или значением памяти. |
RCL/ROL |
RCL/ROL- <назначение>, <источник> - побитовое вращение числа в назначении влево на число, указанное в источнике . Результат: верхний бит сдвигается в самый низ, второй верхний бит становится первым (самым верхним) - ROL, или самый верхний бит переносится в флаг CF, значение флага переносится в самый низ регистра, второй верхний бит становится первым (самым верхним). Назначением может быть значение памяти или регистра, источник - число.
|
RCR/ROR |
RCR/ROR - <назначение>, <источник> - побитовое вращение числа в назначении вправо на число, указанное в источнике . Результат: верхний бит сдвигается ниже , самый нижний бит становится первым (самым верхним) - ROR, или самый нижний бит переносится в флаг CF, значение флага переносится в вершину регистра, второй нижний бит становится последним. Назначением может быть значение памяти или регистра, источник - число. |
SAL/SHL |
SAL/SHL <назначение>, <источник> - побитовый сдвиг назначения влево на число, указанное в источнике . Например, 10111100 после сдвига будет 01111000. Назначение - регистр или значение памяти, источник - число или регистр CL. Сдвиг числа на единицу влево равнозначно его умножению на два.
|
SAR/SHR |
SAR/SHR <назначение>, <источник> - побитовый сдвиг назначения вправо на число, указанное в источнике . Например, 10111100 после сдвига будет 01011110. Назначение - регистр или значение памяти, источник - число или регистр CL. Сдвиг числа на единицу влево равнозначно его делению на два.
|
SUB |
SUB <назначение>, <источник> - вычитание. Вычитает источник из назначения , результат записывается в назначение. Назначение - регистр или значение памяти, источник - регистр, значение памяти или число.
|
Логические операции:
(5 команд)
Таблица логических значения
Операция
|
источник
|
назначение
|
результат
|
AND
|
1 1 0 0 |
1 0 1 0 |
1 0 0 0 |
OR
|
1 1 0 0 |
1 0 1 0 |
1 1 1 0 |
XOR
|
1 1 0 0 |
1 0 1 0 |
0 1 1 0 |
NOT |
0 1 |
N/A N/A |
1 0 |
NEG
|
NEG <источник> - источник вычитается из 0 и заменяется. Например, двоичное значение 01001001 преобразуется в 10110110, а HEX значение 13 преобразуется в ED.
|
NOT
|
NOT <источник> - "переворачивает" каждый бит источника так, что 0 становится 1, а 1 - 0. Например, значение 01001001 преобразуется в 10110110.
|
AND
|
AND <назначение>, <источник> - Логическое "И": сравнивает побитно источник и назначение, и записывает результат в назначении; если оба бита равны 1, то пишется "1", иначе пишется "0". Источник - значение регистра или памяти, назначение - значение регстра, памяти или число. |
OR |
OR <назначение>, источник - логическое "ИЛИ": сравнивает побитно низначение и источник, результат пишется в назначение. Если оба бита равны ")", то пишется ")", иначе записывается "1". |
XOR
|
XOR <назначение>, <источник> - логическое "ИСКЛЮЧАЮЩЕЕ ИЛИ": сравнивает побитно назначение и источник, результат записывается в назначение. Если биты одинаковы (два "0" или две "1"), записывается "0", иначе пишется "1". Если источник и назначение одинаковы, в результате получается "0". Назначение - значение памяти или регистр, источник - значение памяти, регистр или число.
|
Операции с памятью:
(44 команды)
IN
|
IN <назначение>, <источник> - ввод из порта: перенос байта, слова или двойного слова из порта, определенного в источнике, в регистр, указанный в назначении. Назначение - AL, AX или EAX, источник - любой однобайтный номер порта, или DX с двубайтным номером порта. |
INS INSB INSW INSD
|
INS/INSB/INSW/INSD <назначение>, <источник> - ввод из порта в троковую переменную: ввод информации из порта, определенного в источнике, в место, определенное ES:DI. Значение назначения игнорируется, источником должен быть регистр DX. После переноса DI увеличивается/уменьшается (в зависимости от флага направления) на число перенесенных байт. INSB/INSW/INSD работают без аргументов, и переносят информацию определенного размера (байт, слово или двойное слово) из порта, определенного DX в место, определенное ES:DI. |
LEA
|
LEA <назначение>, <источник> - загрузить адрес: вычисляет адрес (оффсет) источника, и заносит его в назначение. Назначение - регистр, источник - значение памяти или символьное имя. |
LODS LODSB LODSW LODSD
|
LODS/LODSB/LODSW/LODSD <источник> - загрузить строковые данные: записывает байт, слово или двойное слово из ES:SI в Al, AX или ЕАХ. После записи SI увеличивается/уменьшается (в зависимости от флага направления) на число перенесенных байт. Значение источника игнорируется. LODSB/LODSW/LODSD работают без аргументов. |
MOV |
MOV <назначение>, <источник> - перенос данных: копирует значение источника в назначение. Если назначение - значение регистра, источник может быть регистром. значением памяти или числом. Если назначение - значение памяти, то источник может быть только регистром или числом. |
MOVS MOVSB MOVSW MOVSD |
MOVS/MOVSB/MOVSW/MOVSD <назначение>, <источник> - перенос строковых данных: копирует байт/слово/двойное слово из DS:ESI в ES:EDI, независимо от аргументов. После переноса SI и DI увеличиваются,уменьшаются (в зависимости от флага неправления) на число перенесенных байт. MOVSB/MOVSW/MOVSD работают без аргументов. | |
MOVSCX |
MOVSX <назначение>, <источник> - перенос со знаком-расширителем: считывает байт или слово в источнике, и копирует его в слово или двойное слово, определенное назначением со знаком-расширителем. Назначение - регистр, источник - значение памяти или регистр.
| |
MOVZX |
MOVZX <назначение>, <источник> - перенос с расширителем-нулем: считывает байт или слово в источнике, и копирует его в слово или двойное слово, определенное назначением со знаком-нулем. Назначение - регистр, источник - значение памяти или регистр. | |
OUT |
OUT <назначение>, <источник> - вывод в порт: перенос данных из источника в порт, определенный назначением. Источник - AL, AX, EAX. Назначение - любой однобайтовый номер порта или DX с двубайтовым номером порта. | |
OUTS OUTSB OUTSW OUTSD |
OUTS/OUTSB/OUTSW/OUTSD <назначение>, <источник>: вывод строки в порт: перенос данных из DS:ESI в порт, определенный значением регистра DX. Аргументы игнорируются. после переноса SI увеличивается/уменьшается (в зависимости от флага направления) на число перенесенных байт. OUTSB/OUTSW/OUTSD работают без аргументов, переносят байт, слово или двойное слово. | |
POP |
POP <назначение> - извлечение из стека: переносит значение из вершины стека (слово или двойное слово) в назначение. Указатель стека SP увеличивается на 2 (слово) или 4 (двойное слово). Назначение - регистр или значение памяти.
| |
POPA POPAD POPAW |
POPA/POPAD/POPAW - извлечение из стека всех регистров: запись значений из стека во все основные регистры. POPA и POPAW равнозначны POP DI,SI,BP,BX,DX,CX,AX. POPAD разнозначно POP EDI,ESI,EBP,EBX,EDX,ECX,EAX.
| |
POPF POPFD POPFW |
POPF/POPFD/POPFW - извлечь в регистр флагов: извлекает из стека верхнее слово (POPF/POPFW) или двойное слово (POPFD) в регстр флагов процессора. | |
PUSH |
PUSH <источник> - запись в стек: уменьшает значение стека на 2 (слово) или 4 (двойное слово) для создания места в стеке, и копирует в это место значение источника. Т.е. команда записывает число в вершину стека. Источник - регистр, значение памяти или число.
| |
PUSHA PUSHAD PUSHAW |
PUSHA/PUSHAD/PUSHAW запись в стек всех регистров: записывает 16-битные (PUSHA/PUSHAW) или 32-битные (PUSHAD) регистры в вершину стека; PUSHA и PUSHAW эквивалентны PUSH AX, CX, DX, BX, SP, BP, SI, DI , а PUSHAD равнозначно PUSH EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI. | |
PUSHF PUSHFD PUSHFW |
PUSHF/PUSHFD/PUSHFW запись регистра флагов: запись FLAGS (PUSHF/PUSHFW) или EFLAGS (PUSHFD) в вершину стека.
| |
SCAS SCASB SCASW SCASD |
SCAS/SCASB/SCASW/SCASD <источник> - сравнение строк: сравнение байта, слова или двойного слова в ES:DI с AL, AX или ЕАХ независимо от аргумента.
| |
STOS STOSB STOSW STOSD |
STOS/STOSB/STOSW/STOSD <источник> - сохранение строковых данных: перенос содержимого AL, Ax или ЕАХ в адрес памяти, определенный в ES:DI. Аргумент игнорируется. После переноса DI увеличивается/уменьшается (в зависимости от флага направления) на число перенесенных байт.
| |
XCHG |
XCHG <назначение>, <источник> - обмен: обмен содержимого ячейки памяти или регистра с регистром. Меняет местами значения источника и назначения. Если назначение - регистр, то источник - регистр или значение памяти. Если назначение - значение памяти, то источник - регистр. |
Операции с флагами процессора:
(8 команд)
CLC CLD CLI LAHF
SAHF
STC STD STI |
установка CF=0 установка DF=0 установка IF=0 загрузка регистра AH из регистра флагов: устанавливает биты 7, 6, 4, 2 и 0 по значениям флагов SF ZF AF PF CF. запись регистра AH в регистр флагов: устанавливает флаги SF ZF AF PF CF по битам 7, 6, 4, 2 и 0 регистра AH. установка CF=1 установка DF=1 установка IF=1 |
Работа с BCD числами.
(3 команды)
В ассемблере нет спецальных команд для сложения, умножения или вычитания BCD чисел. Все действия с ними происхожят как и с обычными числами- поразрядно в нескольких. Однако для корректировки таких действий предусмотрены спецальные команды.
AAA |
Корректирует неупакованный результат сложения двух одноразрядных неупакованных BCD-чисел, находящихся в регистрах AH и AL. |
AAM
|
Корректирует результат умножения двух неупакованных BCD-чисел и преобразует двоичного числа меньшего 63h (9910) в его неупакованный BCD-эквивалент.
|
AAS |
Корректирует результат вычитания двух неупакованных одноразрядных BCD-чисел.
|