Лабораторная работа по ассемблеру макросы

Цель работы

 Изучение аппарата макросредств ассемблера и получение навыков разработки и использования макроопределений.

Лабораторное задание

Разработать программу вычисления таблицы значений функции 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();
}


Результат работы программы

Комментариев нет:

Отправить комментарий