Учебный курс Архитектура ЭВМ и язык ассемблера Лекция 3 заместитель министра связи и массовых коммуникаций РФ, старший преподаватель Северов Дмитрий Станиславович
Команды сравнения и булевых операций Флаги результатов выполнения команд ZF- обнуление CF- выход за границу разрядной сетки SF- копия старшего (знакового) бита OF- нарушение дополнительного кода РF- чётное число бит AND,OR,XOR,NOT TEST,CMP – меняем только флаги Установка и сброс отдельных флагов BT,BTC,BTS,BTR работа с семафорами 2
– – – – Команды условных переходов J?? ; много вариантов – Условия – во флагах – До 386 метка – ближняя (-128…+127 байт) По результатам «сравнения» Equal, Not Equal Greater, 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* ; есть варианты LOOP: if (!--ECX) goto. – счётчик только в CX/ECX, – традиционно: цикл с постусловием! – вошёл с СХ/ECX=0 : ещё 2 16 /2 32 раз. LOOPE/LOOPZ : Поиск отличного if(!--ECX || ZF)goto LOOPNE/LOOPNZ : Поиск требуемого if(!--ECX || !ZF)goto. Важно: расстояние до от -128 до 128 байт 4
Условные конструкции ЯВУ(1) mov eax,op1 ebx,op2 ecx,op3 while(op1
Условные конструкции ЯВУ(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_A EntrySize = ($ - CaseTable) BYTE 'B' DWORD Process_B BYTE 'C' DWORD Process_C BYTE 'D' DWORD Process_D NumberOfEntries = ($ - CaseTable)/EntrySize mov al,par mov ebx,OFFSET CaseTable mov ecx,NumberOfEntries L1: cmp al,[ebx] jne L2 call NEAR PTR [ebx + 1] jmp L3 L2: add ebx,EntrySize loop L1 L3: … 6
Условные директивы ассемблера Условная конструкция Сравнения. IF условие1 команды [.ELSEIF условие2 команды] [.ELSE команды].ENDIF Цикл с постусловием. REPEAT команды.UNTIL условие Цикл с преусловием. WHILE условие команды.ENDW – Регистров – без знака – С переменной – как определена Операторы в условиях expr1 == expr2 expr1 != expr2 expr1 > expr2 expr1 >= expr2 expr1 < expr2 expr1
Напоминания Циклы ( LOOP* ) – Важно: расстояние до от -128 до 128 байт Фокусы оптимизации while(op1
Сдвиги ??? SH?D операнд,счётчик получатель,источник,счётчик SHL SAL SHR CF 0 MSB ………… LSB 0 CF SHLD MSB LSB получатель SAR ROL ………… источник SHRD ROR … CFMSBLSB получатель 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 CF H-получатель H-источник H-получатель L-получатель L-источник L-получатель 12
Об основах программирования Создание и инициализация автопеременных Область действия и время жизни переменных Передача параметров – механизм передачи: стек – способы передачи: «по значению» и «по ссылке» – входные, выходные, универсальные параметры Стековые фреймы, контекст Рекурсия 13
Локальные переменные Назначение – Упрощение отладки – Переиспользование памяти – Переиспользование имён BubbleSort PROC LOCAL Temp:DWORD LOCAL SwapFlag:DWORD ; RET BubbleSort ENDP [ESP] Правильное обращение: BubbleSort : push ebp mov ebp,esp add esp,0FFFFFF8h mov esp,ebp pop ebp ret Адрес возврата EBP (сохранён) [ EBP ] Temp [ EBP-4 ] SwapFlag [ EBP-8 ] lea esi,SwapFlag mov eax,[esi] загрузка эффективного адреса обращение по адресу 14
Параметры регистровые и стековые pushad mov esi,OFFSET array mov ecx,LENGTHOF array mov ebx,TYPE array call DumpMem popad push call TYPE array LENGTHOF array OFFSET array DumpMem 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:DWORD 15
; ; ; ; ; ; Разные параметры и переменные TITLE ArraySum (ArrySum.asm)ArraySum PROC INCLUDE Irvine32.inc.data Array DWORD 50 DUP(5) push ebp mov ebp,esp sub esp,4 push esi сохранить указатель место для сохранить EBP на локальные локальной ESI.code main PROC mov DWORD PTR sum,0 mov esi,pArray mov ecx,count pushLENGTHOF Array push call OFFSET Array ArraySum L1: mov eax,[esi] ;взять элемент массива add call esp,8 WriteDec Crlf add sum,eax add esi,4 loopd L1 ; добавить с сумме ; к следующему элементу exit main ENDP sum EQU pop mov pop ret esi eax,sum esp,ebp ebp ;;;; восстановить ESI результат в EAX удалить локальные восстановить EBP pArray EQU count EQU ArraySum ENDP 16