16
Учебный курс Архитектура ЭВМ и язык ассемблера Лекция 3 заместитель министра связи и массовых коммуникаций РФ, старший преподаватель Северов Дмитрий Станиславович

Учебный курс

  • Upload
    lei

  • View
    69

  • Download
    0

Embed Size (px)

DESCRIPTION

Учебный курс. Архитектура ЭВМ и язык ассемблера Лекция 3 заместитель министра связи и массовых коммуникаций РФ, старший преподаватель Северов Дмитрий Станиславович. Команды сравнения и булевых операций. • Флаги результатов выполнения команд ZF- обнуление. - PowerPoint PPT Presentation

Citation preview

Page 1: Учебный курс

Учебный курс

Архитектура ЭВМ и язык ассемблера

Лекция 3

заместитель министра связи и массовых коммуникаций РФ, старший преподаватель

Северов Дмитрий Станиславович

Page 2: Учебный курс

Команды сравнения и булевых операций

• Флаги результатов выполнения командZF- обнулениеCF- выход за границу разрядной сеткиSF- копия старшего (знакового) битаOF- нарушение дополнительного кодаРF- чётное число бит• AND,OR,XOR,NOT• TEST,CMP – меняем только флаги• Установка и сброс отдельных флагов• BT,BTC,BTS,BTR работа с семафорами

2

Page 3: Учебный курс

––––

Команды условных переходов

• J?? <op> ; много вариантов– Условия – во флагах– До 386 метка – ближняя (-128…+127 байт)

• По результатам «сравнения»Equal, Not EqualGreater, Less, Greater or Equal, Less or Equal (со знаком)Above, Below, Above or Equal, Below or Equal (без знака)Примеры: JL - если SF != OF, JB - если CF=1

• По состоянию определённого флага[Not] flag {Z|S|C|O|P}F set to 1»JZ, JNZ,…,JP,JNP• По состоянию счётчикаJCXZ JЕCXZ–обход цикла для реализации «предусловия»

3

Page 4: Учебный курс

Команды циклов

• LOOP* <op>; есть варианты• LOOP: if (!--ECX) goto <метка>.

– счётчик только в CX/ECX,– традиционно: цикл с постусловием!– “вошёл с СХ/ECX=0”: ещё 2

16

/232

раз.

• LOOPE/LOOPZ: Поиск отличногоif(!--ECX || ZF)goto <метка>

• LOOPNE/LOOPNZ: Поиск требуемогоif(!--ECX || !ZF)goto <метка>.

• Важно: расстояние до <op> от -128 до 128 байт

4

Page 5: Учебный курс

Условные конструкции ЯВУ(1)movmovmov

eax,op1ebx,op2ecx,op3

while(op1<op2)

{op1++;if(op2==op3)

X=2;else

X=3;}

L1:

L2:L3:

L4:

L5:L6:L7:

cmpjljmpinccmpjejmpmovjmpmovjmpmov

eax,ebxL2L7eaxebx,ecxL4L5X,2L6X,3L1op1,eax

5

Page 6: Учебный курс

Условные конструкции ЯВУ(2)switch(par){case ’A’:

Process_A();break;

case ’B’:Process_B();break;

case ’C’:Process_C();break;

case ’D’:Process_D();break;

}

…CaseTable BYTE 'A'

DWORD Process_AEntrySize = ($ - CaseTable)

BYTE 'B'DWORD Process_BBYTE 'C'DWORD Process_CBYTE 'D'DWORD Process_D

NumberOfEntries = ($ - CaseTable)/EntrySize

mov al,parmov ebx,OFFSET CaseTablemov ecx,NumberOfEntries

L1: cmp al,[ebx]jne L2call NEAR PTR [ebx + 1]jmp L3

L2: add ebx,EntrySizeloop L1

L3: …6

Page 7: Учебный курс

Условные директивы ассемблера• Условная конструкция • Сравнения.IF условие1

команды[.ELSEIF условие2

команды][.ELSE

команды].ENDIF• Цикл с постусловием.REPEAT

команды.UNTIL условие• Цикл с преусловием.WHILE условие

команды.ENDW

– Регистров – без знака– С переменной – как определена

• Операторы в условияхexpr1 == expr2expr1 != expr2expr1 > expr2expr1 >= expr2expr1 < expr2expr1 <= expr2! exprexpr1 && expr2expr1 || expr2expr1 & expr2CARRY? OVERFLOW? PARITY?

SIGN? ZERO?

7

Page 8: Учебный курс

Напоминания

• Циклы (LOOP* <op>)– Важно: расстояние до <op> от -128 до 128 байт

• Фокусы оптимизации

while(op1<op2)

{op1++;if(op2==op3)

X=2;else

X=3;}

L1:

L2:L3:

L4:

L5:L6:L7:

movmovmovcmpjljmpinccmpjejmpmovjmpmovjmpmov

eax,op1ebx,op2ecx,op3eax,ebxL2L7eaxebx,ecxL4L5X,2L6X,3L1op1,eax

8

Page 9: Учебный курс

Сдвиги???SH?D

операнд,счётчикполучатель,источник,счётчик

SHLSAL

SHR

CF

0

MSB…

LSB0

CF

SHLD

MSB LSBполучатель

SAR

ROL

источник

SHRD

ROR … CF MSB LSBполучатель

RCL

RCR

источник

9

Page 10: Учебный курс

Умножение и деление• MUL операнд IMUL операнд

Множимое

AL

AX

Множимое

Множитель

reg/mem8

reg/mem16

Множитель

Произведение

AX

DX:AX

Произведение

• DIV операнд IDIV операнд

Делимое

AX

DX:AX

Делимое

Делитель

reg/mem8

reg/mem16

Делитель

Частное

AL

AX

Частное

Остаток

AH

DX

Остаток

• CBW/CWBE CWD/CDQ -расширение со знаком 10

Page 11: Учебный курс

Тонкости применения

• Сдвиги– Сдвиг массива– Быстрое умножение– Выделение полей

• Умножение– без переполнений– CF,OF – большой результат

• Деление– исключение - деление на нуль– исключение - переполнение

11

Page 12: Учебный курс

Произвольная точность

• ADC – ADd with Carry

• SBB – SuBtract with Borrow

Сложить(Вычесть)

«получатель»(1-й аргумент)«источник»(2-й аргумент)«получатель»(результат)

ADD(SUB)

ADC(SBB) CF

CFH-получатель

H-источникH-получатель

L-получательL-источник

L-получатель

12

Page 13: Учебный курс

Об основах программирования

• Создание и инициализация автопеременных

• Область действия и время жизни переменных

• Передача параметров

– механизм передачи: стек

– способы передачи: «по значению» и «по ссылке»

– входные, выходные, универсальные параметры

• Стековые фреймы, контекст

• Рекурсия

13

Page 14: Учебный курс

Локальные переменные• Назначение

– Упрощение отладки– Переиспользование памяти– Переиспользование имён

BubbleSort PROCLOCAL Temp:DWORDLOCAL SwapFlag:DWORD

;RET

BubbleSort ENDP

[ESP]

Правильное обращение:

BubbleSort :push ebpmov ebp,espadd esp,0FFFFFF8hmov esp,ebppop ebpret

Адрес возвратаEBP (сохранён) [EBP]

Temp [EBP-4]SwapFlag [EBP-8]

lea esi,SwapFlagmov eax,[esi]

загрузка эффективного адресаобращение по адресу 14

Page 15: Учебный курс

Параметры регистровые и стековыеpushadmov esi,OFFSET arraymov ecx,LENGTHOF arraymov ebx,TYPE arraycall DumpMempopad

pushpushpushcall

TYPE arrayLENGTHOF arrayOFFSET arrayDumpMem

INVOKE DumpMem,OFFSET array,LENGTHOF array,TYPE arrayАргумент INVOKE Примеры

Непосредственное значение 10,300h,OFFSET myList,TYPE array

Целочисленное выражение

Имя переменной

Адресное выражение

Имя регистра

Аргумент INVOKE

(10*20), COUNT

myList, array, Temp, SwapFlag

[myList+2], [ebx+esi]

eax, bl, edi

Примеры

ArraySum PROTO ptrArray:PTR DWORD, sZArray:DWORD15

Page 16: Учебный курс

;;;;

;;

Разные параметры и переменныеTITLE ArraySum (ArrySum.asm)ArraySum PROC

INCLUDE Irvine32.inc

.dataArray DWORD 50 DUP(5)

push ebpmov ebp,espsub esp,4push esi

сохранитьуказательместо длясохранить

EBPна локальныелокальнойESI

.codemain PROC

mov DWORD PTR sum,0mov esi,pArraymov ecx,count

push LENGTHOF Arraypushcall

OFFSET ArrayArraySum

L1:mov eax,[esi] ;взять элемент массива

addcallcall

esp,8WriteDecCrlf

add sum,eaxadd esi,4loopd L1

; добавить с сумме; к следующему элементу

exitmain ENDP

sum

EQU <[ebp-4]>

popmovmovpopret

esieax,sumesp,ebpebp

;

;

восстановить ESIрезультат в EAXудалить локальныевосстановить EBP

pArray EQU <[ebp+8]>count EQU <[ebp+12]> ArraySum ENDP

16