Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
SM: Приклад оформлення звіту.
Практична робота №5 .
Обчислення цілочисельних виразів
Мета роботи:оволодіти навиками програмування обчислювального процесу лінійної структури з використанням арифметичних операцій на мові Асемблер.
Порядок виконання роботи
Завдання для виконання. Варіант №39.
(25/c-d + 2)/(d + a*a-l)
Розробка алгоритму.
Алгоритм розвязання задачі лінійний. Обчислення почнемо із знаменника. Потім обчислимо чисельник. Через те, що в знаменнику використовується операція множення а*а, 8-бітове число d необхідно розширити до слова (16 біт), щоб не втратити старшу частину добутку. Таким чином, знаменник виходить завдовжки 16 біт, значить, чисельник має бути 32-бітовим. Результат обчислення арифметичного виразу буде 16-бітовий.
Визначення змінних програми
Для розвязання задачи нам знадобляться змінні для представлення кожного параметра формул - а,c,d і для представлення результату - result. Крім того, доведеться ввести додаткові змінні znamen і chisl для зберігання проміжних результатів: знаменника і чисельника. Вони необхідні для відладки програми.
Початкові дані мають розмір 1 байт. Виділимо під змінні а, с, d по 2 байти для наочності. Літера „с” зарезервоване слово. Тому, число с будемо зберігати в змінній с1.
Текст програми на мові Асемблер
include irvine32.inc
.data
a byte 1,0
c1 byte -1,0
d byte 255,0
chisl word ?
znamen word ?
result word ?
.code
main proc
;-------------------- знаменатель
mov eax,0
mov al,a
imul al ; результат в ax
mov bx,ax
mov al,d
cbw
add ax,bx ; d=a*a
dec ax
mov znamen,ax
;---------------------числитель
mov ax,25
idiv c1 ; результат в al
sub al,d
add al,2
cbw
mov chisl,ax
;--------------------- результат
cwd
idiv znamen
mov result,ax
exit
main endp
end main
Текст програми на мові Сі
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char a,c,d;
short int znamen, chisl, result;
int temp;
char otv;
do
{
//----------------------------------------ввод данных---------
cout<<"Введите a: ";
cin>>temp;
a=temp;
cout<<"Введите c: ";
cin>>temp;
c=temp;
cout<<"Введите d: ";
cin>>temp;
d=temp;
//----------------------------------------вывод данных---------
cout<<"\nВы ввели:\n";
cout<<"\ta\t:"<<dec<<(short int)a<<"\t"<<hex<<(short int)a<<endl;
cout<<"\tc\t:"<<dec<<(short int)c<<"\t"<<hex<<(short int)c<<endl;
cout<<"\td\t:"<<dec<<(short int)d<<"\t"<<hex<<(short int)d<<endl;
//---------------------------------------------------------------
znamen=d+a*a-1;
chisl=25/c-d+2;
result=chisl/znamen;
//----------------------------------------вывод результата---------
cout<<"\nРезультат:\n";
cout<<"\tchisl \t: "<<dec<<chisl<<"\t"<<hex<<chisl<<endl;
cout<<"\tznamen \t: "<<dec<<znamen<<"\t"<<hex<<znamen<<endl;
cout<<"\tresult \t: "<<dec<<result<<"\t"<<hex<<result<<endl;
cout<<endl<<endl;
cout<<endl<<endl;
cout<<"Продолжить? ";
cin>>otv;
} while (otv=='y');
system("pause");
}
Відладка програми
При відладці програми можна перевіряти правильність виконання деяких важливих операції. Результати таклих операції виводяться на екран.
Введите a: 0 Введите c: 1 Введите d: 0 Вы ввели: a : 0 0 c : 1 1 d : 0 0 Результат: chisl : 27 1b znamen : -1 ffff result : -27 ffe5 |
Введите a: 127 Введите c: -1 Введите d: -128 Вы ввели: a : 127 7f c : -1 ffff d : -128 ff80 Результат: chisl : 105 69 znamen : 16000 3e80 result : 0 0 |
Введите a: 0 Введите c: -1 Введите d: 127 Вы ввели: a : 0 0 c : -1 ffff d : 127 7f Результат: chisl : -150 ff6a znamen : 126 7e result : -1 ffff |
Введите a: 1 Введите c: -1 Введите d: 255 Вы ввели: a : 1 1 c : -1 ffff d : -1 ffff Результат: znamen : -1 ffff chisl : -22 ffea result : 22 16 |
Висновки.
За результатами тестування Асемблер і С++ працюють нормально.
У 4-му варіанті тестування результат невірний - знакове число 255 не поміщається в коміку памяті розміром 1 байт.
Для беззнакового формата:
char a,c,d;
unsigned short int znamen, chisl, result;
unsigned short int temp;
char otv;
…
//----------------------------------------вывод данных---------
cout<<"\nВы ввели:\n";
cout<<"\ta\t:"<<dec<<(unsigned short int)a<<"\t"<<hex<<(unsigned short int)a<<endl;
cout<<"\tc\t:"<<dec<<(unsigned short int)c<<"\t"<<hex<<(unsigned short int)c<<endl;
cout<<"\td\t:"<<dec<<(unsigned short int)d<<"\t"<<hex<<(unsigned short int)d<<endl;
…
Введите a: 0 Введите c: 1 Введите d: 0 Вы ввели: a : 0 0 c : 1 1 d : 0 0 Результат: chisl : 27 1b znamen : -1 ffff result : -27 ffe5 |
Введите a: 127 Введите c: 1 Введите d: 255 Вы ввели: a :127 7f c :1 1 d :65535 ffff Результат: chisl : 28 1c znamen : 16127 3eff result : 0 0 Компилятор выполнил преобразование неправильно!!! |
Введите a: 128 Введите c: 127 Введите d: 126 Вы ввели: a :65408 ff80 c :127 7f d :126 7e Результат: chisl : 65412 ff84 znamen : 16509 407d result : 3 3 |
Перевірити, чи правильно ці віріанти працюють на Асемблері. Зробити висновки.
PAGE 4
DATE \@ "M/d/yyyy" 12/6/2012