Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Sofia 9
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 21
1

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

24.08.2016, 18:34. Просмотров 2336. Ответов 48
Метки нет (Все метки)

Срочно нужно написать программу для расчета Х, ввод чисел а,b,c с клавиатуры. Выводить Х, включая минусовые и десятичные значения
Сделать проверки на деления на ноль и переполнения . Помогите пожалуйста,сама пытаюсь разобраться,но сложно все понять,когда только -только начинаешь изучать ассемблер.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2016, 18:34
Ответы с готовыми решениями:

Вычисление значения выражения (x^3-15)
Прошу помощи с задачей: "Необходимо ввести с клавиатуры число X и вычислить значение выражения...

Вычисление значения выражения
Здравствуйте. Просматриваю код через дебаг и почему то у меня регист dx обнуляется (черным...

Вычисление значения выражения
Добрый день! Подскажите как записать этот пример в ассемблер? X=\frac{({A}^{2}+D)}{C-B}

Вычисление значения выражения y=(2*c-d+23)/(a/4-1)
Ребята, помогите, пожалуйста, найти ошибку в программе, которая вычисляет значение выражения...

Вычисление значения выражения: (3*c-2*d)/(a)
Помогите пожалуйста, вычислить (3*c-2*d)/(a).

48
Sofia 9
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 21
24.08.2016, 18:48  [ТС] 2
вот система уравнений ,которую нужно решить
http://www.cyberforum.ru/cgi-bin/latex.cgi?X=\begin{cases}\frac{a}{b}+11 & \text{,  } a>b  \\ -11 & \text{,  } a=b  \\ \frac{3 \cdot b-9}{a}  & \text{,  } a<b\end{cases}

На ассемблере написать программу, для расчёта Х.
Ввод чисел a и b с клавиатуры.
Выводить X, включая минусовые и десятичные значения.
Сделать проверки на деления на ноль и переполнения.
0
R71MT
5792 / 1548 / 320
Регистрация: 29.07.2014
Сообщений: 2,575
Записей в блоге: 5
24.08.2016, 20:25 3
Цитата Сообщение от Sofia 9 Посмотреть сообщение
сама пытаюсь разобраться
..где эти попытки?
вот система уравнений
..пример не попадает под определение "система уравнений", и там нет переменной(С).

А по теме, для начала можно взять процедуры от сюда, и от них плясать дальше..
0
Kukuxumushu
24.08.2016, 20:33
  #4

Не по теме:

Всегда в таких случаях интересно, чем думают составители заданий, ставя деление? Ведь чтобы сделать тру-деление без переполнений надо приличную квалификацию иметь.
Ну и понятно дело, если ТС говорит про "систему уравнений", то тут никакими самостоятельными попытками и не пахнет. За спасибо, думаю, будет делать разве что мазохист.

0
Sofia 9
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 21
24.08.2016, 20:47  [ТС] 5
Объясню ситуацию.
Собственные попытки настолько скудны,что не вижу смысла сюда что-то отправлять. В программировании я полный нуб, все начинаю потихоньку изучать... Задание нужно решить для сдачи академ.разницы(которая через несколько дней),чтоб перейти на другой факультет в другой вуз. До этого момента никогда программирования не изучала. Прилагаю скриншот собственных усилий , думаю вас развеселю
0
Миниатюры
Вычисление значения выражения по вводимым числам  
R71MT
5792 / 1548 / 320
Регистрация: 29.07.2014
Сообщений: 2,575
Записей в блоге: 5
24.08.2016, 21:03 6
Ну это ясно-дело не вариант! Ещё и в блокноте.. Тогда уж на бумажке, губной помадой
В любом случае, если и вправду ситуация такая, то нужно сдать хоть что-то..
Скачай компилятор FASM, а там - набросаем хотя-бы оболочку.
1
Kukuxumushu
1849 / 632 / 119
Регистрация: 13.06.2015
Сообщений: 2,159
Завершенные тесты: 2
24.08.2016, 21:06 7
Цитата Сообщение от R71MT Посмотреть сообщение
набросаем хотя-бы оболочку
ага, ввод знаковых чисел с клавиатуры))) и непереполяемое деление. Набросаем))
0
Sofia 9
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 21
24.08.2016, 21:11  [ТС] 8
У меня стоит TASM - не подойдет?
и вроде, понимаю как этим пользоваться
0
Миниатюры
Вычисление значения выражения по вводимым числам  
ФедосеевПавел
Модератор
4319 / 2392 / 956
Регистрация: 01.02.2015
Сообщений: 7,891
24.08.2016, 21:21 9
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
ввод знаковых чисел с клавиатуры
Под DOS - это most have у каждого ученика
К примеру, (нельзя вставить ссылку на другой форум, а там я последовательно с учеником нарисовал ввод):
Ввод десятичного числа и вывод на экран этого числа в 10 и 8 системах счисления
После этого или ввод нового числа или выход при нажатии на Esc.
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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
.MODEL  Small
 
