Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - Gestire l'eccezione della divisione per 0 in assembly dell'8086
Forum - Altri Linguaggi - Gestire l'eccezione della divisione per 0 in assembly dell'8086

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
gllobal (Normal User)
Rookie


Messaggi: 41
Iscritto: 02/04/2012

Segnala al moderatore
Postato alle 10:44
Venerdì, 30/11/2012
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

Codice sorgente - presumibilmente Altri Linguaggi

  1. data segment
  2.     divisore db 15
  3.     numeratore db 15
  4.     msgOk db "Divisione eseguita correttamente $"
  5.     msgErr db "Errore!! Divisione per 0 impossibile$"
  6. ends
  7.        
  8. code segment
  9. divisione proc
  10.     mov ds, si
  11.     cmp divisore, 0
  12.     je MessaggioErrore
  13.     lea dx, msgOk
  14.     mov ah, 09h
  15.     int 21h
  16.     jmp fine
  17. MessaggioErrore:
  18.     lea dx, msgErr
  19.     mov ah, 09h
  20.     int 21h
  21. fine:    
  22. iret          
  23. divisione endp
  24.  
  25. start:  
  26.     mov ax, data
  27.     mov ds, ax
  28.    
  29.     mov ah,00
  30.     mov al,13h
  31.     int 10h   ;modalita' video
  32.        
  33.     mov cx,[00]  ;in cx metto ip
  34.     mov dx,[02]  ;in dx metto cs
  35.     mov ax,0
  36.     mov si,ds
  37.     mov ds,ax
  38.     mov ax,seg divisione
  39.     mov [02],ax   ;cs  
  40.     mov ax,offset divisione
  41.     mov [00],ax   ;ip
  42.    
  43.     mov ah,0
  44.     mov al,numeratore
  45.     div divisore    ;divisione per generare l' eccezione
  46.  
  47.     mov [02],dx  ;ripristino i 4 byte dell'IVT
  48.     mov [00],cx  
  49.        
  50.     mov ax, 4C00h ; exit to operating system.
  51.     int 21h
  52. ends
  53. end start



Il mio programma

Codice sorgente - presumibilmente Altri Linguaggi

  1. data segment  
  2.     MsgNoErr db "Operazione completata$"
  3.     MsgSiErr db "Errore divisione per 0$"
  4.     divs db 0
  5.     divd db 15
  6. ends    
  7.  
  8. code segment  
  9. ERR proc
  10.     mov ds,di
  11.     cmp divs, 0
  12.     jne NoErr
  13.     lea dx,MsgSiErr
  14.     jmp Fine
  15. NoErr:
  16.     lea dx,MsgNoErr
  17. Fine:          
  18.     mov ah,09h
  19.     int 21h  
  20.     iret
  21. ERR endp    
  22.        
  23. start:
  24.     mov ax,data
  25.     mov ds,ax    
  26.    
  27.     mov ah,00
  28.     mov al,13h
  29.     int 10h   ;modalita' video
  30.    
  31.     mov cx,[00]  ;in cx metto ip
  32.     mov dx,[02]  ;in dx metto cs  
  33.     mov si,ds  
  34.     mov ax,0        
  35.     mov ds,ax  
  36.     mov ax,seg ERR
  37.     mov [02],ax   ;cs  
  38.     mov ax,offset ERR
  39.     mov [00],ax   ;ip  
  40.      
  41.     mov ah,0
  42.     mov al,divd
  43.     div divs    ;divisione per generare l' eccezione
  44.  
  45.     mov [02],dx  ;ripristino i 4 byte dell'IVT
  46.     mov [00],cx  
  47.    
  48.     mov ax, 4c00h
  49.     int 21h    
  50. ends
  51.  
  52. end start ; set entry point and stop the assembler.


Ultima modifica effettuata da gllobal il 30/11/2012 alle 21:00
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6196
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:42
Venerdì, 30/11/2012
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à.
PM Quote
Avatar
gllobal (Normal User)
Rookie


Messaggi: 41
Iscritto: 02/04/2012

Segnala al moderatore
Postato alle 21:02
Venerdì, 30/11/2012
Ho cambiato ERR con Errore ma il problema persiste.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6196
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:02
Venerdì, 30/11/2012
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à.
PM Quote
Avatar
gllobal (Normal User)
Rookie


Messaggi: 41
Iscritto: 02/04/2012

Segnala al moderatore
Postato alle 22:05
Venerdì, 30/11/2012
emu8086

PM Quote
Avatar
gllobal (Normal User)
Rookie


Messaggi: 41
Iscritto: 02/04/2012

Segnala al moderatore
Postato alle 22:12
Venerdì, 30/11/2012
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.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6196
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:54
Venerdì, 30/11/2012
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 è

Codice sorgente - presumibilmente Altri Linguaggi

  1. data segment  
  2.     MsgNoErr db "Operazione completata$"
  3.     MsgSiErr db "Errore divisione per 0$"
  4.     divs db 0
  5.     divd db 15
  6. ends    
  7.  
  8. code segment  
  9. ERR proc
  10.     mov ds,di
  11.     cmp divs, 0
  12.     jne NoErr
  13.     lea dx,MsgSiErr
  14.     jmp Fine
  15. NoErr:
  16.     lea dx,MsgNoErr
  17. Fine:          
  18.     mov ah,09h
  19.     int 21h  
  20.     iret
  21. ERR endp    
  22.        
  23. start:
  24.     mov ah,00
  25.     mov al,13h
  26.     int 10h   ;modalita' video
  27.    
  28.     mov di,data
  29.    
  30.     mov ax,0
  31.     mov ds,ax
  32.    
  33.     mov cx,[00]  ;in cx metto ip
  34.     mov dx,[02]  ;in dx metto cs  
  35.     mov ax,seg ERR
  36.     mov [02],ax   ;cs  
  37.     mov ax,offset ERR
  38.     mov [00],ax   ;ip  
  39.    
  40.     mov ds,di
  41.      
  42.     mov ah,0
  43.     mov al,divd
  44.     div divs    ;divisione per generare l' eccezione
  45.    
  46.     mov ax,0
  47.     mov ds,ax
  48.    
  49.     mov [02],dx  ;ripristino i 4 byte dell'IVT
  50.     mov [00],cx  
  51.    
  52.     mov ax, 4c00h
  53.     int 21h    
  54. ends
  55.  
  56. 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à.
PM Quote
Avatar
gllobal (Normal User)
Rookie


Messaggi: 41
Iscritto: 02/04/2012

Segnala al moderatore
Postato alle 23:06
Venerdì, 30/11/2012
perchè prima di ripristinare i 4 byte dell'IVT hai azzerato il registro ds?

Codice sorgente - presumibilmente Plain Text

  1. mov ax,0
  2.          mov ds,ax


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6196
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:17
Sabato, 01/12/2012
Per lo stesso motivo per cui l'ho fatto prima, quando sono stati letti. Perché quei byte stanno nel segmento 0 della memoria. Vedi

http://wiki.osdev.org/Interrupt_Vector_Table


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à.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo