Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.61 Mб
Скачать

Завдання №4

Тема: Робота із стеком.

Мета роботи: Вивчити команди для роботи із стеком.

Обладнання: ПЕОМ, OC Windows,C++ Builder

Хід виконання роботи

Завдання. Застосовуючи непряму адресацію здійснити обмін даних між регістрами EDI та ЕАХ.

Текст програми:Нижче наведено листінг програми яка ілюструє роботу із стеком, виводячи на екран літери А - Z. Знайдіть помилку.

Початковий варіант:

#include<vcl.h>

#pragma hdrstop

#include<iostream.h>

#pragma argsused

Int main(int argc, char* argv[])

{

Char letter='A';

Char stop='Z';

start:

asm

{

Mov ah, letter

Mov al, stop

Cmp aс, al

Jle print

Jmp exit

}

print:

cout<<letter;

letter++;

cout<<"";

goto start;

exit:

cout<<"r";

cin>>"r";

return 0;

}

Модифікована програма:

#include <vcl.h>

#include <iostream.h>

using namespace std;

int a,b,c,e; // объявляем переменные

int main(int argc, char* argv[])

{

// объявляем инициализируем переменные типа char

char letter='A';

char stop='Z';

start:

// ассемблерный код

__asm

{

mov ah, letter // переносим значение из переменной letter в регистр ah

mov al, stop // переносим значение из переменной stop в регистр al

cmp ah, al // сравниваем значения из регистров ah и al

jle print // если <= печатаем

jmp exit // метка на выход

}

print:

cout<<letter; // выводим букву

letter++; //увеличиваем значение переменной letter на 1

cout<<"";

goto start; // переходим на start

exit:

cout<<"r";// вывод r

cin.get();

return 0;

}

Результат роботи програми показано на рис. 4.1.

Рис 4.1.

Висновок: У цьому завданні були здобуті навички роботи зі стеком у Assembler.

Завдання №5

Тема: Маніпуляція над бітами

Мета роботи: Вивчити команди для роботи з бітами. Навчитися писати програми для роботи з окремими бітами на мові програмувати асемблер.

Обладнання: ПЕОМ, OC Windows,C++ Builder

Хід виконання роботи

Завдання. Підраховуємо значення виразу b/3+a*4

а=50; b=900

Текст програми:

#include "stdafx.h"

#include <windows.h>

#include <conio.h>

#include <stdio.h>

DWORD a,b,c;

int main ()

{

a=50; b=900;

__asm

{

MOV EAX,b

SHR EAX,3 //обчислюємо b/8

MOV c, EAX

SHL EAX,1 //обчислюємо b/8*2

ADD EAX, c //обчислюємо b/4+b/8

ADD EAX, b //обчислюємо b*3/8+b

SHR EAX, 2 //обчислюємо (b*3/8+b)/4

SHL a,2 //обчислюємо a*4

ADD EAX, a //обчислюємо b/3+a*4

MOV c, EAX

}

printf ("%d", c);

getch( );

return 0;

}

Результат на Рис. 5.1. Рис. 5.1.

Висновок: У цьому завданні були здобуті навички маніпуляції з бітами у Assembler.

Завдання №6

Тема: Операції з рядками

Мета роботи: Вивчити команди асемблера для роботи з рядками. Навчитися виконувати на асемблері операції над ланцюжками байтів.

Обладнання: ПЕОМ, OC Windows,C++ Builder

Хід виконання роботи

Завдання. Використовуючи команди для роботи з рядками визначити довжину рядка який складається з прізвища та ім’я студента вашої групи.

Текст програми:

#include "stdafx.h"

#include <windows.h>

#include <conio.h>

#include <stdio.h>

#include <iostream>

using namespace std;

DWORD l=0;

DWORD lens (char * s)

{

_asm

{

CLD //задати напрям сканування (скинути прапор DF)

MOV EDI, s //адреса рядка в EDI

MOV ESI, EDI //запам'ятати початок рядка

//довжина рядка обмежується максимальним 32-бітовим числом

MOV ECX, 0FFFFFFFFH

//шукатимемо 0

XOR AL, AL

//сканувати, поки не зустрівся 0

REPNE SCASB

//довжина рядка в EDI

SUB EDI, ESI

//виключити з довжини термінальний символ

DEC EDI

MOV l, EDI

}

return l;

}

//рядок-буфер

char c [] ="Vakhmistrov Nick";

int main ( )

{

lens(c);

cout<<l;

getch();

Рис. 6.1

return 0;} Результат на Рис. 6.1.

Висновок: У цьому завданні були здобуті навички роботи операцій з рядками у Assembler.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]