.DATA
 
KeyBuf  db      7, 0, 7 dup(0)      ;max,len,string,CR(0dh)
CR_LF   db      0Dh, 0Ah, '$'
 
Prompt  db      'Введите число (-32768..+32767): ', '$'
Res10   db      'Введено число (десятичное    ): ', '$'
Res08   db      'Введено число (восьмеричное  ): ', '$'
Error01 db      'Ошибка ввода числа',0Dh, 0Ah, '$'
ExitMsg db      'Для завершения нажмите Esc', '$'
 
 
Numer   dw      ?
 
.CODE
 
; выводит число в регистре AX на экран
; входные данные:
; cx - система счисления (не больше 10)
; ax - число для отображения
Show_ax PROC
;        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@show
        ret
Show_ax ENDP
 
; преобразования строки в число
; на входе:
; ds:[si] - строка с числом
; ds:[di] - адрес числа
; на выходе
; ds:[di] - число
; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
Str2Num PROC
        push    ax
        push    bx
        push    cx
        push    dx
        push    ds
        push    es
        push    si
 
        push    ds
        pop     es
 
        mov     cl, ds:[si]
        xor     ch, ch
 
        inc     si
 
 
        mov     bx, 10
        xor     ax, ax
 
        ;если в строке первый символ '-'
        ; - перейти к следующему
        ; - уменьшить количество рассматриваемых символов
        cmp     byte ptr [si], '-'
        jne     @@Loop
        inc     si
        dec     cx
@@Loop:
        mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
        mov     [di], ax   ; игнорируем старшее слово
        cmp     dx, 0      ; проверяем, результат на переполнение
        jnz     @@Error
 
        mov     al, [si]   ; Преобразуем следующий символ в число
        cmp     al, '0'
        jb      @@Error
        cmp     al, '9'
        ja      @@Error
        sub     al, '0'
        xor     ah, ah
        add     ax, [di]
        jc      @@Error    ; Если сумма больше 65535
        cmp     ax, 8000h
        ja      @@Error
        inc     si
 
        loop    @@Loop
 
        pop     si         ;проверка на знак
        push    si
        inc     si
        cmp     byte ptr [si], '-'
        jne     @@Check    ;если должно быть положительным
        neg     ax         ;если должно быть отрицательным
        jmp     @@StoreRes
@@Check:                   ;дополнительная проверка
       or       ax, ax     ;
       js       @@Error
@@StoreRes:                ;сохранить результат
        mov     [di], ax
        clc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
@@Error:
        xor     ax, ax
        mov     [di], ax
        stc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Str2Num ENDP
 
Main    PROC    FAR
        mov     ax, @DATA
        mov     ds, ax
        mov     es, ax
@@Input:
        ; ввод числа с клавиатуры (строки)
        lea     dx, Prompt
        mov     ah,09h
        int     21h
 
        mov     ah, 0Ah
        mov     dx, offset KeyBuf
        int     21h
 
        ; перевод строки (на новую строку)
        lea     dx, CR_LF
        mov     ah,09h
        int     21h
 
 
        ; преобразование строки в число
        lea     si, KeyBuf+1
        lea     di, Numer
        call    Str2Num
 
        ; проверка на ошибку
        jnc     @@NoError
 
        ; если есть ошибка ввода - напечатать сообщение об ошибке
        lea     dx, Error01
        mov     ah,09h
        int     21h
        jmp     @@Exit
 
        ; если нет ошибки ввода - напечатать число
@@NoError:
        ; в десятичном представлении
        lea     dx, Res10
        mov     ah,09h
        int     21h
 
        mov     ax, Numer
        mov     cx, 10
        call    Show_ax
 
        lea     dx, CR_LF
        mov     ah,09h
        int     21h
 
        ; в восьмеричном представлении
        lea     dx, Res08
        mov     ah,09h
        int     21h
 
        mov     ax, Numer
        mov     cx, 8
        call    Show_ax
 
        lea     dx, CR_LF
        mov     ah,09h
        int     21h
 
