Операции и выражения в ассемблере.




1. Арифметические операции.

+, -, *, /, mod (эти операции выполняются на этапе трансляции)

 

pi_int EQU 31416/1000 - целая часть p

pi_rem EQU 31416 mod 1000 - дробная часть p

 

SHR_N - сдвиговые операции (вправо и влево на N двоичных разрядов.

SHL_R

 

maska EQU 110010b

maska2 EQU maska SHR_2

 

2. Логические операции.

Эти операции подразделяются на операции отношения (EQ, NE, LT, LE, GT,GE) и на непосредственно логические (AND, OR, XOR, NOT).

Истина — 0FFFFh

Ложь — 0

mov ax, ((b LT 10) AND 5) OR ((b GE 10) AND 15)

при b=3 предыдущая команда означает: mov ax, 5.

 

3. Операции со счетчиком размещения программы (СРП).

LC- Location Counter

$- текущее значение СРП, предопределенная переменная.

Message DB ‘Hello!!!’

Mes_leght=$-Message

ORG- директива принудительной установки СРП на константу.

ORG 100h – для *.com

ORG $+99h – изменение СРП на 99 байт по отношению к текущему значению.

EVEN- задает четное значение СРП (выравнивает СРП на ближайшее четное большее текущего).

4. Оператор изменения типа.

<тип> PTR переменная или метка.

B_TABLE DB 40DUP

mov ax, B_TABLE+10

mov ax, word ptr B_TABLE+10

x_word EQU 0FFFCh

xor ax, ax

add al, byte ptr xword; (AL)=FCh

CALL FAR PTR My_Sub

5. Операции выделения сегментной части адреса и смещения.

SEG - переменная (DS)

OFFSET - метка (СS)

SIZE имя переменной - определяет размер переменной в байтах.

 

 

Основные группы команд.

1. Команды передачи данных

dst – получатель

src – источник

mem адрес памяти

reg – регистр процессора

sreg – сегментный регистр

data – непосредственные данные

 

MOV – команда пересылки данных (копирование)

1) одним из операндов должен бать обязательно регистр

2) нельзя пересылать из одной ячейки памяти в другую

3) нельзя содержимое одного сегментного регистра переслать в другой сегментный регистр (нужно использовать РОНы или STACK)

4) нельзя использовать сегментный регистр CS в качестве приемника (потеряются коды)

5) ОПЕРАНДЫДОЛЖНЫСОАПАДАТЬ ПО ДЛИНЕ

 

Команды ввода/вывода из портов: IN AL,42H

OUT AX,71H

 

1) LEA AX,mem (аналогично mov AX,OFFSET(mem))

2) Push, Pop

 

2. Команды арифметической обработки целых чисел.

 

1) Команды сложения:

а) ADD – сложение mem/reg1, reg2/mem (1_операнд+2_операнд=1_операнд)

dst:=dst+src;

б) INC – увеличение на 1

 

2) Команды вычитания:

а) DEC – уменьшение на 1

б) SUB dst,src (dst:=dst-src)

в) SBB dst,src – вычитание с переносом

г) NEG – изменяет знак на противоположный

 

3) Команды сравнения:

а) CMP dst,src

б) SUB dst,src (сравнение осуществляется путем вычитания источника из приемника (воздействует на флаги: CF, OF, SF, ZF, AF, PF)

 

 

4) Умножние:

а) MUL src – команда умножения для беззнаковых чисел (выполняет умножение операнда на регистр AX)

б) IMUL src – для знаковых чисел (результат может изменять знаки)

 

5) Деление:

а) DIV <делитель> (делимое должно находиться в AX!; частное попадает в AL, а остаток в AH)

б) IDIV – деление со знаком (целочисленное)

 

3. Логические операции (выполняются побитно).

AND, OR, XOR, NOT, TEST dst,src

X Y AND OR XOR NOT x
           
           
           
           

 

NOT x не воздействует на флаги! Остальные команды воздействуют на OF, SF, ZF, PF, CF.

 

4. Сдвиговые операции.

Сдвиговые операции воздействуют на флаги: OF, SF, ZF, PF, CF

1) Простые:

а) SHL/SAL – сдвиг влево

б) SHR/SAH – сдвиг вправо

2) Циклические:

а) ROL/RCL – сдвиг влево

б) ROR/RCR – сдвиг вправо

 

5. Команды передачи управления.

1) Команды переходов:

1.1) безусловных переходов (JMP):

а) ближний переход

б) дальний переход (по адресу)

1.2) условных переходов (около 30)

1.3) для работы с беззнаковыми числами: JA/JNB/JNC

1.4) для работы со знаковыми числами: JG/JNLE; JS…

1.5) для всех: JE/JZ; JNP/JPO… и др.

Расшифровка команд перехода:

А (Above) – выше (для чисел без знака)

B (Below) – ниже, меньше (без знака)

L (Less) – меньше (для знаковых)

G (Greater) – больше (для знаковых)

N (Not) – не отрицания

E (Equal) – равно

Z (Zero) – 0

 

2) Команды вызова подпрограмм:

2.1) CALL<имя, адрес…> передает управления с автоматическим

сохранением адреса в STACK.

2.2) RET – всегда возврат в основную программу

(RET2) – возврат из подпрограммы и считывается из STACK 2-а слова.

3) Команды прерываний (INT)

INT<номер прерывания>

INT выполняется следующим образом:

1) Декремент (уменьшение) указателя STACK на 2.

2) Включение в STACK содержимого регистров флага (запомнить).

3) Сброс флагов IF и TF (прерывание разрешаем).

4) Декремент указателя STACK на 2.

5) Сохраняем CS в STACK.

6) Определение адреса вектора прерывания (умножение на 4)

7) Загрузка в CS слова памяти, расположенного по адресу +2

8) Декремент STACK на 2

9) IP сохранить в STACK

10) Загрузка в IP слова памяти, расположенного по адресу (call<адрес>)

 

IRET – вернуться из прерывания (предназначена для выхода из подпрограммы обработки прерываний).

 

4) Команды управления флагами.

Push F – запомнить все флаги в стеке

Pop F – достать флаги из стека

FLD – команда пересылки флагов

 

5) Команды управления процессором.

HLT – приостанавливает работу ПК до RESET

WAIT – синхронизация основного процессора с сопроцессорами

ESC – выход

LOCK – запрещает обращение к шине на время выполнения программ.

 

6) Команды организации циклов.

LOOP – проверяет завершение цикла

LOOPE/LOOPZ – (если CX=0 или ZF=0)

LOOPNE/LOOPNZ – (если CX=0 или ZF=1)

JCXZ – (если CX=0, то переход к метке).

 

7) Цепочные команды.

Под цепочкой понимается последовательность любых контекстной связи байт или слов, находящихся в смежных ячейках памяти.

REP, LOOP, либо использовать проверку флагов: DF и DI, SI.

 

 

Использование процедур в ассемблере.

Ассемблер относится как к процедурным языкам (Pascal, C, …), так и к непроцедурным. Считается удобным фрагменты текста на ассемблере оформлять в виде процедур, однако оператор CALL far PTR [BX] позволяет обращаться в произвольное место программы, имя процедуры не используется.

Явное описание процедур:

имя_процедуры PROC [тип] [язык] [uses regs]

тело процедуры

ret; retf или retn

имя_процедуры ENDP

 

тип: far, near (по умолчанию- near);

язык: (по умолчанию- ассемблер);

regs- сохраняются в стеке.

 

Схема вызова процедуры. При вызове типа NEAR обрабатывание CS не происходит.

 
 


My_Proc ENDP

 
 


Ret

 
 


- - - - - - - - - - - - Стек

       
   
 


My_Proc PROC IP

       
   
 
 


CS

       
   
 
 


- - - - - - - - - - - -

       
 
 
   


Call My_Proc CS IP

       
   
 
 

 

 


Обеспечивается вложенность процедур (ограничена стеком), могут организовываться рекурсивные вызовы. Этапы выполнения процедуры:

- подготовка параметров для работы с процедурой (типы параметров: значения, ссылки, возвращаемые значения, именования (при макровызовах));

- сохранение адреса возврата;

- передача управления на начало процедуры;

- выполнение тела процедуры, включая сохранение регистров, фиксацию результатов, фиксацию кода завершения, восстановление регистров;

- возвращение в основную программу в место после команды вызова, может быть с очисткой стека.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: