Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [asm] Калькулятор


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

Автор: airyashov 14.12.2009, 07:59
и где код программы, что конкретно не получается или все же во фриланс?

Автор: Aingon 14.12.2009, 09:56
код:

Цитата

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 деление

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)