Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler: математика, вычисления

Войти
Регистрация
Восстановить пароль
 
Nastia_01203
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 113
#1

Квадратное уравнение - Assembler/TASM

20.05.2018, 20:23. Просмотров 182. Ответов 10
Метки нет (Все метки)

Здравствуйте! Вот код для решения квадратного уравнения.
Компилируется, но никакой результат не выводится.
Как думаете, в чем проблема?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
.286
.model    small
.data
 
    a    dd    2.0
    b    dd    4.0
    c    dd    2.0
    D    dd    ?
 
    mes1    db    'No roots! $'
 
    temp    dd    4.0
    temp2    dd    2.0
 
.stack    256h
.code
 
;Main PROC
main    proc
 
    push    @data
    pop    ds
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
    finit
 
; discriminante
; C++:
; D = sqr(b)-4*a*c
 
    fld    b
    fmul    b    
    fld    a
    fld    temp
 
    fmul
    fld    c
    fmul
    fsubp    st(1),st(0)
    fst    D
    
; <=>
    ftst
 
    fstsw    ax
    sahf
 
    jc    j1
    jz    j2
 
; D > 0
; X1 = (-b-sqrt(D))/(2*a)
; X2 = (-b+sqrt(D))/(2*a)
 
    finit
    
    fld    temp2
    fmul    a
    fld    D
    fsqrt
    fld    b
    fchs
 
    fsave    temp2[4]
    frstor    temp2[4]
 
    fsubr
    fdivr    ; first root
    
    frstor    temp2[4]
 
    fadd
    fdivr    ; second root
 
    jmp    ex
 
; D < 0
; !no roots!
 
j1:    mov    ah,    09h
    mov    dx,    offset mes1
    int    21h
    jmp    ex
 
; D = 0
; X = -b/(2*a)
 
j2:    finit
    fld    temp2
    fmul    a
    fld    b
    fdivr
    fchs    ; root
    
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ex:    mov    ax,    04C00h
    int    21h
 
main    endp
;end of main
 
end    main
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2018, 20:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос TASM Квадратное уравнение (Assembler):

Решить квадратное уравнение - Assembler
Помогите решить задачу пожалуйста, без решения этой задачи мне никак: Решить квадратное уравнение. Спасибо заранее...

Создать производные классы линейное уравнение и квадратное уравнение, в которых данная функция переопределена - C++
Создать абстрактный базовый класс уравнение с виртуальной функцией - корни уравнения. Создать производные классы линейное уравнение и...

Квадратное уравнение - C++
Решил немного попрактиковаться и написать програмку для решения квадратных уравнений. И у меня вопрос - поддерживает ли С++ комплексные...

Квадратное уравнение - C++
Пишет ошибку &quot;тип &quot;double&quot; не требуется&quot; и &quot;d: необъявленный идентификатор&quot;, помогите разобраться плз #include &quot;stdafx.h&quot; #include...

Квадратное уравнение - Delphi
Дано квадратное уравнение.Определите, чему равен дискриминант,являются ли корни действительными числами, посчитайте корни, выведите...

Квадратное уравнение - C++
Хотел написать программу которая решает квадратное уравнение.Выдает две ошибки. #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include...

10
ФедосеевПавел
Модератор
3253 / 1863 / 752
Регистрация: 01.02.2015
Сообщений: 6,384
20.05.2018, 23:14 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Наверное, в отсутствии вывода.
Смотрите тему и берите из неё готовую процедуру
Ввод и вывод чисел в различных системах счисления
1
Nastia_01203
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 113
20.05.2018, 23:19  [ТС] #3
Спасибо за ссылку) к сожалению, у меня не получилось правильно все сделать ...
0
ФедосеевПавел
Модератор
3253 / 1863 / 752
Регистрация: 01.02.2015
Сообщений: 6,384
20.05.2018, 23:22 #4
Покажите, как получилось.
0
Nastia_01203
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 113
20.05.2018, 23:26  [ТС] #5
не хочется глупости сюда загружать
0
ФедосеевПавел
Модератор
3253 / 1863 / 752
Регистрация: 01.02.2015
Сообщений: 6,384
20.05.2018, 23:29 #6
Ну ладно, тогда я - спать.
Думал по-быстрому поправить ошибку при вызове готовой рабочей (и проверенной буквально вчера) процедуры, а не разбираться во всей программе.
0
Nastia_01203
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 113
20.05.2018, 23:31  [ТС] #7
спасибо за попытку помочь...)
у меня не получается разобраться
0
ФедосеевПавел
Модератор
3253 / 1863 / 752
Регистрация: 01.02.2015
Сообщений: 6,384
21.05.2018, 21:57 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Смотрите, в этой теме я применил готовую процедуру для вывода
Используя разложение в ряд Тейлора найти значение sh(x) с заданной точностью
Разберитесь и попробуйте воспользоваться.