@@Exit:
        lea     dx, ExitMsg
        mov     ah,09h
        int     21h
 
        lea     dx, CR_LF
        mov     ah,09h
        int     21h
 
        ; ожидание нажатия клавиши Esc
@@WaitForEsc:
        mov     ah,07h        ; ожидаем нажатие любой клавиши
        int     21h
 
        cmp     al, 1Bh       ; 1Bh - код клавиши Esc
        jnz     @@Input       ; если это не Esc, то повторить
 
        ; выход
        mov     ax,4c00h
        int     21h
Main    ENDP
 
.STACK  100h
 
        END     Main
0
R71MT
5792 / 1548 / 320
Регистрация: 29.07.2014
Сообщений: 2,575
Записей в блоге: 5
24.08.2016, 21:24 10
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
Тут не сборище личных холопов, которые будут бесплатно выполнять за вас всю чёрную работу
При чём тут холопы, и что ты отвечаешь за всех? Нет желания объяснять - проходи мимо, и не навязывай своё мнение всем! Лично мне ничего не стоит набросать её оболочку, в которую кстати не входят твои переполнение деления и прочая лабуда.

Sofia 9, просто у меня фасм и чтоб не менять синтаксис было-бы удобно..
3
Kukuxumushu
1849 / 632 / 119
Регистрация: 13.06.2015
Сообщений: 2,159
Завершенные тесты: 2
24.08.2016, 21:29 11
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Ввод десятичного числа
Ну я примерно такой же самопал использую.
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
InS16 proc   ; Ввод 16-битного знакового числа в AX, CF - признак ошибки
push cx      ; Сохранение состояния
push dx
push si
enter 10,0
 
mov ax,ss    ; ds:dx = ss:sp
mov ds,ax
mov dx,sp
mov byte ptr[bp-10],7 ; Ограничение длины строки
mov ah,0Ah   ; Ввод строки
int 21h
 
cmp byte ptr[bp-9],0 ; Проверка длины строки
je ErrInS16  ; Ошибка - пустая строка
xor ax,ax    ; Очистка ax
xor ch,ch    ; Очистка ch
mov si,-8    ; Установка указателя на первый символ
cmp byte ptr[bp+si],'-' ; Проверка первого символа на минус
jne ReadS16  ; Если первый минус
inc si       ; то сдвинуть указатель
cmp byte ptr[bp+si],13  ; Чтение символа после минуса
je ErrInS16  ; Если пусто - ошибка - пустая строка
 
ReadS16:     ; Цикл чтения символов
mov cl,[bp+si] ; Чтение символа в регистр (для ускорения)
cmp cl,13    ; Проверка на конец строки
je ExitInS16 ; Если конец строки - выход (CF сброшен)
mov dx,10    ; Множитель
mul dx       ; Умножение результата на 10
jc ErrInS16  ; Ошибка - переполнение
sub cl,'0'   ; Вычитание смещения ASCII
cmp cl,9
ja ErrInS16  ; Ошибка - некорректный символ
add ax,cx    ; Прибавление младшего разряда
jc ErrInS16  ; Ошибка - переполнение
inc si       ; Переход к следующему символу
jmp ReadS16
 
ExitInS16:
cmp ax,8000h ; Проверка на переполнение
ja ErrInS16  ; Ошибка - переполнение
cmp byte ptr[bp-8],'-' ; Проверка на отрицательность
je ToNegS16  ; Отрицательное число - перевод в доп. код
test ax,8000h; Проверка на +32768
jnz ErrInS16 ; Ошибка - +32768
jmp FinInS16 ; При <+32768 - выход (CF сброшен)
ToNegS16:
neg ax       ; Обращение в дополнительный код
clc          ; Сброс флага ошибки
jmp FinInS16
 
ErrInS16:    ; Если произошла ошибка
stc          ; установить флаг ошибки
FinInS16:
leave        ; Освобождение памяти
pop si       ; Восстановление состояния
pop dx
pop cx
ret
InS16 endp
1
ФедосеевПавел
Модератор
4319 / 2392 / 956
Регистрация: 01.02.2015
Сообщений: 7,891
24.08.2016, 21:38 12
Sofia 9, не буду обманывать, что займусь вашей задачей. Просто попрошу - приведите дословную постановку задачи. Наиболее интересны моменты - разрядность переменных и результата, их типы (целые или с плавающей запятой), каким образом обрабатывать переполнения - перехватом прерываний (24h и не помню номер overflow interrupt) или простой проверкой условия до начала умножения или деления.

