Не пойму где ошибка в программе - Assembler

Узнай цену своей работы

Формулировка задачи:

Суть проблемы в том, что, ошибок в примере нету (в программе Far Менеджер, показывало, что нету их), но результаты не сходятся (вычислял пример сам и смотрел в программе Far), но я не могу понять, почему так получается и как исправить это? Сама задача вот: Вычислить -2с-23d / (a/4)-1; a,c,d ввести с клавиатуры. А вот и программа:
S Segment stack                                                      
      db 128 dup (?)                                                 
S ENDS                                                               
DDD Segment                                                          
      coc1 db 3                                                      
      coc2 db 4                                                      
      r1 db (?)                                                      
      r2 db (?)                                                      
      r3 db (?)            ;резервные ячейки                         
      r4 db (?)                                                      
      r5 db -2                                                       
      a db 3,(?),3 dup (?)                                           
      c db 3,(?),3 dup (?) ;буфер для ввода с клавиатуры             
      d db 3,(?),3 dup (?)                                           
      a1 db 0dh,0ah,'введите a,$'                                    
      c1 db 0dh,0ah,'введите c,$'                                    
      d1 db 0dh,0ah,'введите d,$'                                    
DDD ENDS                                                             
CCC Segment                                                          
      assume ds:ddd,cs:ccc,ss:s                                      
Start:                                                               
      Mov ax,ddd      ;перенос адреса сигмента данных в ds           
      Mov ds,ax                                                      
      Lea dx,a1                                                      
      Mov ah,9AH                                                     
      int 21H         ;вывод строки a1                               
      Lea dx,a                                                       
      Mov ah,0AH                                                     
      int 21H         ;ввод a                                        
      xor ax,ax                                                      
      Mov si,1                                                       
      Mov cx,3        ;задание цикла для перевода a                  
      cmp a[si],2                                                    
      jne m1                                                         
      inc si                                                         
m1:   Mov ah,a[si]                                                   
      inc si                                                         
      Mov al,a[si]                                                   
      and ax,0f0fh                                                   
      aad                                                            
      Mov r1,al       ;перевод числа a                               
                                                                     
      Lea dx,c1                                                      
      Mov ah,9H                                                      
      int 21H         ;вывод строки c1                               
      Lea dx,c                                                       
      Mov ah,0AH                                                     
      int 21H         ;ввод c                                        
      xor ax,ax                                                      
      Mov si,1                                                       
      Mov cx,3        ;задание цикла для перевода c                  
      cmp c[si],2                                                    
      jne p1                                                         
      inc si                                                         
p1:   Mov ah,c[si]                                                   
      inc si                                                         
      Mov al,c[si]                                                   
      and ax,0f0fh                                                   
      aad                                                            
      Mov r2,al       ;перевод числа c                               
                                                                     
      Lea dx,d1                                                      
      Mov ah,9H                                                      
      int 21H         ;вывод строки d1                               
      Lea dx,d                                                       
      Mov ah,0AH                                                     
      int 21H         ;ввод d                                        
      Mov si,1                                                       
      Mov cx,4        ;задание цикла для перевода d                  
      cmp d[si],2                                                    
      jne v1                                                         
      inc si                                                         
v1:   Mov ah,d[si]                                                   
      inc si                                                         
      Mov al,d[si]                                                   
      and ax,0f0fh                                                   
      aad                                                            
      Mov r3,al       ;перевод d                                     
      Mov al,d[si]                                                   
      and ax,0f0fh                                                   
      aad                                                            
      Mov r4,al       ;перенос d                                     
      Mov AL,r3                                                      
      Imul r5                                                        
      Mov bp,ax       ;перенос -2c в регистр bp                      
      xor ax,ax       ;обнуляем ax                                   
      Mov al,r4       ;перенос d в регистр ax                        
      Mul coc1        ;умножаем d на 23                              
      Mov ah,0        ;обнуляем старшую часть ax                     
      Sub bp,ax       ;перенос результата в регистр bl               
      xor ax,ax       ;обнуляем ax                                   
      Mov al,r1       ;перенос a в регистр ax                        
      div coc2        ;деление a на 4 результат в AL                 
      Mov dl,r2       ;перенос b в регистр dx                        
      Sub al,dl       ;1 минус AL                                    
      xor ax,ax       ;обнуляем ax                                   
      Mov ax,bp       ;перенос bp в регистр ax                       
      IDiv dl         ;делим ax на dl                                
      Mov ax,4C00H                                                   
      Int 21H                                                        
CCC ENDS                                                             
END Start

Решение задачи: «Не пойму где ошибка в программе»

textual
Листинг программы
;Вычислить -2с-23d/(a/4)-1; a,c,d ввести с клавиатуры.
 
stak segment stack                          
      db 128 dup (?)                             
stak ends                               
data segment                                  
      a2 db (?)                              
      c2 db (?)                              
      d2 db (?)        
      
      a_a dw 0
      c_c dw 0
      d_d dw 0
 
    vvod db 4
    line db ?
  chislo db 3 dup (?) 
 
      a1 db 0dh,0ah,'введите a,$'                    
      c1 db 0dh,0ah,'введите c,$'                    
      d1 db 0dh,0ah,'введите d,$'
 
   otvet dd 0
 
       z db 0
                    
data ends                                 
 
code segment     
 
 assume ds:data,cs:code,ss:stak                      
 
start:                                   
 mov ax,data           
 mov ds,ax  
 
;;; a ;;;;;;;;;;;;                          
 lea dx,a1                          
 call text_1              
 lea dx,vvod                               
 call vvod_1
 call perevod
 mov [a2],al
 
;;; c ;;;;;;;;;;;;                          
 lea dx,c1                          
 call text_1              
 lea dx,vvod                               
 call vvod_1
 call perevod
 mov [c2],al
 
;;; d ;;;;;;;;;;;;                          
 lea dx,d1                          
 call text_1              
 lea dx,vvod                               
 call vvod_1
 call perevod
 mov [d2],al
 
 call formula
 
 
exit_dos:                  
 mov ax,4c00h                           
 int 21h    
                        
;-2с-23d/(a/4)-1 ;;;;;;;;;;;;;;;;;;;;;;;;;
formula:
 
;(a/4)-1
 xor ax,ax
 mov al,[a2]
 shr ax,2
 sub ax,1
 mov [a_a],ax 
 
;-2с
 xor ax,ax
 mov al,[c2]
 shl ax,1
 not ax
 mov [c_c],ax  
 
;-23d
 xor ax,ax
 mov al,d2
 mov cl,-23
 imul cl
 mov [d_d],ax
 
 int 3
 
 mov ax,[c_c] 
 sub ax,[d_d]
 mov cx,[a_a]
 xor dx,dx
 
 idiv cx
  
 
 ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
text_1:
 mov ah,09h
 int 21h
 ret
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vvod_1:
 mov ah,0ah
 int 21h
 ret 
 
;perevod string = byte chislo ;;;;;;;;;;;;;
perevod:
 mov [z],0
 
 xor bx,bx
 xor ax,ax
 xor cx,cx
 
 cmp [line],2
 ja p1
 cmp [line],1
 ja p2
 jmp p3
 
; chislo * 100 
p1:
 mov al,[chislo+bx]  
 sub al,30h
 mov cx,2
 
p1_1:
 push cx
 mov cl,al
 shl al,3
 shl cl,1
 add al,cl    
 pop cx
 loop p1_1
 inc bx
 add [z],al
  
 
;; chislo * 10 
p2:
 mov al,[chislo+bx]  
 sub al,30h
 mov cl,al
 shl al,3
 shl cl,1
 add al,cl    
 add [z],al
 inc bx
 
;; chislo +
p3:
 mov al,[chislo+bx]  
 sub al,30h
 add [z],al
 
;vozvrat al=otvet
 mov al,[z]
 ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code ends                                 
end start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.214 из 5