Цель работы
Изучение языковых средств и принципов организации циклов на
ассемблере, приобретение навыков программирования циклической обработки
массивов данных.
Лабораторное задание
Разработать программу вычисления таблицы значений функции
y = f( a, b, c, d, e) при изменении одного из аргументов с постоянным шагом h. Вычислить n значений функции.
y = f( a, b, c, d, e) при изменении одного из аргументов с постоянным шагом h. Вычислить n значений функции.
Варианты
заданий: Для
каждого варианта указан номер, под которым f приведена в описании к работе 1, варьируемый аргумент (a, b, c, d, e), способ представления
результата (1, 2, 3, 4) и формат данных (байт – b, слово - w):
Вариант
5:
5) 35 e 1 w
35) y=(a+b)/c-d*e
1) в виде одного массива,
содержащего n троек
значений “порядковый номер – аргумент - функция”;
Листинг
asm3.cpp
#include "stdio.h"
#include "conio.h"
short a,b,c,y,num,j;
char d,e,h;
struct troyka
{
short i;
char arg;
short func;
};
troyka
mass[5];
void main(){
_asm {
push
eax;
push
ecx;
push
ebx;
push
edx;
mov
a,1;
mov
b,1;
mov
c,1;
mov
d,1;
mov
e,7;
mov
num,6;
mov
cx,5; счетчик цикла
mov
h,2; шаг аргумента
lea
edx,mass
mov
num,0
for_begin:
push
edx
add
num,1
mov
ax,a; ax=a=1 //y=(a+b)/c-d*e
add
ax,b; ax=ax+b=1+1=2
cwd;
idiv c; ax=dx:ax/c=2/1, остаток
в dx
push cx
mov
cx,ax
mov
al,d;
imul
e; умножаем
al=d*e, результат в ax
sub cx,ax
mov
ax,cx
pop
cx
mov bl,e
pop edx
push
cx
mov
cx,num
mov
[edx+0],cx; кладем
номер
mov [edx+2],bl; кладем аргумент
mov [edx+4],ax; кладем функцию
pop cx;
sub bl,h;
изменяем
mov e,bl;
переменную е на 2
add edx,6;
переход к след. эл-ту массива
loop for_begin;
pop
edx;
pop
eax;
pop
ecx;
pop
ebx;
}
printf(" +--+-------+-------+\n");
for (j=0;j<5;j++)
{
printf(" |%2d| %5d | %5d |\n", mass[j].i,
mass[j].arg, mass[j].func);
printf(" +--+-------+-------+\n");
}
_getch();
}
Схема программы
Результат работы
программы
Комментариев нет:
Отправить комментарий