Лабораторная работа по ассемблеру циклическая программа

Цель работы

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

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

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

}

Схема программы

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


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

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