Oppure

Loading
30/11/12 9:44
gllobal
Ciao a tutti, ho il seguente problema, in pratica per vari motivi sono stato assente a molte lezioni di sistemi, il prof ha consegnato un nuovo progetto e cioè gestire l'eccezione della divisione per 0 in assembly, io avendo perso molte lezioni ho chiesto il programma a un compagno che l'ha finito, e quindi ho preso spunto dal suo codice. Il problema è il seguente, il mio non funziona il suo invece si. Ho controllato il suo e il mio e mi sembra che siano identici tranne che cambiano i nomi delle variabili, il procedimento è lo stesso, però il mio n on funziona il suo si. Di seguito c'è il codice, il primo programma è del mio compagno e dopo c'è il mio. Poi se potete spiegarmi anche i vari passaggi eseguiti nel programma, sarebbe il massimo grazie a tutti.

Programma dell'amico

data segment
    divisore db 15
    numeratore db 15 
    msgOk db "Divisione eseguita correttamente $"
    msgErr db "Errore!! Divisione per 0 impossibile$"
ends
       
code segment
divisione proc 
    mov ds, si 
    cmp divisore, 0
    je MessaggioErrore
    lea dx, msgOk
    mov ah, 09h
    int 21h 
    jmp fine
MessaggioErrore:
    lea dx, msgErr
    mov ah, 09h
    int 21h 
fine:    
iret           
divisione endp

start:   
    mov ax, data
    mov ds, ax
    
    mov ah,00
    mov al,13h
    int 10h   ;modalita' video 
        
    mov cx,[00]  ;in cx metto ip
    mov dx,[02]  ;in dx metto cs
    mov ax,0
    mov si,ds
    mov ds,ax
    mov ax,seg divisione 
    mov [02],ax   ;cs  
    mov ax,offset divisione
    mov [00],ax   ;ip 
    
    mov ah,0
    mov al,numeratore
    div divisore    ;divisione per generare l' eccezione

    mov [02],dx  ;ripristino i 4 byte dell'IVT
    mov [00],cx  
       
    mov ax, 4C00h ; exit to operating system.
    int 21h 
ends
end start 


Il mio programma

data segment   
    MsgNoErr db "Operazione completata$"
    MsgSiErr db "Errore divisione per 0$"
    divs db 0
    divd db 15
ends     

code segment  
ERR proc 
    mov ds,di
    cmp divs, 0
    jne NoErr
    lea dx,MsgSiErr 
    jmp Fine
NoErr:
    lea dx,MsgNoErr 
Fine:          
    mov ah,09h
    int 21h   
    iret
ERR endp    
        
start:
    mov ax,data
    mov ds,ax    
    
    mov ah,00
    mov al,13h
    int 10h   ;modalita' video 
    
    mov cx,[00]  ;in cx metto ip
    mov dx,[02]  ;in dx metto cs   
    mov si,ds   
    mov ax,0        
    mov ds,ax   
    mov ax,seg ERR 
    mov [02],ax   ;cs  
    mov ax,offset ERR
    mov [00],ax   ;ip   
      
    mov ah,0
    mov al,divd
    div divs    ;divisione per generare l' eccezione

    mov [02],dx  ;ripristino i 4 byte dell'IVT
    mov [00],cx  
    
    mov ax, 4c00h 
    int 21h    
ends

end start ; set entry point and stop the assembler.
Ultima modifica effettuata da gllobal 30/11/12 20:00
aaa
30/11/12 19:42
nessuno
Comincia a non usare ERR come etichetta perché potrebbe essere riservato.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
30/11/12 20:02
gllobal
Ho cambiato ERR con Errore ma il problema persiste.
aaa
30/11/12 21:02
nessuno
Ma cosa utilizzi per scrivere, compilare ed eseguire il programma?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
30/11/12 21:05
gllobal
emu8086
aaa
30/11/12 21:12
gllobal
Lo uso a scuola, ho eseguito il codice, istruzione per istruzione e ho notato che non mi crea l'eccezione del processore quando avviene la divisione per 0 e quindi non mi esegue la procedura ERR, invece quando eseguo quello del mio amico va tutto liscio, non capisco il perchè alla fine sono identici, tranne la procedura che l'ho un po' accorciata togliendo il codice che si ripeteva.
aaa
30/11/12 21:54
nessuno
Il fatto è che tutti e due i codici sono sbagliati e quello del tuo compagno funziona solo per caso (dipende dal contenuto della memoria).

Il codice corretto è

data segment  
    MsgNoErr db "Operazione completata$"
    MsgSiErr db "Errore divisione per 0$"
    divs db 0
    divd db 15
ends    
 
code segment  
ERR proc
    mov ds,di
    cmp divs, 0
    jne NoErr
    lea dx,MsgSiErr
    jmp Fine
NoErr:
    lea dx,MsgNoErr
Fine:          
    mov ah,09h
    int 21h  
    iret
ERR endp    
       
start:
    mov ah,00
    mov al,13h
    int 10h   ;modalita' video
   
    mov di,data
    
    mov ax,0
    mov ds,ax
    
    mov cx,[00]  ;in cx metto ip
    mov dx,[02]  ;in dx metto cs  
    mov ax,seg ERR
    mov [02],ax   ;cs  
    mov ax,offset ERR
    mov [00],ax   ;ip  
    
    mov ds,di
     
    mov ah,0
    mov al,divd
    div divs    ;divisione per generare l' eccezione
    
    mov ax,0
    mov ds,ax
    
    mov [02],dx  ;ripristino i 4 byte dell'IVT
    mov [00],cx  
   
    mov ax, 4c00h
    int 21h    
ends
 
end start ; set entry point and stop the assembler.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
30/11/12 22:06
gllobal
perchè prima di ripristinare i 4 byte dell'IVT hai azzerato il registro ds?

mov ax,0 
         mov ds,ax  
aaa