Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы_сиппо.doc
Скачиваний:
18
Добавлен:
22.04.2019
Размер:
230.91 Кб
Скачать

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