Завдання №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.
