Oppure

Loading
16/12/12 18:40
gllobal
Ciao, mi serve un urgente aiuto per una relazione che devo consegnare martedì, volevo sapere cos'è e cosa fa la direttiva assume. Dalla spiegazione del prof io ho dedotto questo, che però non mi convince :

Assume e' una direttiva che associa a tutti i segment delle etichette il segment del DS, CS o SS. Esempio.
Ai segment contenuti nel data vengono associati i segment del DS.

data sarebbe la parte del codice dove ho dichiarato le mie variabili, cioè il data segment.

Assume DS :data,CS:code,SS:pila

Inoltre cos'è il masm e il linker? so che servono per generare il file .exe avendo un .asm, ma qual'è la definizione?

Di seguito ho messo il codice del programma se serve.
Assume DS:data,CS:code,SS:pila   ;Assume e' una direttiva che associa a tutti i segment delle
                             ;etichette il segment del DS, CS o SS. Esempio. 
                             ;Ai segment contenuti nel data vengono associati 
                             ;i segment del DS.
code segment 
ERR: 
    mov ax,data
    mov ds,ax
    lea dx,MsgSiErr    
    mov ah,09h
    int 21h  
    pop ax    ;Estrazione dallo stack dell'ip che punta all'istruzione div
    add al,2  ;L'indirizzo ip viene incrementato di 2, in questo modo in seguito il     
                     ;programma non si posizionerà sull'istruzione div ma su quella seguente.
    push ax   ;L'indirizzo ip viene reinserito nello stack.     
    iret      ;Con l'istruzione iret la cpu salta sull'indirizzo di ritorno, prima di ciò 
              ;il processore estrae 3 word dallo stack, le prime 2 le carica in cs:ip,
              ;l'ultima la carica nel registro flags.  
                     
start:   
    mov ax,0  ;Azzeramento del registro ds per modificare l'IVT
    mov ds,ax       
 
    mov cx,[00]  ;Memorizzazione dell'ip nel registro cx.
    mov bx,[02]  ;Memorizzazione di cs nel registro bx.
    mov ax,seg ERR  
    mov [DS:02],ax    
    mov ax,offset ERR
    mov [DS:00],ax ;Nell'indirizzo CS:IP dell'IVT e' stato inserito l'indirizzo  
                   ;dell'etichetta ERR, in questo modo la CPU eseguirà 
                   ;le istruzioni che seguono l'etichetta ERR.
    mov ax,data
    mov ds,ax      ;Riposizioni il DS sul data segment.
         
    mov ah,0
    mov al,divd
    div divs    ;Divisione per 0 per generare l' eccezione.  
    nop         ;no operation, e' un'istruzione che viene eseguita ma non 
    nop         ;crea cambiamenti durante l'esecuzione del programma.
    nop   
    lea dx,MsgRitorno ;Messaggio per comunicare il ritorno al programma principale 
    mov ah,09h
    int 21h   
         
    mov ax,0
    mov ds,ax
   
    mov [DS:02],bx  ;Ripristino dei 4 byte dell'IVT, precedentemente in BX e' stato memorizzato 
    mov [DS:00],cx  ;il CS e in CX l'IP.
    
    mov ax, 4c00h   
    int 21h    
code ends 

data segment  
    MsgRitorno db "Ritorno al main program.$"
    MsgSiErr db "Errore divisione per 0. $"
    divs db 0
    divd db 15
data ends 

pila segment stack
    db 100 dup(0AAH)
pila ends
end start


Ciao e grazie a tutti quelli che risponderanno :) .
Ultima modifica effettuata da gllobal 16/12/12 18:44
aaa
16/12/12 18:52
pierotofy
E' un po' piu' dettagliato di quello che ha detto il tuo professore: cs.smith.edu/~thiebaut/ArtOfAssembly/CH08/…

Il MASM e' un assembler (converte un file .asm in codice oggetto .obj).

Il linker prende uno o piu' files .obj e si occupa di creare l'eseguibile (.exe).
Ultima modifica effettuata da pierotofy 16/12/12 18:53
Il mio blog: piero.dev
16/12/12 18:54
gllobal
Ok grazie mille :) .
aaa