
6. Команды передачи управления.ppt
- Количество слайдов: 61
Команды передачи управления Лекция 6
План лекции Команда безусловного перехода n Команды вызова процедур n Команды организации циклов n
Команды передачи управления
Команды передачи управления позволяют нарушить естественную последовательность выполнения команд путем изменения содержимого регистра EIP n Команды передачи управления не меняют флаги n
Команды передачи управления Виды команд передачи управления: n безусловный переход n вызов процедур n организация циклов
Команда безусловного перехода
Команда безусловного перехода n JMP <метка> ¨ от слова Jump – «прыжок» ¨ является аналогом GOTO n Логика работы команды: EIP = EIP + смещение
Команда безусловного перехода n Адрес перехода может быть указан при помощи: ¨ метки (которая при компиляции заменяется на адрес) – JMP label ¨ регистра – JMP EAX ¨ содержимого ячейки памяти – JMP DWORD PTR [EBX] ¨ переменной – JMP a
Команда безусловного перехода n Переход осуществляется в пределах текущего сегмента (тип NEAR) ¨ Адрес при этом занимает 4 байта n Если переход осуществляется в пределах – 128. . +127 байт (короткий переход), то используется команда JMP SHORT <метка>
Команды условного перехода
Команды условного перехода n Базовых команд условного перехода всего 17, но они могут иметь различную мнемонику (это команды-синонимы – для удобства чтения и понимания программы), поэтому получается 31 команда
Команды условного перехода Jxx <метка> n Первая буква команды J от уже известного нам слова Jump. Остальные буквы (xx) в сокращенном виде описывают условие перехода n По этому признаку все команды условного перехода можно разбить на три группы n
Команды условного перехода Первая группа команд условного перехода: n Е – Equal (равно) n N – Not (не, отрицание) n G – Greater (больше) – числа со знаком n L – Less (меньше) – числа со знаком n А – Above (выше, больше) – числа без знака n В – Below (ниже, меньше) – числа без знака
Команды условного перехода n n n Например, команда JL означает переход, если меньше Ей эквивалентна команда-синоним JNGE – переход, если НЕ больше и НЕ равно Разница в командах перехода для знаковых и беззнаковых данных объясняется тем, что они реагируют на разные флаги: ¨ знаковые данные – флаг SF ¨ беззнаковые данные – флаг CF
Команды условного перехода n Условный переход для этой группы команд обычно реализуется в два шага: ¨ сравнение, в результате чего формируются флаги ¨ условная передача управления на нужную команду в зависимости от значения флагов n Таким образом, в данном случае реализуется условный оператор if
Команды условного перехода n Эта группа операций чаще всего выполняется в паре с командой сравнения СМР приемник, источник Jxx Короткая метка
Команды условного перехода
Команды условного перехода n Пример. Построить следующую функцию для знаковых и беззнаковых чисел:
Команды условного перехода DATA SEGMENT PUBLIC x 1, y 1, x 2, y 2, f x 1 DD ? y 1 DD ? x 2 DD ? y 2 DD ? f DW ? DATA ENDS
Команды условного перехода CODE SEGMENT PUBLIC Sign, Unsign Sign PROC MOV f, 0 MOV EAX, x 1 MOV EBX, y 1 CMP EAX, EBX JL Less JG Great JMP End 1 Less: MOV f, – 1 JMP End 1 Great: MOV f, 1 JMP End 1: RET Sign ENDP
Команды условного перехода Unsign PROC MOV MOV CMP JB JA JMP Below: MOV JMP Above: MOV JMP End 2: RET Unsign ENDP CODE ENDS END f, 0 EAX, x 2 EBX, y 2 EAX, EBX Below Above End 2 f, – 1 End 2 f, 1 End 2
Команды условного перехода Вторая группа команд условного перехода n n Эта группа команд реагирует на значение определенного флага В мнемонике указывается первая буква проверяемого флага Эти команды не требуют команд сравнения перед своим выполнением Им достаточно любой команды, которая вырабатывает нужный флаг
Команды условного перехода n Некоторые команды встречались в предыдущей таблице
Команды условного перехода n Пример: проверить на переполнение результат операции умножения двух беззнаковых 8 -разрядных данных a и b: MOV AL, a MUL b JC ERRORmul: ; a*b > 255 (CF=1)
Команды условного перехода Третья группа команд условного перехода: n JCXZ <метка> ¨ if (CX == 0) goto <метка> n JECXZ <метка> ¨ if (ECX == 0) goto <метка> n Используются в циклах
Команды вызова процедур
Команды вызова процедур CALL Имя_процедуры n n Команда CALL по сути аналогична команде JMP Поскольку команда CALL предназначена для вызова процедур, дополнительно команда запоминает в стеке адрес точки возврата – следующей за CALL команды
Команды вызова процедур n Логика работы команды: PUSH EIP
Команды вызова процедур Если у вызываемой процедуры есть параметры, они передаются через стек до вызова процедуры, справа налево n Локальные переменные процедуры также хранятся в стеке n
Команды вызова процедур n Если программу на Ассемблере используют с языком высокого уровня, то нужно обеспечить сохранение регистров EBX, EBP, ESI, EDI
Команды вызова процедур Для доступа к параметрам в процедуре нужно использовать регистр ESP n Но работать напрямую с регистром ESP не рекомендуется, поэтому используют регистр EBP: n ¨ MOV EBP, ESP
Команды вызова процедур n Команда возврата в точку вызова: RET [константа] n На величину константы (необязательный параметр) увеличивается указатель стека, в случае, если в функцию передавались через стек параметры
Команды вызова процедур n Логика работы команды: ESP = ESP + константа POP EIP
Команды вызова процедур Очистка стека может выполняться двумя способами: n в процедуре: RET [число байт] n в вызывающей программе: ADD ESP, число байт
Команды вызова процедур Шаблон работы с процедурами n Пусть вызывается процедура proc 1(DWORD a, DWORD b, DWORD d) n Пусть в процедуре объявлено две локальных переменных типа DWORD
Команды вызова процедур Вызывающая программа: PUSH d PUSH b PUSH a CALL proc 1 ADD ESP, 12 ; освободить стек от параметров (N*4 байт) ; или в процедуре RET 12
Команды вызова процедур proc 1 PROC PUSH EBP MOV EBP, ESP SUB ESP, 8 PUSH EBX PUSH ESI PUSH EDI … POP EDI POP ESI POP EBX MOV ESP, EBP POP EBP RET proc 1 ENDP ; сохраняем EBP ; работаем с EBP вместо ESP ; место в стеке для локальных переменных ; сохраняем, если нужно, регистры ; тело процедуры ; восстанавливаем регистры ESP, EBP
Команды вызова процедур
Команды вызова процедур
Команды вызова процедур
Команды вызова процедур
Команды вызова процедур
Команды вызова процедур
Команды вызова процедур
Команды вызова процедур
Команды вызова процедур
Команды вызова процедур n Обращение к локальным переменным:
Команды вызова процедур n Обращение к локальным переменным: MOV EAX, DWORD PTR [EBP – 4] MOV EAX, DWORD PTR [EBP – 8]
Команды вызова процедур n Обращение к аргументам:
Команды вызова процедур n Обращение к аргументам: MOV EAX, DWORD PTR [EBP + 8] MOV EAX, DWORD PTR [EBP + 12] MOV EAX, DWORD PTR [EBP + 16]
Команды вызова процедур n Удобно использовать константы: a EQU [EBP + 8] MOV EAX, a
Команды вызова процедур При взаимодействии с языками высокого уровня важен вопрос согласования передачи параметров: n порядок передачи n способ освобождения стека
Команды вызова процедур
Команды организации циклов
Команды организации циклов 1) LOOP <метка> n Логика работы: метка: <тело цикла> ECX = ECX – 1 if (ECX != 0) goto метка
Команды организации циклов n Пример: Cycle: MOV ECX, Counter JECXZ Exit. Cycle <тело цикла> LOOP Cycle ; ECХ = 0
Команды организации циклов 2) LOOPE <метка>, LOOPZ <метка> n Логика работы: метка: <тело цикла> ECX = ECX – 1 if ((ECX != 0) && (ZF = 1)) goto метка
Команды организации циклов 3) LOOPNE <метка>, LOOPNZ <метка> n Логика работы: метка: <тело цикла> ECX = ECX – 1 if ((ECX != 0) && (ZF = 0)) goto метка
Команды организации циклов n Вложенные циклы: L 1: L 2: MOV ECX, 10 PUSH ECX. . . ; работа внешнего цикла MOV ECX, 100 PUSH ECX. . . ; тело вложенного цикла POP ECX LOOP L 2 POP ECX LOOP L 1
Команды организации циклов n Пример. Вычислить значение n!
Команды организации циклов. DATA PUBLIC n, f n DD ? f DD ? . CODE PUBLIC fact PROC XOR EDX, EDX MOV EAX, 1 MOV ECX, n JCXZ end 1 cycle: MUL ECX LOOP cycle end 1: MOV dword ptr f, EAX MOV dword ptr f+4, EDX RET fact ENDP END