Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 13.12.2016
Сообщений: 8
1
MASM

Примитивный калькулятор (два операнда и операции сложения, вычитания, умножения и деления)

06.04.2018, 12:00. Просмотров 1810. Ответов 5


Здравствуйте.
Вот пытался написать примитивный калькулятор, которые будет +, -, * и / два значения, введенные пользователём, только есть одно условие, пользователь должен одним вводом ввести уравнение, например,
3 + 5
6 – 3
2 * 2
или
6 / 2
Мне нужно чтобы программа считывала какой знак был введен между цыфрами и на его основе производить вычесления.

Была идея, чтобы сохранять введенную пользователем строку в одной переменной, например, userInput DW '3 + 5', а затем разбить данную строку на три значения, firstNumber DW '3', operator DW '+' и secondNumber DW '5'.

При создании я не должен использовать библиотечные функции и код должен быть написан на Masm32.

К сожалению, моих знаний и практики не достаточно чтобы выполнить подобную задачу.
Буду благодарен за любой пример.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2018, 12:00
Ответы с готовыми решениями:

Операции сложения, вычитания, умножения и деления интервалов
ребят, кто знает, и кому не сложно, распишите пожалуйста арифметические операции с интервалами....

Операции сложения, вычитания, умножения и деления в троичной СС
Операции сложения, вычитания, умножения и деления в троичной СС. (тип данных массив, числа...

Реализовать класс MyArray, который бы поддерживал индексные операции, операции сложения, вычитания, умножения, деления
Необходимо реализовать класс MyArray, который бы поддерживал индексные операции, операции сложения,...

Реализовать калькулятор с функциями умножения, деления, сложения и вычитания
Ребятки, спасайте!Учусь на 1 курсе на программиста.Дали курсовик с темой написать калькулятор...

__________________
Помогаю в написании студенческих работ здесь.
5
Эксперт Hardware
5175 / 1835 / 344
Регистрация: 29.07.2014
Сообщений: 2,786
Записей в блоге: 5
06.04.2018, 12:14 2
Цитата Сообщение от Fenixsenok Посмотреть сообщение
Вот пытался написать примитивный калькулятор
где он???

Добавлено через 1 минуту
если числа от 0 до 9, то проблем нет, а если больше, то уже нужно сохранять ввод в буфер
0
0 / 0 / 0
Регистрация: 13.12.2016
Сообщений: 8
06.04.2018, 12:50  [ТС] 3
примерно вот так...

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
.586                                                                    ; Recognise 80x86 instructions that use 32-bit
.MODEL FLAT, STDCALL                                                    ; Generate code for a flat memory model
option casemap :none
.STACK 4096                                                             ; Reserve 4096 bytes for stack operations
 
ExitProcess proto dwExitCode:dword
GetStdHandle proto :dword
WriteConsoleA proto :dword, :dword, :dword, :dword, :dword
ReadConsoleA  proto :dword, :dword, :dword, :dword, :dword
 
 
STD_OUTPUT_HANDLE equ -11                                               ; The standard output device
STD_INPUT_HANDLE equ -10                                                ; The standard output device
 
    
.DATA
 
    
    promptUserInput         DB 10, 13, 'Please enter your equation: ', 0
 
    outputHandle    DWORD ?
    bytes_written   DD ?
    inputHandle DWORD ?
    bytes_read  DWORD ?
 
    buffer_size = 100
 
    bufferUserInput         DB buffer_size dup(?)
 
    bufferForSign           DB buffer_size dup(?)
    bufferFirstNumber       DB buffer_size dup(?)
    bufferSecondNumber      DB buffer_size dup(?)
    result                  DB buffer_size dup(?)
 
 
 
.CODE
    main PROC
        invoke GetStdHandle, STD_OUTPUT_HANDLE
        mov outputHandle, eax
        mov eax, LENGTHOF promptUserInput
        invoke WriteConsoleA, outputHandle, addr promptUserInput, eax, addr bytes_written, 0
        mov eax, 0
        mov eax, bytes_written
        mov eax, 0
    
        invoke GetStdHandle, STD_INPUT_HANDLE
        mov inputHandle, eax
        invoke ReadConsoleA, inputHandle, addr bufferUserInput, buffer_size, addr bytes_read, 0
 
 
        cmp bufferForSign, '+'
        je addition
 
        jne finish_program
 
 
        addition:
            mov ax, 0
            mov ax, bufferFirstNumber       
            add ax, bufferSecondNumber
            mov result, eax
        
            invoke WriteConsoleA, outputHandle, addr result, eax, addr bytes_written, 0
 
    main ENDP
    
    finish_program PROC     
        invoke ExitProcess, 0
    finish_program ENDP
END main
Вот только как разделит переменную на три я понятия не имею...
0
Модератор
Эксперт по электронике
7492 / 3691 / 1445
Регистрация: 01.02.2015
Сообщений: 11,488
Записей в блоге: 2
06.04.2018, 13:03 4
Зачем делить? Обрабатывайте в потоке.
У вас 3 переменные: операнд1, операнд2, операция.

При инициализации операнд1=0, операция=сложение (чтобы не повлиять).
Начинаете обрабатывать строку посимвольно
1. if Buffer[esi]='0'...'9' then Op2:=Op2*10+(Buffer[esi]-'0'); к следующему символу строки

2.1. Если не цифра, то выполнить вычисление Op1:= Op1 (Operation) Op2; Op2:=0;
2.2. Уточнить операцию для следующего вычисления
2.2.1. if Buffer[esi]='+' then Operation:=сложение
2.2.2. if Buffer[esi]='-' then Operation:=вычитание
...
2.2.7. if Buffer[esi]=Enter then выйти
3. esi:=esi+1
4. перейти к п.1

5. вывод результата (Op1)

Так я и делал в Написать программу, позволяющую выполнять арифметические действия над двоичными или шестнадцатеричными числами
0
Модератор
Эксперт по электронике
7492 / 3691 / 1445
Регистрация: 01.02.2015
Сообщений: 11,488
Записей в блоге: 2
07.04.2018, 23:04 5
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
.686
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        aszPrompt       db      'Expression: ', 0Dh, 0Ah, 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
        aszResult       db      10, 13, "Result of your equation is %d", 0
 
        OpAdd           equ     '+'
        OpSub           equ     '-'
        OpMul           equ     '*'
        OpDiv           equ     '/'
 
        AllowedChars    db      '=+-*/0123456789'
        LenAllowedChars equ     $-AllowedChars
        OpChars         db      '=+-*/'
        LenOpChars      equ     $-OpChars
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
        Result          dd      ?
        Op1             dd      ?
        Op2             dd      ?
        Operation       db      ?
.code
 
PrevOperation   proc
                mov     eax,    [Op1]
                cdq
                mov     ebx,    [Op2]
                cmp     [Operation],    OpAdd
                jne     @@Sub
                add     eax,    ebx
                jmp     @@Calc
        @@Sub:
                cmp     [Operation],    OpSub
                jne     @@Mul
                sub     eax,    ebx
                jmp     @@Calc
        @@Mul:
                cmp     [Operation],    OpMul
                jne     @@Div
                mul     ebx
        @@Div:
                cmp     [Operation],    OpDiv
                jne     @@Calc
                idiv    ebx
        @@Calc:
                mov     [Op1],  eax
                mov     [Op2],  0
                mov     al,     [esi-1]
                mov     [Operation],    al
        ret
PrevOperation   endp
 
main    proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
 
        ;ввод выражения
        invoke  WriteConsole, hConsoleOutput, ADDR aszPrompt,\
                LENGTHOF aszPrompt-1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
        lea     esi,    [Buffer]        ;удаление из буфера
        add     esi,    [BufLen]        ;символов перевода строки
        mov     [esi-2],word ptr 0
        sub     [BufLen],       2
 
        ;обработка выражения во введённой строке
        mov     eax,    0
        mov     [Op1],  0
        mov     [Op2],  0
        mov     [Operation],    OpAdd
 
        lea     esi,    [Buffer]
        mov     ecx,    [BufLen]
        @@GetCmd:
                push    ecx
                lodsb
                ;проверка корректности введённых символов
                lea     edi,    [AllowedChars]
                mov     ecx,    [LenAllowedChars]
                repne   scasb
                jnz     @@Next
        @@ProcessChar:
                lea     edi,    [OpChars]
                mov     ecx,    [LenOpChars]
                repne   scasb
                jz      @@DoOperation
        @@TestDigits:
                ;введена цифра
                and     eax,    0FFh
                sub     al,     '0'
                mov     ebx,    [Op2]
                lea     eax,    [eax+8*ebx]
                lea     eax,    [eax+2*ebx]
                mov     [Op2],  eax
 
                pop     ecx
                push    ecx
                cmp     ecx,    1
                jne     @@Next
 
        @@DoOperation:
                ;сначала завершается предыдущая операция
                call    PrevOperation
                cmp     al,     '='
                jne     @@Next
                pop     ecx
                jmp     @@Break
        @@Next:
                pop     ecx
        loop    @@GetCmd
@@Break:
ResultShow:
        ;вывод результата
        mov     eax,    [Op1]
        invoke  wsprintf, ADDR Buffer, ADDR aszResult, eax
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
main    endp
 
end     main
0
Модератор
Эксперт по электронике
7492 / 3691 / 1445
Регистрация: 01.02.2015
Сообщений: 11,488
Записей в блоге: 2
07.01.2020, 10:51 6
Нужно изменить строки
Assembler
102
                mov     ecx,    LenAllowedChars
Assembler
107
                mov     ecx,    LenOpChars
Т.к. и LenAllowedChars и LenOpChars - константы и лишь безразличие masm к квадратным скобкам позволяет избежать ошибки обращения к недоступным адресам при заполнении регистра ecx.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2020, 10:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

Изменить код в калькуляторе, что бы он выполнял операции сложения, умножения, вычитания и деления над рациональными дробями
Доброго времени суток, срочно нужна помощь. Помогите изменить код в калькуляторе, что бы он...

Напишите свой класс, реализующий работу с комплексными числами. Операции сложения, вычитания, деления и умножения должны
Напишите свой класс, реализующий работу с комплексными числами. Операции сложения, вычитания,...

Ввести три операнда с клавиатуры и применить к ним операции деления и вычитания
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...


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

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

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