Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Assembler. Система команд. Синтаксис Intel




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

mov (move – передать переасать) – скопировать.

mov dst, src

dst – destination куда, src – source откуда.

reg - register регистр reg8/reg16/reg32

mem – memory mem8/mem16/mem32

imm – immediately непосредственное значение = const которое записано в коде.

mov работает с любыми представлениями. Запрещены пересылки из памяти в память mov mem, mem – ЗАПРЕЩЕНО. Все остальное можно

Особенности:

регистры CRi DRi TRi только с помощью mov с другими регистрами они работать не будут

Когда один из операндов eAX\AX\AL то общая длина команды сокращается на 1 байт, mov становится однооперандный.

 

xchg dst, src

exchange – меняет местами содержание источника и конца.

На время своего выполнения блокирует системную шину материнской платы. Гарантирует что на момент его исполнения никто другой не сможет вмешается, за счет того что блокируется системная шина на материнской плате.

Используется для проверки изменения значения семафоров, синхронизации асинхронных процессов.

Проблему синхронизации придумал и решил Деекстор.

 

XLALT – безоперандная команда. В 1 байт.

(translate) заменяет содержимое аккумулятора AL на байт из 256 байтов таблицы адрес которого находится в BX

7 0

   
 
YY ß -> копируется в AL[XX(YY)]
  /|\ XX   \ | /
 
 
 
  ß BX

Преобразует текущее значение AL в значение из какой-то таблицы.

из источника на вершину стека

PUSH srk – уменьшает значение

POP dst – увеличивает значение, извлекает с текущей вершины стека и помещает его в destination

 

PUSHA – помещает в стек содержание всех регистров 16 битных в след порядке AX/CX/DX/BX/SP/BP/SI/DI

POPA – извлекает с вершины стека в соответствующем порядке и заполняет их значение в регистрах, значение SP теряется.

Они безоперандные

PUSHAD – для 32 битных регистров

POPAD

PUSHF PUSHFD - Помещает значение флагов

POPF POPFD - извлекает значение и записывает в регистры флагов

 

Команды ввода вывода.

in acc, port Ввод из фиксированного порта

in acc, dx Ввод из переменного порта

команда in помещает в аккумулятор 1 байт из некоторого адреса

 

out port, acc перемещает 1 байт из аккумулятор в порт

out dx, acc либо 1 байт в порт по адресу расположенному в dx

Обмен с периферией возможен только по байту, за передачу отвечает только процессор.

 

Арифметические команды.

add dst, src //dst=dst+src

add – складывает значение источника с текущим значением назначения, сумма попадает в dst

В src можно помещать разные регистры.

 

adc dst,src //dst=dst+src+CF

Если перенос (3+9= 1 2) то CF=1

 

inc dst // dst=dst+1

int - Увеличение на единицу

 

150d = 0096h = 0000 0000 1001 0110b

1111 1111 0110 1010b = FF6Ah = -150d

 

sub dst,src; dst=dst-src

sbl dst,src; dst=dst-src-CF

dec dst; dst=dst-1

 

Ы inc, dec – на CF не влияют

cmp dst,src; dst-src

cmp – команда сравнения, на результат не влияет, результат сравнения находится в регистре флагов.

 

Команды умножения.

mul src; AL=src*AL

умножается и результат помещается в аккумулятор

mul src; ext:acc=acc*src

DL/AL – 8bit

DX/AX – 16bit

EDX/EAX – 32bit

Умножение знаковых чисел

imul src; идентичен умножению знаковых чисел

imul reg,src; умножение регистра общего назначения на источник, результат попадает в регистр, старшая половина при этом теряется. reg=src*reg

imul reg,src,imm; reg=src*imm также старшая половина теряется.

 

Команды деления.

div src; DX/AX = acc/src DX – остаток от деления

AX - целочисленное

относится к командам мультипликативным

idiv src; знаковое деление, 2-х 3-х операндных вариантов нет

 

Команды преобразования.

CBW src; convert bait to word расширение (был 8 битным стал 16 битным)

CND src; convert word to double word (был 16 стал 32 битынм)

CDQ src; был 32 стал 64 битным

Эти команды копируют знаковый бит в старшие разряды

BCD - числа упакованные в байт.

 

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

AND \

OR } [OP]

XOR /

NOT – унарная операция, конвертирует только биты.

 

[OP] dst,src

Логические операции воздействуют друг на друга в межразрядных соединениях.

 

NOT – при реализации основного кода

остальные – для инициализации и булевой логики (XOR ax,ax).

 

Команды сдвига.

Единообразно воздействуют на все виды регистров, операндов, они передают побитовый сдвиг право i+1, при сдвиге лево i-1 если сдвигаем на 1 бит.

Сдвиги различаются тем как мы работаем с теми битами которые выдвигаются из регистров.

Сдвиги бывают:

циклические (то что выпало, идёт на свободное место)

Циклические через CF (длина операндов увеличивается на 1)

Логические (то что выпало игнорируется и на свободное место помещается 0)

Арифметические (знаковый бит «размножается»)

Двойные сдвиги:

Логические сдвиги влево, вправо SHLD SHRD (Shift Left\Right Double)

SHLD dst, src, count

объединяются в один регистр и производится сдвиг

 

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

Вызов, возврат из подпрограмм, обработка прерываний.

JMP imm8/16/32

короткий/ближний/дальний переход (short, near, far)

короткий переход от -127 до 128 байт

ближний переход от -32 до 32 мб

дальний переход от -2 до 2 гб

 

Условные переходы.

JXX проверяются значения флагов.

Команд очень много, могут проверяться комбинации флагов.

JA - проверяют комбинацию регистров CF=0 и ZF=0 – Если выше

JBE - CF=0 и ZF=0 – Если не ниже/не равно.

Термины Выше, Не ниже, для без знаковых чисел.

 

JAE – проверяют значение CF=0 – выше/равно

JNB - проверяют значение CF=0

JNC - проверяют значение CF=0

 

JB - проверяют значение CF=1 - Ниже

JNAE- проверяют значение CF=1

JC - проверяют значение CF=1

 

JBE – проверяют значение CF=1 и ZF=1 – Ниже/равно

JNA - проверяют значение CF=1 и ZF=1

 

JE - проверка значение ZF=1 - Равно

JZ - проверка значение ZF=1

 

JNZ – проверяет на ZF≠0 – не равно 0

 

LOOP imm – CX-1 и передача управления на некоторое смещение, однооперандная команда, еще параметром называется непосредственное назначение, где-то выше loop должна быть метка, до тех пор пока не 0 происходит передача управления.

LOOPE – генерируют один и тот же код.

LOOPZ – кроме CX проверяется значение ZF==1 (результат предыдущей операции не 0). Если CX!=0 и ZF==1 то передача управления.

LOOPNE \ LOOPNZ – отрицание, CX==0 и ZF!=1

 

Вызов и возврат из подпрограмм.

CALL imm – программист вводит название функции, компилятор преобразует в адрес.

Подпрограмма выполняет свою логику, возможно использует фактические параметры из стека. По окончании логики функция помещает результат.

RET – целочисленное в AX, вещественное FPU и чотатам.

Команда RET может быть безоперандной и однооперандной RET imm

RET извлекает с вершины стека адрес точки возврата возвращает управление в этот адрес и тогда очистку стека от фактических параметров должен произвести обвязочный код (СИ конвенция).

Если с операндом то смещение на чотатам байт и очищается стек (Паскаль конвенция).

 

interruptеры.
INT n

INTO è INT 4

n – в команде int это номер в команде которых необходимо обработать, номер из таблицы векторов прерываний, в результате процессор запоминает текущее состояние, которое прерывается, чотатам.

IRET

Интераптеры изменяют IP и передача управление в другой сегмент кода. Команды безусловного перехода которые jump.

 

Обработка цепочек.

Если нам надо произвести одинаковые действие над двумя массивами то мы предполагаем наличие циклов, но наличие цикла это однозначно ветвление и сброс с конвейера. Цепочечные команды конвейер не сбрасывают, позволяют реализовать часть циклических операций в одной строке.

Изменяют SI DI либо вперед либо назад, сдвигают начало массива и конец массива в значении от индекса.

Загружает регистры CX SI DI, потом вызываем команду цепочек и в одной строке повторяем все телодвижения над массивами, конвейер при этом не сбрасывается.

 

REP – повторяет чотатам

REPE/REPZ - проверяется флаг ZF

REPNE/REPNZ – отрицание

MOVS dst, src; передает значение из источника в назначение

MOVSB – работа с байтами

MOVSW – работа со словами

MOVSD – работа с двойными словами.

 

CMPS dst, src;не разрушающее вычитание, изменяются флаги, операнды не трогаются

SCAS dst;однооперандная, вычитает содержимое просматриваемого массива и аккумулятора acc, dst. На равенство значения в аккумуляторе или не равенство.

STOS dst;загружает в цепочку назначение цепочку аккумулятора. dst ç acc

LODS dst; acc ç dst

INS - ввод цепочек в некоторый порт

OUTS – вывод цепочек в некоторый порт

 

CLC (clear larry flag)

CMC (complementary carry)

STC (set carry)
CLD (clear Direction)

STD (Set Direction)

CLT (Clear Interrupt)

STI (Set Interrupt)

IF (Interrupt flag)

NOP (No Operation) – занимает по времени 1 такт процессора и по длине занимает 1 байт.

 

Работа с Ассемблером – Язык низкого уровня можно делать все что угодно в большинстве случаев затраты себя не окупают.

