Вычисление по формулам значений 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д