Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
dsk900
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 4
1

Вычисление выражения по формуле

16.04.2017, 19:46. Просмотров 346. Ответов 4
Метки нет (Все метки)

Необходимо посчитать след. формулу:
http://www.cyberforum.ru/cgi-bin/latex.cgi?y=\frac{3\cdot {a}^{2}\cdot {b}^{3}+1}{a-b}-\frac{a/4+b}{a+b}

Вот программа, которую собрал из учебника:

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
        title prim
        assume cs:cod, ds:d, ss:s
 
s        segment stack
        dw 128 dup (?)
s        ends
d        segment
;резервируем области под переменные a, b, c
a        dw ?
b        dw ?
c        dw ?
;размещаем строки – подсказки для ввода переменных
msga         db ‘Введите a:$’
msgb         db ‘Введите b:$’
msgc         db ‘Введите c:$;размещаем строки – сообщения об ошибках
err1         db ‘Деление на ноль (первая дробь)$’
err2         db ‘Деление на ноль (вторая дробь)$;описываем данные для процедур ввода и вывода целых чисел
.
.
.
    d    ends
    c    od segment
    ;описываем процедуры ввода и вывода целых чисел
    cr = 0dh ;cr присваиваем значение кода символа
    ;возврата каретки (клавиши «Enter»)
    lf = 0ah ;lf присваиваем значение кода символа
    ;перевода строки
IntegerIn proc
    start: mov ah,0ah ;функцией 0a вводим строку
    ;символов и размещаем ее в
    ;области string
    lea dx,string
    int 21h
    xor ax,ax ;обнуляем ax, в котором
    ;будем формировать число
    lea si,string+2 ;устанавливаем si на
    ;первый символ введенной
    ;строки
    mov negflag,ax ;обнуляем флаг
    ;отрицательности числа
    ;(предполагаем, что оно
    ;будет неотрицательным)
    cmp byte ptr [si],'-';первый символ – это
    ;минус?
    jne m2 ;если нет – на m2
    not negflag ;отмечаем, что число
    ;отрицательное
    ;(negflag не равен 0)
    inc si ;продвигаем si со
    ;знака числа к первой
    ;цифре
    jmp m ;прыгаем на разбор
    ;строки цифр
    m2: cmp byte ptr [si],'+';первый символ – это
    ;плюс?
    jne m ;если нет – на m
    inc si ;продвигаем si со
    ;знака числа к первой
    ;цифре
    ;анализируем текущий символ
    m: cmp byte ptr [si],cr ;если это cr – строка
    ;закончилась, выходим
    ;из цикла разбора
    ;символов
    je ex1
    cmp byte ptr [si],'0';если код символа
    ;меньше кода '0' –
    ;это не цифра
    jb err ;прыгаем на метку err
    cmp byte ptr [si],'9';если код символа
    ;больше кода '9' –
    ;это не цифра
    ja err ;прыгаем на метку err
    mov bx,10 ;домножаем полученное
    ;число на основание
    ;системы счисления
    mul bx
    sub byte ptr [si],'0';вычитаем код символа
    ;'0' (получаем
    ;очередную цифру)
    add al,[si] ;добавляем цифру к
    ;числу
    adc ah,0
    inc si ;продвигаем si к
    ;следующему символу
    jmp m ;организуем цикл
    ;функцией 09 выводим сообщение об ошибке
    err: lea dx,errmsg
    mov ah,9
    int 21h
    jmp start ;повторяем ввод
    ex1: cmp negflag,0 ;число положительное?
    je ex ;если да – выходим
    neg ax ;меняем знак числа
    ex: ret
IntegerIn endp
 
IntegerOut proc
    xor cx,cx ;обнуляем счетчик цифр
    mov bx,10 ;в bx помещаем делитель
    cmp ax,0 ;проверяем знак числа
    jge m ;если неотрицательное – на m
    neg ax ;иначе – меняем знак числа
    pushax ;сохраняем число перед вызовом
    ;функции, использующей ax
    mov ah,2 ;функцией 02 выводим знак '-'
    mov dl,'-'
    int 21h
    pop ax ;восстанавливаем число в ax
    m: inc cx ;считаем количество
    ;получающихся цифр
    xor dx,dx ;преобразуем делимое к 32
    ;разрядам
    div bx ;получаем очередную цифру
    pushdx ;сохраняем ее в стеке
    or ax,ax ;проверяем есть ли еще цифры
    jnz m ;если да – на метку m
    ;при выходе из цикла в стеке лежат цифры, в cx – их
    ;количество
    m1: pop dx ;извлекаем цифру из стека
    add dx,'0' ;преобразуем в код символа
    mov ah,2 ;функцией 02 выводим на экран
    int 21h
    loopm1 ;повторяем cx раз
    ret ;возвращаемся из процедуры
 
IntegerOut endp
        ;устанавливаем ds на сегмент данных
    string db 255, 0, 255 dup (?)
    errmsg db 'Недопустимый символ, можно'
    db 'использовать только цифры',cr,lf,'$'
 
start:  mov ax,d
    mov ds,ax   ;вводим значение переменныой a
    Mov ah,09 ;выводим строку – подсказку для a
    Lea dx,msga
    Int 21h
    Call IntegerIn ;вводим число
    Mov a,ax ;помещаем его в область a
        ;вводим значение переменныой b
    Mov ah,09 ;выводим строку – подсказку для b
    Lea dx,msgb
    Int 21h
    Call IntegerIn ;вводим число
    Mov b,ax ;помещаем его в область b
        ;вводим значение переменныой c
    Mov ah,09 ;выводим строку – подсказку для c
    Lea dx,msgc
    Int 21h
    Call IntegerIn ;вводим число
    Mov c,ax ;помещаем его в область c
        ;проверяем знаменатели на равенство 0
    Cmp c,0 ;проверяем первый знаменатель
    Jnz m ;если не 0 – на m
    Mov ah,09 ;выводим сообщение об ошибке
    Lea dx,err1
    Int 21h
    Jmp err ;выходим
m:  Mov ax,b ;считаем второй знаменатель
    Add ax,c
    Jnz m1 ; если не 0 – на m1
    Mov ah,09 ;выводим сообщение об ошибке
    Lea dx,err2
    Int 21h
    Jmp err ;выходим
        ;рассчитываем значение выражения
m1: Mov bx,ax ;помещаем второй знаменатель в bx
    Mov ax,a ;считаем второй числитель
    Imul ax
    Mov cx,3
    Imul cx
    Idiv bx ;считаем значение второй дроби
    Push ax ;сохраняем его в стеке
    Mov ax,a ;считаем первый числитель
    Add ax,b
    Mov bx,c ;считаем значение первой дроби
    Cwd
    Idiv bx
    Pop bx ;извлекаем из стека значение второй
        ;дроби
    Sub ax,bx ;вычитаем
    call IntegerOut ;выводим результат
        ;завершаем работу программы
    mov ax,4c00h ;с кодом завершения 0 – без ошибок
    int 21h
err:    mov ax,4cffh ;с кодом завершения 0ffh (-1) – с ошибкой
    int 21h
c od ends
    end start
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2017, 19:46
Ответы с готовыми решениями:

Вычисление выражения по формуле.
Составить программу, вычисляющую значение арифметического выражения. Результат...

Вычисление выражения по формуле.
Составить программу на языке Assembler для вычисления нижеследующего выражения...

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

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

Вычисление выражения по формуле.
Как сделать? (A-2)(A+6)(A*4)

4
ФедосеевПавел
Модератор
4153 / 2263 / 919
Регистрация: 01.02.2015
Сообщений: 7,527
16.04.2017, 20:11 2
А как вам удалось ввести с клавиатуры символы ‘’? Они недоступны без изощрений.

Добавлено через 17 минут
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
        title prim
        assume cs:cod, ds:d, ss:s
LOCALS
s        segment stack
        dw 128 dup (?)
s        ends
d        segment
;резервируем области под переменные a, b, c
a        dw ?
b        dw ?
y        dw ?
;размещаем строки – подсказки для ввода переменных
msga         db 'Введите a:$'
msgb         db 'Введите b:$'
;размещаем строки – сообщения об ошибках
err1         db 'Деление на ноль (первая дробь)$'
err2         db 'Деление на ноль (вторая дробь)$'
;описываем данные для процедур ввода и вывода целых чисел
    string db 255, 0, 255 dup (?)
    errmsg db 'Недопустимый символ, можно'
    db 'использовать только цифры',cr,lf,'$'
negflag     dw  0
    d    ends
    cod segment
    ;описываем процедуры ввода и вывода целых чисел
    cr = 0dh ;cr присваиваем значение кода символа
    ;возврата каретки (клавиши «Enter»)
    lf = 0ah ;lf присваиваем значение кода символа
    ;перевода строки
IntegerIn proc
    @@start: mov ah,0ah ;функцией 0a вводим строку
    ;символов и размещаем ее в
    ;области string
    lea dx,string
    int 21h
    xor ax,ax ;обнуляем ax, в котором
    ;будем формировать число
    lea si,string+2 ;устанавливаем si на
    ;первый символ введенной
    ;строки
    mov negflag,ax ;обнуляем флаг
    ;отрицательности числа
    ;(предполагаем, что оно
    ;будет неотрицательным)
    cmp byte ptr [si],'-';первый символ – это
    ;минус?
    jne @@m2 ;если нет – на m2
    not negflag ;отмечаем, что число
    ;отрицательное
    ;(negflag не равен 0)
    inc si ;продвигаем si со
    ;знака числа к первой
    ;цифре
    jmp @@m ;прыгаем на разбор
    ;строки цифр
    @@m2: cmp byte ptr [si],'+';первый символ – это
    ;плюс?
    jne @@m ;если нет – на m
    inc si ;продвигаем si со
    ;знака числа к первой
    ;цифре
    ;анализируем текущий символ
    @@m: cmp byte ptr [si],cr ;если это cr – строка
    ;закончилась, выходим
    ;из цикла разбора
    ;символов
    je @@ex1
    cmp byte ptr [si],'0';если код символа
    ;меньше кода '0' –
    ;это не цифра
    jb @@err ;прыгаем на метку err
    cmp byte ptr [si],'9';если код символа
    ;больше кода '9' –
    ;это не цифра
    ja @@err ;прыгаем на метку err
    mov bx,10 ;домножаем полученное
    ;число на основание
    ;системы счисления
    mul bx
    sub byte ptr [si],'0';вычитаем код символа
    ;'0' (получаем
    ;очередную цифру)
    add al,[si] ;добавляем цифру к
    ;числу
    adc ah,0
    inc si ;продвигаем si к
    ;следующему символу
    jmp @@m ;организуем цикл
    ;функцией 09 выводим сообщение об ошибке
    @@err: lea dx,errmsg
    mov ah,9
    int 21h
    jmp @@start ;повторяем ввод
    @@ex1: cmp negflag,0 ;число положительное?
    je @@ex ;если да – выходим
    neg ax ;меняем знак числа
    @@ex: ret
IntegerIn endp
 
IntegerOut proc
    xor cx,cx ;обнуляем счетчик цифр
    mov bx,10 ;в bx помещаем делитель
    cmp ax,0 ;проверяем знак числа
    jge @@m ;если неотрицательное – на m
    neg ax ;иначе – меняем знак числа
    push ax ;сохраняем число перед вызовом
    ;функции, использующей ax
    mov ah,2 ;функцией 02 выводим знак '-'
    mov dl,'-'
    int 21h
    pop ax ;восстанавливаем число в ax
    @@m: inc cx ;считаем количество
    ;получающихся цифр
    xor dx,dx ;преобразуем делимое к 32
    ;разрядам
    div bx ;получаем очередную цифру
    push dx ;сохраняем ее в стеке
    or ax,ax ;проверяем есть ли еще цифры
    jnz @@m ;если да – на метку m
    ;при выходе из цикла в стеке лежат цифры, в cx – их
    ;количество
    @@m1: pop dx ;извлекаем цифру из стека
    add dx,'0' ;преобразуем в код символа
    mov ah,2 ;функцией 02 выводим на экран
    int 21h
    loop @@m1 ;повторяем cx раз
    ret ;возвращаемся из процедуры
 
IntegerOut endp
        ;устанавливаем ds на сегмент данных
 
start:  mov ax,d
    mov ds,ax   ;вводим значение переменныой a
    Mov ah,09 ;выводим строку – подсказку для a
    Lea dx,msga
    Int 21h
    Call IntegerIn ;вводим число
    Mov a,ax ;помещаем его в область a
        ;вводим значение переменныой b
    Mov ah,09 ;выводим строку – подсказку для b
    Lea dx,msgb
    Int 21h
    Call IntegerIn ;вводим число
    Mov b,ax ;помещаем его в область b
    mov ax, a
    sub ax, b
    Cmp ax,0 ;проверяем первый знаменатель
    Jnz m ;если не 0 – на m
    Mov ah,09 ;выводим сообщение об ошибке
    Lea dx,err1
    Int 21h
    Jmp error ;выходим
m:  Mov ax,a ;считаем второй знаменатель
    Add ax,b
    Jnz m1 ; если не 0 – на m1
    Mov ah,09 ;выводим сообщение об ошибке
    Lea dx,err2
    Int 21h
    Jmp error ;выходим
        ;рассчитываем значение выражения
m1: Mov ax, a
    imul a ;ax:=a^2
    Imul b
    Imul b
    Imul b ;ax:=a^2*b^3
    mov bx,3
    imul bx  ;ax:=3*a^2*b^3
    add ax, 1 ;ax:=3*a^2*b^3+1
    cwd
    mov bx, a ;bx:=a-b
    sub bx, b
    idiv bx ;ax:=(a^2*b^3+1)/(a-b)
    mov cx,ax ;сохранение значения первой дроби в cx
    Mov ax,a
    sal ax,1
    sal ax,1 ;ax:=a/4
    add ax,b ;ax:=a/4+b
    mov bx,a
    add bx,b
    Idiv bx ;считаем значение второй дроби
    Sub cx,ax ;вычитаем
    mov ax,cx
    call IntegerOut ;выводим результат
        ;завершаем работу программы
    mov ax,4c00h ;с кодом завершения 0 – без ошибок
    int 21h
error:    mov ax,4cffh ;с кодом завершения 0ffh (-1) – с ошибкой
    int 21h
cod ends
    end start
1
dsk900
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 4
17.04.2017, 04:08  [ТС] 3
Собрал из учебников программу эту, даже не пробовал на работоспособность!
0
dsk900
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 4
17.04.2017, 15:21  [ТС] 4
Слушай, а вот эти ошибки выдает в коде, который ты скинул, поможешь исправить?=)
0
Миниатюры
Вычисление выражения по формуле  
ФедосеевПавел
Модератор
4153 / 2263 / 919
Регистрация: 01.02.2015
Сообщений: 7,527
17.04.2017, 21:04 5
Посмотрите в учебнике, с какими ключами происходит компиляция. Думаю, что решение именно в ключах компиляции, т.к. код из учебника содержит ровно столько же одинаковых (но локальных) меток.
И удалите строку 3 - она решает эту проблему для tasm.

Или возьмите компилятор по-новее masm 6.13.
0
17.04.2017, 21:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2017, 21:04

Вычисление выражения по формуле
Вычислить значение функции F(x)=x2+5x+7

Вычисление выражения по формуле
Написать программу решения примера, использия цикл Loop (1-2!+4!-...)/n

Вычисление выражения по формуле
Z=((-x1)+(-x2)+(-x3 ))-y1+(-y2)


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

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

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