Ассемблер язык платформа зависимый. Это ограничивает сферы применения ассемблера:

1) Оптимизация (в большинстве по скорости);

2) Драйвера к железу.

3) Взлом программ.

Оптимизация. Возможно, оптимизация по скорости и возможно возникают иногда задачи оптимизации по объему памяти.

Требование к оптимизированным программам:

1) Результат работы оптимизированной программы должен совпадать с результатом работы до оптимизации.

2) Прирост производительности. (Можно разворачивать циклы, можно убирать условные переходы это дает прирост производительности в проценты)

SIMD (Simple Instruction Multiple Data)

Если мы можем входной поток данных (на вычислении) одной командой обрабатывать не одну, а множество операндов, то тогда мы получаем множественный так процессора.

Профайлером вылавливается самая напряженная функция, далее она оптимизируется (переписывается на ассемблер), далее компилируется в dll.

 

Шаблон ассемблерной dll:

.586; разрешать не привилегированные команды процессора 586

.XMM; разрешает регистры XMM

.MODEL FLAT;

PUBLIC _nameF@xx;имя экспортируемой функции

.CODE

.start@12

mov al, 1; точка входа в dll

ret 12

 

;если много функций то добавляем произвольно кол-во функций

; ОТСЮДОВА

 

_nameF@xx PROC

push ebp;стандартный заголовок функции

mov ebp,esp;

; тело функции

pop ebp

ret

_nameF@xx ENDP

 

;ДОСЮДОВА.

END_start@12;точка выхода и dll

 

 

Рекомендуемый редактор к программированию Notepad++ (npp)

Компиляция текстового файла:

Меняем.txt на.asl

ml.exe – создает объектный файл из текстового файла.

Для получения dll используется link32.exe – он из объектного файла делает файлы exp.lib и.dll (*.lnk)

в [name].lnk находится:

/DLL

/entry:start

/sybsystem:windows

/export:nameF1

/export:nameF2

/export:nameFN

nameF – название нашей функции без искажения.

Модно создавать файл.bat или.cmd в который напишем

d:\work\..\ml.exe /c /coff /Cp /D_MASM ИМЯ.asm

d:\link32.exe ИМЯ.obj @ИМЯ.lnk

Рекомендуется перед началом компиляции удалять предыдущие результаты компилирования..dll.obj exp

del *.dll

del *.obj

del *.lib

А также

del откудо/то/там/*.dll

Рекомендуется создавать dll в другом каталоге

После компиляции скопировать

copy *.dll Куда/то/там

 

Искажение имён:

_ - подчеркивание, само!

XX – количество в байтах параметром передано функции.

Рекомендуется узнать, сколько параметров мы передаем, и написать прототип функции на языке высокого уровня.

 

ЗАДАНИЕ:

Сравнить скорость работы функции на чистом си и с использование ассемблера.

По номеру варианта выбираем задание ассемблером программы.

Сделать Сишный эквивалент ассемблерной функции.

/////////////////////////////////////////////////////////

MMX (multi media edition)

8 регистров MMX:

MM0.. MM7

Мантиссэ – регистры с плавающей запятой. 8BYTE

               

4WORD

       

2DWORD

   

1QWORD

 

Декларируется что за одну операцию сложения в соответствующих словах результатов: мы получаем прирост производительности на упакованных байтах в 8 раз, на 4WORD в 4 раза и т.д. на учетверенных словах прирост производительности возможен также.

 

Набор команд:

movq dst,src;копирует 64 бита 1QWORD из источника в назначение один из операторов должен быть MMX

Упаковка со знаком насыщения:

PACKSSWB mmx,src; слова в байты

PACKSSDW

приемник регистр MMX

WB – копирует 4 слова со знаком из приемника в 4 младших байта приемника и копирует 4 слова из источника в старшие 4 байта приемника.

При этом если значение слова превышает 127, то в байт записывается 127. +127 d=7F h

Если меньше чем -128 то записывается минимальная из возможных -128. -128d=80h

Эти операции называются операциями насыщения.

Упаковка знаковая с насыщением слова в байты

Упаковка знаковая с насыщением двойных слов в слова

PACKSSWB – копирует 4 слова со знаком из приемника в 4 младших байта приемника и копирует 4 слова со знаком из источника в 4 старших байта приемника.

Команда PACKSSDW – тоже самое только из двойных слов в слова.

 

Упаковка без знакового насыщения.

PACKUSWB mmx, src.

Упаковывает без знаковые с насыщением слова в байты.

если больше 255d=FFh если меньше 0=0

 

РАСПАКОВКА ЧЕГОТОТАМ ТАМ ЧОТО ТАМ. Самостоятельно

 




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


Дата добавления: 2014-01-04; Просмотров: 5265; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.113 сек.