Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
BoltozaR
0 / 0 / 1
Регистрация: 17.09.2010
Сообщений: 16
#1

Математическая формула на ассемблере - Assembler

17.09.2010, 08:23. Просмотров 2048. Ответов 6
Метки нет (Все метки)

Подскажите пожалуйста, мне надо написать прогу. Точнее описать определённую формулу. Формула такая: (a^2-3b)/4c. Формула впринципе простая но я никак не могу понять как именно писать(я пытался, но считала не правильно). Я представляю алгоритм(наверное) но блин... Можете помоч, написать команды?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2010, 08:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Математическая формула на ассемблере (Assembler):

Математическая задачи
Добрый вечер, нужно помощь в написании 2-х программ. 1 задача С=(А×В)/(А+В)...

Формула треугольной спирали в Ассемблере
Есть формула спирали Архимедова (на картинке) ;------Вычисляем формулу...

Математическая формула
z1=Math.sin(3)*(x-Math.PI/4)/(1/3)+Math.sqrt(Math.cos)*(y+1); почему выдает...

Математическая формула
Как можно написать эту формулу в Delphi??

Математическая формула в си
Нужна помощь! Не могу понять как перевести формулу в Си. Нужно найти f(n) ...

Математическая формула
подскажите как записать выделенную часть формулы в delphi 7.

6
vital792
1997 / 1269 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
17.09.2010, 10:30 #2
че то типа этого
Assembler
1
2
3
4
5
6
7
8
9
10
mov ax, a
mul a
mov bx, ax
mov ax, 3
mul b
sub bx, ax
mov ax, bx
mov bx, c
shl bx, 2
div bx
0
BoltozaR
0 / 0 / 1
Регистрация: 17.09.2010
Сообщений: 16
17.09.2010, 13:31  [ТС] #3
Спасибо, только.... что такое это:
Assembler
1
2
3
mov bx, c
shl bx, 2
div bx   ----- это как я понял мы делим числитель на знаменатель?
и почему нельзя написать так:
Assembler
1
2
3
mov bx, 4
mul c
div bx
0
NNN777
299 / 157 / 62
Регистрация: 27.02.2010
Сообщений: 317
17.09.2010, 14:02 #4
Цитата Сообщение от BoltozaR Посмотреть сообщение
и почему нельзя написать так:
mov bx, 4
mul c
div bx
Потому что
Assembler
1
2
mul c ; ax=ax*c
div bx ; ax=ax/bx
0
kidiam
22 / 22 / 1
Регистрация: 12.07.2010
Сообщений: 42
24.09.2010, 01:13 #5
Не сказал бы что формула проста, если предусматривать все возможные входные значения, то резульат будет в бОльших регистрах. Например при a=max b=0 c=1, то результат будет max*max, результат не поместится в таких же регистрах, то же можно сказать и о знаменателе и остатке.
Если предпологать, что результаты всегда помещаются в такие же по типу значения, то одно из решений будет таким:
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
include 'INCLUDE\win32a.inc'
format PE console
entry start
section '.c' code readable executable
start:
        cinvoke printf, sfmt1
        cinvoke scanf, sfmt2, a
        inc     [dig]
        cinvoke printf, sfmt1
        cinvoke scanf, sfmt2, b
        inc     [dig]
        cinvoke printf, sfmt1
        cinvoke scanf, sfmt2, c
 
        mov     eax, 4          ; 4
        imul    [c]             ; edx:eax <= 4c
        mov     esi, eax        ; Сохраним младшую часть 4c в esi
 
        mov     ebx, eax        ;
        or      ebx, edx        ;
        jz      @err_div0       ; Проверить есть ли деление на 0.
        xor     eax, edx        ; Для простоты делим только
        js      @err_zn         ; на младший регистр, но надо
        inc     edx             ; проверить чтоб в старшем
        cmp     edx, 2          ; разряде небыло значимых бит и
        ja      @err_zn         ; небыло переполнения в младшем
 
        mov     eax, 3
        imul    [b]             ; edx:eax <= 3*b
        mov     ebx, eax
        mov     ecx, edx        ; ecx:ebx <= 3*b
        mov     eax, [a]
        imul    eax             ; edx:eax <= a*a
        sub     eax, ebx
        sbb     edx, ecx        ; edx:eax <= (a*a - 3*b)
 
        cmp     edx, esi        ; Если старшая часть знаменателя,
        jg      @err_ch         ; то будет переполнение
        jne     @todiv          ; если равна, то зависит от младшей
        cmp     eax, esi        ; если младшая >= знаменателя,
        jge     @err_ch         ; то переполнение
 
