Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
STOPX N Z V C* * * * *X N Z V C - Modificati a secondo dell'operandosize: unsized esempio 2.187 STOP Load Status Register and Stop- privileged instruction0100111001110010<Immediate Data>Immediate Data -> SR; STOPX N Z V C* * * * *X,N,Z,V,C : set according to the immediate operandImm. Field: Specifica il dato da caricare nel registro di stato*esempio2.188 SUB Subtract binary1101 R mode eadest=dest+sorg* * * ? ?·D ·¬R +S ·¬D ·RV=¬Sm m m m m mC=S ·¬D +R ·¬D +S ·Rm m m m m mADD <ea>,DnADD Dn,<ea>size: B,W,Lesempio2.189 SUB Subtract binary1001 R opmode eadest=dest-sorg* * * * *X=settato come il carryN=1 se il risultato e’ negativo. Nullo altrimenti.Z=1 se il risultato e’ nullo. Nullo altrimenti.V=1 se e’ generato OVERFLOW. Nullo altrimenti.C=1 se e’ generato un BORROW. Nullo altrimenti.SUB <ea>,Dn SUB Dn,<ea> size: B,W,Lesempio *** VEDI ESEMPI ISTRUZIONI: DIVS
eadest=dest+sorg* * * * *
N=1 se dest<0
Z=1 se dest=0
V=1 se si genera overflow
C,X=1 se si genera riporto (decimale)
ADD <ea>,Dn
ADD Dn,<ea>
size: B,W,L
Lesempio 2.192 SUBI Subtract immediate
1101 R mode eadest=dest+sorg* * * ? ?
·D ·¬R +S ·¬D ·R
V=¬S ·D ·¬R +S ·¬D ·R
m m m m m m
ADD <ea>,Dn
ADD Dn,<ea>
size: B,W,L
Lesempio2.193 SUBI Subtract immediate
00000100 size ea + 1,2 ext word←dest
*dest-immX,N,Z,V,C* * * ? ?
V=¬S ·D ·¬R +S ·¬D ·R
m m m m m m
C=S ·¬D +R ·¬D +S ·R
m m m m m m
SUBI #<imm>,<ea>
size: B,W,L
Modi di indirizzamento non permessi :
- Immediate
- Relative
- Relative indexed
esempio :
* Questo segmento di programma estrae una colonna da una matrice di
long word e * la trasferisce in una certa area di memoria con
l'ordine invertito per gli * elementi.
* D0 contiene l'indice della colonna e A1
contiene l'indirizzo di partenza dell' * area di memoria in cui deve essere trasferita la colonna.
org $8000
START subq.l #1,D0 individua l'indirizzo di partenza
mulu.w #4,D0 dell'ultimo elemento della colonna
addi.l #TABINI+3*16,D0 selezionata;
moveq.l #3,D1 inizializza il contatore;
LOOP move.l D0,A0 per utilizzare l'indirizzamento indiretto;
move.l (A0),(A1)+ trasferisce l'elemento e aggiorna il puntatore;
subi.l #16,D0 seleziona il successivo elemento della colonna;
dbf D1,LOOP
TABINI org $8020 inizializza l'area della tabella
RIGA1 dc.l $004531A0,$0103F34A,$0005E781,$120056BC
RIGA2 dc.l $17C3B001,$A9D361C0,$01050641,$F20D501
RIGA3 dc.l $1045F380,$D010520A,$0005E000,$AB00D12
RIGA4 dc.l $030581A0,$0AB3F51A,$0503D081,$1263A0BC
end START
2.194 Note:
- Il modo di indirizzamento 'Address-direct-register' non è permesso, contrariamente a quanto è scritto sia sul manuale ('Only data alterable addressing modes are allowed') sia sul
Wakerly ('a_dst').2.195
SUBQ Subtract quick1101 R mode eadest=dest+sorg* * * ? ?·D ·¬R +S ·¬D ·RV=¬Sm m m m m mC=S ·¬D +R ·¬D +S ·Rm m m m m mADD <ea>,DnADD Dn,<ea>size: B,W,L
Esempio2.196 SUBQ Subtract quick0101 data 1 size eadest<=*dest-sorgX N Z V C* * * ? ?·D ·¬R +S ·¬D ·RV=¬Sm m m m m mC=S ·¬D +R ·¬D +S ·Rm m m m m mSUBQ #data,<ea>size: B,W,L
ESEMPIO Questa subroutine permette il calcolo dei bit alti di un dato passatoin D0,restituisce il risultato in d1.
ORG $8000 indirizzo di partenza
ESSUBQ MOVE.L #32,D0 Inizializza a 32 d1
MOVE.L #32,D2 Inizializza il contatore
LAB1 ROL #1,D0 Shifta a sinista D0
BSC LAB2 Controlla il primo bit di D0
SUBQ #1,D1
LAB2 SUBQ #1,D2
BNE LAB1
RTS Ritorno al chiamante
MAIN MOVE.L #$10000003,D0 Metti in D0 il dato
JSR ESSUBQ Salto a sottoprogramma
END MAIN
SUBQ Sottrazione
D Effectivea Addressta
SUBQ
<data>,<ea> Sottrae al valore contenuto in dst un valore immediato compreso tra 1 ed 8. La destinazione può essere un indirizzo effettivo alterabile. Sono permessi i size BWL tranne che per gli Andove non è permesso utilizzare il size Byte.
X N Z V C* * * ? ?
X è settato allo stesso modo di C Sm bit più significativo del sorgente
N è settato se il risultato è negativo Dm bit più significativo della destinazione
Z è settato se il risultato è zero Rm bit più significativo del risultato
·D ·¬R +S ·¬D ·R
V = ¬Sm m m m m m
C = S ·¬D +R ·¬D +S ·Rm m m m m m
L'istruzione SUBQ torna utile laddove serve decrementare un puntatore ad una word (2 unità) o ad una long word (4 unità).
Differenze con SUBI: è più corta ed è ad essa preferita quando si ha a che fare con parole in doppia precisione; può usare un An
come destinazione ed, in tal caso, si comporta come un con un dato immediato (sono consentite come dimensioni, in questo caso, soltanto W e L e i bit di stato restano intatti). SUBX Subtract with extend 1101 R mode eadest=dest+sorg* * ? ? ?·D ·¬R +S ·¬D ·RV=¬Sm m m m m mC=S ·¬D +R ·¬D +S ·Rm m m m m mZ=Z·¬R ·...·¬Rm 0ADD
come* num1 = 1.153.390.864.253.429.473* Il risultato, solo per una verifica veloce anche dei bit di flag,* e' salvato anche nei registri D0,D4* NB: Data la scelta precisa dei due numeri num0 e num1,* si verifichera' il BORROW durante la SUBX.* Di conseguenza la parte LOW del risultato sara' un num negativo.* E' quindi logico che spostando tale parte nel registro D4,* verra' settato il bit N dell'SR.* Elaborazione: Gruppo 10 - 96/97
ORG $8000 *START
MOVEA.L #0,A0 * AZZERA IL REGISTO A0
MOVEA.L A0,A1 * AZZERA IL REGISTRO A1
NUM0H EQU $3001FFF3 * SPLITTA L'INTERO NUMERO IN DUE LONG
W: NUM0H(HIGH)
NUM0L EQU $1245F6E3 * E NUM0L (LOW)
NUM1H EQU $1001AAE1 * STESSA OPERAZIONE PER NUM1
NUM1L EQU $4F01A6E1
N0 DS.L 2 * RISERVA LO SPAZIO PER ALLOCARE IN MEMORIA I DUE NUMERI
N1 DS.L 2
MOVE.L #NUM0H,N1 * PONE NUM0H IN MEMORIA
MOVE.L #NUM0L,N1+4 * PONE NUM0L IN MEMORIA, DOPO NUM0H
* (QUINDI 4 BYTES DOPO NUM0H)
MOVE.L #NUM1H,N0 * STESSA OPERAZIONE PER NUM2
MOVE.L #NUM1L,N0+4
LEA.L N1+8,A0 * CARICA IN A0 L'INDIRIZZO DI NUM0
LEA.L N0+8,A1 * CARICA IN A1 L'INDIRIZZO DI NUM1
MOVE.W #0,CCR * AZZERA LO SR
SUBX.L -(A1),-(A0) * EFFETTUA LA SOTTRAZIONE TRA NUM0L E NUM1L
SUBX.L -(A1),-(A0) * SOTTRAE LE PARTI HIGH DEI DUE NUMERI COMPRESO L'EVENTUARE BORROW DELLA SOTTRAZIONE PRECEDENTE
MOVE.L (A0)+,D0 * PONE LA PARTE HIGH DEL RISULTATO IN D0
MOVE.L (A0)+,D4 * PONE LA PARTE LOW DEL RISULTATO IN D4
(N=1 SE C'È STATO BORROW)
END START * FINE.
2.199 SUBX Subtract with extend
1001 Rdest 1 Size 00 R/M Rsrc
dest=dest-sorg-X
?
?
?
·D ·¬R +S ·¬D ·R
V=¬S
m m m m m m
C=S ·¬D +R ·¬D +S ·R
m m m m m m
Z=Z·¬R ·...·¬Rm
0 SUBX Dy,Dx
SUBX -(Ay),-(Ax) size: B,W,LE
esempio subx.a68:
Utilizzo del codice operativo: SUBX
Il programma seguente mostra l'utilizzo del codice SUBX con l'indirizzamento con predecremento. Il minuendo è il numero op1=67381185,
Il sottraendo * op2 = 22419153. La differenza dei due numeri è 44F68032, e viene calcolata, tenendo conto del prestito memorizzato nei flag X e C, componendo la sottrazione parziale delle coppie di cifre decimali contenute in ciascuno dei 4 byte in cui ciascun numero è memorizzato. La differenza è posta nelle stesse locazioni di op1 e nel registro D2.
Area Programma a partire dalla locazione $8000
ORG $8000
START
MOVE.L #EOP1,A0 In A0 indirizzo base 1^ addendo
MOVE.L #EOP2,A1 In A1 indirizzo base 2^ addendo
MOVE.L #COUNT,D1 In D1 il valore della variabile di conteggio del ciclo