Scambio di un registro con W in assembler
Con un banale accorgimento è possibile scambiare il contenuto di un qualsiasi registro con il registro accumulatore W senza l’ausilio di un terzo registro di appoggio. L’accorgimento consiste nell’usare tre istruzioni XOR consecutive come mostrato nel listato 3 (si ricorda che l’operazione XOR tra due bit restituisce un valore alto solo se i due bit operando sono diversi tra loro). Il listato 3 riporta un esempio scritto sottoforma di macro per PIC ed è facilmente trasportabile su altri microcontrollori. Per l’esempio si è supporto di voler scambiare il contenuto di W con quello di un registro A.
I commenti a fianco di ciascuna riga di codice mostrano il contenuto dei registri coinvolti a seguito dell’esecuzione della relativa istruzione. L'esempio riportato è scritto in assembler per PIC e, come si può notare dal listato 3, il nome della macro è stato scelto in modo da assomigliare ad una istruzione vera e propria. Includendo questa macro nel programma si disporrà dunque di una "nuova istruzione" SWAPWF che scambia il contenuto di W con quello del registro F passatogli come parametro.
SWAPWF macro A ;sia A=11010011 W=01001111 xorwf A,F ;A=10011100 W=01001111 xorwf A,W ;A=10011100 W=11010011 xorwf A,F ;A=01001111 W=11010011 endm
Listato 3 |
Suggerisco di cambiare la parola “assembler” con “assembly”.
Acuta osservazione Johnny, ma non sono d’accordo 🙂
Per vent’anni ho sempre chiamato il “linguaggio assembly” con la parola “assembler” e con me molti altri miei amici/colleghi progettisti e, a mio avviso c’è una ragione ben precisa.
Con “assembler” viene semplificata la dicitura “linguaggio assembler” inteso come il programma che comprende l’assembly.
Questo avviene non solo in Italia, ma anche in conferenze in lingua inglese mi è capitato di ascoltare FAE facenti sempre riferimento all’assembler come alla programmazione in linguaggio assembly. Diciamo che questo semplifica anche la comprensione con altre lingue, divenendo quasi uno standard….
Quante volte hai sentito nominare la frase “scritto con l’assembler del 6502”, sia in italiano che in inglese?
P.S. a proposito di 6502, suggerisco la lettura di questo interessante articolo, quanti ricordi:
http://it.emcelettronica.com/emulare-lapple-ii-con-arduino-uno
d’accordo con te, indipendentemente da quel che dice Emanuele, che non condivido’. Assembler e assembly hanno significati totalmente diversi, se ci sono molte persone nel mondo che ne ignorano il significato e usano i due termini indistintamente non vedo perché abbassarsi al medesimo livello. Allo stesso modo allora scambiamo resistore e resistenza solo perché la maggior parte della gente li utilizza quali sinonimi.
Contrarre una frase in una parola non significa ignorarne il significato, ma semplificarne (ed anche internazionalizzare) tale parola 😉
Bellissimo metodo.
Lo stesso discorso vale anche per normali variabili di memoria.
Il seguente metodo effettua lo swap di 2 variabili numeriche:
a = a + b
b = a – b
a = a – b
In caso di necessità di routine estremamente veloci, bisogna controlare quale dei due metodi è il più veloce, includendo anche ilmetodo di scambio con un terzo registro/variabile di comodo.
Ottimo esempio anche dal punto di vista computazione, credo. Meglio assembler 😉
Buonasera, cercavo un forum d’informatica proprio come questo. Sto cercando di fare una funzione in linguaggio assembler che riceve in R1 e R2 gli indirizzi di memoria di due interi e scambia in memoria il loro contenuto.
Pensavo di fare:
LDWA R0 R1
STWA R2 R1
STWA R0 R2
però non sono sicuro.
E’ lo stessa swap del linguaggio C, ma in assembler non saprei.
Il concetto è analogo, stai sfruttando un registro per scambiare i valori. La funzione MOV permette di scambiare i valori di due registri. La soluzione qui sopra sfrutta un registro accumulatore senza l’ausilio di uno di appoggio. p.s. questo è un forum di elettronica 😉
Ciao dfg123434
Si, puoi usare lo stesso sistema, usando i registri oppure altre label di memoria, purche’ non siano usate in altre parti del programma:
;—Inizializza registri AX e BX
mov ax,3
mov bx,55
;—-Scambia i registri——
mov cx,ax
mov ax,bx
mov bx,cx
Ciao
nel tuo caso ax, bx, cx sono R0, R1 e R2…
Ovviamente, nel tuo caso, lo swap deve essere fatto per riferimento e non per valore.
Quindi devi proprio scambiare tra loro gli indirizzi o, come per dirla in C, devi scambiare i puntatori.