@todiv: idiv    esi
        mov     [fun], eax
        mov     [ost], edx
 
@print:
        cinvoke printf, sfmt3, [fun], [ost], esi
@end:
        cinvoke system,cmd
        invoke ExitProcess,0
 
@err_zn:
        cinvoke printf, serr1
        jmp     @end
@err_ch:
        cinvoke printf, serr2
        jmp     @end
@err_div0:
        cinvoke printf, serr3
        jmp     @end
 
section '.d' data readable writeable
sfmt1   db      'Input '
dig     db      'a=', 0
sfmt2   db      '%d',0
sfmt3   db      'f=%d %d/%d', 13, 10, 0
serr1   db      'Error denominator too big.', 0
serr2   db      'Error numerator too big.', 0
serr3   db      'Error. Division by zerro.', 0
cmd     db      'pause',0
a       dd      0
b       dd      0
c       dd      0
fun     dd      0
ost     dd      0
 
section '.i' import data readable
 
library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll'
 
import kernel,\
       ExitProcess,'ExitProcess'
 
import msvcrt,\
       scanf,'scanf',\
       printf,'printf',\
       system,'system'
1
semiono
12 / 12 / 0
Регистрация: 14.09.2010
Сообщений: 285
Записей в блоге: 6
24.09.2010, 23:41 #6
А можно такой код немного видоизменить для GUI ? Чего уж тут, раз в windows,
только я сам сломать могу. Впрочем для scanf наверное какие-то поля Edit понадобится...
Не хотелось бы тоже наворачивать GUI лишним контентом.
0
kidiam
22 / 22 / 1
Регистрация: 12.07.2010
Сообщений: 42
25.09.2010, 07:02 #7
Вот и под GUI. (В составе fasm-a есть же примеры под GUI, а подправить - пару функций под WinAPI)
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
format PE GUI 4.0
entry start
 
include 'include\win32a.inc'
ID_FORM = 100
ID_A    = 101
ID_B    = 102
ID_C    = 103
ID_RES  = 104
 
section '.' code readable executable
;------------------------------------
;section '.d' data readable writeable
sfmt1   db      'Input '
dig     db      'a=', 0
sfmt2   db      '%d',0
sfmt3   db      '%d %d/%d', 13, 10, 0
serr1   db      'Error denominator too big.', 0
serr2   db      'Error numerator too big.', 0
serr3   db      'Error. Division by zerro.', 0
cmd     db      'pause',0
 
start:  invoke  GetModuleHandle,0
        invoke  DialogBoxParam,eax,ID_FORM,HWND_DESKTOP,DialogProc,0
        invoke  ExitProcess,0
;-------------------------------
proc DialogProc hwnddlg,msg,wparam,lparam
        push    ebx esi edi
        cmp     [msg],WM_COMMAND
        je      .wmcommand
        cmp     [msg],WM_CLOSE
        je      .wmclose
        xor     eax,eax
        jmp     .finish
 
.wmcommand:
        cmp     [wparam],BN_CLICKED shl 16 + IDCANCEL
        je      .wmclose
        cmp     [wparam],BN_CLICKED shl 16 + IDOK
        jne     .processed
        invoke  GetDlgItemInt,[hwnddlg],ID_A,NULL,TRUE
        mov     [a], eax
        invoke  GetDlgItemInt,[hwnddlg],ID_B,NULL,TRUE
        mov     [b], eax
        invoke  GetDlgItemInt,[hwnddlg],ID_C,NULL,TRUE
        mov     [c], eax
        call    fun1
        invoke  SetDlgItemText,[hwnddlg],ID_RES,str_res,TRUE
        jmp     .processed
 
.wmclose:
      invoke  EndDialog,[hwnddlg],0
.processed:
        mov     eax,1
.finish:
        pop     edi esi ebx
        ret
endp
 
