Está en la página 1de 11

ORGANIZACION DEL COMPUTADOR

75.03

ASSEMBLER
Instrucciones y notas de programacin

2000 1er C

por Durglin who2112@yahoo.com

Tipos de instrucciones y operandos

Tipos de instrucciones en ASSEMBLER IBM/370

Instrucciones propiamente dichas


Son aquellas que el ensamblador transforma en lenguaje mquina (p.e. LA, PACK, AP, etc).
Macro-instrucciones
Conjunto de instrucciones pre-escritas, guardadas en una biblioteca de macroinstrucciones, y
que son invocadas por su nombre (p.e. CLOSE, OPEN, PPIO, CHAU, GET, PUT, etc).
Pseudo-instrucciones
Comandos para el ensamblador que no son transformados en lenguaje mquina (p.e. END,
USING, START, EQU, etc).

Tipos de operandos en ASSEMBLER IBM/370


Registros generales
Nmero decimal (entre 0 y 15) que especifica un registro de uso general (p.e. LR 10,6). El
nmero 0 se utiliza para los casos en que no se quiere referenciar ningn registro (p.e. en una
instruccin que direcciona por base, ndice y desplazamiento y no es necesario el ndice).
Explcitos
Especificacin de la direccin del dato segn el formato de instruccin (p.e. L 5,7(4,3)).
Simblicos
Rtulos (p.e. L 5,PALABRA ; B FIN). Los rtulos estn formados por una cadena de 1 a 8
caracteres alfanumricos ( 0..9, A..Z, @, #, $) pero el primer caracter no puede ser numrico.
Sern traducidos a una direccin como base(registro especificado en la PPIO)-desplazamiento
por el ensamblador y tienen asociados una longitud que puede ser implcita o explcita.
Literales
Especificacin del dato anteponiendo '=' + 'tipo de dato' (p.e. L
genera un rtulo auxiliar.

5,=F'243'). Al ensamblarse

Inmediatos
Especificacin del dato (1 byte) en instrucciones inmediatas (p.e. MVI LINEA, C'4').
Mscaras
Nmero decimal que responde a alguna de las 16 posibles combinaciones de un nibble (0 a 15)
que ser utilizado para evaluar la ocurrencia de uno o ms cdigos de condicin (p.e. BC 12,
CICLO).

R1,D2(X2,B2)

Add

AL

R1,D2(X2,B2)

Add logical

AP

D1(L1,B1),D2(L2,B2)

Add Decimal

Si

AR

R1,R2

Add

Si

BAL

R1,D2(X2,B2)

Branch and link

No

BALR

BC

BCR

BCT

BCTR

R1,R2

Branch and Link

No

M1,D2(X2,B2)

Branch and condition

No

M1,R2

Branch on condition

No

R1,D2(X2,B2)

R1,R2

Branch on count

No

Branch on count

No

R1,D2(X2,B2)

Compare

CL

R1,D2(X2,B2)

Compare logical

D1(L1,B1),D2(B2)

Compare Logical

Si

CLC

CLI

D1(B1),I2

CLM

R1,M3,D2(B2)

CLR

R1,R2

Compare Logical

Compare Logical Characters


under Mask

Si

Compare logical

Si

Se suman los BPF c/s contenidos en los registros especificados por el


operando 1 y la palabra apuntada por el operando 2 (debe estar
entornada a palabra). El resultado se guarda en el registro del operando
1 y la palabra del operando 2 no sufre modificaciones.
Se suman lgicamente (bit a bit) los BPF s/s contenidos en los registros
especificados por el operando 1 y la palabra apuntada por el operando 2
(debe estar entornada a palabra). El resultado se guarda en el registro
del operando 1 y la palabra del operando 2 no sufre modificaciones.
Se suman los empaquetados apuntados por los operandos 1 y 2. El
resultado se guarda en el campo del operando 1. Si el resultado no entra
en el campo previsto, el CC marca overflow. Si alguno de los sumandos
no es empaquetado, se genera un error de excepcin.
(Rop1)[BPFc/s] + (Rop2)[BPFc/s] ==> Rop1 [BPFc/s]
Se suman los BPF c/s contenidos en los registros especificados por los
operandos 1 y 2. El resultado se guarda en el registro del operando 1. No
se modifica el registro del operando 2.
Resguarda la direccin de prxima instruccin (se obtiene de la PSW) en
el registro especificado por el operando 1 y bifurca a la direccin
apuntada por el operando 2. Si la direccin apuntada es 0, carga el
registro del operando 1 y no bifurca.
(RPI) ==> Rop1; Bifurca a (Rop2)
Resguarda la direccin de prxima instruccin (se obtiene de la PSW) en
el registro del operando 1 y bifurca a la direccin contenida en el registro
del operando 2. Si el operando 2 es 0, carga el registro del operando 1 y
no bifurca.
Si alguno de los bits en 1 de la mscara (operando 1) coincide con el
cdigo de condicin actual (ver tabla), bifurca a la direccin apuntada por
el operando 2. Si el operando 2 apunta a 0 o la mscara es 0, la
instruccin equivale a una no operacin.
Si alguno de los bits en 1 de la mscara (operando 1) coincide con el
cdigo de condicin actual (ver tabla), bifurca a la direccin contenida en
el registro del operando 2. Si el operando 2 es 0 o la mscara es 0, la
instruccin equivale a una no operacin.
Decrementa en 1 el contenido del registro especificado por el operando
1. Si el resultado es diferente de 0 bifurca a la direccin apuntada por el
operando 2, sino continua la secuencia actual. Si la direccin apuntada
es 0, se opera sobre el registro del operando 1 pero no se bifurca.
(Rop1)[BPFc/s] - 1 ==> Rop1; si (Rop1) <> 0 ==> Bifurca a (Rop2)
Decrementa en 1 el contenido del registro del operando 1. Si el resultado
es diferente de 0 bifurca a la direccin contenida en el registro del
operando 2, sino continua la secuencia actual. Si el contenido del registro
del operando 2 es 0, se opera sobre el registro del operando 1 pero no se
bifurca.
Compara el BPF c/s contenido en el registro especificado por el operando
1 con el BPF c/s contenido en la palabra apuntada por el operando 2
(debe estar entornada a palabra). No se modifica el registro ni la palabra.
Compara lgicamente (bit a bit) el contenido del registro especificado por
el operando 1 con el contenido de la palabra apuntada por el operando 2
(debe estar entornada a palabra). No se modifica el registro ni la palabra.
Compara lgicamente (bit a bit) los campos apuntados por los operandos
1 y 2.
(BYTEop1) <== ? ==> -INMEDIATOSe comparan lgicamente (bit a bit) los contenidos del primer byte a partir
de la direccin dada por el operando 1 y el operando inmediato. El
operando inmediato debe ser de 1 byte. La comparacin se realiza de
izquierda a derecha y termina con la primer desigualdad o por fin de
campo.
El operando 3 define una mscara de 4 bits. Cada bit se corresponde con
1 byte del registro especificado por el operando 1. Los bytes del registro
que coinciden con un 1 en la mscara se toman como un campo contiguo
y se lo compara lgicamente (bit a bit) con el campo definido en el
operando 2 (debe tener tantos bytes como unos haya en la mscara).
(Rop1)[BPFs/s] <== ? ==> (Rop2)[BPFs/s]
Compara lgicamente (bit a bit) los contenidos de los registros
especificados por los operandos 1 y 2. La comparacin se efectua de
izquierda a derecha.

CP

D1(L1,B1),D2(L2,B2)

CR

R1,R2

Compare Decimal

Si

Compare

Si

CVB

R1,D2(X2,B2)

Convert to binary

No

CVD

R1,D2(X2,B2)

Convert to decimal

No

R1,D2(X2,B2)

Divide

No

Divide Decimal

No

Divide

No

No

Se comparan los dos empaquetados apuntados por los operandos 1 y 2.


Si alguno de los campos no es empaquetado, se genera un error de
excepcin. No es necesario que los campos tengan la misma longitud.
(Rop1)[BPFc/s] <== ? ==> (Rop2)[BPFc/s]
Compara los BPF c/s contenidos en los registros especificados por los
operandos 1 y 2. No se modifica ninguno de los registros.
El campo apuntado por el operando 2 (8 bytes) debe contener un
empaquetado entornado a doble palabra. El registro especificado por el
operando 1 ser el receptor del BPF c/s resultante de la conversin del
empaquetado. Si el registro no alcanza para contener todo el nmero, se
guardan slo los dgitos de orden inferior y se produce una interrupcin
de programa. No se modifica el campo del operando 2.
El registro especificado por el operando 1 contiene el BPF c/s a ser
convertido en empaquetado. El operando 2 apunta al campo de 8 bytes
receptor del empaquetado resultante. Este campo debe estar entornado
a doble palabra. No se modifica el registro del operando 1.
El contenido del campo apuntado por el operando 2 es el divisor. El
dividendo es la unin de la dupla de registros par-impar consecutivos,
cuyo componente par es especificado por el primer operando. El cociente
se guarda en el registro impar de la dupla y el resto en el par. No se
modifica el operando 2. Ya que el dividendo esta compuesto por la dupla
de registros, el registro par debe ser inicializado con el signo del
contenido del registro impar.
Se divide el empaquetado apuntado por el operando 1por el
empaquetado apuntado por el operando 2. El campo del operando 2
(divisor) no puede tener una longitud mayor a 8 bytes ni mayor o igual a
la del dividendo. El cociente de la operacin se guarda en los primeros n
bytes del dividendo, siendo n la longitud del dividendo menos la longitud
del divisor. El resto se guarda en el espacio restante del campo dividendo
(logitud igual a la del divisor). Los dos campos deben ser empaquetados
o se genera un error de excepcin. El signo del cociente respeta las
reglas algebraicas y el del resto es igual al del dividendo (ambas partes
son empaquetadas).
concatenacin (Rop1par,Rop1impar)[BPFc/s] / (Rop2)[BPFc/s]
resto ==> Rop1par[BPFc/s] ; cociente ==> Rop1impar[BPFc/s]
El contenido del registro del segundo operando es el divisor. El dividendo
es la unin de la dupla de registros par-impar consecutivos, cuyo
componente par es especificado por el primer operando. El cociente se
guarda en el registro impar de la dupla y el resto en el par. No se
modifica el operando 2. Ya que el dividendo esta compuesto por la dupla
de registros, el registro par debe ser inicializado con el signo del
contenido del registro impar.

DP

D1(L1,B1),D2(L2,B2)

DR

R1,R2

IC

R1,D2(X2,B2)

Insert character

ICM

R1,M3,D2(B2)

Insert
Mask

R1,D2(X2,B2)

Load

No

Carga el registro especificado por el operando 1 con la palabra apuntada


por el operando 2 (debe estar entornada a palabra).

LA

R1,D2(X2,B2)

Load address

No

Resuelve la direccin especificada por el operando 2 y carga el registro


especificado por el operando 1 con esa direccin calculada.

LM

R1,R3,D2(B2)

LR

R1,R2

R1,D2(X2,B2)

Characters

under

Si

Load Multiple

No

Load

No

Multiply

No

El byte apuntado por el operando 2 (no necesita estar entornado a


palabra) es cargado en el byte de orden inferior del registro especificado
por el operando 1. El resto del registro permanece inalterado, al igual que
el campo del op 2.
El operando 3 define una mscara de 4 bits. Cada bit se corresponde con
1 byte del registro especificado por el operando 1. Los bytes del campo
definido en el operando 2 (debe tener tantos bytes como unos haya en la
mscara) se copiaran respectivamente en los bytes del registro que
coincidan con un 1 en la mscara. El resto del registro no ser afectado.

Los operandos 1 y 3 definen la secuencia de registros que sern


cargados. Esta secuencia incluye a los registros indicados en los
opernados y se permite que el op1 > op3. En ese caso, se toma el
numero de registro como ciclo de 0 a 15 a 0... La direccin apuntada por
el operando 2 indica el comienzo del campo a ser cargado y se extiende
a tantas palabras como sean necesarias para cargar todos los registros.
(Rop2) ==> Rop1
El contenido del registro especificado en el operando 2 es copiado al
registro del operando 1.
El contenido del campo apuntado por el operando 2 es el multiplicador. El
operando 1 especifica el registro par de una dupla par-impar consecutiva.
El contenido del componente impar de la dupla es el multiplicando. El
resultado se guarda en la dupla como si fuera un nico registro de 64
bits.

MP

MR

D1(L1,B1),D2(L2,B2)

R1,R2

Multiply Decimal

No

Multiply

No

MVC

D1(L1,B1),D2(B2)

Move

No

MVI

D1(B1),I2

Move

No

MVN

MVZ

N
NC

NI

NR

O
OC

OI

OR

D1(L1,B1),D2(B2)

D1(L1,B1),D2(B2)

Move Numerics

No

Move Zones

No

R1,D2(X2,B2)

AND

D1(L1,B1),D2(B2)

AND

Si

D1(B1),I2

R1,R2

AND

AND

Si

R1,D2(X2,B2)

OR

D1(L1,B1),D2(B2)

OR

Si

D1(B1),I2

R1,R2

OR

OR

Si

Se multiplican los empaquetados apuntados por los operandos y se


guarda el resultado en el espacio del op 1. Para evitar OVF, el
multiplicando (op 1) deber tener tantos bytes en 0 a izquierda como
bytes tiene el multiplicador. El multiplicador tiene una longitud mxima de
7 bytes y no puede ser mayor que la longitud del multiplicando.
(Rop1impar)[BPFc/s] * (Rop2)[BPFc/s] ==> concat(Rop1par,Rop1impar)[BPFc/s]
El contenido del registro del operando 2 es el multiplicador. El operando 1
especifica el registro par de una dupla par-impar consecutiva. El
contenido del componente impar de la dupla es el multiplicando. El
resultado se guarda en la dupla como si fuera un nico registro de 64
bits.
El operando 1 define la direccion a partir de la cual se reciben los
caracteres que comienzan en la direccion apuntada por el operando 2.
Se copian tantos caracteres (bytes) como se indiquen en la longitud del
operando 1. Si no se especifica dicha longitud, se toma la longitud
asociada al rtulo utilizado. En caso de que la longitud supere la del
rtulo del operando 1, se copiarn los caracteres de todas formas,
pisando los contenidos de memoria ms all del rtulo indicado.

-INMEDIATO- ==> BYTEop1


Se copia el operando inmediato (debe ser de 1 byte) al primer byte a
partir de la direccin dada por el operando 1.
El operando 1 define la direccin a partir de la cual se reciben los
numricos (segundo nibble de cada byte) que comienzan en la direccin
apuntada por el operando 2. Se copian tantos numricos como se
indiquen en la longitud del operando 1. Si no se especifica dicha longitud,
se toma la asociada al rtulo del op1. El nibble restante de cada byte
queda intacto. En caso de que la longitud supere la del rotulo del
operando 1, se copiarn los caracteres de todas formas, pisando los
contenidos de memoria ms all del rtulo indicado.
El operando 1 define la direccin a partir de la cual se reciben las zonas
(primer nibble de cada byte) que comienzan en la direccin apuntada por
el operando 2. Se copian tantas zonas como se indiquen en la longitud
del operando 1. Si no se especifica dicha longitud, se toma la asociada al
rtulo del op1. El nibble restante de cada byte queda intacto. En caso de
que la longitud supere la del rotulo del operando 1, se copiarn los
caracteres de todas formas, pisando los contenidos de memoria ms all
del rtulo indicado.
Se operan lgicamente (AND) los bits de los registros especificados por
el operando 1 y la palabra apuntada por el operando 2 (debe estar
entornada a palabra). El resultado se guarda en el registro del op 1.
Se operan lgicamente (AND) los bits de los campos apuntados por los
operandos 1 y 2. El resultado se guarda en el campo del operando 1.
(BYTEop1) AND -INMEDIATO- ==> BYTEop1
Se operan lgicamente (AND) los bits del primer byte a partir de la
direccin dada por el operando 1 y el operando inmediato. El operando
inmediato debe ser de 1 byte. El resultado se guarda en el primer byte a
partir de la direccin dada por el operando 1 (actualiza).
(Rop1) AND (Rop2) ==> Rop1
Se operan lgicamente (AND) los bits de los registros especificados por
los operandos 1 y 2. El resultado se guarda en el registro del operando 1.
No se modifica el registro del operando 2.
Se operan lgicamente (OR) los bits de los registros especificados por el
operando 1 y la palabra apuntada por el operando 2 (debe estar
entornada a palabra). El resultado se guarda en el registro del op 1.
Se operan lgicamente (OR) los bits de los campos apuntados por los
operandos 1 y 2. El resultado se guarda en el campo del operando 1.
(BYTEop1) OR -INMEDIATO- ==> BYTEop1
Se operan lgicamente (OR) los bits del primer byte a partir de la
direccin dada por el operando 1 y el operando inmediato. El operando
inmediato debe ser de 1 byte. El resultado se guarda en el primer byte a
partir de la direccin dada por el operando 1 (actualiza).
(Rop1) OR (Rop2) ==> (Rop1)
Se operan lgicamente (OR) los bits de los registros especificados en los
operandos 1 y 2. El resultado se guarda en el registro del operando 1. No
se modifica el registro del operando 2.

PACK

SLA

SLDA

D1(L1,B1),D2(L2,B2)

R1,D2(X2,B2)

R1,D2(B2)

R1,D2(B2)

Pack

Substract

Shift Left Single

Shift Left Double

No

Si

Si

SLDL

R1,D2(B2)

Shift Left Double Logical

No

SLL

R1,D2(B2)

Shift Left Single Logical

No

SP

D1(L1,B1),D2(L2,B2)

Subtract Decimal

Si

SR

SRA

R1,R2

R1,D2(B2)

Subtract

Si

Shift Right Single

Si

SRDA

R1,D2(B2)

Shift Right Double

Si

SRDL

R1,D2(B2)

Shift Right Double Logical

No

SRL

R1,D2(B2)

Shift Right Single Logical

No

Store

No

ST

R1,D2(X2,B2)

Supone que el campo apuntado por el op 2 es zoneado y lo empaqueta


en el cam-po apuntado por el op 1 recorriendo de derecha a izquierda
(invierte los primeros 2 nibbles y pasa el resto de los numricos (segundo
nibble de cada byte)).
Al contenido del registro especificado por el operando 1 (BPF c/s) se le
resta (suma del complemento) la palabra apuntada por el op 2 (BPF c/s)
(debe estar entornada a palabra). El resultado se guarda en el registro
del operando 1.
El operando 2 indica la cantidad de bits del registro especificado en el
operando 1 que sern desplazados a izquierda. Por ser un
desplazamiento algebraico, el bit de signo no se toca; se desplazan los
restantes 31, compensando los bits perdidos con 0 a derecha. El
desplazamiento mximo es 63 y no existe operando 3. Si un bit perdido
es distinto del signo, el CC indicar overflow.
El registro sealado en el operando 1 especifica el registro par de una
dupla par-impar consecutiva que conforman un registro de 64 bits. El
operando 2 indica la cantidad de bits que sern desplazados a izquierda.
Por ser un desplazamiento algebraico, el bit 0 del registro par no ser
tocado; se desplazan los restantes 63 bits, compensando los bits
perdidos con 0 a derecha. El desplazamiento mximo es de 63 y no
existe operando 3. Si un bit perdido es diferente del bit de signo, el CC
marca overflow.
El registro sealado en el operando 1 especifica el registro par de una
dupla par-impar consecutiva que conforman un registro de 64 bits. El
operando 2 indica la cantidad de bits que sern desplazados a izquierda.
Por ser un desplazamiento lgico, se desplazan los 64 bits,
compensando los bits perdidos con 0 a derecha. El desplazamiento
mximo es de 63 (no se puede desplazar la dupla completa) y no existe
operando 3.
El operando 2 indica la cantidad de bits del registro especificado en el
operando 1 que sern desplazados a izquierda. Por ser un
desplazamiento lgico, se desplazan los 32 bits, compensando los bits
perdidos con 0 a derecha. El desplazamiento mximo es 63 y no existe
operando 3.
Se restan los empaquetados apuntados por los operandos 1 y 2. El
resultado se guarda en el campo del operando 1. Si alguno de los
campos no es empaquetado, se genera un error de excepcin.
(Rop1)[BPFc/s] + complemento(Rop2) ==> Rop1[BPFc/s]
Al BPF c/s contenido en el registro del operando 1 se le resta el BPF c/s
contenido en el registro del operando 2 (se suma el contenido del primero
al complemento del contenido del segundo). El resultado se guarda en el
registro del operando 1. No se modifica el registro del operando 2. El
cdigo de condicin seteado indicar si hubo acarreo de signo (overflow).
El operando 2 indica la cantidad de bits del registro especificado en el
operando 1 que sern desplazados a derecha. Por ser un
desplazamiento algebraico, el bit de signo no se toca; se desplazan los
restantes 31, compensando los bits perdidos con el signo a derecha. El
desplazamiento mximo es 63 y no existe operando 3.
El registro sealado en el operando 1 especifica el registro par de una
dupla par-impar consecutiva que conforman un registro de 64 bits. El
operando 2 indica la cantidad de bits que sern desplazados a derecha.
Por ser un desplazamiento algebraico, el bit 0 del registro par no ser
tocado; se desplazan los restantes 63 bits, compensando los bits
perdidos con el signo a izquierda. El desplazamiento mximo es de 63 y
no existe operando 3.
El registro sealado en el operando 1 especifica el registro par de una
dupla par-impar consecutiva que conforman un registro de 64 bits. El
operando 2 indica la cantidad de bits que sern desplazados a derecha.
Por ser un desplazamiento lgico, se desplazan los 64 bits,
compensando los bits perdidos con 0 a izquierda. El desplazamiento
mximo es de 63 (no se puede desplazar la dupla completa) y no existe
operando 3.
El operando 2 indica la cantidad de bits del registro especificado en el
operando 1 que sern desplazados a derecha. Por ser un
desplazamiento lgico, se desplazan los 32 bits, compensando los bits
perdidos con 0 a derecha. El desplazamiento mximo es 63 y no existe
operando 3.
Almacena el contenido del registro especificado por el operando 1 en la
palabra apuntada por el operando 2 (debe estar entornada a palabra).

STC

R1,D2(X2,B2)

Store Character

STCM

R1,M3,D2(B2)

Store
Mask

STM

R1,R3,D2(B2)

Store Multiple

No

Test under mask

TM

TR

TRT

D1(B1),I2

D1(L1,B1),D2(B2)

Translate

under

No

No

Translate and test

Si

Unpack

No

R1,D2(X2,B2)

Exclusive OR

XC

D1(L1,B1),D2(B2)

Exclusive OR

Si

XI

D1(B1),I2

Exclusive OR

UNPK

XR

ZAP

D1(L1,B1),D2(B2)

Characters

No

D1(L1,B1),D2(L2,B2)

R1,R2

D1(L1,B1),D2(L2,B2)

Exclusive OR

Zero and Add Decimal

Si

Si

El byte de orden inferior del registro especificado por el operando 1 es


almacenado en el byte apuntado por el operando 2 (no necesita estar
entornado a palabra). El registro del operando 1 permanece inalterado.
El operando 3 define una mscara de 4 bits. Cada bit de la mscara se
corresponde con 1 byte del registro especificado en el operando 1. Se
toman los bytes del registro que coinciden con un 1 en la mscara y se
copian consecutivamente a partir de la direccin dada en el operando 2.
El registro no sufre modificaciones.
Los operandos 1 y 3 dan la secuencia de registros que sern
almacenados. Esta secuencia incluye a los registros indicados en los
opernados y se permite que el op1 > op3. En ese caso, se toma el
nmero de registro como ciclo de 0 a 15 a 0... La direccin apuntada por
el operando 2 es la posicin de inicio del almacenamiento.
El operando inmediato sirve como mscara de 8 bits. Cuando un bit de la
mscara est en 1, se chequea el estado del bit correspondiente en el
byte apuntado por el operando 1. Si el bit de la mscara es 0, se ignora el
bit correspondiente. El resultado del chequeo se registra en el cdigo de
condicin.
El campo apuntado por el operando 1 es el campo a traducir. Se toma
cada uno de sus bytes (de izquierda a derecha) considerndolos como
BPF s/s. Para cada uno de ellos se suma su contenido al de la direccin
apuntada por el operando 2 (desplazamiento). El byte apuntado por la
direccin calculada es el resultado de la traduccin y reemplaza el byte
del primer operando que lo gener. La operacin finaliza al recorrer todo
el primer operando. El segundo operando no es modificado salvo que
ambos operandos estn superpuestos.
Se toma cada uno de los bytes del campo apuntado por el operando 1
(de izquierda a derecha) considerndolos como BPF s/s. Para cada uno
de ellos se suma su contenido al de la direccin apuntada por el
operando 2 (desplazamiento). Si el byte apuntado por la direccin
calculada es 00 (HEXA), entonces el testeo es exitoso y se continua con
el prximo byte, sino la direccin del byte que fall se guarda en los
ltimos 24 bits del R1 y el byte de traduccin por el cual fall (<> 00) se
guarda en los ltimos 8 bits del R2. Los restantes bits de R1 y R2 quedan
inalterados.
Supone que el contenido del campo apuntado por el operando 2 es un
empaquetado. El campo apuntado por el operando 1 ser el receptor del
zoneado obtenido a partir del empaquetado. El empaquetado se procesa
de derecha izquierda, invirtiendo los nibbles del primer byte procesado, y
pasando los sucesivos nibbles (dgitos) intercalndolos con 'F' en los
nibbles de zona. Si el campo receptor es demasiado chico, se pierden los
bytes de orden superior.
Se operan lgicamente (XOR) los bits de los registros especificados por
el operando 1 y la palabra apuntada por el operando 2 (debe estar
entornada a palabra). El resultado se guarda en el registro del op 1.
Se operan lgicamente (XOR) los bits de los campos apuntados por los
operandos 1 y 2. El resultado se guarda en el campo del operando 1.
(BYTEop1) XOR -INMEDIATO- ==> BYTEop1
Se operan lgicamente (XOR) los bits del primer byte a partir de la
direccin dada por el operando 1 y el operando inmediato. El operando
inmediato debe ser de 1 byte. El resultado se guarda en el primer byte a
partir de la direccin dada por el operando 1 (actualiza).
(Rop1) XOR (Rop2) ==> Rop1
Se operan lgicamente (XOR) los bits de los registros especificados en
los operandos 1 y 2. El resultado se guarda en el registro del operando 1.
No se modifica el registro del operando 2.
Pone en 0 (packed) el campo apuntado por el operando 1 y le suma el
empaquetado apuntado por el operando 2. Se copia as el empaquetado
del operando 2 al campo del operando 1, sin afectar el original. Si el
resultado excede la capacidad del campo receptor (longitud de operando
1 no es suficiente), el CC marca overflow.

Notas de programacin
A continuacin, algunos detalles y notas sobre cuestiones comunes.

Algunas formas de inicializar un registro en 0 (ejemplificando con el R5)

Instruccin
SR
5,5
LA
5,0
L
5,=F'0'
XR
5,5
N
5,=F'0'
SLL
5,32
SRL
5,32
SLDL
4,32
M
4,=F'0'

Explicacin
Resta el registro a s mismo
Carga la direccin 0 en el registro
Carga la palabra 00000000h en el registro
OR exclusiva del registro con s mismo [0 XOR 0 = 0 , 1 XOR 1 = 0]
X AND 00000000h = 00000000h
Desplaza todo el contenido del R5 (llena con ceros)
Desplaza todo el contenido del R5 (llena con ceros)
Desplaza todo el contenido del R5 (llena con ceros) [PISA EL R4]
Multiplica el R5 por 00000000h

Empaquetados, zoneados y EBCDIC

Especial cuidado debe tenerse al efectuar conversiones de formato, ya que entonces vara el espacio requerido para
almacenar un nmero. En el caso particular de los empaquetados y los zoneados, se verifica las siguiente frmula:

Qz = (Qp * 2) 1
donde Qz es la cantidad de bytes del nmero en zoneado y Qp la cantidad de bytes del nmero en empaquetado. As,
el nmero empaquetado | 01 | 32 | 1C | (3 bytes) ocupar, en zoneado, 3 * 2 1 = 5 bytes. Del mismo modo, para
evaluar la situacin inversa, se puede despejar Qp para averiguar cuanto ocupar un zoneado en formato
empaquetado, teniendo en cuenta que si el resultado no es entero, se deber redondear hacia arriba para mantener la
integridad a nivel bytes.
Cuando se programa en ASM IBM/370 nunca se trabaja realmente con zoneados, ya que no es un formato con el
cual se pueda operar. De todas maneras, s se utiliza la codificacin EBCDIC de caracteres, en la cual los dgitos
numricos se expresan de igual manera que en zoneado (ver pg. 12 de la cartilla). Esto implica que si bien al utilizar
la instruccin UNPK se est llevando un nmero de empaquetado a zoneado, la verdadera utilidad que tendr esa
operacin ser llevar un nmero a EBCDIC para ser mostrado en pantalla. El problema surge porque EBCDIC no
interpreta la ltima zona de un zoneado como signo, sino como parte del ltimo caracter. Por ejemplo:
an cuando | 01 | 32 | 1F | empaquetado = | 01 | 32 | 1C | empaquetado ,
| 01 | 32 | 1F | empaquetado = | F0 | F1 | F3 | F2 | F1 | zoneado ==> 01321 (interpretando como EBCDIC)
| 01 | 32 | 1C | empaquetado = | F0 | F1 | F3 | F2 | C1 | zoneado ==> 0132A (interpretando como EBCDIC)
En estos casos (UNPK) se hace necesaria la utilizacin de la instruccin MVZ, para asegurarse de que en la ltima
zona haya siempre una F y as no perder un dgito.
Asimismo, cuando se lea de teclado un nmero negativo, el signo no podr ser "capturado" por la codificacin
EBCDIC, con lo cual deber ser manejado en forma independiente. Entonces, al empaquetarse (PACK) el nmero
ingresado para operar con l, ser importante considerar esto para eventualmente realizar una MVN que especifique
que el nmero es negativo.
Finalmente, es muy comn preguntarse cul es el empaquetado ms grande (en bytes) que se puede desempaquetar, o
cul es el zoneado ms grande que se puede empaquetar. Bueno, considerando que los empaquetados se manejan con

instrucciones SS (de dos longitudes), entonces el empaquetado ms grande manejable ser de 16 bytes (4 bits de la
instruccin se destinan a la longitud del empaquetado). Ahora bien, a pesar de ser esto as, un nmero en zoneado en
la mayora de los casos ocupa ms que el mismo nmero en empaquetado, con lo cual el mayor nmero (en bytes)
que puede ser desempaquetado sin ser truncado es uno de 8 bytes, mientras que el mayor nmero empaquetable es de
16 bytes (empaquetado ocupar menos).
empaquetado de 8 bytes ==> 8 * 2 1 = 15 ==> zoneado de 15 bytes (mximo desempaquetado)
empaquetado de 9 bytes ==> 9 * 2 1 = 17 ==> zoneado de 17 bytes (trunca el 1er byte de la izquierda)
zoneado de 16 bytes (mximo) ==> (16 + 1) / 2 = 9 ==> empaquetado de 9 bytes

Intercambio de unos por ceros en un registro

Esta operacin, comunmente utilizada en el clculo de complemento, se puede realizar simplemente con una
Exclusive OR del registro contra una palabra inicializada con unos:
X

5, =F'-1' (el 1 en BPF c/s es 11111111 11111111 11111111 11111111)

As,

'1' XOR '1' = '0'

'0' XOR '1' = '1' , logrndose el intercambio deseado.

Load VS Load address

Es bastante comn confundir las dos instrucciones. Sin embargo la diferencia es muy sencilla: la LOAD carga el
contenido de una palabra en un registro, mientras que la LOAD ADDRESS, aplicada al mismo registro y el mismo
campo, cargar el registro con la direccin de comienzo del campo. Por ejemplo:
R6 = 100h
R7 = 3h
108h (palabra en memoria) = 500h
Instruccin
L

5,5(6,7)

LA 5,5(6,7)

Anlisis
A(5,(6,7)) = 5 + (R6) + (R7) = 5h + 100h + 3h = 108h
Resuelve la direccin y busca la palabra almacenada a partir de esa direccin
(debe estar entornada a palabra). Segn el ejemplo, la palabra que comienza
en la 108h contiene 500h. Ese es el valor con el que carga el registro 5.
A(5,(6,7)) = 5 + (R6) + (R7) = 5h + 100h + 3h = 108h
Resuelve la direccin (108h) y ese es el valor con el que carga el registro 5.

(R5)
500h

108h

En cuanto a su funcionalidad, la LOAD se usa comunmente para cargar palabras a registros y para resolver
indirecciones:
L

4,ALFA

4,0(4)

donde

ALFA DC F'1234'

[carga el R4 con el contenido de la palabra ALFA]


[carga el R4 con la palabra a la que estaba apuntando]

La LOAD ADDRESS, por su parte, se utiliza mucho en la inicializacin y actualizacin (incrementos) de registros.
LA 4,0

[inicializa el R4 en 0]

LA 4,1(4)

[incrementa el R4 en 1]

LA 4,TABLA

[inicializa el R4 con la direccin del rtulo TABLA]

Blanqueado una lnea de impresin

Una tarea usual dentro de un programa es el blanqueo de lneas que sern usadas para la salida por pantalla de
informacin resultante. Existe una forma clsica de hacerlo, que es mantener una zona de memoria constante con 80
caracteres "blancos" (suponiendo que el registro del archivo de salida a pantalla tiene 80 caracteres) de modo que
para blanquear la lnea en uso basta con ejecutar
MVC

LINEA, BLANCOS

donde ambos rtulos corresponden a campos de 80 caracteres y BLANCOS es la lnea en blanco.


Pero existe otra forma que no usa un rtulo predefinido y puede resultar interesante para ver como funciona la MVC:
MVI LINEA, C' '
MVC LINEA+1(79),LINEA
donde la MVI pone un blanco en el primer byte del campo LINEA (instruccin inmediata que slo copia un byte). La
MVC har uso del principio de solapamiento, por lo que cada byte de LINEA ser copiado al byte LINEA+1 hasta
cubrir 79 movimientos de bytes, pero como la instruccin trabaja byte a byte, cuando se quiera copiar el byte
LINEA+1 al byte LINEA+2, LINEA+1 ya estar en blanco, por lo que en definitiva se estar copiando el blanco
recin copiado al byte anterior a lo largo de todo el campo LINEA.

Validacin de empaquetados con TRT

Para definir la tabla de validacin por TRT para empaquetados habr que tener en cuenta lo siguiente:
1. Un byte empaquetado vlido es aquel en cuyos nibbles hay slo dgitos (salvo en el ltimo byte).
2. El ltimo byte de un empaquetado debe ser del tipo dgito-letra para ser vlido.
Entonces, bastar con mirar la columna HEX de la cartilla y definir una tabla en la cual, a las filas donde el valor de
columna sea del tipo dgito-dgito les corresponder un 00h, y a las filas donde el valor de columna sea del tipo
dgito-letra les corresponder, por ejemplo, un FFh, mientras que las restantes filas no sern de inters y por lo tanto
se les asignar un valor cualquiera. De esta forma, el 00h responder a los bytes considerados dentro del punto 1. y el
FFh a los bytes considerados en 2.
TABPACK

DS
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC
DC

0CL256
10X'00'
6X'FF'
10X'00'
6X'FF'
10X'00'
6X'FF'
10X'00'
6X'FF'
10X'00'
6X'FF'
10X'00'
6X'FF'
10X'00'
6X'FF'
10X'00'
6X'FF'
10X'00'
6X'FF'
10X'00'
6X'FF'
96C'*'

logitud asociada: 256 bytes memoria reservada: 0 bytes


a los bytes 00h...09h les corresponde 00h
a los bytes 0Ah...0Fh les corresponde FFh
a los bytes 10h...19h les corresponde 00h
a los bytes 1Ah...1Fh les corresponde FFh
a los bytes 20h...29h les corresponde 00h
a los bytes 2Ah...2Fh les corresponde FFh
a los bytes 30h...39h les corresponde 00h
a los bytes 3Ah...3Fh les corresponde FFh
a los bytes 40h...49h les corresponde 00h
a los bytes 4Ah...4Fh les corresponde FFh
a los bytes 50h...59h les corresponde 00h
a los bytes 5Ah...5Fh les corresponde FFh
a los bytes 60h...69h les corresponde 00h
a los bytes 6Ah...6Fh les corresponde FFh
a los bytes 70h...79h les corresponde 00h
a los bytes 7Ah...7Fh les corresponde FFh
a los bytes 80h...89h les corresponde 00h
a los bytes 8Ah...8Fh les corresponde FFh
a los bytes 90h...99h les corresponde 00h
a los bytes 9Ah...9Fh les corresponde FFh
a los bytes A0h...FFh les corresponde '*'

Suponiendo ahora un campo EMPA (PL5) a validar como empaquetado,

TRT

EMPA,TABPACK

realizara la operacin deseada. El resultado se debe interpretar de la siguiente forma: un empaquetado vlido tiene
bytes del tipo dgito-dgito (todos menos el ltimo) y el ltimo byte del tipo dgito-letra. Mirando la tabla definida se
observa que todos los bytes del tipo dgito-dgito tienen asignado 00h, con lo cual el testeo de estos primeros bytes
ser exitoso. Al llegar al que sera el ltimo byte del empaquetado, el testeo no ser exitoso, puesto que los bytes del
tipo dgito-letra tienen asignado FFh. Sin embargo, se podra decir entonces que, siempre que el cdigo de condicin
resultante de la TRT sea 2 (la validacin fall en el ltimo byte del campo) y el consecuente contenido del byte de
menor peso del R2 (registro donde se guarda el byte de la tabla de comparacin por el cual fall la validacin) sea
FFh (byte asignado a los bytes del tipo dgito-letra), el campo contiene efectivamente un empaquetado. Traduciendo
esto a instrucciones:
TRT
BC
STC
CLI
BNE

EMPA,TABPACK
13, INVALIDO
2,BYTER2
BYTER2,X'FF'
INVALIDO

operacin de validacin
si el cdigo de condicin resultante es distinto de 2, es invlido
almacena el byte de menor peso de R2 en BYTER2
compara el contenido de BYTER2 con FFh
si la comparacin indica que no son iguales, es invlido

As, si el empaquetado es vlido, el programa seguir en la instruccin siguiente a BNE INVALIDO, mientras que
si resultara ser invlido el programa continuar en el rtulo INVALIDO.

Mscara VS Cdigo de condicin

Los bits 34 y 35 de la PSW estn reservados para el llamado cdigo de condicin (CC) que, consecuentemente puede
tomar como valores: 0, 1, 2 3 (expresado en decimal). El estado de esta dupla de bits (que refleja el resultado de
una operacin) en un momento determinado de la ejecucin de un programa depender del resultado de la ltima
operacin cuyo resultado lo afecte. Mientras no se ejecuten instrucciones que modifican el CC, en la PSW
permanecer almacenado el ltimo estado. En general se suele pensar en la actualizacin del cdigo de condicin
como resultado de una comparacin, pero no se debe perder de vista que el CC tambin es modificado por
operaciones tales como la suma y resta de empaquetados, corrimientos y operaciones lgicas. El detalle del
significado de los estados posibles para cada instruccin, y el listado completo de las instrucciones que trabajan
contra el CC se pueden ver en la pgina 5 de la cartilla IBM/370.
Por su parte, una mscara es un nibble que permite establecer condiciones mltiples de anlisis. Visto de modo ms
sencillo, la mscara permite evaluar el CC sin tener que limitarse a una condicin por vez haciendo corresponder
cada bit del nibble a uno de los estados posibles del CC. Por ejemplo:
Cdigo de condicin (2 bits)
Valor del bit de mscara

0
8

Caso ejemplo (comparacin lgica)

iguales

1
4

2
2

op1 menor op1 mayor

3
1
-

Suponiendo entonces que se ejecuta una comparacin entre dos operandos iguales, el CC resultante ser 0, ya que
corresponde con la condicin de igualdad. Ahora, si luego de una comparacin se quisiera bifurcar a SEGUIR si el
operando 1 es mayor o igual al operando 2, entonces la construccin de la mscara se llevar a cabo sumando todas
las condiciones por las cuales se quiere bifurcar. En este caso:
bifurcacin por
mscara
As,

BC

CC = 0 (iguales)
8

10, SEGUIR

CC = 2 (op1 > op2)


2

10

, en el caso de los operandos iguales tendr como resultado la bifurcacin.

También podría gustarte