Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/2: Рейтинг темы: голосов - 2, средняя оценка - 4.50
Annet96
0 / 0 / 0
Регистрация: 02.11.2014
Сообщений: 36
1

Как переделать калькулятор, чтобы работал с большими числами?

14.11.2014, 20:19. Просмотров 458. Ответов 2
Метки нет (Все метки)

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
.model tiny
.code
  JUMPS ; эта директива заставляет генерировать код, при котором можно писать условные 
        ; переходы на расстояние больше 128 байт (а тут такие есть)
org 100h
start:
   mov ax, 3
   int 10h
@@00:   
 lea  dx, msg_first
 CALL inputDEC
     mov a, al
 lea  dx, msg_second
 CALL inputDEC
     mov b, al
 lea dx, msg_op
 mov ah, 9
 int 21h
op01: 
 mov ah, 8
 int 21h     
  cmp al, '*'
  je  op_mul
  cmp al, '+'
  je  op_add
  cmp al, '-'
  je  op_sub
  cmp al, '/'
  je  op_div
    jmp op01 ; все остальные игнорируем
op_mul:
    mov  op, al
    mov  al, a
    mov  ah, b
    imul ah 
    mov  c, al
    jmp  show_result   
op_add:
    mov op, al
    mov al, a
    add al, b
    mov c, al
    jmp show_result
op_sub:
    mov op, al
    mov al, a
    sub al, b
    mov c, al
    jmp show_result
op_div:
    mov op, al
    mov bl, b
    or  bl, bl
    jz  op_no_div
       mov  al, a
       cbw        ; конвертировать байт в слово с сохранением знака
       idiv bl    ; знаковое деление
       mov  c, al
       jmp show_result
op_no_div:    
     lea dx, msg_no_div
     mov ah, 9
     int 21h
     jmp op_repeat 
show_result:
 lea dx, msg_res
 mov ah,9
 int 21h
 mov  al, a
 CALL writeDEC
 mov  al, op
 int 29h
 mov al, b
 CALL writeDEC
 mov al, '='
 int 29h
 mov al, c
 CALL writeDEC
 
op_repeat:
   lea dx, msg_repeat
   mov ah, 9
   int 21h
 
    mov ah, 8
    int 21h
    cmp al, 'y'
    je  @@00 
    cmp al, 'Y'
    je  @@00
    jmp @@_exit
  
 
  lea dx, PressKey
  mov ah,9
  int 21h
 
  xor ax, ax
  int 16h
@@_exit:
  int 20h
  
inputDEC proc
; возвратит число со знаком в AL
; при вводе в DX - адрес сообщения
push bx
  mov ah, 9
  int 21h
  xor bl, bl ; число 
  xor bh, bh ; флаг отрицательного будет
@@1_01:
    mov ah, 8
    int 21h
    cmp al, '-'
    jne @@1_digit
      inc bh
      int 29h ; покажем
      jmp @@1_01
@@1_digit:
     cmp  al, '0'
     jb   @@1_01 ; меньше нуля - игнорируем
     cmp  al, '9'
     ja   @@1_01
  ; значит цифра
        int 29h 
        sub al, '0' ; число и символ числа отличаются на код '0'
  or bh, bh ; проверим, установлен ли
  jz @@1_positive
     neg al
@@1_positive:   
pop  bx   
 ret
inputDEC endp  
  
writeDEC proc
; вывод числа в AL как десятичного со знаком
; -128 .. + 127
push ax
push bx
push cx
push dx
 or al, al
 jns @@positive ; если не установлен флаг знака 
 push ax
   mov ah, 2
   mov dl, '-'
   int 21h
 pop  ax  
   neg al 
 @@positive:
   xor cx, cx
   mov bl, 10
@@next_digit:
   xor  ah, ah
   div  bl
   push ax
   inc  cx
   or   al, al
   jnz @@next_digit
   
@@out_next_digit:
   pop  ax
   xchg ah, al   
   add  al, '0'    
   int  29h
   LOOP @@out_next_digit
 
pop  dx
pop  cx
pop  bx
pop  ax 
ret
writeDEC endp 
 
a   db ? ; первое число
b   db ? ; второе число
c   db ? ; результат
op  db ?
 
msg_first  db 13,10,'Введите первое число: $'
msg_second db 13,10,'Введите второе число: $'
msg_op     db 13,10,'Введите знак операции (+,-,*,/): $'
msg_res    db 13,10,'Результат: $'
msg_repeat db 13,10,'Повторить (Y/N)$'
msg_no_div db 13,10,'Деление невозможно$'
  
PressKey   db 13,10,'Press any key ...$'
end start
помогите пожалуйста кому не тяжело, я новичок и не совсем понимаю
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2014, 20:19
Ответы с готовыми решениями:

Как избежать переполнения при работе с большими числами
При написании программы возникла проблема с большими числами. У меня есть число, которое копится в...

Как переделать данный код под работу с большими числами?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Калькулятор с большими числами(25 чисел)
Народ, помогите. Мне требуется написать консольный калькулятор, который может считат большие...

Как переделать код чтобы он работал для .xlsx файлов
Есть код, который извлекает информацию из .xls файлов с помощью ExcelExtractor : package main;...

Простой калькулятор для работы с большими числами
Помогите плеас) Задали сделать простенький калькулятор-сделал. Сказали, что нужно для работы с...

2
Mikl___
Автор FAQ
13515 / 6444 / 638
Регистрация: 11.11.2010
Сообщений: 11,637
15.11.2014, 03:32 2
Annet96,
скачай учебник Юрова "Assembler. практикум", там он подробно рассматривает, как выполнять арифметические операции с многобайтовыми числами, примеров в книге очень много
0
Мотороллер
433 / 244 / 43
Регистрация: 05.08.2013
Сообщений: 1,666
Завершенные тесты: 1
21.11.2014, 09:05 3
в факе есть процедурины для работы с большими числами
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2014, 09:05

Подскажите, как переделать код так, чтобы он работал с двумя полями.
Добрый день. Вот HTML + PHP выводит два поля(то что на скрине 1) ...

Можно как-то переделать код из Turbo Pascal чтобы он работал в pascal abc.net?
Сделайте пожалуйста, я просто не вникаю uses Graph, Crt; var grDriver: integer; grMode:...

Переписать функцию sqrt, чтобы она работала с большими числами
желательно что бы корень извлекался из строки и возвращался результат в виде строки


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

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

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