;-------------------------------
proc fun1
        mov     eax, 4          ; 4
        imul    [c]             ; edx:eax <= 4c
        mov     esi, eax        ; Сохраним младшую часть 4c в esi
 
        mov     ebx, eax        ;
        or      ebx, edx        ;
        jz      .err_div0       ; Проверить есть ли деление на 0.
 
        xor     eax, edx        ; Для простоты делим только
        js      .err_zn         ; на младший регистр, но надо
        inc     edx             ; проверить чтоб в старшем
        cmp     edx, 2          ; разряде небыло значимых бит и
        ja      .err_zn         ; небыло переполнения в младшем
 
        mov     eax, 3
        imul    [b]             ; edx:eax <= 3*b
        mov     ebx, eax
        mov     ecx, edx        ; ecx:ebx <= 3*b
        mov     eax, [a]
        imul    eax             ; edx:eax <= a*a
        sub     eax, ebx
        sbb     edx, ecx        ; edx:eax <= (a*a - 3*b)
 
        mov     ebx, esi        ; Проверка на ошибки деления
        sar     ebx, 1          ; ebx - полу-знаменатель
        jns     .abs
        neg     ebx             ; ebx - модуль полу-знаменателя
.abs:   cmp     edx, ebx        ; Если старшая часть числителя >= модуля
        jge     .err_ch         ; полу-знаменателя, то будет переполнение
 
        idiv    esi
        mov     [fun], eax
        mov     [ost], edx
 
        cinvoke sprintf, str_res, sfmt3, [fun], [ost], esi
.end:   ret
 
.err_zn:
        cinvoke sprintf, str_res, serr1
        jmp     .end
.err_ch:
        cinvoke sprintf, str_res, serr2
        jmp     .end
.err_div0:
        cinvoke sprintf, str_res, serr3
        jmp     .end
endp
 
;------------------------------------
;section '.i' import data readable
data import
library kernel,'kernel32.dll',\
        user,'user32.dll',\
        msvcrt,'msvcrt.dll'
 
import  kernel,\
        GetModuleHandle,'GetModuleHandleA',\
        ExitProcess,'ExitProcess'
 
import  user,\
        DialogBoxParam,'DialogBoxParamA',\
        GetDlgItemInt,'GetDlgItemInt',\
        SetDlgItemText,'SetDlgItemTextA',\
        EndDialog,'EndDialog'
 
import msvcrt,\
       sprintf,'sprintf',\
       system,'system'
end data
 
data resource
directory RT_DIALOG,dialogs
resource dialogs,ID_FORM,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration
dialog demonstration,'f=(a^2-3b)/4c',70,70,190,120,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
        dialogitem 'STATIC','a=',-1,10,10,20,8,WS_VISIBLE
        dialogitem 'STATIC','b=',-1,10,30,20,8,WS_VISIBLE
        dialogitem 'STATIC','c=',-1,10,50,20,8,WS_VISIBLE
        dialogitem 'STATIC','f=',-1,10,70,20,8,WS_VISIBLE
        dialogitem 'EDIT','', ID_A, 25,10,60,12,WS_VISIBLE+WS_BORDER+WS_TABSTOP
        dialogitem 'EDIT','', ID_B, 25,30,60,12,WS_VISIBLE+WS_BORDER+WS_TABSTOP
        dialogitem 'EDIT','', ID_C, 25,50,60,12,WS_VISIBLE+WS_BORDER+WS_TABSTOP
        dialogitem 'EDIT','',ID_RES,25,70,140,12,WS_VISIBLE+WS_BORDER+WS_TABSTOP
        dialogitem 'BUTTON','OK',IDOK,10,95,55,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
        dialogitem 'BUTTON','C&ancel',IDCANCEL,70,95,55,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
enddialog
end data
 
;-------------------------------
section '.bss' readable writeable
str_a   rb 11
str_b   rb 11
str_c   rb 11
str_res rb 20h
a       dd ?
b       dd ?
c       dd ?
fun     dd ?
ost     dd ?
1
25.09.2010, 07:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2010, 07:02
Привет! Вот еще темы с решениями:

Математическая формула
Здравствуйте! Помогите пожалуйста решить эту задачу: Входные данные: 2...

Математическая формула
помогите пожалуйста написать формулу в C#: O = arccos * Заранее...

Математическая формула
Добрый вечер. Помогите, пожалуйста, с созданием формы для расчета показателя по...

Математическая формула
Дорогие друзья. Подскажите дельным советом, можно ли данную формулу забить в...


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

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

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