Протабулировать функцию в emu8086 - Assembler

Узнай цену своей работы

Формулировка задачи:

Табулирование функции

— это вычисление значений функции при изменении аргумента от некоторого начального значения до некоторого конечного значения с определённым шагом. В общем нужно протабулировать на asm'е функцию которая указана на картинке Нужно чтобы работало в emu8086. На лабораторной работе мы делали что-то подобное, только там, по-моему, выводятся сразу только y и всё в одну строчку. Вот как мы делали (функция тут другая):
name "Lab 2.2"
INCLUDE 'emu8086.inc'
ORG 100h
LEA SI, msg2
CALL print_string
.code
f DW ?
x DW ?
y DW ?
MOV AX, @data
MOV x, 1
MOV y, 1
MOV f, 0
a1: MOV x, 1
IMUL x
MOV BX, 3
XCHG AX, BX
IMUL y
ADD AX, BX
SUB AX, 3
MOV CX, x
XCHG CX, AX
IMUL y
MOV f, AX
; OUTPUT
MOV AX, f
CALL print_num
PRINT ' ';
ADD y, 2
ADD x, 4
CMP y, 20
JB a1
MOV AH, 0
INT 16h
RET
msg1 DB '', 0
msg2 DB 'Tabul funkzii ', 0
DEFINE_SCAN_NUM
DEFINE_PRINT_STRING
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
DEFINE_PTHIS
END
Мне же нужно сделать так же, только для моей функции. И чтобы было 2 колонки x и y. Как ниже на скрине. Я написал аналог нужного на С++:
#include <iostream>
#include <Math>
using namespace std;
 
int main() {
        int y = 2; //любое значение
        cout << "x\tf" << endl;
        for(int x = 10; x >= 5; x--)
                cout << x << "\t" << (7 * pow(x, 2) - 3 * pow(y, 2) + y) << endl;
        system("PAUSE");
        return 0;
}
Значение переменной

y

задаётся в программе программистом. Думаю, задача понятна.. За правильное решение заплачу 100 рублей на Webmoney кошелёк.

Решение задачи: «Протабулировать функцию в emu8086»

textual
Листинг программы
name "for_vovka"
include 'emu8086.inc'
org 100h
lea si, msg2
call print_string;
.code             
 
x dw ?
y dw ?
f dw ?
mov ax, @data
mov dx, ax
mov bx, ax
mov cx, ax
mov x, 10
mov y, 1 
mov f, 0
 
a1: mov ax, x
mul ax
aam
mov bx, 7
mul bx
aam
mov bx, ax
; bx = 7x^2
mov ax, y
mul ax
aam
mov cx, 3
mul cx
aam
mov cx, ax
; cx = 3x^2
mov dx, y 
add dx, bx
aaa
add dx, cx
aaa
; dx = f()
mov f, dx
; 
printn ' '
mov ax, x
call print_num
lea si, msg1
call print_string
mov ax, y
call print_num 
call print_string
mov ax, f
call print_num 
;
 
sub x, 1 
aas
cmp x, 5
jge a1
;
mov ah, 0
int 16h
ret;
msg1 db '  ', 0
msg2 db 'x  y  f', 0
;
DEFINE_SCAN_NUM
DEFINE_PRINT_STRING
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
DEFINE_PTHIS
END

Объяснение кода листинга программы

Вот что получилось:

  1. Переменные: — x — счётчик, используется в основном цикле — y — переменная для хранения результата вычисления — f — переменная для хранения результата вычисления
  2. Выполняемые действия: — Вычисление значения f() — в этом коде оно вычисляется как (7x^2 + 3x^2 + 3) — Вывод на экран значений переменных x, y, f — Уменьшение значения переменной x на единицу — Проверка значения переменной x: если оно равно 5, то выполнение программы завершается — Вывод на экран сообщения об ошибке (если таковая произошла) Этот код выполняет следующие действия:
  3. Задаёт начальное значение для переменных x, y, f.
  4. Переходит к основному циклу.
  5. Вычисляет значение f() — оно равно (7x^2 + 3x^2 + 3).
  6. Выводит на экран значения переменных x, y, f.
  7. Уменьшает значение переменной x на единицу.
  8. Проверяет значение переменной x: если оно равно 5, то выполнение программы завершается.

Оцени полезность:

11   голосов , оценка 3.909 из 5