  | Il  codice oggetto
    prodotto è pero "a
    rischio"; vediamo alcuni errori di tipo warning,
    molto frequenti durante le nostre prime esperienze.
  
      | sempre a proposito della conoscenza delle istruzioni
        del nostro processore si potrebbe essere indotti a pensare che l'acqua di un bicchiere possa stare dentro una bottiglia; ma l'assemblatore non
        sembra d'accordo.. Se inseriamo l'istruzione MOV
        AX,BL viene segnalato questo errore:
          
      
      test04.ASM(5): warning A4031: Operand types must match 
         
        0 Warning Errors 
              1 Severe  Errors | 
       
     
    Sebbene BL (8
        bit) sia facilmente contenibile da AX (16
        bit) l'operazione non è logica e il compilatore prima
        ci avvisa che gli operandi devono essere dello stesso tipo e
        poi di sua iniziativa
        compila comunque l'istruzione, però come se fosse scritta MOV
        AX,BX. Naturalmente il  codice
        macchina prodotto non è quello che noi avevamo pensato e il programma
        potrebbe funzionare male! |  
   
  
      
          
            | 
          Non
            sottovalutare gli errori di tipo warning; l'assemblatore genera
            comunque il  codice oggetto, ma ciò che sarà
            eseguito dal processore  non sarà quello che volevamo... | 
       
     
  
      | Un caso simile al precedente, ma potenzialmente più
        pericoloso, è quello suggerito da questo codice sorgente; sono definite
        2 variabili, una da 8 bit (alfa) e una da 16 (beta), e si attuano
        operazioni di scambio dati:
          
      
      alfa     
        DB      10H 
        beta      DW      0B800H 
                  ;------------------------------------ 
        Main:     MOV     CS:[alfa],AX    ;linea 6 
                  MOV     CS:[beta],AL    ;linea
        7 
                  MOV     AX,CS:[alfa]    ;linea
        8 
                  MOV     AL,CS:[beta]    ;linea
        9 | 
       
     
    I 4 messaggi d'errore sono gli
        stessi di prima: avvisano che gli operandi non sono della stessa
        dimensione, e la cosa sembra ragionevole...
    
          
      
      test05.ASM(6): warning A4031: Operand types must match 
        test05.ASM(7): warning A4031: Operand types must match 
        test05.ASM(8): warning A4031: Operand types must match 
        test05.ASM(9): warning A4031: Operand types must match 
         
      4 Warning Errors 
        
        0 Severe Errors | 
       
     
    Ma ora il compilatore non prende iniziative: genera un codice
        esattamente uguale a quello aspettato. Allora, dove sta' il problema?
        Vediamo di capire:
        
        
            | l'istruzione
         MOV
            CS:[alfa],AX cerca di
            inserire 16 bit (AX) in una variabile
            da 8 bit (alfa): se non siamo ben certi
            di quello che facciamo l'operazione sembra eretica. In effetti, al
            di là delle differenti dimensioni dei 2 operandi, il compito
            richiesto è sintatticamente possibile ma può produrre effetti
            devastanti; con questa istruzione si caricano infatti 2 locazioni
            consecutive: gli 8 bit di AL vanno a
            finire in alfa e gli 8 bit di AH
            in alfa+1, cioè praticamente in beta...
            (cosa probabilmente non voluta): 
            Naturalmente se alfa fosse stata definita word (DW, 16 bit) non ci
            sarebbe stato errore.
         |  
            | l'istruzione
         MOV CS:[beta],AL
            cerca di inserire 8 bit (AL)
            in una variabile da 16 bit (beta),
            quindi non è a rischio: semplicemente viene eseguito metà del
            compito possibile.. 
         |  
            | l'istruzione
         MOV AX,CS:[alfa]
            è simile alla precedente: cerca di inserire 8 bit (il contenuto
            della variabile alfa) in un registro a
            16 bit (AX): è illogica, ma caricherà
            solo la parte bassa (AL) di AX.
         |  
            | decisamente inaccettabile invece
            l'ultima istruzione, MOV
            AL,CS:[beta]come possiamo
            capire dalle precedenti spiegazioni 
         |  
     
     |  
      | Lo stesso tipo di problema si può presentare con
        istruzioni che coinvolgono il caricamento di locazioni di memoria con
        numeri (caricamento immediato); molto frequentemente l'istruzione MOV
        CS:[alfa],00H può dare il solito errore (warning A4031: Operand types must match):
        in questo caso la ragione sta nel fatto che il compilatore non può
        sapere a priori la dimensione di quello 0;
        in altre parole non c'è differenza
        tra il valore 0 di un byte
        e quello di una word, ma quando
        bisogna generare il codice è necessario sapere se vogliamo azzerare
        solo la variabile alfa (un byte a 0) o
        anche le locazioni successive ad essa. Per questo lo 0 deve avere
        dimensione e noi dobbiamo correttamente fissarla! Le istruzioni corrette
        fanno riferimento all'operatore Ptr
        (vedi 
        scheda),
        cioè:
    
        | MOV Byte Ptr
            CS:[alfa],00H se desideriamo azzerare solo la variabile alfa. |  
        | MOV Word Ptr
            CS:[alfa],00H se desideriamo azzerare la variabile alfa
            e anche la successiva, alfa+1. |  
        | con questa tecnica esiste la possibilità di creare
            codice in grado di caricare anche dieci locazioni consecutive.... |  
     
     |  
   
   |