Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/268: Рейтинг темы: голосов - 268, средняя оценка - 4.96
Программист
 Аватар для Arigato
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5
TASM

Простейший калькулятор

03.06.2012, 03:14. Показов 52187. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стоит задача следующего типа: написать простейший калькулятор, умеющий выполнять действия сложения и вычитания и контролировать переполнение. Проблема возникла в следующем моменте - при вычитании двух различных чисел (разных знаков, и одинаковых в том числе) рассчет и вывод верный, а при суммировании операндов с различными знаками, происходит неверный подсчет. Прошу помощи

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
.model small
.stack 100h
 
data segment      
   _errorCF db 'Finded overflow at ADD operation!','$'  
   _errorOF db 'Finded overflow at SUB operation!','$'             
   _INFO    db 'Types of operations:',10,13,'1. + -> sum',10,13,'2. - -> subtraction',10,13,'$'           
   _nc      db 10,13,'$'
   first    dw 65535    ;первый операнд
   second   dw 5         ;второй операнд
data ends
   
code segment
assume cs:code,ds:data     
begin:
        mov ax,data         
        mov ds,ax           
        mov es,ax           ;es ссылается туда же, где и ds
;------------------------------------------------
;Вывод приглашения на ввод числа
        mov ah,09h          ;команда на вывод строки
        mov dx,offset _INFO ;смещение на строку
        int 21h             ;выполнить команду
;------------------------------------------------
;Определяем тип операции
enter_type_operation: 
        mov ah,01h            ;вызов команды ввода символа с клавиатуры
        int 21h               ;выполнить команду
        cmp al,'+'            ;введен "+" 
        je summ               ;да -> суммируем 2 числа
        cmp al,'-'            ;введен "-" 
        je minus              ;да -> вычитаем 2 числа
        jmp enter_type_operation;во всех других случаях - повтор ввода
;------------------------------------------------
;Суммирование двух чисел
summ:
        mov ah,09h            ;команда на вывод строки
        mov dx,offset _nc     ;в dx смещение на строку
        int 21h               ;выполнить команду
        mov ax,first          ;ax=first
        mov bx,second
        add ax,bx             ;ax=ax+bx
        jnc write_res         ;если нет переноса(CF=0), то вывод результата
        jmp errorCF           ;иначе вывести ошибку
;------------------------------------------------
minus:
        mov ah,09h            ;команда на вывод строки
        mov dx,offset _nc     ;в dx смещение на строку
        int 21h               ;выполнить команду
        mov ax,first          ;ax=first 
        mov bx,second
        sub ax,bx             ;ax=ax-bx
        jno write_res         ;если нет заема(OF=0), то вывод результата
        jmp errorOF           ;иначе вывести ошибку
;------------------------------------------------
;Вывод числа
write_res:
        test ax,ax            ;проверим знак числа
        jns init              ;SF=0? если да, то просто вывод числа
        mov cx,ax             ;иначе выводим как отрицательное, cx=ax
        mov ah,02h            ;выводим символ
        mov dl,'-'            ;поместим в dl символ минуса
        int 21h               ;выполним команду
        mov ax,cx             ;вернем старое значение, cx=ax
        neg ax                ;сменим знак операнда     
init:
        xor cx,cx             ;cx=0
        xor dx,dx             ;dx=0
    push -1               ;сохраним признак конца числа
    mov cx,10         ;делим на 10
repeat: 
        xor dx,dx         ;очистим регистр dx
    div cx                ;делим 
    push dx               ;сохраним цифру
    cmp ax,0          ;остался 0? (оптимальнее or ax,ax)
    jne repeat        ;нет -> продолжим
    mov ah,2h             ;вывод символа
digit:  
        pop dx                ;восстановим цифру
    cmp dx,-1         ;дошли до конца -> выход {оптимальнее: or dx,dx jl ex}
    je exit               ;завершить вывод
    add dl,'0'        ;преобразуем число в цифру
    int 21h               ;выведем цифру на экран
    jmp digit         ;и продолжим 
;------------------------------------------------
;Вывод ошибки о переполнении, при операции сложения
errorCF:
        mov ah,09h            ;команда на вывод строки
        mov dx,offset _errorCF;в dx смещение на строку
        int 21h               ;выполнить команду
        jmp exit              ;переход по метке
;------------------------------------------------
;Вывод ошибки о заеме, при операции вычитания       
errorOF:
        mov ah,09h            ;команда на вывод строки
        mov dx,offset _errorOF;в dx смещение на строку
        int 21h               ;выполнить команду
        jmp exit              ;переход по метке
;------------------------------------------------ 
exit:
        mov ax,4c00h       
        int 21h