Добавлено через 2 минуты
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
Ну я примерно такой же самопал использую.
Ну вот - часть задачи уже наскребли по сусекам!
1
Sofia 9
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 21
24.08.2016, 21:40  [ТС] 13
Честно говоря, никакой информации у меня больше нету. Передо мной поставили такую задачу(на скрине). Я думала,полистаю ютуб,гугл и разберусь - но не тут то было... начала изучать примеры,код, и поняла,что тут такииие бредни.. =.=
0
Миниатюры
Вычисление значения выражения по вводимым числам  
Sofia 9
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 21
24.08.2016, 22:14  [ТС] 14
Я тут пока разбираюсь с FASM...

Добавлено через 28 минут
В общем,что-то ничего у меня не получилось с фасмом =.= спасибо ,что хоть с чем-то помогли в принципе, немного понятно с кодом про ввод чисел. Буду разбираться...
0
Kukuxumushu
1849 / 632 / 119
Регистрация: 13.06.2015
Сообщений: 2,159
Завершенные тесты: 2
24.08.2016, 22:36 15
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
целые или с плавающей запятой
Ахах, да, вот это было бы шедевральным решением всех проблем вычислений. Останутся только проблемы ввода/вывода, но если ввод/вывод сделать целочисленным, то и они легко разрешимы.
0
Sofia 9
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 21
24.08.2016, 22:40  [ТС] 16
Вот мне только-что уточнили,что с плавающей запятой. Но что-то мне это ничего не говорит,хах
0
Kukuxumushu
1849 / 632 / 119
Регистрация: 13.06.2015
Сообщений: 2,159
Завершенные тесты: 2
24.08.2016, 22:59 17
Цитата Сообщение от Sofia 9 Посмотреть сообщение
Вот мне только-что уточнили,что с плавающей запятой.
Ввод и вывод чисел с плавающей запятой вы не сделаете, это задание явно не студенческого уровня. Может быть у вас вообще имеется ввиду не целиком всю прогу на ассемблере писать, а только сами вычисления оформить в виде ассемблерной вставки, например в паскаль?
0
Sofia 9
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 21
24.08.2016, 23:07  [ТС] 18
Нет, про паскаль препод даже ничего не говорил. Именно по ассемблеру. Да и в принципе ничего не объяснялось. Мне вот сбросили суто задание... Я думаю, мне нужно сделать уже хоть как-нибудь. Какой вариант самый легкий? С каким условием?
0
Kukuxumushu
1849 / 632 / 119
Регистрация: 13.06.2015
Сообщений: 2,159
Завершенные тесты: 2
24.08.2016, 23:18 19
Цитата Сообщение от Sofia 9 Посмотреть сообщение
Какой вариант самый легкий? С каким условием?
Тут сложно что-то сказать, с очень высокой вероятностью препода это не устроит, поэтому всё от начала до конца надо узнавать у него. Вот прям на конкретном примере - какие числа мы вводим (например 2,5 и -4,88, или целые) и что в итоге должны получить на выходе (с плавающей точкой, округлённое целое)? И про паскаль тоже, т.к. для голого ассемблера это слишком сложно для студентов.
0
Sofia 9
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 21
24.08.2016, 23:37  [ТС] 20
Думаю, мне все же надо выбрать хоть какой-то вариант, а потом просто покажу ему,что просто знаю,что существует несколько вариантов написания программы
0
24.08.2016, 23:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2016, 23:37

Вычисление значения выражения: (с/d + 3*а/2)/(c - а + 1)
Помогите пожалуйста, вычислить (с/d + 3*а/2)/(c - а + 1) для исходных данных в знаковых форматах...

Вычисление значения выражения (2c-42)/(c+a-1)
Дано вот такое выражение: (2c-42)/(c+a-1). Нужно вычислить его значение. MASM MODEL SMALL...

Вычисление значения выражения (А/2 – В) – 2*(С + 1) (masm)
Вот пример выражения (А – В) *2 + С – 1, где А, В, С - целые знаковые числа. А мне нужно (А/2 –...


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

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

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