Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 01.10.2013
Сообщений: 20

Неправильно считается выражение

03.07.2014, 02:58. Показов 774. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, есть программа вычисляющая выражение (2*c/a – d[i]*d[i]) / (d[i] + a – 1), в программе ошибка, а именно идет не правильный подсчет вот здесь:
Assembler
1
2
3
4
5
6
7
8
9
10
11
funk2 proc near              ;расчет p(+)
         mov AL, c           ;AL=c
         mov BL, 2           ;BL=2
         imul BL             ;AL=c*2
         mov BL, a
         idiv BX             
         mov p, AX           ;p=AL
         mov AX, 0           ;AL=0
         mov BX, 0
         ret 
funk2 endp
Сначала идет умножение, и все нормально, а потом должно идти деление и вот тут то и получается ошибка...где она и как ее решить никак не могу понять...
Вот весь код программы
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
;(2*c/a – d[i]*d[i]) / (d[i] + a – 1)
.model   small
.stack 200h
.data
 
a      db   ?
c      db   ?
 
d      db   4 dup (?, ?, ?, ?)
 
q      dw   ?
p      dw   ?
y      dw   ?
n      dw   ?
k      dw   ?
j      dw   ?
t      dw   4
 
D16 db '0123456789ABCDEF'
BUF db 4 DUP (20h),13,10,'$'
str1  db 'Resultat',13,10,'$'
 
.code
             
funk1 proc near ;расчет q(+)
        mov AL, a ;AL=a
         cbw
         mov j, AX
         mov ax, j
         sub AX, 1 ;AL=AL-1
         mov q, AX ;q=AX
         mov AX, 0 ;AX=0
         ret 
funk1 endp
 
funk2 proc near              ;расчет p(+)
         mov AL, c           ;AL=c
         mov BL, 2           ;BL=2
         imul BL             ;AL=c*2
         mov BL, a
         idiv BX             
         mov p, AX           ;p=AL
         mov AX, 0           ;AL=0
         mov BX, 0
         ret 
funk2 endp  
 
InputInt proc 
        mov ah, 0ah
        xor di, di
        mov dx, offset buff  ; адрес буфера
        int 21h              ; принимаем строку
        mov dl, 0ah
        mov ah, 02
        int 21h 
                                ; выводим перевод строки и обрабатываем  
                                ; содержимое буфера
       mov si, offset buff+2    ; берем адрес начала строки
       cmp byte ptr [si], "-"   ; если первый символ минус                                             
       jnz ii1
       mov di, 1             ; устанавливаем флаг
       inc si                ; и пропускаем его
ii1:   xor ax, ax 
       mov bx, 10            ; основание сc      
             
ii2:   mov cl, [si]          ; берем символ из буфера
       cmp cl, 0dh           ; проверяем не последний ли он      
       jz endin      
                             ; если символ не последний, то проверяем его                          
                             ; на правильность
       cmp cl, '0'           ; если введен неверный символ <0
       jl er                                           
       cmp cl, '9'           ; если введен неверный символ >9      
       ja er      
       sub cl, '0'           ; делаем из символа число       
       mul bx                ; умножаем на 10      
       add ax, cx            ; прибавляем к остальным
       inc si                ; указатель на следующий символ      
       jmp ii2               ; повторяем      
er:    mov dx, offset error  ; если была ошибка, то выводим сообщение об  
                             ; этом и выходим                                                                                                                            
       mov ah,09      
       int 21h
       int 20h               ; все символы из буфера обработаны число 
                             ; находится в ax
endin: cmp di,1              ; если установлен флаг, то      
       jnz ii3      
       neg ax                ; делаем число отрицательным      
ii3:   ret 
       error db "incorrect number$"
       buff    db 6,7 Dup(?)                                           
InputInt endp  
 
OutInt proc near             ;=====Процедура вывода
       test ax, ax          ; проверяем число на знак.
       jns oi1                                             
       mov cx, ax            ; eсли оно отрицательное, выведем минус и  
                             ; оставим его модуль
       mov ah, 02h
       mov dl, '-'
       int 21h
       mov ax, cx
       neg ax                                  
oi1:   xor cx, cx            ; количество цифр будем держать в CX
       mov bx, 10            ; основание сс. 10 для десятеричной и т.п.
oi2:   xor dx, dx
       div bx                ; делим число на основание сс, в остатке 
                             ;  получается последняя цифра
       push dx               ; сразу выводить её нельзя, поэтому сохраним 
                             ; её в стэке
       inc cx
                            ; а с частным повторяем то же самое, отделяя
                             ; от него очередную
       test    ax, ax       ; цифру справа, пока не останется ноль, что 
                             ;значит, что дальше
       jnz     oi2           ; слева только нули
 
;========Вывод=========       
        mov ah, 02h
