9. Команды передачи управления. Команда безусловного перехода. Команды условного перехода.
9. Команды передачи управления. Команда безусловного перехода. Команды условного перехода. Команды передачи управления.
Команда безусловного перехода. jmp метка Используется в программе для организации безусловного перехода как внутри текущего сегмента команд, так и за его пределы. При определенных условиях в защищенном режиме работы команда jmp может использоваться для переключения задач. Команду jmp применяют для осуществления ближних и дальних безусловных переходов без сохранения контекста точки перехода. Команды условного перехода. Команды для работы с беззнаковыми числами: JA/JNBE – переход, если больше; JAE/JNB/JNC - переход, если больше или равно; JB/JNAE/JC - переход, если меньше; JBE/JNA - переход, если меньше или равно. Команды для работы со знаковыми числами: JG/JNLE - переход, если больше; JGE/JNL - переход, если больше или равно; JL/JNGE - переход, если меньше; JLE/JNG - переход, если меньше или равно; JNS - переход, если больше нуля; JS - переход, если меньше нуля. Команды, общие для знаковых и беззнаковых чисел: JE/JZ - переход, если равно переход, если ноль; JNE/JNZ - переход, если не равно переход, если не ноль.
10. Команды вызова процедур. Команды организации циклов. Команды вызова процедур. call цель Передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата. push источник Размещение содержимого операнда источник в стеке. pop приемник Извлечение слова или двойного слова из стека. ret ret число Возврат управления из процедуры вызывающей программе. Команды организации циклов. loop метка Организация цикла со счетчиком в регистре cx. loope/loopz метка loopne/loopnz метка
Организация цикла со счетчиком в регистре cx с учетом флага zf.
11. Работа с массивами. Одномерные массивы, двумерные статические массивы. Одномерные массивы. Объявление массива на языке Си: short mas[3]; short *pt; pt = mas; Адрес элемента массива: pt + 1 ≡ mas + 1 ≡ & mas[1] Значение элемента массива: *(pt + 1) ≡ *(mas + 1) ≡ mas[1] Имя массива является его начальным адресом Пример. Найти сумму элементов одномерного массива целых чисел void InputArrKey(int *a, int n); void PrintArr(int *a, int n); extern " C" int const n = 5; extern " C" int a[5]; extern " C" int s; extern " C” void sum(); . MODEL FLAT, C . DATA EXTRN a: DWORD, n: DWORD, s: DWORD . CODE PUBLIC C sum sum PROC XOR EBX, EBX XOR EAX, EAX MOV ECX, n JECXZ end1 cycle: ADD EAX, DWORD PTR a[EBX] ADD EBX, 4 LOOP cycle end1: MOV s, EAX RET sum ENDP END add EAX, DWORD PTR a[EBX] add EAX, DWORD PTR [a + EBX] add EAX, DWORD PTR [EBX]+a В качестве индексного регистра можно использовать регистры EBX, ESI, EDI Двумерные статические массивы. Объявление статического массива short mas[3][2]; Адрес элемента массива: mas ≡ & mas[0][0] Значение элемента массива: **mas ≡ mas[0][0] Адрес элемента массива: mas + 1 ≡ & mas[1][0] Значение элемента массива: **(mas + 1) ≡ mas[1][0] Пример. Найти сумму элементов двумерного массива целых чисел #include < time. h> extern " C" int const n = 3; extern " C" int const m = 2; extern " C" int a[n][m]; extern " C" int s; extern " C" void sum2x();
. MODEL FLAT, C . DATA EXTRN a: DWORD, n: DWORD, m: DWORD, s: DWORD m4 DD?
. CODE PUBLIC C sum2x Sum2x PROC XOR EBX, EBX XOR EAX, EAX MOV EDX, m SHL EDX, 2 MOV m4, EDX MOV ECX, n JECXZ endl cycle1: PUSH ECX XOR ESI, ESI MOV ECX, m JECXZ endl cycle2: ADD EAX, DWORD PTR a[EBX][ESI] ADD ESI, 4 LOOP cycle2 ADD EBX, m4 POP ECX LOOP cycle1 endl: MOV s, EAX RET sum2x ENDP END
12. Работа с массивами. Двумерные динамические массивы. Двумерные динамические массивы. Объявим динамический массив на языке Си: short **mas; mas ≠ & mas[0][0] mas + 1 ≠ & mas[1][0] Адрес элемента массива: *mas ≡ & mas[0][0] Значение элемента массива: **mas ≡ mas[0][0] Адрес элемента массива: *(mas + 1) ≡ mas[1][0] Значение элемента массива: **(mas + 1) ≡ mas[1][0] Пример. Найти сумму элементов двумерного массива целых чисел. void InputArrDyn(int **b, int n, int m) { for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) b[i][j] = rand()/1000; } void PrintArrDyn(int **b, int n, int m) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cout < < b[i][j] < < " \t"; cout < < endl; } } . DATA EXTRN b: DWORD, n: DWORD, m: DWORD, s: DWORD . CODE PUBLIC C sum2xDyn sum2xDyn PROC MOV EDX, b MOV EBX, [EDX] XOR EAX, EAX MOV ECX, n JECXZ endl cycle1: PUSH ECX XOR ESI, ESI MOV ECX, m JECXZ endl cycle2: ADD EAX, DWORD PTR [ESI][ESI] ADD ESI, 4 LOOP cycle2 MOV EBX, [EDX+4] POP ECX LOOP cycle1 endl: MOV s, EAX RET sum2xDyn ENDP END
13. Команды обработки строк. Команды обработки строк позволяют работать с последовательностью символов (байт) как с единым целым. В языке Си строка – последовательность символов, оканчивающаяся символом
Для обработки последовательности символов (байт, слов, двойных слов) используются команды-префиксы: · REP – повторять, пока ECX ¹ 0 · REPE/REPZ – повторять, пока ECX ¹ 0 или пока ZF = 1 · REPNE/REPNZ – повторять, пока ECX ¹ 0 или пока ZF = 0 Адрес строки-источника находится в регистре ESI. Адрес строки-приемника находится в регистре EDI. В процессе выполнения строковых команд регистры ESI и EDI автоматически изменяются на длину символа строки в зависимости от флага направления (DF – Direction Flag). Если DF = 0, то значения ESI и EDI увеличиваются (строка обрабатывается слева направо – в сторону больших адресов). Если DF = 1, то значения ESI и EDI уменьшаются (строка обрабатывается справа налево – в сторону меньших адресов). Флаг DF устанавливается и сбрасывается командами STD и CLD Команды пересылки: · MOVSB – копирование строки байтов · MOVSW – копирование строки слов · MOVSD – копирование строки двойных слов Команды сравнения: · CMPSB – сравнение строк байтов · CMPSW – сравнение строк слов · CMPSD – сравнение строк двойных слов Команды поиска (сканирования): · SCASB – сканирование строки байт (сравнение элементов строки с AL) · SCASW – сканирование строки слов (регистр AX) · SCASD – сканирование строки двойных слов (регистр EAX) · Изменяется регистр EDI Команды чтения из строки: · LODSB – чтение байта из строки в AL · LODSW – чтение слова из строки в AX · LODSD – чтение двойного слова из строки в регистр EAX · Изменяется регистр ESI Команды записи в строку: · STOSB – запись байта из регистра AL в элемент строки · STOSW – запись слова из регистра AX в элемент строки · STOSD – запись двойного слова из регистра EAX в элемент строки · Изменяется регистр EDI
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|