Цель работы
Изучение
аппарата макросредств ассемблера и получение навыков разработки и использования
макроопределений.
Лабораторное задание
Разработать программу вычисления таблицы значений
функции y = f (a, b, c, d, e) при изменении одного из ее аргументов в
соответствии с заданной зависимостью. Обеспечить вывод на экран вида
табулируемой функции, значений неизменяемых аргументов и результатов вычислений
в виде пар: “значение варьируемого аргумента – значение функции”.
Методические указания
Значения
всех аргументов, в том числе и начальное значение варьируемого аргумента,
следует задать в программе. Значения варьируемого аргумента, а также
соответствующие значения функции должны быть представлены в виде массивов. Составить
макросы для каждого поддиапазона изменения индекса i, а также для вычисления
значения функции. В программе необходимо использовать макросы общего вида и
специальные макросы.
Для каждого варианта указана изменяемая переменная
(ai, bi, ci, di или ei)
как функция индекса i. Вид этой функции различен для разных поддиапазонов
изменения индекса i (1..5, 6..10):
Изм-ая
перем-я |
i=1…5
|
i=6…10
|
bi
|
8-(i+2)
|
3*(i-1)
|
.
Листинг
Asm6.cpp
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define one_five\
_asm mov
edx, i\
_asm add
edx, 2\
_asm mov
ebx, 8\
_asm sub
ebx, edx
//8-(i+2)
#define six_ten\
_asm mov
eax, i\
_asm sub
eax, 1\
_asm imul
eax, 3\
_asm mov
ebx, eax
//3*(i-1)
#define myfunc\
_asm mov
eax, a\
_asm add
eax, b\
_asm cdq\
_asm idiv
c\
_asm imul
eax, d\
_asm sub
eax, e
// y=(a+b)/c*d-e
void main()
{
struct table
{
char rezultat;
char k;
char num;
};
int a=2,
b, c=1, d=3, e=2, f;
int i=1;
table nom [10];
memset(nom, 0, sizeof(nom));
_asm
{
lea edi, nom
mov ecx,i
for_loop:
mov ebx, b
mov edx,0
cmp ecx, 5
ja lbl
one_five
jmp lbl2
lbl:
six_ten
lbl2:
mov b, ebx
myfunc
mov [edi], al
mov [edi + 1], bl
mov [edi + 2], cl
add edi, 3
inc ecx
mov i,ecx
cmp i,11
jnz for_loop
}
printf("+--------------+----+---+\n");
printf("| y | b
| # |\n");
printf("+--------------+----+---+\n");
for (i=0;
i<10; i++)
{
printf("%8d %9d %4d\n",nom[i].rezultat,nom[i].k,nom[i].num);
}
getch();
}
Результат работы
программы
Комментариев нет:
Отправить комментарий