Upload
lei
View
69
Download
0
Embed Size (px)
DESCRIPTION
Учебный курс. Архитектура ЭВМ и язык ассемблера Лекция 3 заместитель министра связи и массовых коммуникаций РФ, старший преподаватель Северов Дмитрий Станиславович. Команды сравнения и булевых операций. • Флаги результатов выполнения команд ZF- обнуление. - PowerPoint PPT Presentation
Citation preview
Учебный курс
Архитектура ЭВМ и язык ассемблера
Лекция 3
заместитель министра связи и массовых коммуникаций РФ, старший преподаватель
Северов Дмитрий Станиславович
Команды сравнения и булевых операций
• Флаги результатов выполнения командZF- обнулениеCF- выход за границу разрядной сеткиSF- копия старшего (знакового) битаOF- нарушение дополнительного кодаРF- чётное число бит• AND,OR,XOR,NOT• TEST,CMP – меняем только флаги• Установка и сброс отдельных флагов• BT,BTC,BTS,BTR работа с семафорами
2
––––
Команды условных переходов
• 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
Команды циклов
• 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
Условные конструкции ЯВУ(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
Условные конструкции ЯВУ(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
Условные директивы ассемблера• Условная конструкция • Сравнения.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
Напоминания
• Циклы (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
Сдвиги???SH?D
операнд,счётчикполучатель,источник,счётчик
SHLSAL
SHR
CF
0
MSB…
…
LSB0
CF
SHLD
MSB LSBполучатель
SAR
ROL
…
…
источник
SHRD
ROR … CF MSB LSBполучатель
RCL
RCR
…
…
источник
9
Умножение и деление• 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
Тонкости применения
• Сдвиги– Сдвиг массива– Быстрое умножение– Выделение полей
• Умножение– без переполнений– CF,OF – большой результат
• Деление– исключение - деление на нуль– исключение - переполнение
11
Произвольная точность
• ADC – ADd with Carry
• SBB – SuBtract with Borrow
Сложить(Вычесть)
«получатель»(1-й аргумент)«источник»(2-й аргумент)«получатель»(результат)
ADD(SUB)
ADC(SBB) CF
CFH-получатель
H-источникH-получатель
L-получательL-источник
L-получатель
12
Об основах программирования
• Создание и инициализация автопеременных
• Область действия и время жизни переменных
• Передача параметров
– механизм передачи: стек
– способы передачи: «по значению» и «по ссылке»
– входные, выходные, универсальные параметры
• Стековые фреймы, контекст
• Рекурсия
13
Локальные переменные• Назначение
– Упрощение отладки– Переиспользование памяти– Переиспользование имён
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
Параметры регистровые и стековые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
;;;;
;;
Разные параметры и переменные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