Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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. Команды обработки строк.

Команды обработки строк позволяют работать с последовательностью символов (байт) как с единым целым. В языке Си строка – последовательность символов, оканчивающаяся символом
с кодом ноль «\0». Нулевой символ не входит в строку. Для Ассемблера содержимое строки не имеет значения, главное – длина символа. Длина символа равна байту, слову или двойному слову.

Для обработки последовательности символов (байт, слов, двойных слов) используются команды-префиксы:

· 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...