Основные элементы языка ассемблера



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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!