code ends
end begin
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.06.2012, 03:14
Ответы с готовыми решениями:

Написать простейший дизассемблер
Привет Кто нибудь писал дизассемблер(наипростейший)?? С чего начать?Какие книги посоветуете? Может кто пример скинет А...

Простейший планировщик процессов
Всем привет. Нам в лабораторной работе дали задание: Написать на ассемблере IBM PC программу простейшего планировщика, обеспечивающего...

Простейший планировщик процессов
Помогите пожалуйста написать программу! В ассемблере разбираюсь плоховато, буду рад любым подсказкам)) Задание: Написать на...

8
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
03.06.2012, 10:55
В 43 строке должно быть jno вместо jnc.
0
Программист
 Аватар для Arigato
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5
03.06.2012, 11:07
Цитата Сообщение от Ant1971on Посмотреть сообщение
В 43 строке должно быть jno вместо jnc.
Но разве при операции сложения не CF флаг учитывается, а не OF, как для вычитания? Хотя я попробовал - но проблемы это не решило.
В целом суть какая:
При сложении получается, что на входных данных, скажем первый операнд 65532, а второй 5, то получается что при сложении получим переполнение, что верно. В то время, как при вычитании получим -9, что впринципе не верно.
0
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
03.06.2012, 11:43
Лучший ответ Сообщение было отмечено как решение

Решение

Операнды должны быть в диапазоне от -32768 до 32767 для знаковых чисел типа word. Число 65532 в качестве операнда годится только при операциях с числами без знака.
3
Программист
 Аватар для Arigato
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5
03.06.2012, 11:49
Цитата Сообщение от Ant1971on Посмотреть сообщение
Операнды должны быть в диапазоне от -32768 до 32767 для знаковых чисел типа word. Число 65532 в качестве операнда годится только при операциях с числами без знака.
Спасибо. Сейчас попробовал так:

а)
первый операнд 32767
второй операнд -5
результат: при вычитании и разности получил переполнения
б)
первый операнд 32767
второй операнд 5
результат: при сумме получил -32764(верно?), при разности 32762(это верно)
Так должно все получится? Верно?
0
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
03.06.2012, 11:59
Цитата Сообщение от Arigato Посмотреть сообщение
первый операнд 32767
второй операнд -5
результат: при вычитании и разности получил переполнения
Смотри:
-5 = 65531

32767-65531 будет заем.



Цитата Сообщение от Arigato Посмотреть сообщение
первый операнд 32767
второй операнд 5
результат: при сумме получил -32764(верно?), при разности 32762(это верно)
Так должно все получится? Верно?
Сумма не верная, потому что
32767+5 = 32772
32772 имеет единичный знаковый бит, поэтому считается отрицательным числом.
Не задавай предельные значения!
2
273 / 268 / 11
Регистрация: 24.12.2010
Сообщений: 328
03.06.2012, 12:02
a) 32767-(-5)=32772 -> переполнение -> выход.
б) 32767+5=32772 -> тоже, 32767-5=32762 -> верно.
2
Программист
 Аватар для Arigato
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5
03.06.2012, 12:04
Цитата Сообщение от Anonimys Посмотреть сообщение
Смотри:
-5 = 65531
32767-65531 будет заем.

Сумма не верная, потому что
32767+5 = 32772
32772 имеет единичный знаковый бит, поэтому считается отрицательным числом.
Не задавай предельные значения!
Спасибо. Просто я решил проверять именно калькулятор на граничных значениях.
На значениях -15 и 5 получил -10 и -20 соответственно.
На значениях -15 и -5 получил -10(разность) и -20(при сумме,что верно)
0
 Аватар для cupoma
0 / 0 / 0
Регистрация: 13.09.2016
Сообщений: 76
04.06.2023, 10:12
Это простейший калькулятор на masm32_fenix.zip
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.06.2023, 10:12
Помогаю со студенческими работами здесь

Простейший калькулятор
Калькулятор считает сумму, разность, произведение и частное двух чисел a и b Код: #include <stdio.h> #include...

Простейший калькулятор
Помогите пож переделать немного код. По заданию нужно чтобы мы вводили 2 числа в поля 1 и 2. И результат высчитывался в поле 3. Кнопка +/-...

Простейший калькулятор
Не нашел ни одного хорошего кода калькулятора для новичков. Чтобы они поняли как устроены конструкции else, if. Вот, может кому...

Простейший калькулятор
Доброго времени суток! Только начал изучать Java. До этого с программированием не сталкивался, поэтому код может быть мягко сказано не...

Простейший калькулятор
Есть код на решение примеров +,-,*. при запуске знаков или не видно или они не правильно стоят.((( Заранее багодарен. ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru