Le istruzioni per lo spostamento dati (In questi appunti vi parlo un po' di assembler) By Leons Le istruzioni per lo spostamento dati sono possibili solo i seguenti spostamenti: memoria registro registro registro Non sono possibili spostamenti da memoria a memoria e per far ciò si deve ricorrere all'uso di registri di supporto: memoria registro memoria Esempi di spostamenti memoria , NON AMMESSI, sono (in linguaggio macchina): mov byte/word [100],[200] mov byte/word [bx],[50] Esercizio (facile!): espandere questi spostamenti usando ad es. al/ax come registro di supporto. > MOVIl metodo più comune per spostare i dati è quello di utilizzare l'istruzione MOV. La sintassi completa dell'istruzione è la seguente: MOV < registro|memoria > , < registro|memoria|valore imm. > Alcuni esempi sono: mov ax,7 ;valore --> registro mov mem,45 ;valore --> memoria mov ax,bx ;registro --> registro mov mem[bx],7 ;valore --> memoria (indiretto) ... ... > XCHGUn'altra istruzione per eseguire spostamenti di dati è XCHG che scambia tra loro i due operandi : XCHG < registro|memoria > , < registro|memoria > Ad esempio: xchg ax,bx ; pippo:=ax; ; ax:=bx; ; bx:=pippo; Attenzione che non è possibile fare lo scambio di due dati entrambi in memoria. > LAHF e SAHFPer esaminare il registro dei flag esistono queste due istruzioni: LAHF che carica in AH, SAHF che li salva. Spero vi sia sorto un dubbio. Come faccio a far stare l'intero registro di flag in 8 bit ??Bene queste due istruzioni lavorano solo sugli 8 bit meno significativi del registro.Esistono comunque altre due istruzioni per salvare e ripristinare l'intero registro di flag nello Stack ma le vedremo dopo. -- CONVERTIRE LE DIMENSIONI DI UN DATO --Siccome trasferire dati tra registri di diversa dimensione non è consentito,per fare questo tipo di operazione si devono prendere alcuni accorgimenti.Prima di tutto ci si comporta in modo diverso a seconda che il dato abbia o no il segno.Nel caso di SIGNED VALUE l'Assembly mette a disposizione due istruzioni:CBW (Convert Byte to Word) e CWD (Convert Word to Doubleword).CBW converte il dato a 8 bit con segno contenuto in AL mettendolo in AX (16bit). CWD come la precendente prende il dato in AX (16bit) e lo mette in DX:AX.Per capire meglio vediamo un esempio: .DATA mem8 DB -5 mem16 DW -5 .CODE .... .... mov al,mem8 ;mette in AL -5 (FBh) cbw ;converte (8--> 16)(FBh--> FFFBh) in AX mov ax,mem16 ;AX=-5 (FFFBh) cwd ;converte (16--> 32)(FFFBh--> FFFF:FFFBh) in DX:AX -- USARE I PUNTATORI -- > LEAL'istruzione LEA (Load Effective Address) carica un puntatore di tipo NEAR nel registro specificato, la sua sintassi è : LEA registro,memoria Ad esempio: LEA dx,stringa ;carica in dx l'offset di stringa equivale a MOV dx,OFFSET stringa NOTA : il secondo modo (con l'uso di MOV) in tal caso è più veloce essendo l'OFFSET una costante nota all'assembler che quindi non deve essere calcolata.Nota: più veloce in tal caso significa risparmiare qualche ciclo di clock (!!!), ma ciò avviene solo sugli 8088 (!!! Continua »
Appunti su Tiziano guarda il video »