Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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
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
Codice sorgente - presumibilmente Altri Linguaggi
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 il 30/11/2012 alle 21:00
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à.
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à.
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.
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
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à.
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à.