Добавлено через 22 часа 16 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
.286
.model    small
.data
 
    a    dd    2.0
    b    dd    4.0
    c    dd    0.3
 
    x1   dd    ?
    x2   dd    ?
 
    mes0    db    'No roots! $'
    mes1    db    'x1= $'
    mes2    db    13,10,'x2= $'
 
    Roots   dw ?
 
    Flags   dw ?
.stack    256h
.code
 
;Main PROC
main    proc
 
    push    @data
    pop    ds
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
    mov [Roots], 0
    finit
 
; discriminante
; C++:
; D = sqr(b)-4*a*c
    fld [b]             ;b^2
    fmul st(0), st(0)
 
    fld [a]             ;4*a*c
    fmul [c]
    fadd st(0), st(0)
    fadd st(0), st(0)
 
    fsubp st(1), st(0)  ;b^2-4*a*c
 
    ftst
    fstsw    ax
    sahf
 
    jc    j1
    jz    j2
 
; D > 0
; X1 = (-b-sqrt(D))/(2*a)
; X2 = (-b+sqrt(D))/(2*a)
 
    mov [Roots], 2
    fsqrt
    fld [a]
    fadd st(0), st(0)
    fld [b]
    fchs
    fsub st(0), st(2)
    fdiv st(0), st(1)
    fstp [x1]
    fld [b]
    fchs
    fadd st(0), st(2)
    fdiv st(0), st(1)
    fstp [x2]
 
    mov    ah,    09h
    mov    dx,    offset mes1
    int    21h
 
    fninit
    fld     [x1]
    mov     ax,     5
    push    ax
    call    OutFloat
 
    mov    ah,    09h
    mov    dx,    offset mes2
    int    21h
    fld     [x2]
    mov     ax,     5
    push    ax
    call    OutFloat
 
    jmp    ex
 
; D < 0
; !no roots!
 
j1:
    mov    [Roots], 0
    mov    ah,    09h
    mov    dx,    offset mes0
    int    21h
    jmp    ex
 
; D = 0
; X = -b/(2*a)
 
j2:
    mov    [Roots], 1
    fld [a]
    faddp st(1), st(0)
    fld [b]
    fchs
    fdiv st(0), st(1)
    fstp [x1]
 
    mov    ah,    09h
    mov    dx,    offset mes1
    int    21h
    fninit
    fld     [x1]
    mov     ax,     5
    push    ax
    call    OutFloat
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ex:
    mov    ax,    04C00h
    int    21h
 
main    endp
;end of main
 
; Вывод вещественного числа
; аргумент - количество цифр дробной части
length_frac     equ     [bp+4]
; локальные переменные
ten     equ word ptr [bp-2]
temp    equ word ptr [bp-4]
 
OutFloat proc   near
        enter   4, 0            ; пролог - выделим в кадре стека 4 байта под локальные переменные
        mov     ten, 10
        ftst                    ; определяем знак числа
        fstsw   [Flags]
        mov     ax,     [Flags]
        sahf
        jnc     @positiv
        mov     al, '-'         ; если число отрицательное - выводим минус
        int     29h
        fchs                    ; и получаем модуль числа
@positiv:
        fld1                    ; загружаем единицу
        fld     st(1)           ; копируем число на вершину стека
        fprem                   ; выделим дробную часть
        fsub    st(2), st       ; отнимем ее от числа - получим целую часть
        fxch    st(2)           ; меняем местами целую и дробную части
        xor     cx, cx          ; обнуляем счетчик
; далее идет стандартный алгоритм вывода целого числа на экран
@1:
        fidiv   ten             ; делим целую часть на десять
        fxch    st(1)           ; обменяем местами st и st(1) для команды fprem
        fld     st(1)           ; копируем результат на вершину стека
        fprem                   ; выделим дробную часть (цифру справа от целой части)
        fsub    st(2), st       ; получим целую часть
        fimul   ten             ; *10
        fistp   temp            ; получаем очередную цифру
        push    temp            ; заталкиваем ее глубже в стек
        inc     cx              ; и увеличим счетчик
        fxch    st(1)           ; подготовим стек к следующему шагу цикла (полученное частное на вершину, в st(1) - 1)
        ftst                    ; проверим не получили ли в частном 0?
        fstsw   [Flags]
        mov     ax,     [Flags]
        sahf
        jnz     @1              ; нет - продолжим цикл
@2:                             ; извлекаем очередную цифру, переводим её в символ и выводим.
        pop     ax
        add     al, '0'
        int     29h
        loop    @2
; далее то же самое, только для дробной части. Алгоритм похож на вывод целого числа, только вместо деления умножение и проход по числу слева
        fstp    st              ; сначала проверим, есть ли дробная часть
        fxch    st(1)
        ftst
        fstsw   [Flags]
        mov     ax,     [Flags]
        sahf
        jz      @quit           ; дробная часть отсутствует
        mov     al, '.'
        int     29h             ; если присутствует - выведем точку
        mov     cx, length_frac ; помещаем в счетчик длину дробной части
@3:
        fimul   ten             ; умножим на 10
        fxch    st(1)           ; подготовка для fprem - меняем st и st(1) местами и
        fld     st(1)           ; копируем число на вершину
        fprem                   ; отделим дробную часть от целой
        fsub    st(2), st       ; и оставляем дробную
        fxch    st(2)
        fistp   temp            ; выталкиваем полученное число из стека в temp
        mov     ax, temp        ; по дробной части идем слева, значит число выводим сразу, без предварительного сохранения в стек
        or      al, 30h         ; перевод в ascii
        int     29h             ; на экран
        fxch    st(1)           ; подготовим стек к следующему шагу цикла (полученное частное на вершину, в st(1) - 1)
        ftst
        fstsw   [Flags]
        mov     ax,     [Flags]
        sahf                    ; проверим на 0 остаток дробной части
        loopne  @3
@quit:
        fstp                    ; готово. Чистим стек сопроцессора
        fstp    st
        leave                   ; эпилог
        ret     2
OutFloat endp
 
end    main
1
Nastia_01203
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 113
21.05.2018, 23:08  [ТС] #9
Огромнейшее спасибо))
Очень выручили ))))

Добавлено через 5 минут
правда, в результате показывает ответ на единицу меньше нужного, но не беда)
0
ФедосеевПавел
Модератор
3253 / 1863 / 752
Регистрация: 01.02.2015
Сообщений: 6,384
22.05.2018, 07:28 #10
Нет. Ответ правильный. Я в онлайн решателе квадратных уравнений проверит только что.

Мне не понравился стиль решения и я переделал вычисления. А потом на разных коэффициентах проверял.
Сейчас там не исходные коэффициенты, а другие.
1
Nastia_01203
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 113
22.05.2018, 23:17  [ТС] #11
Благодарю)

конечно, это я заметила)
0
22.05.2018, 23:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2018, 23:17
Привет! Вот еще темы с ответами:

Квадратное уравнение - Free Pascal
Написать программу которая вычисляет корни квадратного уравнения. Коэффициенты вводит пользователь. (Операцию проводить с помощью функции)

Квадратное Уравнение - VB
Написать программу решения квадратное уравнение.

Квадратное уравнение - MathCAD
x^2+3x=0 помогите решить так,чтобы после решения можно было написать х=... и программа сама бы выдавала ответ,заранее спасибо

Квадратное уравнение - Delphi
Прога работает, но не правильно, пишет: 'уравнение не имеет корней' на любое введеное число, помогите исправить. var Form1: TForm1; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru