Lenguaje Ensamblador del Z80 (I) Arquitectura del Z80 e Instrucciones Instrucciones básicas básicas
Operaciones matematicas Las operaciones aritméticas básicas para nuestro Spectrum son la suma la resta! tanto con acarreo como sin él" A partir de ellas deberemos crearnos nuestras propias rutinas para multiplicar! di#idir! etc"
Suma: ADD (Add) $uestro microprocesador Z80 puede reali%ar sumas de 8 &' bits internamente" La instruccin utili%ada para ello es ADD* el +ormato es,
ADD DESTINO, ADD DESTINO, ORIGEN
Las instrucciones disponibles para reali%ar sumas se reducen a,
ADD A, s ADD HL, ss ADD ri, ADD ri, rr
-onde,
s: Cualquier registro registro de 8 bits bits (A, B, C, D, E, E, H, !, "ualquier #alor i$%ediato de 8 bits (e$ el ra$go &')) o '*8+* e$ "o%-le%e$to a dos!, "ualquier dire""i.$ de %e%oria a-u$tada -or H, / "ualquier dire""i.$ de %e%oria a-u$tada -or u$ registr registro o 0$di"e "o$ des-la1a%ie$to de 8 bits2 ss: Cualquier registro de *3 bits de e$tre los siguie$tes: BC, DE, H, S42
ri: 5$o de los registros 0$di"es (I6 o I7!2 rr: Cualquier registro de *3 bits de e$tre los siguie$tes e"e-to el %is%o registro 0$di"e orige$: BC, DE, H, I6, I7, S42
Esto dar.a la posibilidad de ejecutar cualquiera de las siguientes instrucciones,
; ADD A, s
ADD
A, B
ADD
A,
ADD
A, 9HL
ADD
A, 9IX+*&
*&&
;A=A+B ; A = A + 100 ; A = A + [HL] ; A = A + [IX+10]
; ADD HL, ss
ADD
HL, BC
; HL = HL + BC
ADD
HL, SP
; HL = HL + SP
; ADD ri, rr
ADD
IX, BC
; IX = IX + BC
ADD
IY , DE
; IY = IY + DE
ADD
IY , IX
; IY = IY + IX
ADD
IX, IY
; IX = IX + IY
/or contra! estas instrucciones no ser.an #álidas,
ADD
B, C
; Sólo A puede ser desi!o
ADD
BC, DE
ADD
IX, IX
; Sólo puede ser desi!o HL ; "o pode#os su#$r u! re%isro &!di'e $ (l #is#o
La a+ectacin de los +lags ante las operaciones de sumas es la siguiente,
/ara A-- A! s*! el registro $ (Substraction) se pone a 0 (lgicamente! a que slo
se pone a uno cuando se a reali%ado una resta)" El registro /12 se comporta como un registro de 3#er+lo4 e indica si a abido o#er+lo4 (desbordamiento) en la operacin" El resto de +lags (Sign! Zero! 5al+67arr 7arr) se #erán a+ectados de acuerdo al resultado de la operacin de suma" /ara A-- 5L! ss* A-- ri! rr*! se pone a 0 el +lag $! slo se #erá a+ectado el
+lag de acarreo (7) de acuerdo al resultado de la operacin" 3! en +orma de tabla de a+ectacin,
;lags I$stru""i.$
'''''''''''''''''''''''''''''''''' ADD A, s ADD H, ss ADD ri, rr
<> > > ? & >< <' ' @ ' & >< <' ' @ ' & ><
Las sumas reali%adas por el Spectrum se acen a ni#el de bits! empe%ando por el bit de más a la dereca endo acia la i%quierda! segn las siguientes reglas,
& + & & & + * * * + & * * + * *& (& "o$ a"arreo!
Al sumar el ltimo bit! se actuali%ará el +lag de acarreo si es necesario" /or ejemplo,
> &&&&&*&& + &&&&&*&* ''''''''''' &&&&*&&*
(> a"arreo de la su%a del bit a$terior, *+**&!
Si la suma del ltimo bit (bit 9) requiere un bit e:tra! se utili%ará el 7arr ;lag del registro ; para almacenarlo" Supongamos que ejecutamos el siguiente cdigo,
D A, *&&&&&&& D B, *&&&&&&& ADD
A, B
El resultado de la ejecucin de esta suma ser.a, A<&=8>&=8<=?'" 7omo =?' (&00000000b) tiene @ bits! no podemos representar el resultado con los 8 bits del registro A! de modo que el resultado de la suma ser.a realmente, A < 00000000 7arr;lag < &"
Resta: SUB (Substract) En el caso de las restas! slo es posible reali%ar (de nue#o gracias a la no ortogonalidad del "I" del Z80) la operacin A
S5B ORIGEN
7oncretamente,
S5B r
; A = A ) r
S5B N
;A=A)"
S5B 9HL
; A = A ) [HL]
S5B 9rr+d ; A = A ) [rr+d]
/or ejemplo,
S5B B
;A=A)B
S5B *&&
; A = A ) 100
S5B 9HL
; A = A ) [HL]
S5B 9IX+*&
; A = A ) [IX+10]
Es importante recordar que en una operacin SD F*! la operacin reali%ada es A
;lags:
S=H4NC
''''''''''''''''''''''' Ae"ta"i.$: > > > ? * >
Es decir! el +lag de $ (substraction) se pone a &! para indicar que emos reali%ado una resta" El +lag de /12 (/arit13#er+lo4) se con#ierte en indicar de 3#er+lo4 queda a+ectado por el resultado de la resta" El resto de +lags (Sign! Zero! 5al+67arr 7arr) quedarán a+ectados de acuerdo al resultado de la misma (por ejemplo! si el resultado es 7ero! se acti#ará el ;lag Z)"
Suma con acarreo: ADC (Add with carry) Sumar con acarreo dos elementos (ADC) signi+ica reali%ar la suma de uno con el otro ! posteriormente! sumarle el estado del +lag de 7arr" Es decir,
ADC A, s
equi#ale a
A A + s + Carr/;lag
ADC H, ss equi#ale a
H H + ss + Carr/;lag
(s* ss* tienen el mismo signi+icado que en A-- SD)" La tabla de a+ectacin de +lags ser.a la siguiente,
I$stru""i.$
;lags
'''''''''''''''''''''''''''''''''' ADC A,s ADC H,ss
<> > > ? & >< <> > @ ? & ><
La suma con acarreo se utili%a normalmente para sumar las partes altas de elementos de &' bits" Se suma la parte baja con A-- luego la parte alta con A-7 para tener en cuenta el acarreo de la suma de la parte baja"
Resta con acarreo: SBC (Substract with carry) Al igual que en el caso de la suma con acarreo! pod emos reali%ar restas con acarreo (SBC)! que no son más que reali%ar una resta de los = operandos! tras lo cual restamos además el #alor del bit de 7arr ;lag,
SBC A, s
equi#ale a
SBC H, ss equi#ale a
A A ' s ' Carr/;lag H H ' ss ' Carr/;lag
La tabla de a+ectacin de +lags (en este caso con $<&! a que es una resta),
I$stru""i.$
;lags
'''''''''''''''''''''''''''''''''' SBC A,s
<> > > ? * ><
SBC H,ss
<> > @ ? * ><
Complemento a dos A lo largo del presente te:to emos ablado de nmeros en complemento a dos" 7omplemento a dos es una manera de representar nmeros negati#os en nuestros registros de 8 bits! utili%ando para ello como signo el bit más signi+icati#o (bit 9) del bte" Si dico bit está a 0! el nmero es positi#o! si está a & es negati#o" As.,
&*******
(+*!
&******&
(+*3!
&*****&*
(+*)!
&*****&&
(+*!
(222! &&&&&*&&
(+!
&&&&&&**
(+F!
&&&&&&*&
(+!
&&&&&&&*
(+*!
&&&&&&&&
(&!
********
('*!
*******&
('!
******&*
('F!
******&&
('!
(222! *&&&&&**
('*)!
*&&&&&*&
('*3!
*&&&&&&*
('*!
*&&&&&&&
('*8!
/odemos a#eriguar cuál es la #ersin negati#a de cualquier nmero positi#o ( #ice#ersa)! in#irtiendo el estado de los bits sumando uno,
+* &&&*&&&*
'* ***&***& (I$#erti%os u$os / "eros!
+* (Su%a%os *!
***&**** ('* e$ "o%-le%e$to a dos!
Se eligi este sistema para representar los nmeros negati#os para que las operaciones matemáticas estándar +uncionaran directamente sobre los nmeros positi#os negati#os" G/or qué no utili%amos directamente la in#ersin de los bits para representar los nmeros negati#os estamos sumando además & para obtenerlosH Sencillo, si no sumáramos uno simplemente in#irtiéramos los bits! tendr.amos = ceros (00000000 &&&&&&&&) además las operaciones matemáticas no cuadrar.an (por culpa de los dos ceros)" La gracia del complemento a dos es que las sumas restas binarias lgicas (A--! A-7! SD S7) +uncionan, Sumemos 6&9 =,
'* ***&**** + +F &&*&&&&& '''''''''''''''''
* &&&&****
El resultado es 0000&&&&! es decir! &?! a que =6&9<&?" El +lag de carr se pone a &! pero lo podemos ignorar! porque el +lag que nos indica realmente el desbordamiento (como #eremos a continuacin) en operaciones de complemento a dos es el +lag de 3#er+lo4" Sumemos aora >&9 6&9,
+* &&&*&&&* + '* ***&**** '''''''''''''''''''''' * &&&&&&&&
7omo podéis #er! al sumar >&9 6&9 el resultado es 0" Si representáramos los nmeros negati#os simplemente como la in#ersa de los positi#os! esto no se podr.a acer,
+* &&&*&&&* + '* ***&***&
''' (solo bits i$#ertidos!
'''''''''''''''''''''' * ********
''' Nos da todo u$os, el "ero alter$ati#o2
En complemento a dos! las sumas restas de nmeros se pueden reali%ar a ni#el lgico mediante las operaciones estándar del Z80" En realidad para el Z80 no a más que simples operaciones de unos ceros! somos nosotros los que interpretamos la in+ormacin de los operandos del resultado de una +orma que nos permite representar nmeros negati#os" En otras palabras, cuando #emos un uno en el bit más signi+icati#o de un resultado! somos nosotros los que tenemos que interpretar si ese bit representa un signo negati#o o no, si sabemos que estamos operando con nmeros 06=??! podemos tratarlo como un resultado positi#o" Si estábamos operando con nmeros en complemento a dos! podemos tratarlo como un resultado en complemento a dos" /ara el microprocesador! en cambio! no a más que unos ceros" /ara acabar! #eamos cuál es la di+erencia entre el ;lag de 7arr (7) el de 3#er+lo4 (2) a la ora de reali%ar sumas restas" El primero (7) se acti#ará cuando se produ%ca un
desbordamiento +.sico a la ora de sumar o restar = nmeros binarios (cuando necesitemos un bit e:tra para representarlo)" El segundo (2)! se utili%ará cuando se produ%ca cualquier sobrepasamiento operando con = nmeros en complemento a dos" 7omo acabamos de #er! en complemento a dos el ltimo bit (el bit 9) nos indica el signo! cuando operamos con = nmeros binarios que nosotros interpretamos como nmeros en complemento a dos no nos basta con el bit de 7arr" Es el bit de 3#er+lo4 el que nos dará in+ormacin sobre el desbordamiento a un ni#el lgico" El bit de 7arr se acti#ará si pasamos de =?? a 0 o de 0 a =?? (comportándose como un bit de #alor = ele#ado a 8! o =?')! el bit de o#er+lo4 lo ará si el resultado de una operacin en complemento a dos requiere más de 9 bits para ser representado" Jediante ejemplos, =??>&,
******** + &&&&&&&* ''''''''''' * &&&&&&&&
C* (-orque a"e alta u$ bit etra! ?&
&=9>&,
&******* + &&&&&&&* ''''''''''' *&&&&&&&
C& ($o es $e"esario u$ bit etra e$ el registro! ?* (e$ "o%-le%e$to a dos, $o -ode%os re-rese$tar +*8!
En el ejemplo anterior! 2 se acti#a porque no a abido desbordamiento +.sico (no es necesario un bit e:tra para representar la operacin)! pero s. lgico, no podemos representar >&=8 con 9 bits>signo en complemento a dos"
Instrucciones de intercambio 7omo a se a e:plicado! disponemos de un banco de registros alternati#os (los Sado4 Kegisters)! podemos conmutar los #alores entre los registros estándar los alternati#os mediante unas determinadas instrucciones del Z80" El Z80 nos proporciona una serie de registros de propsito general (as. como un registro de +lags)! de nombres A! ! 7! -! E! ;! 5 L" El micro dispone también de unos registros e:tra (set alternati#o conocido como Sado4 Kegisters) de nombre A! ! 7! -! E! ;! 5 L! que apro#ecaremos en cualquier momento de nuestro programa" $o obstante! no podremos acer uso directo de estos registros en instrucciones en ensamblador" $o es posible! por ejemplo! ninguna de las siguientes instrucciones,
D B, J*& INC A D H, J*F D A, (J*F!
La manera de utili%ar estos registros alternati#os es conmutar sus #alores con los registros estándar mediante la instruccin !!*! cuo resultado es el intercambio de por ! 7 por 7! - por -! E por E! 5 por 5 L por L" Supongamos que tenemos los siguientes #alores en los registros,
Registro
Valor
Registro
Valor
B
$A0
B'
$00
C
$55
C'
$00
D
$01
D'
$00
E
$FF
E'
$00
Registro
Valor
Registro
Valor
H
$00
H'
$00
L
$31
L'
$00
En el momento en que realicemos un EFF! los registros cambiarán de #alor por la conmutacin* de bancos,
Registro
Valor
Registro
Valor
B
$00
B'
$A0
C
$00
C'
$55
D
$00
D'
$01
E
$00
E'
$FF
H
$00
H'
$00
L
$00
L'
$31
Si reali%amos de nue#o EFF! #ol#eremos a dejar los #alores de los registros en sus posiciones* originales" EFF (mnemnico ensamblador deri#ado de EFcange)! simplemente intercambia los #alores entre ambos bancos" Aparte de la instruccin EFF! disponemos de una instruccin ! A"# A"$ ! que! como el lector imagina! intercambia los #alores de los registros A; A;" As.! pasar.amos de,
Registro
Valor
Registro
Valor
A
01h
A'
00h
F
10h
F'
00h
Registro
Valor
Registro
Valor
A
00h
A'
01h
F
00h
F'
10h
a,
Keali%ando de nue#o un EF A;! A; #ol#er.amos a los #alores originales en ambos registros" -e esta +orma podemos disponer de un set de registros e:tra Acumulador1;lags con los que trabajar" /or ejemplo! supongamos que programamos una porcin de cdigo donde queremos acer una serie de cálculos entre registros después dejar el resultado en una posicin de memoria! pero no queremos perder los #alores actuales de los registros (ni tampoco acer uso de la pila! que #eremos en su momento)" En ese caso! podemos acer,
; *!$ rui!$ $ l$ ue s$l$re#os %r$'i$s $ l$ ; eiue$ ue de!i#os $u&-
KiRuti$a:
; C$#.i$#os de .$!'o de re%isros-
E66 E6 AF,
AF
L I$ter"a%bia%os A; "o$ A;
; H$'e#os !uesr$s oper$'io!es
D A, (J*F! D B,
A
D A, (J*F)! INC
A
ADD A, B ; /e' ; /$u& #2s oper$'io!es
; 3r$.$#os el resul$do e! #e#ori$
D (J*F3!,
A
; 4e'uper$#os los 5$lores de los re%isros
E6 AF,
AF
L I$ter"a%bia%os A; "o$ A;
E66
; 6ol5e#os $l lu%$r de ll$#$d$ de l$ rui!$
RET
Además de EFF EF A;! A; tenemos disponibles instrucciones de intercambio más que no trabajan con los registros alternati#os! sino entre la memoria registros! la pila (o memoria en general) los registros 5L! IF e IM"
Instrucción
Resultado
EX DE, HL
Intercambiar los alores !e DE " HL#
EX %&, HL
Intercambiar el alor !e HL con el alor !e 1( bits !e la )osici*n !e memoria a)+nta!a )or el reistro %& )or e-em)lo, )ara intercambiar el alor !e HL con el !el .ltimo reistro /+e ha"amos intro!+ci!o en la )ila#
EX %&, IX
I+al /+e el anterior, )ero con IX#
EX %&, I
I+al /+e el anterior, )ero con I#
La primera de estas instrucciones nos resultará mu til en nuestros programas en ensamblador! a que nos permite intercambiar los #alores de los registros -E 5L" Las instrucciones restantes permiten intercambiar el #alor apuntado por S/ (en memoria) por el #alor de los registros 5L! IF o IM" 7omo a emos comentado cuando ablamos del carácter Lo46Endian de nuestra 7/D! al escribir en memoria (también en la pila) primero se escribe el te ajo luego el te Alto" /osteriormente lo leeremos de la misma +orma! de tal modo que si los btes apuntados en la pila (en memoria) son N;; N00*! al acer el EF (S/)! 5L! el registro 5L #aldrá N00;;*" $tese que apro#ecando la pila (como #eremos en su momento) también podemos intercambiar los #alores de los registros mediante,
45SH
BC
45SH
DE
4O4
BC
4O4
DE
El siguiente programa muestra el uso de esta técnica,
; E7e#plo ue #uesr$ el i!er'$#.io de re%isros ; #edi$!e el uso de l$ pil$ /P*SH8P9P
ORG &&&&
; C$r%$#os e! DE el 5$lor 1:< > ; re$li?$#os u! i!er'$#.io de 5$lores ; 'o! BC, #edi$!e l$ pil$-
D DE, *F) D BC, &
45SH
DE
45SH
BC
4O4
DE
4O4
BC
; 6ol5e#os, $@or$ BC=DE > DE=BC
RET
Lo ensamblamos,
-as%o ''ta-bas "a%bio2as% "a%bio2ta-
Oras esto lo cargamos en un emulador de Spectrum (como un +icero OA/)! nos #amos al ASI7 tecleamos /KI$O AO &0! &0P DSK Q0000*" En pantalla aparecerá el #alor
&=Q?*! a que las rutinas llamadas desde ASI7 de#uel#en sus resultados en 7! nosotros emos eco un intercambio mediante la pila! entre -E 7" En su momento #eremos cmo +unciona la pila! por aora basta con saber que tenemos la posibilidad de intercambiar registros mediante el uso de la misma" /odr.amos aber optado por no e:plicar este pequeRo truco asta aber ablado de la pila! pero nos parece más con#eniente el eco de tener toda la in+ormacin sobre ensamblador agrupada de +orma al buscar in+ormacin o re+erencias sobre instrucciones para intercambiar #alores de registros! pueda encontrarse toda junta" 7omo emos comentado al principio de este cap.tulo! resulta mu complicado e:plicar un lenguaje tan interrelacionado de +orma que no se solapen di+erentes áreas! de modo que la comprensin total de mucos de los conceptos se alcan%ará con una segunda lectura del curso completo"