Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [asm] Калькулятор, калькулятор на 4 операции 
:(
    Опции темы
Aingon
Дата 13.12.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.12.2009

Репутация: нет
Всего: нет



Помогите мне, пожалуйста!
Необходимо написать калькулятор на ассемблере в DOS (компилятор - TASM)
Калькулятор для работы с простыми операциями + - * / (целые одно- и двузначные числа)

Это сообщение отредактировал(а) Aingon - 14.12.2009, 09:07
PM MAIL   Вверх
airyashov
Дата 14.12.2009, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 1
Всего: 6



и где код программы, что конкретно не получается или все же во фриланс?


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Aingon
Дата 14.12.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.12.2009

Репутация: нет
Всего: нет



код:

Цитата

dseg segment
.386
op1 dd 0
d dd 0
osn dd 10
vv db 10,13,'вводите пример в виде: <число1><знак операции><число2><знак "равно">',10,13,'$'
s db 10,13,'Нужно вводить числа!',10,13,'$'
gr db 10,13,'Я не могу работать с такими большими числами',10,13,'$'
n db 10,13,'Делить на ноль нельзя!','$'
dey db 0
dseg ends

code segment use16
assume cs:code, ds:dseg;установка связи между сегментами и сегментными регистрами
start:
    mov ax,dseg
    mov ds,ax
mov ah,9                                       
lea dx,vv
int 21h
call input                                               ;ввод первого операнда и занесение его в перем ор1
mov eax,d                                                       
mov op1,eax                                                    

menu:
mov al,dey                                        ;в al копируем содержимое dey
    cmp al,'='                                    ;сравнение al со знаком = (если нет - переход на m1)
    jne m1                               
    call output                                     
    mov ah,7h                                             
    int 21h                                                      
    mov ah,4ch                                                
    int 21h

m1:
    cmp al,'+'                                    ;сравнение al со знаком + (если нет - переход на m2)
    jne m2                               
    call input                                     
    mov eax,d                                         
        add op1,eax                                                  ;op1=op1+ax
    jmp menu                                           
m2:
    cmp al,'-'                                    ;сравнение а1 со знаком - (если нет - переход на m3)
    jne m3                                 
    call input                                       
    mov eax,d                                            
    sub op1,eax                                                  ;op1=op1-ax
    jmp menu                                             
m3:
    cmp al,'*'                                    ;сравнение al со знаком * (если нет - переход на m4)
    jne m4                               
    call input                                       
    mov eax,op1                                      
    mul d                                           
    mov op1,eax                                       
    jmp menu                                          
m4:
    cmp al,'/'                                    ;сравнение al со знаком / (если нет - переход на menu)
    jne menu                           
    call input                                      
    mov eax,op1                                      
cmp al,'0'
jnz nolb
    div d                                                  ;деление ах на d
    mov op1,eax                                        ;копирование ах в ор1
    jmp menu                                               ;переход на menu
nolb:
mov ah,9
lea dx,n
int 21h
call output

;----------------------------процедура ввода-----------------------------------
input proc                                               ;процедура ввода числа
mov d,0                                                   
begin:
    mov ah,1h                            
    int 21h        
    cmp al,'='
    jne h
    mov dey,al
    ret

h:
    cmp al,'0'                         ;сравнение кода символа с кодом нуля (>= то переход на dal1)
    jge dal1                     
mov dey,al
ret
    dal1:
    cmp al,'9'                            ;сравнение кода символа с кодом 9 (<= то переход на dal2)
    jle dal2                   
mov ah,9h                              ;сообщение - введено не число
lea dx,s                                                
int 21h                                                 
jmp begin     
                                               
    dal2:
    sub al,'0'    ;вычитание из кода символа код нуля, чтобы получить число
    cbw                                                
    mov esi,eax                                        ;сохр числа в si
    mov eax,d   
    mul osn                                             
    jnc dal3                     ;нет переноса, то переход на dal3
mov ah,9h                    ;сообщение - большое число 
lea dx,gr                                                 
int 21h                                                
mov ah,4ch                                                    
int 21h
    dal3:
    add eax,esi                
    mov d,eax                             
    jmp begin                               
input endp

;-----------------------------процедура вывода---------------------------------
output proc
mov eax,op1                                    
mov cx,0                                                      
    out_dec:
    mov dx,0                                                  
    div osn                                  
    push dx                                     
    inc cx                                                   
    cmp eax,0                                          
    jne out_dec                     
dmet:
    pop dx                                         
    add dl,'0'                               
    mov ah,2h                                  
    int 21h
    loop dmet                                                  
ret
output endp
code ends
end start


Не получается:
       1 вычитание (если вычитаемое больше)
       2 деление
PM MAIL   Вверх
airyashov
Дата 14.12.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 1
Всего: 6



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


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.