Основные элементы языка ассемблера
1. Арифметические операции и операторы ( ), унарные + или - , *, /, MOD, + или -.
2. Целочисленные, вещественные, символьные и строковые константы. Значения суффиксов h, q, o, d, b, r, t, y. Использование кавычек внутри констант.
3. Зарезервированные слова, идентификаторы, директивы, метки, команды (мнемоника, операнды, комментарии).
Директивы - являются указанием транслятору ассемблера на выполнение некоорых действий. У директив нет аналогов в машинном представлении.
Имя метки — символьный идентификатор. Значением данного идентификатора является адрес первого байта предложения программы, которому он предшествует.
Код операции (КОП) и директива — это мнемонические обозначения соответствующей машинной команды, макрокоманды иди директивы транслятора.
Команды (инструкции) представляют собой символические аналоги машинных команд. В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд процессора.
Комментарии содержат любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором.
Ключевые слова — это служебные символы языка ассемблера. По умолчанию регистр символов ключевых слов не имеет значения. К ключевым словам относятся:
Идентификаторы — последовательности допустимых символов, использующиеся для обозначения имен переменных и меток.
4. Структура программы на языке ассемблера. Директивы TITLE, INCLUDE, LOCAL, .MODEL, .CODE, .DATA, .STACK, PROC, INVOKE, ENDP, END.
|
|
TITLE – задает заголовок файла листинга
.DATA – Определяет в нашем модуле начало инициализированного сегмента данныхEND - Отмечает начало исходного файла.ENDP - Отмечает конец процедуры. INCLUDE – Включает исходный код из файла с указанным именем в текущей позиции ассемблируемого модуля.LOKAL - Определяет локальные переменные в макрокомандах и процедурах. .MODEL - Задает модель памяти для упрощенных директив определения сегментов.PROC - Определяет начало процедуры с указанным именем.STACK - Определяет начало сегмента стека, выделяя "размер" байт..CODE - При использовании с директивой .MODEL определяет начало сегмента кода.INVOKE - упрощенный вызов процедуры
Типы данных. Определение данных.
1. Директивы BYTE, SBYTE, WORD, SWORD, DWORD, SDWORD, FWORD, QWORD, TBYTE, REAL4, REAL8, REAL10.
BYTE – 1байт знаковое число ; WORD – 2б ; DWORD – 4б; FWORD – 6б; QWORD – 8б; TBYTE – 10б;
SBYTE – 1 байт беззнаковое число; SWORD – 2б; SDWORD – 4б;
REAL4 – 4 байта действительное число; REAL8 – 8б; REAL10 – 10б;
2. Множественная инициализация переменных, определение строк, использование оператора DUP.
DB – 1 байт, символьная строка, 8-разрядное выражение
DW – 2 байта или 1,2-байтовая строка, 16-ое выражение(смещение сегмента или адрес сегмента)
|
|
DD – 4 байта, относительное выражение – 16-р адрес и 16-р смещение
DF DP – 6 байт, отн. выражение из 32 бит, адр. выр.(16 сегм и 32 смещение), 6-ти байтная строка в ковычках
DQ – 8 байт, аналогично DP
DT – 10 байт, аналогично DP
n DUP (?) – повтор выражения n раз
3. Примеры инициализации переменных различных типов. Прямой и обратный порядок следования байтов.
Реализован принцип «младший байт по младшему адресу»; вторая кавычка (“” или ‘’) является частью строки
4. Операторы (OFFSET, PTR, TYPE, LENGTHOF, SIZEOF, TYPEDEF) и директивы (ALIGN, LABEL) для работы с данными.
тип (type) — объем памяти, выделяемой переменной в соответствии с директивой объявления переменной.
смещение (offset) в байтах от начала сегмента с переменной;
5. Структуры. Объявления структурных переменных. Обращение к структурным переменным. Директивы STRUCT и ENDS.
2. Символические константы. Директива присваивания =. Определение размера массивов и строк, директивы EQU и TEXTEQU.
с помощью псевдооператора EQU идентификатору можно ставить в соответствие как числовые выражения, так и текстовые строки, а псевдооператор = может использоваться только с числовыми выражениями;
идентификаторы, определенныес помощью псевдооператора=, можно переопределять в исходном тексте программы, а определенные с использованием псевдооператора EQU — нельзя.
|
|
Команды и операнды.
1. Типы операндов и адресации.
1. Непосредственно заданное значение, регистр, память (r8, r16, r32, reg, sreg, imm8, imm16, imm32, imm, r/m8, r/m16, r/m32, mem).
2. Операнды с непосредственно заданным адресом.
3. Операнды с непосредственно заданным смещением.
4. Косвенные операнды, массивы, операнды с индексом, указатели (NEAR, FAR).
5. Базово-индексный режим адресации.
в адресной части команды выделяются два поля: база (base), индекс (index) а исполнительный адрес формируется как сумма из двух компонент.
Поля base и index команды содержат адреса РОН, в которых в свою очередь находятся компоненты исполнительного адреса – базовый адрес (Base) и индекс (Index).
6. Базово-индексный режим адресации со смещением.
в адресной части команды выделяются три поля: база (base), индекс (index) и смещение (displacement), а исполнительный адрес формируется как сумма из трех компонент.
Поля base и index команды содержат адреса РОН, в которых в свою очередь находятся компоненты исполнительного адреса – базовый адрес (Base) и индекс (Index).
Команды пересылки данных.
|
|
1. Команда MOV.
Команда передает значение операнда-источника в операнд-приемник
reg à reg; imm à reg; imm à mem; reg à mem; mem à reg; reg à sr; mem à sr;sr à reg; sr à mem.
2. Команды расширения целых чисел: MOVZX, MOVSX.
MOVZX – преобразование элементов без знака меньшей размерности в эквивалентные им элементы без знака большей размерности.
MOVSX – преобразование элементов со знаком меньшей размерности в эквивалентные им элементы со знаком большей размерности.
3. Команды загрузки флагов состояния LAHF и SAHF.
LAHF – загрузка в АН всех арифметических флагов кроме OF
SAHF – извлечение из АН всех флагов кроме OF в eflags/flags
4. Команда обмена данным XCHG.
XCHG – Команда производит взаимный обмен значениями между операндом-источником и операндом-приемником.
5. Операции со стеком. Команды PUSH и POP.
PUSH – загрузка операнда в стек. POP – извлечение операнда из стека.
6. Команды загрузки указателей LDS, LES, LFS, LGS, LSS.
LDS – загрузка полного указателя с использованием регистра DS.
LES – загрузка полного указателя с использованием регистра ES.
Остальные аналогично
7. Команда загрузки текущего адреса LEA.
Команда LEA формирует эффективный адрес (ЕА) на основе постбайта адресации и загружает его в регистр с адресом, заданным полем reg постбайта. Эта команда используется для адресации как одиночных элементов, так и структур данных, размещаемых в памяти.
3. Арифметические команды.
1. Команды сложения и вычитания: INC, DEC, ADD, SUB, NEG.
INC – увеличение значения операнда в памяти или регистре на 1
DEC – уменьшение значения операнда в памяти или регистре на 1.
ADD – сложение двух операндов источник и приемник размерностью байт, слово или двойное слово.
SUB – целочисленное вычитание. опер1=опер2 - опер1
NEG – изменение знака (получение двоичного дополнения) источника.
2. Команды умножения и деления: MUL, IMUL, DIV, IDIV.
MUL/IMUL – asd операция умножения двух целых чисел без учета знака/со знаком
DIV/IDIV – asd выполнение операции деления двух двоичных беззнаковых/знаковых значений.
3. Сложение и вычитание чисел с произвольной точностью. Команды ADC и SBB.
ADC – сложение двух операндов с учетом переноса из младшего разряда.
SBB – вычитание целых чисел с заемом
4. Арифметические операции с упакованными десятичными числами и ASCII‑строками: AAA, AAS, AAM, AAD.
AAA – вычитание целых чисел с заемом. Если младшая тетрада результата в AL > 9 или установлен флаг AF, осуществляется сложение AL с кодом 6, сброс старшей тетрады AL в ноль и установка обоих флагов CF и AF, а также инкремент AH. В противном случае осуществляется сброс флагов AF и CF
AAS – корректировка результата вычитания двух неупакованных одноразрядных BCD-чисел. AAS корректирует регистр AL так, чтобы он содержал правильную десятичную цифру результата. Если число в AL перед AAS больше 9, то AH уменьшается на 1 и устанавливаются AF и СF. Если число в AL перед AAS меньше 9, то AH не изменяется. В любом случае старшая тетрада регистра AL содержит 0.
AAM – корректировка результата умножения двух неупакованных BCD-чисел. двоичного числа из AL на 10 и помещению частного как старших цифр в AH, а остатка как младших цифр в AL. Для корректного применения этой команды после команды MUL необходимо предварительно осуществить сброс старших тетрад байтных операндов.
AAD – корректировка результата деления двух неупакованных BCD-чисел. В отличие от других команд коррекции, команда AAD корректирует не результат, а операнд (делимое), превращая неупакованное десятичное число из регистра AX в двоичное число, которое помещается в регистр AL
4. Команды простого и циклического сдвигов: SHL, SHR, SAL, SAR, ROL, ROR, RCL, RCR, SHLD, SHRD.
SH – логический сдвиг(в освободившейся старший разряд 0)
SA – арифметический сдвиг( в освободившейся старший разряд заносится 1)
RO – циклический сдвиг
RC – циклический сдвиг с флагом переноса
SH.D – двойной логический сдвиг
5. Булевы операции и команды сравнения: AND, OR, XOR, NOT, TEST, CMP. Установка и сброс отдельных флагов состояния процессора.
TEST – операция логического сравнения операндов
std, cld – DF; clc,stc,cmc – CF; cli,sti - IF
6. Команды передачи управления.
1. Команда безусловного перехода JMP.
JMP – организация безусловного перехода как внутри текущего сегмента команд, так и за его пределы.
2. Команды условного перехода в зависимости от значения флагов состояния процессора: JZ, JNZ, JC, JNC, JO, JNO, JS, JNS, JP, JNP.
JZ/JNZ => ZF
JC/JNC => CF
JO/JNO => OF
JS/JNS => SF
JP/JNP => PF
3. Команды условного перехода в зависимости от равенства операндов: JE, JNE, JCXZ, JECXZ.
JE/JNZ = JZ/JNZ
JCXZ/JECXZ => CX/ECX=0
4. Команды условного перехода, использующиеся после команд сравнения беззнаковых операндов: JA, JNBE, JAE, JNB, JB, JNAE, JBE, JNA.
JA/JNA – без знаковое выше/не выше – CF v ZF=0/1
JAE/JNAE – без знаковое выше или равно/не выше и не равно CF = 0/1
JB/JNB – без знаковое ниже/не ниже CF = 1/0
JBE/JNBE – без знаковое ниже или равно/не ниже или не равно CF v ZF = 1/0
5. Команды условного перехода, использующиеся после команд сравнения операндов со знаком: JG, JNLE, JGE, JNL, JL, JNGE, JLE, JNG.
JG/JNG – JGE/JNGE – знаковое больше/не больше
JL/JNL – JLE/JNLE – знаковое меньше/не меньше
6. Команды организации цикла: LOOP, LOOPZ, LOOPE, LOOPNZ, LOOPNE.
LOOP осуществляет декремент регистра счётчика СХ и сравнение его нового содержимого с нулём. При равенстве осуществляется переход к следующей команде программы и выход из цикла
LOOPE/LOOPZ – повторять пока равно/ноль ZF=1
LOOPNE/LOOPNZ – повторять пока не равно/не ноль ZF=0
7. Команда обращения к процедуре (подпрограмме) CALL и команда возврата из процедуры (подпрограммы) RET. Передача параметров через регистры и стек. Вложенные вызовы процедур.
CALL – передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата;
1) cохраняет в стеке адрес возврата;
2) осуществляет безусловную передачу управления по адресу вызова (адрес первой команды процедуры).
RET (RETurn) - осуществляет возврат из процедуры в основную программу и является завершающей командой в процедуре; IP (ближний возврат), IP:CS (дальний возврат).
При выполнении трёхбайтной команды RET дополнительно осуществляется сложение указателя стека SP с непосредственным операндом. С помощью этого дополнительного действия производится очистка стека от параметров отработавшей процедуры
8. Команда прерывания INT.
INT – вызов подпрограммы обслуживания прерывания с номером прерывания, заданным операндом команды.
Запись флагов и адреса возврата в стек => сброс IF,TF => обработка прерывания
7. Команды обработки строковых примитивов: MOVSB (MOVSW, MOVSD), CMPSB (CMPSW, CMPSD), SCASB (SCASW, SCASD), STOSB (STOSW, STOSD), LODSB (LODSW, LODSD).
MOVS. – пересылка двух цепочек в памяти. SI и DI изменяются в зависимости от размера и DF
CMPS. – сравнение двух строк. Приемник – ES:EDI/DI
LODS. – загрузка строки-источника в Акк. Источник DS:ESI/SI
STOS. – сохранение из Акк в строку-источник. DF=0 =>увеличить номер; DF=1 => уменьшить номер
SCAS. – просмотр строки-приемника. Неразрывное вычитание из Акк с установкой флагов
8. Команды перекодировки байтов XLAT, XLATB.
XLAT – табличное преобразование. подмена байта в регистре al байтом из последовательности (таблицы) байтов в памяти.
· вычислить адрес, равный ds:bx+(al);
· выполнить замену байта в регистре al байтом из памяти по вычисленному адресу.
Компиляция программы.
1. Трансляция, компоновка и запуск программы.
2. Макрокоманды. Определение макрокоманды. Вызов макрокоманды. Передача параметров. Директивы MACRO и ENDM. Директива ECHO. Вложенные макрокоманды.
Макрокоманда представляет собой строку, одним из компонентов которой является символическое имя макрокоманды. Имя макрокоманды может сопровождаться параметрами. Если данная строка встречается в теле исходного текста программы, то транслятор замешает ее одной или несколькими другими строками. Какими именно строками — определяется макроопределением, которое представляет собой шаблон (описание) макрокоманды.
имя_макрокоманды macro список_формальных_аргументов
тело макроопределения
endm
3. Директивы условного ассемблирования: IF, IFB, IFNB, IFIDN, IFIDNI, IFDIF, IFDIFI, IFDEF, IFNDEF, ENDIF, ELSE, EXITM.
Если в директиве IF логическое выражение истинно, то в объектный модуль помешается первый фрагмент программы. Если логическое выражение ложно, то при наличии директивы ELSE в объектный код помешается второй фрагмент.
Директива IFE аналогично директиве IF анализирует значение логического выражения. Но теперь для включения первого фрагмента программы в объектный модуль требуется, чтобы логическое выражение было ложным.
.IF(Е) условие
предложения блока IF
[.ELSEIF] условие
предложения блока ELSEIF
[.ELSE]
предложения блока ELSE
.ENDIF
Директива IFDEF проверяет, описано или нет в программе символическое имя, и если это так, то в объектный модуль помешается первый фрагмент программы. В противном случае при наличии директивы ELSE в объектный код помещается второй фрагмент программы. IFNDEF – обратно по действию.
IF(N)DEF символическое_имя
фрагмент программы 1
ELSE
фрагмент программы 2
ENDIF
Директива IFB проверяет равенство аргумента пробелу. В качестве аргумента могут выступать имя или число. Если его значение равно пробелу (то есть фактический аргумент при вызове макрокоманды не был задан), то транслируется и помешается в объектный модуль первый фрагмент программы.
IFNB – противоположно IFB
.IF(N)В аргумент
фрагмент_прог раммы_1
ELSE
фрагмент_программы_2
ENDIF
Директива IFIDN(I) сравнивает символьные значения аргумент_1 и аргументу. Если результат сравнения положительный, то транслируется и помещается в объектный модуль первый фрагмент программы.
они позволяют учитывать либо не учитывать различие строчных и прописных букв. Так, директивы IFIDNI и IFDIFI игнорируют это различие, a IFIDN и IFDIF — учитывают.
IFIDN(I) аргумент_1,аргумент_2
фрагмент программы 1
ELSE
фрагменг_программы 2
ENDIF
IFDIF(I) аргумент_1,аргумент_2
фрагмент_программы 1"
ELSE"
фрагмент_программь» 1
ENDIF
4. Операторы отношения языка ассемблера (LT, GT, EQ, NE, LE, GE).
EQ (equal)— равно
NE (not equal) — не равно
LT (less than) — меньше
LE (less or equal) — меньше или равно
GT (greater than) - больше
GE (greater or equal) — больше или равно
5. Специальные операторы: & (оператор подстановки), < > (оператор выделения текста), ! (оператор выделения символа), % (оператор подстановки).
6. Создание повторяющихся блоков программы. Директивы WHILE, REPEAT, FOR, FORC.
.REPEAT – цикл с пост условием .REPEATE {code} .UNTIL
.WHILE – цикл с предусловие .WHILE (условие) {code} .ENDW
Дата добавления: 2018-04-04; просмотров: 1859; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!