oi3:    pop dx
        add dl, '0'          ; извлекаем очередную цифру, переводим её в 
                             ; символ и выводим
        int 21h
        loop oi3             ; повторим ровно столько раз, сколько цифр 
                             ; насчитали
        ret     
OutInt endp  
 
Begin:
       mov ax, @Data
       mov ds, ax
             
       call InputInt       ; ввод числа а
       mov a, AL
       call InputInt       ; ввод числа с
       mov c, AL
 
       mov SI, 0           ; ввод массива
       push SI
l1:    call InputInt
       pop SI
       mov d[SI], AL
       add SI, 1
       cmp SI, t
       push SI
       jne    l1
 
       call funk1          ;вызов funk1 
       call funk2          ;вызов funk2
       
       mov   SI, 0
       mov   CX, 4
       mov   y, 0
       mov   AX, 0
 
per:   mov AL,d[SI]
       cbw
       mov j, ax
       mov BX, j
       mov al, d[SI]
       cbw
       imul BX
       mov n, AX
       mov AL, d[si]
       mov BX, q
       cbw
       add AX, BX
       mov k, AX 
       mov AX, n
       mov BX, p
       sub BX, AX          ;AL=AL-d[SI]
       mov AX, BX
       cwd
       idiv k              ;AL=AL/q
       add y, AX           ;y=y+AX
       add SI, 1           ;SI=SI+1
       loop per            ;безусловный переход к per
             
       mov CX, 0
       LEA  BX, D16      
       mov  AX, y
       mov  DX, AX          ;DX:=AX
 
       call OutInt
 
       mov   AX,4c00h
       int     21h
end   Begin
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.07.2014, 02:58
Ответы с готовыми решениями:

Неправильно считается выражение
Здравствуйте! Отличаются результаты вычислений в С++ и маткаде. При исходных данных a=0.5 b=2.9 x=0.3 в С++ получается 0.784731. А в...

Арифметическое выражение считается неправильно
Столкнулся с проблемой, что значение выражения считается не правильно, если кто может, подскажите что не так. Код программы: int...

Почему неправильно считается простое математическое выражение?
Всем привет. Вопрос будет очень банальным: я правильно записал выражение? double R = (2 * Math.Pow(a, 3) - 9 * a * b + 27 * c) / 54; ....

2
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
03.07.2014, 10:01
попробуйте перед делением обнулить регистр:
Assembler
1
2
3
4
5
6
7
         imul BL             ;AL=c*2
 
         xor BX, BX         ; обнуляем регистр bx
 
         mov BL, a
         idiv BX             
...
p.s. извините, не проверял, просто предположение...

Добавлено через 6 минут
а ещё я бы
Assembler
1
2
error db "incorrect number$"
buff  db 6,7 Dup(?)
перенёс в секцию данных!!
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
.data
 
a      db   ?
c      db   ?
 
d      db   4 dup (?, ?, ?, ?)
 
q      dw   ?
p      dw   ?
y      dw   ?
n      dw   ?
k      dw   ?
j      dw   ?
t      dw   4
 
error db "incorrect number$"
buff  db 6,7 Dup(?)                                           
 
 
D16 db '0123456789ABCDEF'
BUF db 4 DUP (20h),13,10,'$'
str1  db 'Resultat',13,10,'$'
 
.code
.............
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
03.07.2014, 10:39
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
;(2*c/a – d[i]*d[i]) / (d[i] + a – 1)
mov cl,d[si]
add cl,a
dec cl;CL=d[i] + a – 1
mov al,d[si]
imul al;AX=d[i]*d[i]
mov bx,ax
mov al,c
cbw; AX=c
add ax,ax;AX=2*c
idiv a
cbw; AX=2*c/a
sub ax,bx; AX=2*c/a – d[i]*d[i]
idiv cl;AL=(2*c/a – d[i]*d[i]) / (d[i] + a – 1)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.07.2014, 10:39
Помогаю со студенческими работами здесь

Неправильно считается выражение со степенью и выходит неправильный ответ
Здравствуйте. Пожалуйста, подскажите, где ошибка в программе. Неправильно считается выражение со степенью и выходит неправильный ответ. ...

Считается неправильно, почему?
Подскажите пожалуйста! я перемножаю числа которые находятся в текст боксах, для этого написал формулу : Text15.Text =...

Неправильно считается факториал
Условие. Дан числовой ряд и некоторое число e. Найти суму тех членов ряда, модуль которых больше или равняется заданному числу e, если...

Неправильно считается факториал
Добрый день,написал рекрсивную функцию. function fact(n:integer):integer; begin if n &lt; 1 then result := 0 else if n = 1...

Неправильно считается факториал
Добрый день,написал рекрсивную функцию. function fact(n:integer):integer; begin if n &lt; 1 then result := 0 else if n = 1...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 11.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru