Вычисление по формулам значений 2х уравнений - Assembler
Формулировка задачи:
Всё просто, ситуация тривиальна но проблематична. Учусь на программиста, второй курс заканчиваю, программируем на языках высокого уровня, C++ C#, Java была не так давно. Проблема в том, что по одному предмету прошлись вскользь по Асемблеру. Препод сам ничего по нему не знает, но нам задал написать простенькие программки на нём, вычисление по формулам значений 2х уравнений. Я написал, но она считает не правильно. Сам не знаком с ассемблером, всё чот писал, нарыл и начитался в сети, прошу помощи, по тому, что задали вчера, а завтра сдавать. С пн сессия и это просто ужас!
Говорю сразу, чётко и ясно, не надо за меня писать задачу, прошу только помочь справить ошибки, если можете
Писал я в NotPad++, через DosBox запускал TASM и через него создавал obj-файл, а после Tlink, после которого появлялись в папке map-файл и exe-шник. Последний открывал через TD в том же DOSbox. Пошагово запускал и смотрел на значения переменных, вроде как считает, но почему-то, если производить те же вычисления на калькуляторе, то они не сходятся и не сходятся прилично.
По этой ссылке, можно скачать архив с папкой TASM, где будут все три exe-шника (tasm.exe, tlink.exe, td.exe) и файл laba.asm, вдруг понадобиться.
А это официальный сайт DOSbox, вдруг у кого-то ещё нет
Код:
Условие:
;условие
; 12*a^2+8*b
; X = -----------;
; 2*c^2-a
;
; (21+a)*x+1
; X = -----------.
; 14-c*b
;a=5; b=3; c=-3;
; Пример для случая когда переменные байты
.model small
.stack 100h
.DATA
a db 5
b db 3
c db -3
x db ?
y db ?
.CODE
;--------------Загрузка адреса сегмента DATA в DS
mov ax,@Data
mov ds,ax
;--------------Начало вычислений
;--------------Расчёт X
mov al, c ;загружаем в аккумулятор переменную c
imul c ;c^2
mov cl, 2 ;загружаем в cl - 2
sal ax, cl ;c^2
sub al, a ;c^2-a
mov bl, al ;перемещаем знаменатель в bl
;------------
mov al, a ;загружаем в al переменную a
imul a ;a^2
mov cl, 12 ;загружаем в cl 12
imul cl ;a^2*12
mov dx, ax ;переносим в dx ax
mov al, b ;загружаем в al переменную b
sal ax, 3 ;b*8
add ax, dx ;12*a^2 + 8*b
cbw ;подготавливаем число к делению
idiv bl ;12*a^2+8*b / 2*c^2-a
mov x, al ;переносим в x значение после деления
;--------------Расчёт Y
mov al, c ;загружаем в аккумулятор переменную c
imul b ;c*b
mov bl, al ;перемещаем знаменатель в bl
mov al, 14 ;загружаем в al - 14
sub al, bl ;14 - c*b
mov bl, al ;перемещаем знаменатель в bl
;------------
mov al, 21 ;загружаем в al - 21
add al, a ;21+a
imul x ;(21+a)*x
inc al ;(21+a)*x + 1
cbw ;подготавливаем число к делению
idiv bl ;(21+a)*x+1 / 12-c*b
mov y, al ;переносим в y значение после деления
;--------------Конец программы
mov ah,4ch ; функция DOS завершения программы ; программы
int 21h ; завершить программу
END
a = 5;
b = 3;
c = -3;
12*a^2+8*b
X = -----------;
2*c^2-a
(21+a)*x+1
X = -----------.
14-c*b
Решение задачи: «Вычисление по формулам значений 2х уравнений»
textual
Листинг программы
model tiny .code org 100h start: mov al,c imul al mov bx,ax shl bx,1; mov al,a cbw sub bx,ax imul al mov cl,12 imul cl xchg ax,cx mov al,b cbw shl ax,3 add ax,cx idiv bx ret a db 5 b db 3 c db -3 end start