Вы находитесь на странице: 1из 5

Отчет по практической работе №19

Организация циклов на ассемблере в среде Visual Studio


Цель: Научиться работать в среде Visual Studio с программами на
ассемблере.
Индивидуальные задания
1. Вычислить произведение квадратов чисел натурального ряда от 1 до N.
Данные для проверки: N=3
Ответ: 36
#include "stdafx.h"
#include <iostream>
using namespace std;

// 1. Вычислить произведение квадратов чисел натурального ряда от 1 до N


int main()
{
setlocale(0, "rus");
int n;
cout << "Введите n: "; cin >> n;

_asm
{
FOR_START: // начало
mov edx, 1; // I = 1; инициализация счетчика
mov ecx, n; // N
mov ebx, 1;
FOR_LOOP: // метка цикла

//тело цикла//
mov eax, edx;
imul eax, eax;
imul ebx, eax;
//тело цикла//

add edx, 1; // I = I + l; увеличиваем счетчик


cmp edx, ecx; // IF I <= N THEN; проверяем счетчик
jna FOR_LOOP; // GOTO FOR_LOOP; переходим на начало цикла или
выходим из цикла
FOR_FINISH: // конец цикла
mov n, ebx;

cout << n << endl;


system("pause");
return false;
}

Лист
АТПР.090201.18.116
5
Изм Лист № документа Подпись Дата
2. Вычислить сумму чисел для заданного М
2+4+6+…+(2М)
Данные для проверки: М=4
Ответ: 20
#include "stdafx.h"
#include <iostream>
using namespace std;

// 2. Вычислить сумму чисел для заданного М


// 2 + 4 + 6 + … + (2М)

int main()
{
setlocale(0, "rus");
int m;
cout << "Введите m: "; cin >> m;

_asm
{
FOR_START: // начало
mov edx, 2; // I = 2; инициализация счетчика
mov ecx, m;
mov eax, 0;
imul ecx, 2; // M
FOR_LOOP: // метка цикла

//тело цикла//
mov ebx, edx;
add eax, ebx;
//тело цикла//

add edx, 2; // I = I + 2; увеличиваем счетчик


cmp edx, ecx; // IF I <= M THEN; проверяем счетчик
jna FOR_LOOP; // GOTO FOR_LOOP; переходим на начало цикла или
выходим из цикла
FOR_FINISH: // конец цикла
mov m, eax;

cout << m << endl;


system("pause");
return false;
}

Лист
АТПР.090201.18.116
5
Изм Лист № документа Подпись Дата
3. Вычислить произведение чисел для заданного М
3*5*7*…*(2М+1)
Данные для проверки: М=3
Ответ: 105
#include "stdafx.h"
#include <iostream>
using namespace std;

// 3. Вычислить произведение чисел для заданного М


// 3 * 5 * 7 * …*(2М + 1)

int main()
{
setlocale(0, "rus");
int m;
cout << "Введите m: "; cin >> m;

_asm
{
FOR_START: // начало
mov edx, 0; // I = 0; инициализация счетчика
mov ecx, m;
mov eax, 1; // p = 1;
FOR_LOOP: // метка цикла

//тело цикла//
mov ebx, edx;
imul ebx, 2;
add ebx, 1;
imul eax, ebx; // p=p*(2*i+1);
//тело цикла//

add edx, 1; // I = I + 1; увеличиваем счетчик


cmp edx, ecx; // IF I <= M THEN; проверяем счетчик
jna FOR_LOOP; // GOTO FOR_LOOP; переходим на начало цикла или
выходим из цикла
FOR_FINISH: // конец цикла
mov m, eax;

}
cout << m << endl;
system("pause");
return false;
}

Лист
АТПР.090201.18.116
5
Изм Лист № документа Подпись Дата
4. Вычислить произведение только четных чисел натурального ряда от 1 до
заданного N (использовать DWORD).
Данные для проверки: N=7
Ответ: 48
#include "stdafx.h"
#include <iostream>
using namespace std;

// 4. Вычислить произведение только четных чисел натурального ряда от 1 до заданного N

int main()
{
setlocale(0, "rus");
int n;
cout << "Введите n: "; cin >> n;

_asm
{
FOR_START: // начало
mov edx, 1; // I = 1; инициализация счетчика
mov eax, 1;
mov ecx, n;
FOR_LOOP: // метка цикла

//тело цикла//

test edx, 1 // проверка на четность


jnz _Odd; // нечетное, переход на метку Odd
jz _Even; // четное, переход на метку Even

_Even: // четное число


imul eax, edx;
_Odd: // нечетное число - продолжаем цикл

//тело цикла//

add edx, 1; // I = I + 1; увеличиваем счетчик


cmp edx, ecx; // IF I <= N THEN; проверяем счетчик
jna FOR_LOOP; // GOTO FOR_LOOP; переходим на начало цикла или
выходим из цикла
FOR_FINISH: // конец цикла
mov n, eax;

Лист
АТПР.090201.18.116
5
Изм Лист № документа Подпись Дата
cout << n << endl;
system("pause");
return false;
}

Вывод: Мы освоили приемы работы с циклами в ассемблере.

Лист
АТПР.090201.18.116
5
Изм Лист № документа Подпись Дата