Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 156 di 198] 

    

    REPNZ - Ripete automaticamente il confronto di stringhe se gli elementi non sono nulli 
     
bulletQuesta istruzione è propriamente un prefisso e va messa davanti alle istruzioni che confrontano stringhe o, in genere, aree di dati.
bulletIl suo compito è quello di obbligare la ripetizione di questi tipi d'istruzione il numero di volte indicato dal registro CX, a meno che il confronto delle aree confrontate abbia rilevato elementi uguali a zero.
bulletIn altri termini la REPNZ (Repeat if Non Zero, ripeti se non zero) viene eseguita se, dopo l'istruzione ripetuta, la [flag di Zero]=0 (vedi esempio alla fine della pagina).
bulletIl prefisso controlla se il valore della flag di Zero è 1 o se quello di CX è 0000H: in questi casi il processore non ripete l'istruzione e prosegue con il resto del programma; altrimenti decrementa CXesegue l'istruzione di confronto stringhe e rientra nel loop.
bulletDunque, se il valore iniziale della flag di Zero è 1 o quello di CX è nullo il prefisso non produce alcun effetto, cioè nessuna delle istruzioni supportate viene eseguita. 
bulletVa sottolineato che, dopo aver verificato il valore di CX, viene anche verificato se c'è qualche richiesta d'interruzione pendente; non c'è dunque il pericolo che la ripetizione delle istruzioni di gestione stringhe mettano in crisi questa importante esigenza.
bulletIl prefisso si applica alle istruzioni:
bulletCMPS (e alle sue varianti CMPSB, CMPSW e CMPSD).
bulletSCAS (e alle sue varianti SCASB, SCASW e SCASD).
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
 REPNZ <Istruzione>  mentre CX <> 0000H: esegue istruzione e decrementa CX
 

Esempio di Applicazione

Cicli di Clock Mem
Acces

Bytes
Flag   influenzate
Mnemonico Operandi 86 268 386 486 O D I T S Z A P C

REPNZ

 CMPS

9+22n 5+9n 5+9n 7+7n no 1             #      
REPNZ  CMPSB
REPNZ  CMPSW
REPNZ  CMPSD
REPNZ  SCAS 9+15n 5+8n 5+8n 7+5n
REPNZ  SCASB
REPNZ  SCASW
REPNZ  SCASD
         
bulletIl servizio di questa istruzione è identico a quello offerto dalla REPNE (ripeti se è non uguale).
bulletLa figura seguente mostra le risorse richieste da questa istruzione in funzione degli coinvolti (leggi le istruzioni):
          

Addr 

Codifica Masm

Istruzione

0100
0103
0105
0107

010A
010C
010E
0110
F2 26 A6
F2 A6
F2 A7
F2 66 A7

F2 AE
F2 AE
F2 AF
F2 66 AF
      REPNZ CMPS ES:[DI],Byte Ptr [SI]
REPNZ CMPSB
REPNZ CMPSW
REPNZ CMPSD

REPNZ SCAS Byte Ptr ES:[DI]
REPNZ SCASB
REPNZ SCASW
REPNZ SCASD
     
bulletData l'utilità di questo prefisso viene proposto un esercizio d'esempio:
         

Addr 

 

 Codifica Masm

 

 Istruzione                  

0100
0132

-----
0164
0165
0168
016C
0170
0172


0176
0177

0179
017A


017B
  0032  [ ?? ]
0032  [ ?? ]
-------------
FC
B9 0032
8D 36 0100  
8D 3E 0132
F2 A6
0F 85 0179  


90
EB 02

4E
4F


90
  Depo01 
Depo02

----------------






;---------------
tutte_non_nulle:


;---------------
trovata_nulla:



continua:
      DB    50 DUP (?)
      DB    50 DUP (?)
-------------------------------
      CLD
      MOV   CX,50
      LEA   SI,Depo01
      LEA   DI,Depo02
REPNZ CMPSB
      JZ    trovata_nulla
;---------------------------
; servizio coppie diverse      
      NOP                      
      JMP  SHORT continua      
;------------------------------

      DEC   SI                 
      DEC   DI                 
; servizio prima coppia uguale 
;------------------------------
 
      NOP
         
bulletL'analisi del codice suggerisce queste considerazioni:
bulletprendiamo nota della tecnica con cui viene riservata memoria per le 2 aree da confrontare, con la pseudoistruzione Dup.
bulletnotiamo la presenza dell'istruzione CLD, per imporre un'analisi in avanti.
bullet per inizializzare gli offset dei puntatori delle 2 aree da confrontare si è fatto uso l'uso dell'istruzione LEA.
bulleti segment si ritengono quelli di default, DS e ES.
bulletil contatore CX è stato caricato con la dimensione di entrambe le aree e il prefisso REPNZ provvederà a ripetere automaticamente il confronto se i 2 bytes assunti dalla coppia di locazioni sono uguali tra loro, fino all'esaurimento di tutti gli elementi.
bulletse le coppie di bytes sono tutte diverse il processo ha termine regolarmente e, essendo NZ la condizione d'uscita, l'istruzione JZ non verrà eseguita e il programma proseguirà subito sotto, nella zona di programma indicata dall'etichetta tutte_non_nulle.
bulletse viene rilevata una coppia uguale il processo verrà immediatamente interrotto prima della fine e, essendo ora Z la condizione d'uscita, l'istruzione JZ verrà eseguita e il programma proseguirà più in basso, nella zona di programma indicata dall'etichetta trovata_nulla: le prime istruzioni da eseguire sono, in questo caso, il decremento dei puntatori DI e SI, così da favorire la localizzazione dei dati trovati diversi.

    

Pagina Precedente Scheda n° 07 Pagina Successiva Istruzioni Cpu 80x86 Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Istruzione 156 - REPNZ

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati