Top Banner
ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI ASSEMBLER para Mainframes IBM Prof. Alberto Romano Schiesari (1 a edição: 1974; última revisão:2001) 1 1
248

Assembler Mainframes Ibm

Jul 04, 2015

Download

Documents

Roger Correa
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

ASSEMBLER paraMainframes IBM

Prof. Alberto Romano Schiesari (1a edição: 1974; última revisão:2001)

11

Page 2: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

SUMÁRIO

1) INTRODUÇÃO.................................................................................................................................................................................. 61-1 A LINGUAGEM ASSEMBLER................................................................................................................................................... 61-2 REVISÃO DOS SISTEMAS DE NUMERAÇÃO BINÁRIO E HEXADECIMAL.........................................................................6

1-2-1 Conversões............................................................................................................................................................................ 71-2-2 Operações aritméticas.......................................................................................................................................................... 13

1-3 ) ARQUITETURAS DE MAINFRAME'S IBM........................................................................................................................... 171-3-1 VISÃO GERAL................................................................................................................................................................... 171-3-2 ENDEREÇAMENTO........................................................................................................................................................... 201-3-3 REPRESENTAÇÃO DE DADOS........................................................................................................................................ 221-3-4 REPRESENTAÇÃO DE INSTRUÇÕES.............................................................................................................................. 23

2) MONTADOR ASSEMBLER E ESPECIFICAÇÃO DE ELEMENTOS............................................................................................302-1) INTRODUÇÃO......................................................................................................................................................................... 30

2-1-1 O MONTADOR ASSEMBLER........................................................................................................................................... 302-1-2 O STATEMENT ASSEMBLER........................................................................................................................................... 32

2-2) SÍMBOLO................................................................................................................................................................................. 322-3) CÓDIGO DE INSTRUÇÃO....................................................................................................................................................... 33

2-3-1) INSTRUÇÕES AO MONTADOR...................................................................................................................................... 332-3-2) INSTRUÇÕES DE MÁQUINA.......................................................................................................................................... 332-3-3) MACRO-INSTRUÇÕES..................................................................................................................................................... 33

2-4) OPERANDOS E COMENTÁRIOS............................................................................................................................................ 332-4-1) OPERANDOS EM REGISTRADOR.................................................................................................................................. 342-4-2) OPERANDOS EM MEMÓRIA.......................................................................................................................................... 342-4-2-1) TÊRMOS DE EXPRESSÕES.......................................................................................................................................... 34

2-5) CONTINUAÇÃO DE STATEMENTS...................................................................................................................................... 382-6) IDENTIFICAÇÃO E SEQUÊNCIA DE STATEMENTS........................................................................................................... 38

3) INSTRUÇÕES AO MONTADOR ASSEMBLER............................................................................................................................. 393-1) Instruções para definição de áreas.............................................................................................................................................. 39

DC (Define Constant - Definir Constante)..................................................................................................................................... 39DS (Define Storage - Definir Memória)......................................................................................................................................... 44

3-2) Outras instruções ao montador................................................................................................................................................... 45CCW ou CCW0 (Channel Command Word - Palavra de Comando de Canal)................................................................................45CCW1 (Channel Command Word - Palavra de Comando de Canal)..............................................................................................46START (Começo)......................................................................................................................................................................... 47CSECT (Control Section - Seção de Controle)............................................................................................................................... 47DSECT (Dummy Section - Seção Simulada)................................................................................................................................. 48DXD (Define External Dummy Section - Definir Dummy Section Externa)..................................................................................48CXD.............................................................................................................................................................................................. 49COM (Blank Common Control Section - Seção de Controle Branca Comum)...............................................................................49LOCTR (Multiple Location Counters - Múltiplos Contadores de localização)...............................................................................49AMODE (Adressing Mode - Modo de endereçamento).................................................................................................................. 50RMODE (Residence Mode - Modo de residência)......................................................................................................................... 51ENTRY (Entrada)......................................................................................................................................................................... 52EXTRN (External - Externo)......................................................................................................................................................... 52WXTRN........................................................................................................................................................................................ 52USING (Usando)........................................................................................................................................................................... 53DROP (Por de lado, Deixar).......................................................................................................................................................... 53TITLE (Título).............................................................................................................................................................................. 54EJECT (Ejetar).............................................................................................................................................................................. 54SPACE (Espaço)........................................................................................................................................................................... 54PRINT (Impressão)....................................................................................................................................................................... 55ICTL (Input Control - Controle de Entrada)................................................................................................................................... 55ISEQ (Input Sequence - Sequência de Entrada)............................................................................................................................. 56PUNCH (Perfure).......................................................................................................................................................................... 56REPRO (Reproduza)..................................................................................................................................................................... 57ORG.............................................................................................................................................................................................. 57EQU (Equate - Igualar)................................................................................................................................................................. 57OPSYN (Operation Code Synonim - Sinônimo para código de operação)......................................................................................58

22

Page 3: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

PUSH (Empurrar).......................................................................................................................................................................... 59POP............................................................................................................................................................................................... 59LTORG......................................................................................................................................................................................... 59CNOP (Conditional Nop - Nop Condicional)................................................................................................................................. 59COPY (Copiar).............................................................................................................................................................................. 60END (Fim).................................................................................................................................................................................... 60

4) INSTRUÇÕES DE MÁQUINA........................................................................................................................................................ 654-1) INSTRUÇÕES DE MOVIMENTO DE MEMÓRIA PARA MEMÓRIA....................................................................................67

MVC (Move Character - Movimentar Caracteres)......................................................................................................................... 67MVZ (Move Zones - Movimentar Zonas)...................................................................................................................................... 67MVN (Move Numerics - Movimentar Numéricos)......................................................................................................................... 68MVI (Move Immediate - Movimentar Imediato)........................................................................................................................... 68MVO (Move with Offset – Movimetar com deslocamento)........................................................................................................... 69ZAP (Zero and Add Packed – Zerar e Somar em Compactado)......................................................................................................69MVCL (Move Long – Mover [campo] Longo).............................................................................................................................. 70PACK (Compactar)....................................................................................................................................................................... 72UNPK (Unpack – descompactar)................................................................................................................................................... 73MVCI (Move Inverse – Mover invertido)...................................................................................................................................... 74

4-2) INSTRUÇÕES ARITMÉTICAS COM CAMPOS COMPACTADOS........................................................................................75AP (Add Packed – Somar em compactado).................................................................................................................................... 75SP (Subtract Packed – Subtrair em compactado)............................................................................................................................ 75MP (Multiply Packed – Multiplicar em compactado)..................................................................................................................... 76DP (Divide Packed – Dividir em compactado)............................................................................................................................... 77SRP (Shift and Round Packed – Deslocar e arredondar compactado).............................................................................................78

4-3) INSTRUÇÕES DE COMPARAÇÃO......................................................................................................................................... 79CP (Compare Packed – Comparar em compactado)....................................................................................................................... 79CLC (Compare Logical Character – Comparar Caracteres Logicamente)......................................................................................79CLI (Compare Logical Immediate - Comparar Logicamente com Operando Imediato)..................................................................79CLCL (Compare Logocal Character Long – Comparar Logicamente campos longos)...................................................................80C (Compare)................................................................................................................................................................................. 81CH (Compare Halfword)............................................................................................................................................................... 81CL (Compare Logical – Compare Logicamente)........................................................................................................................... 82CLM (Compare Logical Characters Under Mask - Comparar campos lógicamente, sob máscara)..................................................82CR (Compare Register – Comparar Registradores)........................................................................................................................ 83CLR (Compare Logical Register – Comparar Registradores Logicamente)....................................................................................83

4-4) INSTRUÇÕES DE DESVIO...................................................................................................................................................... 844-4-1) Introdução.......................................................................................................................................................................... 84BC (Branch on Condition – Desviar na Condição)......................................................................................................................... 86BCR (Branch on Condition Register – Desviar [para endereço de registrador] na Condição).........................................................86

4-5) INSTRUÇÕES DE CONTROLE DE LOOP.............................................................................................................................. 87BCT (Branch on Count – Desvie na condição [de contagem] testada)............................................................................................87BCTR (Branch on Count Register – Desvie na condição [de contagem] testada para [endereço contido em] registrador) ...............87BXH (Branch on Index High – Desvie se o Índice for Maior)........................................................................................................ 88BXLE (Branch on Index Low or Equal – Desvie se o Índice for Menor ou Igual)..........................................................................88

4-6) INSTRUÇÕES DE EDIÇÃO..................................................................................................................................................... 89ED (Edit – Editar)......................................................................................................................................................................... 89EDMK (Edit and Mark – Editar e Marcar)..................................................................................................................................... 90

4-7) INSTRUÇÕES DE TRADUÇÃO E TESTE DE BYTES............................................................................................................ 91TR (Translate – Traduzir).............................................................................................................................................................. 91TRT (Translate and Test – Traduzir e Testar)................................................................................................................................ 91

4-8) SHIFT EM REGISTRADORES................................................................................................................................................. 93SLL (Shift Left Logical – Deslocamento Simples Lógico à esquerda)...........................................................................................93SRL (Shift Right Logical – Deslocamento Simples Lógico à direita).............................................................................................93SLDL (Shift Left Double Logical – Deslocamento Duplo Lógico à esquerda)...............................................................................94SRDL (Shift Right Double Logical – Deslocamento Duplo Lógico à direita).................................................................................94SLA (Shift Left Algebraic – Deslocamento Simples Algébrico à esquerda)...................................................................................95SRA (Shift Right Algebraic – Deslocamento Simples Algébrico à direita).....................................................................................95SLDA (Shift Left Double Algebraic – Deslocamento Duplo Algébrico à esquerda).......................................................................96SRDA (Shift Right Double Algebraic – Deslocamento Duplo Algébrico à direita)........................................................................96

33

Page 4: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-9) INSTRUÇÕES DE ÁLGEBRA BOOLEANA............................................................................................................................ 97N (And – E)................................................................................................................................................................................... 97O (Or – Ou)................................................................................................................................................................................... 98X (Exclusive Or – Ou exclusivo)................................................................................................................................................... 98NR (And Register – E entre registradores)..................................................................................................................................... 99OR (Or Register – Ou entre registradores)..................................................................................................................................... 99XR (Exclusive or Register – Ou exclusivo entre registradores)......................................................................................................99NI (And Immediate – E [com operando] imediato)...................................................................................................................... 100OI (Or Immediate – Ou [com operando] imediato)...................................................................................................................... 100XI (Exclusive Or Immediate – Ou exclusivo [com operando] imediato).......................................................................................100NC (And Character – E entre campos com caracteres)................................................................................................................. 101OC (Or Character – Ou entre campos com caracteres)................................................................................................................. 101XC (Exclusive Or Character – Ou exclusivo entre campos com caracteres).................................................................................101

4-10) INSTRUÇÕES DE CARGA E DESVIO................................................................................................................................ 102BALR (Branch and Link Register – Desviar e ligar via registrador).............................................................................................102BAL (Branch and Link – Desviar e ligar).................................................................................................................................... 102BAS (Branch and Save – Desviar e salvar).................................................................................................................................. 102BASR (Branch and Save Register – Desviar para endereço em registrador e salvar)....................................................................103BASSM (Branch and Save and Set Mode – Desviar, salvar e posicionar modo)...........................................................................103BSM (Branch and Set Mode – Desviar e posicionar modo).......................................................................................................... 103

4-11) INSTRUÇÕES DE MOVIMENTO DE DADOS DE REGISTRADOR PARA MEMORIA....................................................104ST (Store – Armazenar)............................................................................................................................................................... 104STH (Store Halfword – Armazenar halfword).............................................................................................................................. 104STM (Store Multiple – Armazenar Múltiplos)............................................................................................................................. 104STC (Store Character – Armazenar um byte)............................................................................................................................... 105STCM (Store Characters under Mask – Armazenar caracteres por máscara)................................................................................105CVD (Convert to decimal – Converter [de binário] para [decimal] compactado).........................................................................106

4-12) INSTRUÇÕES DE MOVIMENTO DE DADOS DE UM CAMPO DE MEMÕRIA PARA REGISTRADOR.........................107L (Load – Carregar)..................................................................................................................................................................... 107LH (Load Halfword – Carregar halfword).................................................................................................................................... 107LM (Load Multiple – Carregar Múltiplos)................................................................................................................................... 108IC (Insert Character – Inserir Byte).............................................................................................................................................. 108ICM (Insert Character under Mask – Inserir bytes sob máscara)..................................................................................................109CVB (Convert to binary – Converter [de compactado] para binário)............................................................................................109

4-13) INSTRUÇÕES DE MOVIMENTO DE DADOS DE REGISTRADOR PARA REGISTRADOR............................................110LR (Load Register – Carregar registrador)................................................................................................................................... 110LPR (Load Positive Register – Carregar registrador positivo)......................................................................................................110LNR (Load Negative Register – Carregar registrador negativo)...................................................................................................110LCR (Load Complement Register – Carregar o complemento do registrador)..............................................................................111LTR (Load and test Register – Carregar e testar registrador).......................................................................................................111

4-14) OPERAÇÕES ARITMÉTICAS ENTRE REGISTRADORES................................................................................................112AR (Add Register – Somar registradores).................................................................................................................................... 112SR (Subtract Register – Subtrair registradores)............................................................................................................................ 112MR (Multiply Register – Multiplicar registradores)..................................................................................................................... 112DR (Divide Register – Dividir registradores)............................................................................................................................... 113ALR (Add Logical Register – Somar registradores logicamente).................................................................................................113SLR (Subtract Logical Register – Subtrair registradores logicamente).........................................................................................114

4-15) OPERAÇÕES ARITMÉTICAS ENTRE REGISTRADORES E CAMPOS DE MEMÕRIA...................................................115A (Add – Somar)......................................................................................................................................................................... 115S (Subtract – Subtrair)................................................................................................................................................................. 115M (Multiply – Multiplicar).......................................................................................................................................................... 115D (Divide – Dividir).................................................................................................................................................................... 116AH (Add Halfword – Somar hafword)......................................................................................................................................... 117SH (Subtract Halfword – Subtrair hafword)................................................................................................................................. 117MH (Multiply Halfword – Multiplicar hafword).......................................................................................................................... 118AL (Add Logical – Somar logicamente)...................................................................................................................................... 118SL (Subtract Logical – Subtrair logicamente).............................................................................................................................. 119

00 O condition code nunca fica em 00 após um SL........................................................................................................................ 1194-16) OUTRAS INSTRUÇÕES....................................................................................................................................................... 120

44

Page 5: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LA (Load Address – Carregar Endereço)..................................................................................................................................... 120TM (Test Under Mask – Testar com máscara)............................................................................................................................. 120EX (Execute)............................................................................................................................................................................... 121SVC (Supervisor Call – Chamada ao Supervisor)........................................................................................................................ 121MC (Monitor Call – Chamada do monitor).................................................................................................................................. 122SPM (Set Program Mask – estabelecer máscara de programa).....................................................................................................122IPM (Insert Program Mask – inserir máscara de programa)..........................................................................................................122STCK (Store clock – armazenar clock)........................................................................................................................................ 123TS (Test and Set – Testar e posicionar)........................................................................................................................................ 123CS (Compare and Swap – Comparar e Trocar)............................................................................................................................ 123CDS (Compare Double and Swap – Comparar double e Trocar)..................................................................................................124

5 - MACRO-INSTRUÇÕES................................................................................................................................................................ 1255-1 INTRODUÇÃO........................................................................................................................................................................ 1255-2 SÍMBOLOS VARIÁVEIS E DE SEQUÊNCIA......................................................................................................................... 1265-3 EXPRESSÕES.......................................................................................................................................................................... 1295-4 VARIÁVEIS DE MONTAGEM : DECLARAÇÃO E ATRIBUIÇÃO DE CONTEÚDO...........................................................1305-5 ANOP, MNOTE E AREAD...................................................................................................................................................... 1325-6 MHELP..................................................................................................................................................................................... 1345-7 DESVIOS - AGO, ACTR E AIF............................................................................................................................................... 1355-8 PARÂMETROS POSICIONAIS E KEYWORD........................................................................................................................ 1365-9 FUNCIONAMENTO DAS MACROS - EXEMPLOS................................................................................................................ 138

5-9-1 Macro sem símbolo e sem parâmetros................................................................................................................................ 1385-9-2 Macro com símbolo fixo e sem parâmetros........................................................................................................................ 1385-9-3 Macro com símbolo variável e sem parâmetros.................................................................................................................. 1395-9-4 Macro com símbolo variável e com 1 parâmetro posicional................................................................................................1395-9-5 Macro com símbolo variável e com 2 parâmetros posicionais.............................................................................................1405-9-6 Macro com símbolo variável e com 1 parâmetro keyword (sem default).............................................................................1405-9-7 Macro com símbolo variável e com 1 parâmetro keyword (com default)............................................................................1415-9-8 Macro com símbolo variável e com 2 parâmetros keyword (sem default)...........................................................................1415-9-9 Macro com símbolo variável e com 2 parâmetros keyword (com default)...........................................................................142

A P E N D I C E S...................................................................................................................................................................... 143APÊNDICE A - INSTRUÇÕES...................................................................................................................................................... 144APÊNDICE B - TABELAS DE POTÊNCIAS DE 2 E 16................................................................................................................ 155APÊNDICE C - CARACTERES EBCDIC...................................................................................................................................... 157APÊNDICE D - CONTROLE DE IMPRESSÃO............................................................................................................................. 158APÊNDICE E - INTERRUPÇÕES POR ERRO DE PROGRAMA..................................................................................................159APÊNDICE F - TRUQUES ÚTEIS A PROGRAMAS ASSEMBLER..............................................................................................160APÊNDICE G - MACRO INSTRUÇÕES MVS.............................................................................................................................. 162APÊNDICE H - EXEMPLO DE PROGRAMA MVS...................................................................................................................... 163APÊNDICE I - MACRO INSTRUÇÕES VSE................................................................................................................................. 164APÊNDICE J - EXEMPLO DE PROGRAMA VSE........................................................................................................................ 165APÊNDICE K - MACRO INSTRUÇÕES VM................................................................................................................................ 166APÊNDICE L - EXEMPLO DE PROGRAMA VM......................................................................................................................... 167APÊNDICE M - MACRO INSTRUÇÕES XEGUEI E TCHAU......................................................................................................168APÊNDICE N - EXEMPLO DE SUBROTINA............................................................................................................................... 172APÊNDICE O - EXEMPLO 2 DE SUBROTINA............................................................................................................................ 173APÊNDICE P - MONTAGEM DE PROGRAMA DE DEMONSTRAÇÃO 1..................................................................................175APÊNDICE Q - MONTAGEM DE PROGRAMA DE DEMONSTRAÇÃO 2..................................................................................188

PROGRAMAS PROPOSTOS............................................................................................................................................................. 199

55

Page 6: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1) INTRODUÇÃO

1-1 A LINGUAGEM ASSEMBLER

Convém observar que, como toda linguagem Assembler, esta, para poder ser melhor compreendida e utilizada em seu pleno potencial, exige o conhecimento da arquitetura do equipamento no qual ela é utilizada.Uma revisão nos conceitos e princípios básicos da arquitetura IBM é fundamental para o acompanhamento deste curso, recomendando-se a leitura do Principles of Operation do equipamento.

1-2 REVISÃO DOS SISTEMAS DE NUMERAÇÃO BINÁRIO E HEXADECIMAL

A base do sistema de numeração binário é 2.Ele possui 2 algarismos, cujos símbolos gráficos são o 0 e o 1.Cada algarismo tem seu valor dependendo da posição que ocupa no número.

A base do sistema de numeração hexadecimal é 16.Ele possui 16 algarismos, cujos símbolos gráficos são: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E e F.Cada algarismo tem seu valor dependendo da posição que ocupa no número.

TABELA BÁSICA DE EQUIVALÊNCIA

DECIMAL HEXA BINÁRIO DECIMAL HEXA BINÁRIO

0 0 0000 8 8 1000 1 1 0001 9 9 1001 2 2 0010 10 A 1010 3 3 0011 11 B 1011 4 4 0100 12 C 1100 5 5 0101 13 D 1101 6 6 0110 14 E 1110 7 7 0111 15 F 1111

66

Page 7: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-1 Conversões

1-2-1-1 Conversão de decimal para binário

Dividir o número decimal desejado por 2 e "guardar" o resto (que só pode ser 0 ou 1); o cociente dessa divisão deve ser calculado somente em sua parte inteira, e deve-se dividi-lo por 2, "guardando" o resto, e assim por diante, até que o cociente seja zero. Em seguida, os restos devem ser anotados, do último para o primeiro, da esquerda para a direita; o número formado pelos restos transcritos dessa forma, será o número binário equivalente ao decimal que se desejava converter para binário.

Exemplo: achar o número binário equivalente ao decimal 154.

154 / 2 = cociente 77 resto 077 / 2 = cociente 38 resto 138 / 2 = cociente 19 resto 019 / 2 = cociente 9 resto 19 / 2 = cociente 4 resto 14 / 2 = cociente 2 resto 02 / 2 = cociente 1 resto 01 / 2 = cociente 0 resto 1

Portanto, o número binário 10011010 vale 154 em decimal.

Exercícios propostos:

Converter de decimal para binário:

EP001: 987654

EP002: 4095

EP003: 7

EP004: 1023

EP005: 4096

EP006: 255

EP007: 1024

EP008: 10010001

EP009: 256

EP010: 1025

EP011: 999888

EP012: 65432

77

Page 8: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-1-2 Conversão de decimal para hexadecimal

Dividir o número decimal desejado por 16 e "guardar" o resto (que só pode ser de 0 a 15); o cociente dessa divisão deve ser calculado somente em sua parte inteira, e deve-se dividi-lo por 16, "guardando" o resto, e assim por diante, até que o cociente seja zero. Em seguida, os restos devem ser anotados, do último para o primeiro, da esquerda para a direita, observando-se que se o resto for 10 deve-se transcrever A, e assim por diante, de acordo com a tabela básica de equivalência colocada na introdução do tópico 1-2; o número formado pelos restos transcritos dessa forma, será o número hexadecimal equivalente ao decimal que se desejava converter para hexadecimal.

Exemplo: determinar o número hexadecimal equivalente ao decimal 1234567.

1234567 / 16 = cociente 77160 resto 777160 / 16 = cociente 4822 resto 84822 / 16 = cociente 301 resto 6301 / 16 = cociente 18 resto 1313 / 16 = cociente 0 resto 13

Portanto, DD687 é o número hexadecimal equivalente ao decimal 1234567.

Exercícios propostos:

Converter de decimal para hexadecimal:

EP013: 987654

EP014: 4095

EP015: 7

EP016: 1023

EP017: 4096

EP018: 255

EP019: 1024

EP020: 10010001

EP021: 256

EP022: 1025

EP023: 999888

EP024: 65432

88

Page 9: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-1-3 Conversão de binário para hexadecimal

Basta separar o número binário em grupos de 4 algarismos, da direita para a esquerda (completando com zeros à esquerda, o último grupo à esquerda, se for necessário para completar 4 algarismos), e, em seguida, colocar, para cada grupo de 4 algarismos binários, o algarismo hexadecimal equivalente, conforme a tabela básica de equivalência colocada na introdução do tópico 1-2.

Exemplo: determinar o número hexadecimal equivalente ao binário 11001101010001010000011.

0110 0110 1010 0010 1000 0011 6 6 A 2 8 3

Portanto, 66A283 é o número hexadecimal equivalente ao binário 11001101010001010000011.

Exercícios propostos:

Converter de binário para hexadecimal:

EP025: 11111000111010100100001

EP026: 1000000111000111111110000011111110

EP027: 1100

EP028: 11111110001

EP029: 1010101010101000110011000111

EP030: 110011001100110011001

EP031: 1000000000000001

EP032: 1000000001

EP033: 111111100000001111111

EP034: 1

EP035: 1100101011111110

EP036: 101011010111000111000000001111110001111

99

Page 10: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-1-4 Conversão de hexadecimal para binário

Basta transcrever, para cada algarismo hexadecimal, o grupo de 4 algarismos binários a ele correspondente, conforme a tabela do item anterior.Para o último grupo à esquerda pode-se deixar de transcrever os zeros binários à esquerda não significativos.

Exemplo: determinar o número binário correspondente ao hexa 1AB4C.

1 A B 4 C

0001 1010 1011 0100 1100

Portanto, o número binário 11010101101001100 é equivalente ao hexadecimal 1AB4C.

Exercícios propostos:

Converter de hexadecimal para binário:

EP037: CAFE

EP038: CDF

EP039: 1AB4D

EP040: 15

EP041: F

EP042: 87B54

EP043: 1001

EP044: 234

EP045: CAD

EP046: 7F7

EP047: 1990

EP048: 33

1010

Page 11: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-1-5 Conversão de binário para decimal

Deve-se efetuar a soma das potências de 2 correspondentes aos algarismos 1 do número binário.

Exemplo: determinar o número decimal equivalente ao binário 111001101.

1 . (2**8) = 1 . 256 = 2561 . (2**7) = 1 . 128 = 1281 . (2**6) = 1 . 64 = 640 . (2**5) = 0 . 32 = 00 . (2**4) = 0 . 16 = 01 . (2**3) = 1 . 8 = 81 . (2**2) = 1 . 4 = 40 . (2**1) = 0 . 2 = 01 . (2**0) = 1 . 1 = 1

TOTAL 461

Portanto, o número decimal 461 é equivalente ao binário 111001101.

Exercícios propostos:

Converter de binário para decimal:

EP049: 11

EP050: 100001111111

EP051: 101010010101

EP052: 110000001111111

EP053: 11111110000011

EP054: 11110000111000

EP055: 11

EP056: 111111110

EP057: 1111100001111000111001101

EP058: 1000000000000

EP059: 11111001

EP060: 1000000000000001

1111

Page 12: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-1-6 Conversão de hexadecimal para decimal

Deve-se efetuar a soma das potências de 16 multiplicadas pelo valor decimal do algarismo hexadecimal.

Exemplo: determinar o número decimal equivalente ao hexadecimal 1AC5F.

1 . (16**4) = 1 . (16**4) = 1 . 65536 = 65536A . (16**3) = 10 . (16**3) = 10 . 4096 = 40960C . (16**2) = 12 . (16**2) = 12 . 256 = 30725 . (16**1) = 5 . (16**1) = 5 . 16 = 80F . (16**0) = 15 . (16**0) = 15 . 1 = 15

TOTAL 109663

Portanto, o número decimal 109663 é equivalente ao hexadecimal 1AC5F.

Exercícios propostos:

Converter de hexadecimal para decimal:

EP061: 11

EP062: AAF45

EP063: 1B567

EP064: 100

EP065: 1000

EP066: FF

EP067: FFF

EP068: CDF

EP069: CAFE

EP070: FACA

EP071: DAD0

EP072: F1E2D3C4

1212

Page 13: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-2 Operações aritméticas

1-2-2-1 Soma em binário

Os números devem estar alinhados à direita.Análoga à soma em decimal, observando-se a seguinte "tabuada":

0 + 0 = 00 + 1 = 11 + 0 = 11 + 1 = 0 e vai 1 para a "casa" da esquerda

Exemplos:

11001001 1001111011 111+ 1010 + 110110 + 1----------- ------------- ------ 11010011 1010110001 1000

Exercícios propostos:

EP073: 11001100 + 10101010

EP074: 1111001111 + 1001111001

EP075: 1111 + 1

EP076: 1111 + 111

EP077: 100001 + 11110

EP078: 1011110011 + 111101111

EP079: 110011001100 + 101011110000

EP080: 1111100001111000 + 101111

EP081: 111 + 1111 + 100

EP082: 11 + 111 + 1111 + 11111

EP083: 1111 + 1001 + 111 + 101 + 11 + 1

EP084: 111 + 1000 + 1 + 1100

1313

Page 14: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-2-2 Subtração em binário

Os números devem estar alinhados à direita.A subtração é análoga à soma em decimal, observando-se a seguinte "tabuada":

0 - 0 = 01 - 0 = 11 + 1 = 00 - 1 = tira-se 1 da "casa" da esquerda (que fica valendo 1 a menos), e que vem para a "casa" presente valendo 2

Exemplos:

11001001 1001111011 100 100- 1010 - 110110 - 1 - 1000----------- ------------- ------ --------- 10111111 1001000101 11 ...1111100

Exercícios propostos:

EP085: 11001100 - 1010101

EP086: 1111001111 - 1111001

EP087: 1111 - 1

EP088: 1111 - 111

EP089: 100001 - 11110

EP090: 1011110011 - 111101111

EP091: 11001100 - 111011110000

EP092: 1111000 + 101010111

EP093: 111 - 1111

EP094: 10001 - 111111

EP095: 0 - 1

EP096: 0 - 10

1414

Page 15: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-2-3 Soma em hexadecimal

Os números devem estar alinhados à direita.Análoga à soma em decimal, observando-se que só vai 1 para a "casa" da esquerda quando o resultado da soma de dois algarismos das duas parcelas for maior que 15 (o algarismo resultante deve ser a soma achada - 16).Os resultados de cada "casa" devem ser colocados em algarismos hexadecimais (se for 10, coloca-se A; e assim por diante, até o 15, que coloca-se F).

Exemplos:

1AB4 CF55 A2BC89 FFF F0F0+ 123 + 102D + F00F + 4 + CCCC------- ------- --------- ------- -------- 1BD7 DF82 A3AC98 1003 1BDBC

Exercícios propostos:

EP097: F12B + 321

EP098: 1100 + 111

EP099: 1000F + F0001

EP100: A9B8C7 + D6E5F4

EP101: CAFE + CDF

EP102: B001 + FD

EP103: 999 + 111

EP104: 123456 + 789ABC

EP105: FFF + EEE

EP106: DDD + 333

EP107: 987AED + CF01

EP108: FACA + CAFE

1515

Page 16: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-2-2-4 Subtração em hexadecimal

Os números devem estar alinhados à direita.Análoga à subtração em decimal, observando-se que vem 1 da "casa" da esquerda (que fica valendo 1 a menos) quando o algarismo do minuendo for menor que o do subtraendo. Neste caso, o 1 que veio, vem valendo 16, o qual deve ser somado ao algarismo do minuendo, para que o resultado desta adição possa ser subtraído do algarismo do subtraendo, e cujo valor máximo pode ser 15.Os resultados de cada "casa" devem ser colocados em algarismos hexadecimais (se for 10, coloca-se A; e assim por diante, até o 15, que coloca-se F).

Exemplos:

1AB4 CF55 A2BC89 FFF 0- 123 - 102D - F00F - 4 - 2------- ------- --------- ------- -------- 1991 BF28 A1CC7A FFB ...FFE

Exercícios propostos:

EP109: F1C5 - 101

EP110: 1AD87C - FDE9

EP111: 112233 - 44556

EP112: AABBCC - DDEEF

EP113: F1E2D3 - C4B5A6

EP114: FF00001 - 10000F

EP115: CAFE - FACA

EP116: CDF - FDC

EP117: 10001 - 20001

EP118: 10000 - FFFE

EP119: 0 - 9

EP120: 0 - 1A

1616

Page 17: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-3 ) ARQUITETURAS DE MAINFRAME'S IBM

1-3-1 VISÃO GERAL

Com o lançamento da linha /360, a IBM introduziu o conceito de "família" de equipamentos, onde, com compatibilidade, era possível migrar de um modelo menor para qualquer maior, permitindo que se preservasse os investimentos em hardware (periféricos) e software.

A compatibilidade era fruto de diversos fatores, e um deles era a arquitetura dos equipamentos, igual em todos os modelos (exceção aos modelos com características específicas, como os modelos 44 e o 67).

Essa arquitetura era a 360, que evoluiu para a arquitetura 370, que apresentava poucas modificações, a principal delas referente ao uso de memória virtual.

A arquitetura 370 evoluiu para a XA (eXtended Architecture), e, desta, para a arquitetura ESA (Extended System Architecture).

Vários são os elementos que compõe a arquitetura de um sistema de computação: a capacidade e a forma de endereçamento, a forma de comunicação entre o hardware e o software, o conjunto de instruções, os componentes do(s) processador(es), etc... Veremos, a seguir, alguns desses elementos, fundamentais para o aprendizado da linguagem ASSEMBLER.

Um sistema IBM tem, entre outros, os seguintes componentes:

Memória: é um componente fundamental, e é constituída por bytes, cada qual com 8 bits.

16 registradores gerais (ou registradores de ponto fixo), cada qual com 4 bytes

16 registradores de controle, cada qual com 4 bytes 4 registradores de ponto flutuante, cada qual com 8 bytes PSW atual : registrador especial com 8 bytes; nela existem dois "campos" importantes: um (com 3 ou 4 bytes e) que contem um endereço (vide item seguinte) que corresponde ao endereço da próxima instrução que deve ser executada, e outro com o CONDITION CODE, com 2 bits, que indica, após a execução de algumas instruções, alguma condição referente à execução da instrução, como por exemplo, o resultado de comparações.

Outros elementos que compõe a arquitetura são, por exemplo:

o sistema de interrupções os "clocks" os sub-sistemas de entrada e saída o sistema de proteção de memória o sistema de memória virtual a forma de comunicação entre hardware e software

1717

Page 18: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LAY-OUT DA PSW ATUAL (BC MODE)

BYTE 0 BITS 0-5 = máscaras de canal BIT 6 = máscara para canais 6 e acima BIT 7 = máscara externaBYTE 1 BITS 8-11 = chave de proteção BIT 12 = 0 = Basic Control Mode BIT 13 = máscara de machine-check BIT 14 = 1 = estado de wait BIT 15 = 1 = estado de programa problemaBYTES 2-3 (BITS 16-31) = Interruption codeBYTE 4 BITS 32-33 = ILC = Instruction length code BITS 34-35 = CC = Condition code BITS 36-39 = máscara de programaBYTES 5-7 (BITS 40-63) = Instruction address

LAY-OUT DA PSW ATUAL (EC MODE)

BYTE 0 BIT 0 = 0 BIT 1 = máscara de program-event recording BIT 2 = 0 BIT 3 = 0 BIT 4 = 0 BIT 5 = translation mode BIT 6 = máscara de I/O BIT 7 = máscara externaBYTE 1 BITS 8-11 = chave de proteção BIT 12 = 1 = Extended Control Mode BIT 13 = máscara de machine-check BIT 14 = 1 = estado de wait BIT 15 = 1 = estado de programa problemaBYTE 2 BIT 16 = 0 BIT 17 = 0 BITS 18-19 = CC = condition code BITS 20-23 = máscara de programa BIT 20 = máscara de fixed-point overflow BIT 21 = máscara de decimal-overflow BIT 22 = máscara de exponent underflow BIT 23 = máscara de significânciaBYTE 3 (BITS 24-31) = 00000000BYTE 4 (BITS 32-39) = 00000000BYTES 5-7 (BITS 40-63) = Instruction address

1818

Page 19: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LAY-OUT DA PSW ATUAL (XA MODE)

BYTE 0 BIT 0 = 0 BIT 1 = máscara de program-event recording BIT 2-4 = 000 BIT 5 = translation mode BIT 6 = máscara de I/O BIT 7 = máscara externaBYTE 1 BITS 8-11 = chave de proteção BIT 12 = 1 BIT 13 = máscara de machine-check BIT 14 = 1 = estado de wait BIT 15 = 1 = estado de programa problemaBYTE 2 BIT 16 = address space mode (junto c/ bit 5) BIT 17 = 0 BITS 18-19 = CC = condition code BITS 20-23 = máscara de programa BIT 20 = máscara de fixed-point overflow BIT 21 = máscara de decimal-overflow BIT 22 = máscara de exponent underflow BIT 23 = máscara de significânciaBYTE 3 (BITS 24-31) = 00000000BYTE 4 BIT 32 = 0 = 24 bit addressing = 1 = 31 bit addressingBYTE 4/5/6/7 (BITS 33-63) = Instruction address

LAY-OUT DA PSW ATUAL (ESA MODE)

BYTE 0 BIT 0 = 0 BIT 1 = máscara de program-event recording BIT 2-4 = 000 BIT 5 = translation mode BIT 6 = máscara de I/O BIT 7 = máscara externaBYTE 1 BITS 8-11 = chave de proteção BIT 12 = 1 BIT 13 = máscara de machine-check BIT 14 = 1 = estado de wait BIT 15 = 1 = estado de programa problemaBYTE 2 BIT 16-17 = address space control = 00 = Primary space mode (bit 5 = 1) = 01 = Access-register mode (bit 5 = 1) = 10 = Secondary space mode (bit 5 = 1) = 11 = Home space mode (bit 5 = 1) BITS 18-19 = CC = condition code BITS 20-23 = máscara de programa BIT 20 = máscara de fixed-point overflow BIT 21 = máscara de decimal-overflow BIT 22 = máscara de exponent underflow BIT 23 = máscara de significânciaBYTE 3 (BITS 24-31) = 00000000BYTE 4 BIT 32 = 0 = 24 bit addressing = 1 = 31 bit addressingBYTE 4/5/6/7 (BITS 33-63) = Instruction address

1919

Page 20: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-3-2 ENDEREÇAMENTO

Cada byte de memória tem um número que o identifica e o individualiza. A esse número dá-se o nome de endereço, e é expresso através do sistema de numeração hexadecimal.

Para as arquiteturas anteriores à XA, o endereço de um byte era um número hexadecimal de 6 algarismos (24 algarismos binários - 24 bits), variando, portanto, de 000000 até FFFFFF, o que possibilitava referências a endereços até 16MB.

A partir da arquitetura XA, o endereço máximo possível é de 31 bits, equivalentes a 8 algarismos hexadecimais menos 1 bit (31 algarismos binários - 31 bits); pode haver, portanto, referências a endereços que vão desde 00000000 até 7FFFFFFF, possibilitando a utilização de até 2 GB.

No entanto, para que uma instrução possa fazer referência a endereços de campos de memória com os quais ela trabalhe, e para que isso seja feito de forma mais econômica (se uma instrução precisasse fazer referência a dois endereços de memória de 31 bits, ela precisaria - só para isso - de 62 bits, ou seja, praticamente 8 bytes), convencionou-se que as referências a endereços em instruções (Bse + Deslocamento ou Base + Deslocamento + Indexador) seriam feitas de forma indireta.

Referências usando a forma indireta são feitas através da forma

BASE + DESLOCAMENTO

que consiste na citação do número (endereço) de um dos 16 registradores gerais (que são endereçados de 0 a F - por serem 16), além de outro número hexadecimal composto sempre de 3 algarismos.

O registrador geral usado com essa finalidade recebe o nome de registrador BASE, e o número hexadecimal complementar recebe o nome de DESLOCAMENTO.

O endereço desejado é obtido através da soma entre o número contido no registrador base e o deslocamento.

Nas arquiteturas anteriores à XA, o conteúdo do registrador (que tem 4 bytes = 8 algarismos hexadecimais) tem o primeiro byte à esquerda desprezado, e é levado em consideração somente o número formado pelos 3 bytes à direita.

Nas outras arquiteturas, o conteúdo do registrador base tem seu primeiro bit à esquerda desprezado, e os 31 bits restantes formam um número que é levado em consideração no cálculo do endereço.

Vejamos o seguinte exemplo:

Caso uma instrução referencie um endereço na forma BASE + DESLOCAMENTO, onde o registrador base é o registrador geral 12, e o deslocamento é o número C5A, temos que (supondo que o conteúdo do registrador 12 seja 610AB428):

2020

Page 21: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Conteúdo do registrador Base = 0AB428 ou 610AB428Deslocamento = C5A C5AEndereço do campo de memória = 0AC082 610AC082

dependendo da arquitetura utilizada.

Uma outra forma possível de ser utilizada (somente nas instruções RX) é a forma

INDEXADOR + BASE + DESLOCAMENTO

que consiste na citação do número (endereço) de dois dos 16 registradores gerais, além do deslocamento.

Um dos registradores gerais usado recebe o nome de registrador INDEXADOR, e o outro de registrador BASE; e o número hexadecimal complementar recebe o nome de DESLOCAMENTO.

O endereço desejado é obtido através da soma com 3 parcelas: o número contido no registrador indexador, o número contido no registrador base e o deslocamento. Vale aqui as mesmas considerações anteriores relativas ao tratamento do conteúdo do registrador base (24 ou 31 bits) e elas se estendem também ao número contido no registrador indexador.

Vejamos o seguinte exemplo:

Caso uma instrução referencie um endereço na forma INDEXADOR + BASE + DESLOCAMENTO, em que o registrador indexador é o 8, o registrador base é o registrador 2, e o deslocamento é o número F84, temos que (supondo que o conteúdo do registrador 8 seja 30C0A800 e que o conteúdo do registrador 2 seja 10002800):

Conteúdo do registrador indexador = C0A800 ou 30C0A800Conteúdo do registrador Base = 002800 ou 10002800Deslocamento = F84 F84Endereço do campo de memória = C0DF84 ou 40C0DF84

dependendo da arquitetura utilizada.

IMPORTANTE : se o registrador base ou o registrador indexador for o registrador 0, o seu conteúdo é desprezado no cálculo do endereço.

Exemplos:

1) Registrador indexador = R0; conteúdo = 00345CB9 Registrador base = R7; conteúdo = 00FCD800 Deslocamento = 12A Endereço de memória = 00FCD92A

2121

Page 22: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

2) Registrador indexador = R9; conteúdo = 00345CB9 Registrador base = R0; conteúdo = 00FCD800 Deslocamento = 12A Endereço de memória = 00345DE3

3) Registrador indexador = R0; conteúdo = 00345CB9 Registrador base = R0; conteúdo = 00FCD800 Deslocamento = 12A Endereço de memória = 0000012A

4) Registrador base = R0; conteúdo = 00334400 Deslocamento = 123 Endereço de memória = 00000123

5) Registrador base = R9; conteúdo = 00334400 Deslocamento = 123 Endereço de memória = 00334523

1-3-3 REPRESENTAÇÃO DE DADOS

Os dados podem ser representados de forma codificada, em formato que depende de sua natureza.

Assim, devemos distinguir os dados numéricos dos alfanuméricos.

Os dados numéricos podem ser representados numa das seguintes formas:- Formato binário de ponto flutuante- Formato binário de ponto fixo- Formato decimal zonado- Formato decimal compactado

Os dados alfanuméricos devem ser representados no formato EBCDIC.

1-3-3-1 Formato binário de ponto fixo

Neste caso, deve-se usar campos de memória que sejam:- Half-words (campos de 2 bytes com endereço múltiplo de 2)- Full-words ou simplesmente words (campos de 4 bytes com endereço múltiplo de 4).

Os números são representados usando-se 15 bits (se for numa half-word) ou 31 bits (se for numa full-word); o bit adicional é usado para indicar o sinal do número, e é o primeiro bit à esquerda do campo.

Exemplos:

Número Representação em Half-word Representação em Full-word

+12 00.0C 00.00.00.0C-12 FF.F4 FF.FF.FF.F4

2222

Page 23: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

1-3-3-2 Formato decimal zonado

Neste caso, cada algarismo do número decimal ocupa um byte, tendo na parte de zona a configuração F (o último byte à direita é exceção), e na parte numérica a configuração correspondente ao algarismo desejado.No último byte à direita, a parte de zona tem configuração correspondente ao sinal do número: C ou F se o número for positivo, ou D se o número for negativo.Se for necessário usar campos maiores que o suficiente para conter o número desejado, deve-se ter zeros zonados à esquerda. O maior tamanho possível é de 16 bytes.

Exemplos:

Número Representação em decimal zonado

+12 F1.C2 ou F1.F2-12 F1.D2

1-3-3-3 Formato decimal compactado

Neste caso, cada algarismo do número decimal ocupa meio byte, tendo na parte numérica do último byte à direita a configuração correspondente ao sinal do número: C ou F se o número for positivo, ou D se o número for negativo.Se for necessário usar campos maiores que o suficiente para conter o número desejado, deve-se ter zeros à esquerda.

O maior tamanho possível é de 16 bytes.

Exemplos:

Número Representação em decimal compactado

+12 01.2C ou 01.2F-12 01.2D

1-3-4 REPRESENTAÇÃO DE INSTRUÇÕES

Existem os seguintes tipos de instruções:

RR - 2 bytes CO = 1 byte (código de operação) R1 = 1/2 byte (registrador primeiro operando) R2 = 1/2 byte (registrador segundo operando)

E - 2 bytes ambos para o código de operação

QST - 4 bytes CO = 2 bytes (código de operação) QR3 = 1/2 byte (registrador geral -GR- ou pto flut -FR- terceiro oper) RT2 = 1/2 byte (registrador "stride of vector" do segundo operando) VR1 = 1/2 byte (registrador de vetor primeiro operando) RS2 = 1/2 byte (registrador end início de vetor do segundo operando)

2323

Page 24: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

QV - 4 bytes CO = 2 bytes (código de operação) QR3 = 1/2 byte (registrador geral -GR- ou pto flut -FR- terceiro oper) NU = 1/2 byte (não usado) VR1 = 1/2 byte (registrador de vetor primeiro operando) VR2 = 1/2 byte (registrador de vetor segundo operando)

RRE - 4 bytes CO = 2 bytes (código de operação) NU = 1 byte (não usado) R1 = 1/2 byte (registrador primeiro operando) R2 = 1/2 byte (registrador segundo operando)

RS - 4 bytes CO = 1 byte (código de operação) R1 = 1/2 byte (registrador primeiro operando) R3 = 1/2 byte (registrador terceiro operando) B2 = 1/2 byte (registrador base do segundo operando) D2 = 1 byte e 1/2 (deslocamento do segundo operando)

RX - 4 bytes CO = 1 byte (código de operação) R1 = 1/2 byte (registrador primeiro operando) X2 = 1/2 byte (registrador indexador do segundo operando) B2 = 1/2 byte (registrador base do segundo operando) D2 = 1 byte e 1/2 (deslocamento do segundo operando)

S - 4 bytes CO = 2 bytes (código de operação) B2 = 1/2 byte (registrador base do segundo operando) D2 = 1 byte e 1/2 (deslocamento do segundo operando)

SI - 4 bytes CO = 1 byte (código de operação) I2 = 1 byte (operando imediato - segundo operando) B1 = 1/2 byte (registrador base do primeiro operando) D1 = 1 byte e 1/2 (deslocamento do primeiro operando)

VR - 4 bytes CO = 2 bytes (código de operação) QR3 = 1/2 byte (registrador geral -GR- ou pto flut -FR- terceiro oper) NU = 1/2 byte (não usado) VR1 = 1/2 byte (registrador de vetor primeiro operando) GR2 = 1/2 byte (registrador segundo operando)

VS - 4 bytes CO = 2 bytes (código de operação) NU = 1 byte e 1/2 (não usado) RS2 = 1/2 byte (registrador end início de vetor do segundo operando)

2424

Page 25: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

VST - 4 bytes CO = 2 bytes (código de operação) VR3 = 1/2 byte (registrador de vetor terceiro operando) RT2 = 1/2 byte (registrador "stride of vector" do segundo operando) VR1 = 1/2 byte (registrador de vetor primeiro operando) RS2 = 1/2 byte (registrador end início de vetor do segundo operando)

VV - 4 bytes CO = 2 bytes (Código de operação) VR3 = 1/2 byte (registrador de vetor terceiro operando) NU = 1/2 byte (não usado) VR1 = 1/2 byte (registrador de vetor primeiro operando) VR2 = 1/2 byte (registrador de vetor segundo operando)

RSE - 6 bytes CO = 2 bytes (código de operação) R3 = 1/2 byte (registrador terceiro operando) NU = 1/2 byte (não usado) VR1 = 1/2 byte (registrador de vetor primeiro operando) NU = 1/2 byte (não usado) B2 = 1/2 byte (registrador base do segundo operando) D2 = 1 byte e 1/2 (deslocamento do segundo operando)

SS - 6 bytes CO = 1 byte (código de operação) o segundo byte pode ter uma das 3 alternativas: . R1 = 1/2 byte (registrador primeiro operando) R3 = 1/2 byte (registrador terceiro operando) ou . L1 = 1/2 byte (tamanho - 1 do primeiro operando) L2 = 1/2 byte (tamanho - 1 do segundo operando) ou . L = 1 byte (tamanho - 1 dos dois operandos) B1 = 1/2 byte (registrador base do primeiro operando) D1 = 1 byte e meio (deslocamento do primeiro operando) B2 = 1/2 byte (registrador base do segundo operando) D2 = 1 byte e meio (deslocamento do segundo operando)

SSE - 6 bytes CO = 2 bytes (código de operação) B1 = 1/2 byte (registrador base do primeiro operando) D1 = 1 byte e meio (deslocamento do primeiro operando) B2 = 1/2 byte (registrador base do segundo operando) D2 = 1 byte e meio (deslocamento do segundo operando)

-------------------------------------------------------------------------

2525

Page 26: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIOS PROPOSTOS

Representar, no formato binário de ponto fixo, em half-words e full-words, os seguintes números (especificados em decimal):

EP121: 1

EP122: -1

EP123: 10

EP124: -10

EP125: 17

EP126: -17

EP127: 254

EP128: -254

EP129: 100000

EP130: -100000

EP131: 32000

EP132: -32000

EP133: 63000

EP134: -63000

EP135: 1010

EP136: -1010

EP137: 4095

EP138: -4095

EP139: 4097

EP140: -4097

2626

Page 27: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Representar, no formato decimal compactado, os seguintes números (especificados em decimal):

EP141: 1

EP142: -1

EP143: 10

EP144: -10

EP145: 17

EP146: -17

EP147: 254

EP148: -254

EP149: 100000

EP150: -100000

EP151: 32000

EP152: -32000

EP153: 63000

EP154: -63000

EP155: 1010

EP156: -1010

EP157: 4095

EP158: -4095

EP159: 4097

EP160: -4097

2727

Page 28: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Representar, no formato decimal zonado, os seguintes números (especificados em decimal):

EP161: 1

EP162: -1

EP163: 10

EP164: -10

EP165: 17

EP166: -17

EP167: 254

EP168: -254

EP169: 100000

EP170: -100000

EP171: 32000

EP172: -32000

EP173: 63000

EP174: -63000

EP175: 1010

EP176: -1010

EP177: 4095

EP178: -4095

EP179: 4097

EP180: -4097

2828

Page 29: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Representar, no formato EBCDIC, os seguintes dados:

EP181: 17

EP182: -17

EP183: AF$BD

EP184: -AF4BD

EP185: ALBERTO

EP186: 15-9

EP187: -4095

EP188: 4095

EP189: *&$//

EP190: 12+3

EP191: EU E ELA

EP192: CR$ 2.584,73

EP193: US$ 1 MILHAO

EP194: TICO'S BAREP195 : Decodificar o seguinte conjunto de instruções, especificando, para cada uma delas:- Código de operação de máquina e Assembler- Endereço da instrução (supor que a primeira instrução esteja no endereço 00000000).- Operandos (qual registrador, qual base, qual indexador, qual deslocamento); quando o operando for de memória, calcular o seu endereço real, supondo que os registradores gerais tenham o seguinte conteúdo:

R00=00112233 R04=00000400 R08=00000800 R12=00000C00R01=00000100 R05=00000500 R09=00000900 R13=00000D00R02=00000200 R06=00000600 R10=00000A00 R14=00000E00R03=00000300 R07=00000700 R11=00000B00 R15=00000F00

Instruções a decodificar:

1ABB41278CF00A13980F334445E00CB490EC0D00FA82305448CCD28233445566

2929

Page 30: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

2) MONTADOR ASSEMBLER E ESPECIFICAÇÃO DE ELEMENTOS

2-1) INTRODUÇÃO

2-1-1 O MONTADOR ASSEMBLER

É o programa encarregado de transformar as instruções de linguagem fonte (simbólica) para linguagem objeto. O programa objeto será posteriormente tratado pelo linkeditor para torná-lo executável.Uma das diferenças básicas entre um montador e um compilador é que o montador, para cada instrução simbólica gera uma única instrução de máquina, ao passo que um compilador pode gerar de uma a n instruções de máquina.

Numa primeira fase, o montador Assembler lê todos os statements fonte, expandindo as macro-instruções e os COPY's, e, além disso, identificando todos os comandos ao montador e instruções de máquina; ele consegue, para cada um deles que gera algum byte, identificar quantos bytes devem ser gerados, e, em alguns casos, já colocando o conteúdo necessário do programa objeto.

À medida que vai alocando os bytes, o montador Assembler vai incrementando um contador denominado LOCATION COUNTER, que reflete a quantidade de bytes gastos (alocados) até um determinado instante, isto é, o tamanho do programa até esse instante.

Ao mesmo tempo, cada símbolo encontrado vai formando a TABELA DE SÍMBOLOS, de tal forma que fique completa ao fim da primeira fase.A tabela de símbolos contém, entre outras informações: o símbolo, seu endereço, seu atributo de tamanho e seu atributo de tipo (se é uma instrução, o atributo de tipo é I, se é um campo compactado, o atributo de tipo é P, se for uma full-word, é F, e assim por diante).

Na segunda fase, de posse da tabela de símbolos completa, ele "varre" o código objeto gerado, completando as informações que tinham ficado faltando, como por exemplo os endereços na forma base + deslocamento.

Para efeito de exemplificação, vejamos o seguinte fluxo, referente ao sistema operacional MVS:

3030

Page 31: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

fonte objeto SYSIN SYSPUNCH macros/ asmF=IFOX00 listagem copys SYSLIB asmH=IEV90 SYSPRINT work objeto SYSUT1 SYSGO objeto SYSUT1 SYSLIN statements listagem de contro- IEWL le SYSPRINT SYSIN outros executável objetos SYSLMOD SYSLIB executável (de uma LOADER memória LINKLIB)

3131

Page 32: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

2-1-2 O STATEMENT ASSEMBLER

Ele é utilizado para a codificação das instruções de um programa em Assembler.

Normalmente (pode ser diferente - veja o comando ICTL) um statement Assembler é dividido em campos, cada um com uma função. São os seguintes os campos:

a) Posições 1 a 8: Símbolob) Posições 10 a 14: Código da Instruçãoc) Posições 16 a 71: Operandos e Comentáriosd) Posição 72: Posição de Continuaçãoe) Posições 73 a 80: Identificação e Sequência

Estudemos mais detalhadamente cada um desses campos:

2-2) SÍMBOLO

Também conhecido como LABEL. É o nome que se atribui a uma Instrução ou de uma área. Para a criação de um símbolo, deve-se obedecer às seguintes regras:

Um símbolo pode ter de 1 a 8 caracteres (no Assembler F) ou de 1 a 63 caracteres (no Assembler H) Os caracteres válidos para a formação de símbolos são: - Letras: A até Z - Algarismos: 0 ate 9 - Caracteres $ @ # O primeiro caracter não pode ser um algarismo

Exemplos:

ARIMP ARLEIT TOTAL3 VALOR$ Válidos $VALOR SOMAR7 A

3TOTAL TRANZAMAZONICA EU E ELA Não-Válidos (o segundo é válido EU-E-ELA no Assembler H) CABEC.

3232

Page 33: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

2-3) CÓDIGO DE INSTRUÇÃO

Especifica a instrução. Pode-se especificar um dos 3 tipos:

2-3-1) INSTRUÇÕES AO MONTADORSão dados para o montador Assembler, a fim de conduzir a montagem de acordo com o necessário. Com poucas exceções, elas não dão origem a nenhuma instrução em linguagem de máquina. São os seguintes os Comandos ao Montador Assembler:a) Definição de áreas : DC, DS, CCW, CCW0, CCW1 b) Seccionamento de um Programa e Ligação: START, CSECT, DSECT, DXD CXD, COM, ENTRY, EXTRN, WXTRNc) Controle de Registradores Base: USING, DROPd) Controle da listagem: TITLE, EJECT, SPACE, PRINTe) Controle de programa : ICTL, ISEQ, PUNCH, REPRO, ORG, EQU, OPSYN, PUSH POP, LTORG, CNOP, COPY, END, LOCTR, AMODE, RMODEf) Definição de macro-instrução: AREAD, MACRO, MEXIT, MENDg) Montagem condicional: ACTR, AGO, AIF, ANOP, GBLA, GBLB, GBLC LCLA, LCLB, LCLC, MHELP, MNOTE, SETA, SETB, SETC

2-3-2) INSTRUÇÕES DE MÁQUINAPara cada código de operação válido no primeiro byte de uma instrução de máquina, existe um código Assembler correspondente. Verifique nos APÊNDICES A e B a relação de todas as instruções de máquina.

2-3-3) MACRO-INSTRUÇÕESSão códigos que farão com que o montador Assembler dê origem a diversas instruções (de máquina ou ao montador). Para que ele saiba o que gerar, ele consulta a Biblioteca de Macros (em VSE é a SOURCE STATEMENT LIBRARY; em MVS é, em geral, a SYS1.MACLIB). As macro-instruções variam de um sistema operacional para outro.

2-4) OPERANDOS E COMENTÁRIOSOs operandos informam onde se localizam os dados a serem processados. Deve-se especificar um operando após o outro, separando-os através de uma vírgula, sem espaços em branco. Terminada a especificação dos operandos, deve haver pelo menos um espaço em branco; o que vier em seguida, até a posição 71, será considerado comentário, isto é, servirá somente para, aparecendo na listagem dos statements-fonte fornecida pelo montador, explicar o que foi feito na instrução. Por exemplo:

COMPLETA MVC ARIMP,=CL133'b' LIMPAR ARIMP........ ... ............... ............ = = = =Símbolo Código de Operandos Comentários Instrução

Os operandos de uma instrução podem ser registradores ou campos de memória. Vejamos agora, como, ao escrevermos uma instrução, especificamos um operando.

3333

Page 34: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

2-4-1) OPERANDOS EM REGISTRADOR

Este é o caso mais simples; deve-se apenas colocar o número do registrador que contém o dado a ser processado. Suponha, por exemplo, que você tenha um número no registrador 7, e queira adicionar a ele outro número que esteja no registrador 12. Em Assembler a instrução que efetua essa soma é

AR 7,12

Sendo que AR é o código mnemônico da instrução que soma números contidos em registradores.

2-4-2) OPERANDOS EM MEMÓRIA

Para que façamos referência a um operando que seja um campo de memória, utilizamo-nos de EXPRESSÕES que representam os endereços dos campos utilizados. As expressões são compostas de TERMOS, dos quais existem 5 tipos, descritos a seguir.

2-4-2-1) TÊRMOS DE EXPRESSÕES

I - SÍMBOLOS, que podem ser de 3 tipos: Ordinários (vistos no ítem 2-2), Variáveis e de Sequência (serão vistos no estudo de macros).

II - ATRIBUTO DE TAMANHO : O seu formato é L's, sendo que s é um símbolo. O valor deste termo será o tamanho (Length) do símbolo.

III - REFERÊNCIA AO LOCATION COUNTER : O montador Assembler tem para si um contador que é incrementado durante a montagem, à medida que vão sendo usados bytes, seja por instruções, seja por áreas. O nome desse contador de posições é LOCATION COUNTER, e a referência a ele (a seu conteúdo) é feita colocando-se um asterisco (*).Compreenderemos melhor através de um exemplo. Normalmente, ao ser iniciada a montagem de um programa, o conteúdo do LOCATION COUNTER é zero. Suponhamos um programa com o seguinte conjunto de instruções e de áreas:

BALR 3,0 2 BYTES 000000 D --> USING *,3 ----- 000002 BAL 14,ROTLE 4 BYTES 000002 E --> CLC CODIGO,=C'1' 6 BYTES 000006 BNE ERRADO 4 BYTES 00000C F --> AP CERTO,=P'1' 6 BYTES 000010 BAL 14,IMPRIME 4 BYTES 000016 . 00001A . 382 " . . (Por Ex) . . . CODIGO DS CL1 1 BYTE 000198 CERTO DC PL3'0' 3 BYTES 000199 . 00019C A B C

3434

Page 35: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Em A temos as instruções e áreas, conforme definidas no programa.

Em B temos o tamanho de cada instrução ou área.

Em C temos o conteúdo do location counter, que é atualizado a cada campo utilizado, cada byte gasto.

Em D temos um exemplo de uma instrução com 2 operandos, sendo que o primeiro é uma referência ao Location Counter.

IV - TERMOS AUTO-DEFINIDOS

São termos cujo valor é inerente ao termo, isto é, eles próprios são uma especificação explícita do valor que representam.

- Decimal: - um número decimal composto de 1 ate 8 algarismos. Ex:

MVI BYTE,240

- Hexadecimal: - um número hexadecimal composto de 1 ate 6 algarismos, colocados entre apóstrofes, e precedido da letra X. Ex:

MVI BYTE,X'F0'

- Binário:- um número binário composto de 1 ate 24 algarismos, colocados entre apóstrofes, e precedido da letra B. Ex:

MVI BYTE,B'11110000'

- Caracter:- conjunto de 1 a 3 caracteres quaisquer colocados entre apóstrofes e precedido da letra C. Ex:

MVI BYTE,C'0'

OBS:- Quando o caracter desejado for um apóstrofe (') ou um E Comercial (&), ele deve ser colocado duas vezes. Ex:

MVC BYTES,=C'A&&B'

MVC BYTES,=C'A''B'

Como vimos, os termos formam expressões cuja função é fazer referência a um operando na memória. Uma expressão pode ser composta de um ou mais termos, aritmeticamente combinados através dos sinais

+ adição- subtração* multiplicação/ divisão

e, quando necessário, de parênteses, para ordenar a sequência de resolução da expressão. Ex:

ARIMP+L'SALARIO-2*(LEP02/4)

3535

Page 36: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

2-4-2-2) EXPRESSÕES PARA REFERÊNCIA DE OPERANDOS

Não esqueçamos que a referência a um campo de memória tem por função informar ao montador qual o endereço do campo, para que o montador possa transformar a instrução de linguagem simbólica para linguagem de máquina, na qual o endereço é colocado na forma BASE + DESLOCAMENTO ou INDEXADOR + BASE + DESLOCAMENTO.

OBS: - daqui em diante, usaremos as seguintes abreviaturas:

R1 = Registrador primeiro operandoR2 = Registrador segundo operandoR3 = Registrador terceiro operandoB1 = Registrador Base do primeiro operandoB2 = Registrador Base do segundo operandoD1 = Deslocamento do primeiro operandoD2 = Deslocamento do segundo operandoX2 = Registrador Indexador do segundo operandoI2 = Operando Imediato (segundo operando)L = Tamanho do primeiro e do segundo operandosL1 = Tamanho do primeiro operandoL2 = Tamanho do segundo operandoCO = Código de Operação

Existem três maneiras de especificarmos um operando de memória:

a) EXPLÍCITA: - esta forma é para a especificação de registradores ou de operandos de memória. No caso de registrador, basta colocar o número do registrador desejado. Para operandos de memória, há uma indicação explícita de qual é o registrador indexador, qual é o registrador base e qual o deslocamento. A indicação deve ser feita do seguinte modo:

a-1) Instruções RX:

CO R1,D2(X2,B2)

CO R1,D2(X2) assume base 0

CO R1,D2(,B2) assume indexador 0

a-2) Instruções RS:

CO R1,R3,D2(B2)

a-3) Instruções SI:

CO D1(B1),I2

3636

Page 37: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

a-4) Instruções SS: (1 tamanho)

CO D1(L,B1),D2(B2)

a-4) Instruções SS: (2 tamanhos)

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

Ex:

LA 7,382(3,12) RX LA 7,382(3) RX LA 7,382(,12) RX LM 1,12,35(14) RS MVI 0(5),X'80' SI MVC 0(2,7),5(11) SS (L) AP 4(8,12),0(2,3) SS (L1 e L2)

b) IMPLÍCITA: - esta forma é usada, em geral, para operandos de memória; nela, é feita a indicação do endereço através de expressões, cujo valor, calculado pelo Assembler, é o endereço real do campo desejado. O montador Assembler se encarrega de transformar o endereço real para a forma base + deslocamento.Ex:

LA 7,TABELA LA 7,TABELA-30 LM 1,13,SAVE+4 MVI ARIMP+82,C'*' MVI BYTE,C'*' MVC ARIMP+5(6),ARCOMP MVC ARIMP+5(6),ARCOMP+2 AP TOTAL,=P'1' AP VALOR,ARLEIT+5(2) SP ARLEIT+5(8),ARLEIT+28(3)

OBS:- O número que vai entre parênteses após a expressão, indica o tamanho do operando. Numa instrução SS que faz referência a 1 tamanho, este deve ser especificado no primeiro operando; o segundo operando não pode ter indicação de tamanho. Observar que as instruções que se enquadram nesse tipo são: MVN, MVC, MVZ, NC, CLC, OC, XC, TR, TRT, ED, EDMK.

c) LITERAIS :- São áreas (constantes) definidas através das próprias instruções que delas se utilizam. Uma literal é composta do sinal de igual seguido daquilo que seria a parte de operando de um comando DC ou DS utilizado para definir a área desejada. O montador Assembler, sabendo o endereço da literal, transforma-o em base+deslocamento. Ex:

MVC ARIMP,=CL133' ' CLC BYTE,=C' ' CLC =C' ', BYTE

Para entender melhor, veja adiante os comandos DC e DS.

3737

Page 38: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

2-5) CONTINUAÇÃO DE STATEMENTS

Quando, ao se escrever uma instrução, ela não couber na linha (statement), deve-se colocar qualquer caracter diferente de branco na posição 72 do statement a ser continuado, e, a partir da posição 16 (inclusive) do statement seguinte, deve-se fazer a continuação.

As posições 1 a 15 do statement de continuação devem ficar obrigatoriamente em branco. Vejamos os seguintes exemplos:

123456789012345678901234567890123456789012345678901234567890123456789012

CABEC DC CL133' RELACAO DE FUNCIONARIOS COM SEUS RE- SPECTIVOS DEPENDENTES'

ENTRADA DCB DSORG=PS, ORGANIZACAO - DDNAME=DDENTRA, NOME DO DD - EODAD=FIM, FIM DE ARQUIVO - MACRF=(GM) MACROS USADAS

2-6) IDENTIFICAÇÃO E SEQUÊNCIA DE STATEMENTS

Em geral, usa-se essas posições da seguinte maneira:

Pos. 73 a 76 - Identificação. Conjunto de 4 caracteres quaisquer que podem identificar o programa.Pos. 77 a 80 - Número sequencial do statement, em geral numerado de 10 em 10.

OBS:

1) A divisão estabelecida no início do capítulo 2 não é rígida. O importante é haver pelo menos um espaço em branco entre o Símbolo e o Código de Operação; outro espaço em branco entre o Código de Operação e os operandos; e, finalmente, pelo menos um espaço em branco entre os Operandos e Comentários.

2) Quando houver um asterisco (*) na posição 1 de um statement, ele será considerado comentário.

3838

Page 39: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

3) INSTRUÇÕES AO MONTADOR ASSEMBLER

3-1) Instruções para definição de áreas

DC (Define Constant - Definir Constante)

(Símbolo) DC A1B1C1D1(,A2B2C2D2,...)

A função do DC é definir uma área de memória, atribuindo a ela um conteúdo inicial. Temos que:

A - Atributo de duplicação. É um número decimal que indica quantas vezes se deseja definir a área. O mínimo é 1. Se omitido, assume 1.

B- Letra que indica o tipo de constante. Pode ser:

C (Caracter) X (Hexadecimal) B (Binário) F (Full-Word) H (Half-Word) E (Full-Word - Ponto Flutuante) D (Double-Word - Ponto Flutuante) L (Duas Double-Words - Ponto Flutuante) P (Compactado) Z (Zonado) A (Address - Endereço - 4 bytes) Y (Address - Endereço - 2 bytes) S (Endereço em Base + Deslocamento) V (Endereço Externo) Q (Símbolo que dá nome a DXD ou DSECT) W (Endereço Externo sem AUTOLINK)

C - Atributo de tamanho. Pode ser no formato Ln ou L.n (L do inglês Length - Comprimento).No primeiro caso, n indica o número de Bytes que o campo deve ter.No segundo caso, n indica o número de Bits que o campo deve ter.Usa-se, em geral, o primeiro formato.Se omitido, o tamanho assumido vai depender do tipo de constante.

D - Conteúdo inicial da área.Deve vir entre apóstrofes para as constantes tipo C, X, B, F, H, E, D, L, P e Z.

Deve vir entre parênteses para os tipos A, Y, S, V, Q e W.

Ex: ARTOT DC 5PL3'0'

OBS:- Pode-se colocar num só comando DC quantas definições forem necessárias. Ex:

ACS DC PL4'0',C'*',X'0C'

3939

Page 40: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

TABELA DE CONSTANTES

TIPO Tamanhoassumido

Alinha-mento

Tamanhos Válidos

Constantes por

operando

Sentido preenchi-

mento

Completa com

Truncaà

Caracteres Válidos

Cada carater ocupa

C suficiente byte 1 a 256 uma E->D brancos D qualquer 1 byteX suficiente byte 1 a 256 várias D->E X’0’ E 0 a F ½ byteB suficiente byte 1 a 256 várias D->E B’0’ E 0 e 1 1 bitF 4 bytes FullWord 1 a 8 várias D->E (1) E + - 0 a 9 (2) (4)H 2 bytes HalfWord 1 a 8 várias D->E (1) E + - 0 a 9 (3) (4)P suficiente Byte 1 a 16 várias D->E X’0’ E + - 0 a 9 ½ byte (5)Z suficiente Byte 1 a 16 várias D->E C’0’ E + - 0 a 9 1 byteD 8 bytes DoubWord 1 a 8 várias -x- -x- -x- + - 0 a 9 -x-A 4 bytes FullWord 1 a 4 várias E->D B’0’ E expressão -x-Y 2 bytes HalfWord 1 a 2 várias E->D B’0’ E expressão -x-S 2 bytes HalfWord 2 várias -x- -x- -x- expressão -x-

OBS:- (1) 0's se o número for positivo; 1's se o numero for negativo (2) O nro.máximo que pode ser especificado é 2**31 - 1 (3) O nro.máximo que pode ser especificado é 2**15 - 1 (4) O ponto decimal não ocupa nada (5) O sinal ocupa 1/2 BYTE

DC tipo C

Cada caracter especificado no conteúdo inicial ocupa um byte, em sua configuração EBCDIC; se não for especificado tamanho, será assumido o necessário para conter o conteúdo inicial. Se for especificado o atributo de tamanho, ele prevalece sobre a quantidade de bytes necessária ao conteúdo inicial. Se o tamanho especificado for maior que o necessário, será feito preenchimento dos bytes restantes à direita com brancos (X'40'). Se o tamanho for insuficiente, será feito truncamento à direita. O tamanho máximo é 256 bytes. Quando o caracter que se deseja colocar como conteúdo inicial for um apóstrofe (') ou um E comercial (&), deve-se coloca-lo duas vezes. Ex:

DC 1CL1'*' 5C DC 2CL1'*' 5C5C DC CL1'*' 5C DC CL2'*' 5C40 DC 2CL2'*' 5C405C40 DC C'ABC' C1C2C3 DC CL1'ABC' C1 DC C'A&&B' C150C2 DC C'ZE''S' E5C57DE2 DC C'''' 7D

4040

Page 41: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

DC tipo X

Pode-se especificar como conteúdo inicial os algarismos hexadecimais (de 0 a F). Cada algarismo ocupa meio byte. O preenchimento é da direita para a esquerda. Se sobrarem bytes (ou meios-bytes) à esquerda, será feito preenchimento com zeros binários (X'0"). Se o tamanho especificado for insuficiente, será feito truncamento à esquerda. O tamanho máximo permitido é 256 bytes. Aceita múltiplas definições por constante. Ex:

DC 1XL1'0B' 0B DC 3X'5C' 5C5C5C DC XL3'5C' 00005C DC XL2'AB0C14' 0C14 DC X'1A2' 01A2 DC X'00A,B,5A8' 000A0B05A8

DC tipo B

Pode-se especificar como conteúdo inicial somente os algarismos binários( 0 e 1). Cada algarismo ocupa um bit. O preenchimento é feito da direita para a esquerda. Se sobrarem bits à esquerda, será feito preenchimento com zeros binários. Se o tamanho especificado for insuficiente, será feito truncamento à esquerda. O tamanho máximo permitido é 256 bytes. Aceita múltiplas definições por constante. Ex:

DC BL1'0' 00 DC BL2'010001001' 0089 DC B'0101' 05 DC BL2'1' 0001 DC 2B'1' 0101 DC B'1,00101,001' 010501

DC tipo F

O número desejado deve ser colocado em decimal. O montador irá converte-lo para binário e colocá-lo na Full-Word. Se o sinal não for colocado, o número será assumido positivo. Se o sinal for colocado, ele deve ser único, e deve vir antes do número. Se for colocado o atributo de tamanho, não será feito o alinhamento. Aceita múltiplas definições por constante. Ex:

DC F'138' 0000008A DC F'+138' 0000008A DC F'-138' FFFFFF76 DC F'4,392' 0000000400000188

DC tipo H

Análoga ao tipo F, com a diferença de que o campo é uma Half-Word.

DC H'138' 008A DC H'+138' 008A DC H'-138' FF76 DC H'4,392' 00040188

4141

Page 42: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

DC tipo P

O sinal é indicado na parte numérica do último Byte à direita do campo. Se o número for positivo, ela terá C. Se o número for negativo, terá D. O conteúdo inicial é colocado em decimal, e cada algarismo irá ocupar 1/2 byte; o preenchimento é feito da direita para a esquerda. Se o tamanho não for especificado, será reservado um campo com tamanho necessário e suficiente para conter o conteúdo inicial (mais, eventualmente, meio byte, para o caso de a quantidade de algarismos especificada ser par). Se o tamanho especificado for maior que o necessário, será feito preenchimento à esquerda com zeros (X'0'). Se for menor, será feito truncamento à esquerda. Aceita múltiplas definições por constante. Ex:

DC P'122' 122C DC P'10' 010C DC P'-345,45,21.6,7' 345D045C216C7C DC P'0' 0C DC P'+66' 066C DC PL3'1' 00001C DC PL2'43556' 556C DC 3P'1' 1C1C1C

DC tipo Z

O sinal é indicado na parte de zona do último Byte à direita do campo. Se o número for positivo, ela terá C. Se o número for negativo, terá D. Se o número for negativo, terá D. O conteúdo inicial é colocado em decimal, e cada algarismo irá ocupar 1 byte; o preenchimento é feito da direita para a esquerda. Se o tamanho não for especificado, será reservado um campo com tamanho necessário e suficiente para conter o conteúdo inicial . Se o tamanho especificado for maior que o necessário, será feito preenchimento à esquerda com zeros zonados (X'F0'). Se for menor, será feito truncamento à esquerda. Aceita múltiplas definições por constante. Ex:

DC Z'122' F1F2C2 DC Z'-345,45' F3F4D5F4C5 DC Z'+66' F6C6 DC ZL3'1' F0F0C1 DC ZL2'43556' F5C6 DC 3Z'1' C1C1C1

DC tipo A

Se o tamanho for especificado, não será efetuado o alinhamento. O primeiro Byte à esquerda terá zeros binários; os três Bytes restantes terão o endereço real correspondente à expressão colocada como conteúdo inicial da constante.

DC A(TABELA) DC A(TABELA-50) DC A(*) DC A(259) 00000103CAMPO DC 3A(*-CAMPO) 00000000.00000004.00000008 DC A(TCABC+28*52) DC A(FIM-COMECO)

4242

Page 43: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

DC tipo Y

Se o tamanho for especificado, não será efetuado o alinhamento. Os dois Bytes da Half-Word terão o endereço real correspondente à expressão colocada como conteúdo inicial da constante. Observar que o endereço máximo representável através da constante tipo Y é X'FFFF'; este tipo de constante já quase não é mais utilizado, visto que sua utilidade era em computadores de memória pequena.

DC Y(TABELA) DC Y(TABELA-50) DC Y(*) DC Y(259) DC Y(TCABC+28*52) DC Y(FIM-COMECO)

DC tipo S

Se o tamanho for especificado, não será efetuado o alinhamento. Os dois Bytes da Half-Word terão o endereço na forma BASE+DESLOCAMENTO correspondente à expressão colocada como conteúdo inicial da constante.

DC S(TABELA) DC S(TABELA-50) DC S(*) DC S(TCABC+28*52)

DC tipo V

Se o tamanho for especificado, não será efetuado o alinhamento. Esta constante é usada para reservar memória para o endereço de um símbolo externo. A Full-Word será reservada com zeros binários, sendo que o endereço será colocado quando da linkedição do programa.

DC V(ROTINA)

DC tipo Q

Esta constante é usada para reservar memória para o deslocamento numa área de memória de uma DSECT externa. O deslocamento é colocado na constante durante a linkedição do programa. O símbolo especificado no conteúdo inicial deve ter sido previamente definido como símbolo de um DXD ou DSECT. Exemplo:

DC Q(DUMMYEXT)

---------------------------------------------------------------------------

4343

Page 44: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

REVISÃO - Agora que já vimos o comando DC, relembremos o conceito de LITERAL. Supondo a instrução ZAP CONTLIN,ANULAvemos que ela faz referência a dois operandos na memória. Supondo, ainda, que as definições dadas a esses campos sejam as seguintes:

CONTLIN DC P'66'ANULA DC P'0'

Através das literais, poderíamos elaborar o mesmo da seguinte forma:

ZAP CONTLIN,=P'0' : :CONTLIN DC P'66'

Outros exemplos:

ZAP VALOR,=P'0' MVC ARIMP,=CL133'b' CLC ARLEIT+5(2),=C'DB' AP TOTLIDOS,=P'1' CLC =C'DB',ARLEIT+5 CP CONTLIN,=P'66' CLC CODCART,=C'*'

É importante notar que uma literal pode ser especificada tanto no primeiro quanto no segundo operandos de uma instrução. No entanto, ela não pode ser o campo receptor numa instrução que altere o conteúdo de um campo.

----------------------------------------------------------------------------DS (Define Storage - Definir Memória)----------------------------------------------------------------------------

A função do comando DS é definir uma área sem conteúdo inicial. O seu formato é análogo ao DC. Se for especificado conteúdo inicial, ele não será considerado.

DS CL3 DS XL4 DS PL4'0' DS 3CL8

O comando DS admite atributo de duplicação zero (0). Ex:

ARLEIT DS 0CL80CODIGO DS CL10DTEM DS CL8NOME DS CL50CIDADE DS CL12

Neste caso, o atributo de duplicação 0 não define a área, mas avisa que as próximas 80 posições definidas formarão uma área de nome ARLEIT, ou seja, ARLEIT terá atributo de tamanho 80.

4444

Page 45: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

3-2) Outras instruções ao montador

----------------------------------------------------------------------------CCW ou CCW0 (Channel Command Word - Palavra de Comando de Canal)

O comando CCW (ou o CCW0) define uma CCW formato 0. O seu formato é:

símbolo CCW ou CCW0 a,b,c,d sendo:

a - Command Code (Código de Comando). Em geral especificado através de um termo auto-definido. É o código que indica qual a operação de I/O que se deseja efetuar.

b - Expressão que indica o endereço da área (de entrada ou saída) que participará do I/O.

c - FLAGS - Indicadores a respeito do I/O. Em geral especificado através de um termo auto-definido.

d - Tamanho: Indica o número de Bytes que serão transmitidos. Em geral especificado através de um termo auto-definido.Ex:

CCW1 CCW X'02',ARLEIT,X'48',80

O primeiro operando dará o conteúdo do Byte 0 da CCW.

O segundo operando dará o conteúdo dos Bytes 1 a 3 da CCW.

O terceiro operando dará o conteúdo do Byte 4 da CCW. O byte 5 será sempre preenchido com zeros.O quarto operando dará o conteúdo dos Bytes 6 e 7 da CCW.

O formato da CCW é o seguinte:

Byte 0 = Código de comando (COMMAND CODE)Bytes 1, 2 e 3 = Endereço do buffer (DATA ADDRESS) ou da primeira IDAWByte 4 = Flags Bit 32: 0 - Não haverá DATA CHAIN 1 - Haverá DATA CHAIN Bit 33: 0 - Não haverá COMMAND CHAIN. 1 - Haverá COMMAND CHAIN Bit 34: 0 - Erro de tamanho deve ser indicado1 - A condição acima não deve ser indicada. Bit 35: 0 - Haverá transferência de dados 1 - Não haverá transferência de dados Bit 36: 0 - Não haverá interrupção intermediária 1 - Haverá interrupção intermediária Bit 37: 0 - Data address normal 1 - Data address tem endereço da primeira IDAW Bit 38: 0 - Execução normal da CCW 1 - Suspende antes da execução desta CCW Bit 39: não usado; deve ser 0. Byte 5 = não usadoBytes 6 e 7 = Tamanho (quantidade de bytes a transferir)

4545

Page 46: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----------------------------------------------------------------------------

CCW1 (Channel Command Word - Palavra de Comando de Canal)

O comando CCW1 define uma CCW formato 1. O formato do comando CCW1 é este:

símbolo CCW1 a,b,c,d sendo:

a - Command Code b - Data Addressc - FLAGSd - Tamanho

Exemplo:

CCW1 CCW1 X'02',ARLEIT,X'48',80

O formato da CCW1 é o seguinte:

Byte 0 = Código de comando (COMMAND CODE)Byte 1 = Flags Bit 8 : 0 - Não haverá DATA CHAIN 1 - Haverá DATA CHAIN Bit 9 : 0 - Não haverá COMMAND CHAIN. 1 - Haverá COMMAND CHAIN Bit 10: 0 - Erro de tamanho deve ser indicado1 - A condição acima não deve ser indicada. Bit 11: 0 - Haverá transferência de dados 1 - Não haverá transferência de dados Bit 12: 0 - Não haverá interrupção intermediária 1 - Haverá interrupção intermediária Bit 13: 0 - Data address normal 1 - Data address tem endereço da primeira IDAW Bit 14: 0 - Execução normal da CCW 1 - Suspende antes da execução desta CCW Bit 15: não usado; deve ser 0Bytes 2 e 3 = Tamanho (quantidade de bytes a transferir)Bytes 4, 5, 6 e 7 = Endereço do buffer (DATA ADDRESS) ou da primeira IDAW (obs: bit 32=0)

4646

Page 47: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----------------------------------------------------------------------------START (Começo)

O comando START tem por função dar o conteúdo inicial do LOCATION COUNTER. Este comando deve ser um dos primeiros do programa-fonte (antes dele não pode haver nenhum comando ou instrução que altere o Location Counter). O seu formato é:

símbolo START a sendo:

Símbolo: O comando START tem por função também definir a primeira Control Section (CSECT) do programa. Se for colocado o símbolo, ele será o nome da CSECT. Se ele não for colocado, a CSECT é considerada sem nome.

a - Termo auto-definido (cujo valor deve ser múltiplo de 8) que indica o conteúdo inicial do Location Counter. Se omitido, será assumido 0.Ex:

PROG1 START X'305' START 10240

OBS: - Se o comando START não for colocado, é assumido START 0.

----------------------------------------------------------------------------CSECT (Control Section - Seção de Controle)

O comando CSECT identifica o início ou a continuação de uma Control Section.

símbolo CSECT

O comando CSECT não admite operandos.Se o símbolo for colocado, ele dará nome à CSECT.Os comandos e instruções que forem colocados após o comando CSECT farão parte dela, até que seja colocado um outro comado CSECT ou DSECT.Diversos comandos CSECT com o mesmo símbolo podem aparecer num programa. O primeiro dará o nome à CSECT e os outros identificarão sua continuação.

A CSECT CSECT A = 1 + 4 . 1 CSECT B = 2 . CSECT C = 3 + 5B CSECT . 2 .C CSECT . 3 .A CSECT . 4 . C CSECT . 5

END

----------------------------------------------------------------------------

4747

Page 48: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

DSECT (Dummy Section - Seção Simulada)

O comando DSECT define uma Control Section que é montada, mas que não fará parte do programa-objeto. Uma DSECT serve, por exemplo, para se descrever o lay-out de uma área, sem que para isso seja preciso definí-la. O seu formato é:

símbolo DSECT

O comando DSECT não admite operandos. O símbolo dará nome à DSECT. Pode haver diversos comandos DSECT com o mesmo símbolo num programa. O primeiro dará nome à DSECT e os seguintes identificarão a sua continuação.

A interrupção de uma DSECT é feita através de outro comando DSECT com símbolo diferente, ou de comando CSECT. Ex:

CSN1 START . .DSN1 DSECTA DS CL2B DS CL20C DSD DS CL10CSN1 CSECT . . END

Para usar como operandos de instruções os símbolos definidos dentro de DSECT's, o programador deve, antes desse uso, providenciar o comando USING que indicará o(s) registrador(es) base das DSECT's.

----------------------------------------------------------------------------DXD (Define External Dummy Section - Definir Dummy Section Externa)

O comando DXD define uma Dummy Section Externa. O seu formato é o seguinte:

símbolo DXD operando

O símbolo deve aparecer no operando de uma constante tipo Q. Ele representa o endereço do primeiro Byte da DSECT externa definida, e tem atributo de tamanho igual a 1.

O operando tem o mesmo formato que o operando do comando DS. O montador Assembler calcula a quantidade de memória e o alinhamento requerido para uma DSECT externa, a partir da área especificada no operando. Exemplo:

CONST DXD 5F . .DESLOC DC Q(CONST)

4848

Page 49: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----------------------------------------------------------------------------CXD

O comando CXD define uma Full-Word. O Linkage Editor (ou o Loader) colocará nessa área o tamanho total de todas as DSECT's externas especificadas nos programas-fonte que usam essas DSECT's. O seu formato é o seguinte:

símbolo CXD

Este comando não tem operandos. Ex:

TAMANHO CXD

----------------------------------------------------------------------------COM (Blank Common Control Section - Seção de Controle Branca Comum)

Este comando identifica e reserva uma área de memória comum que pode ser referida por módulos independentes que tenham sido linkeditados e carregados para execução como um só programa.Somente uma COM é permitida por programa, embora vários comandos COM possam ser dados, o primeiro definindo o início da COM, e os seguintes definindo a sua continuação. O seu formato é:

COM

Não se deve colocar nem símbolo nem operandos. Ex:

CSPRG START 0 . . COMA DS CL3B DS CL4 . . END----------------------------------------------------------------------------LOCTR (Multiple Location Counters - Múltiplos Contadores de localização)

Este comando ao montador permite o uso de diversos location counters dentro de uma Control Section. Seu formato é:

simbolo LOCTR

O primeiro Location Counter de uma Control Section é definido quando de um comando START, CSECT, DSECT ou COM. Dentro de uma dessas seções, o comando LOCTR define outro location counter; é como se houvesse um location counter para cada símbolo especificado através do START, CSECT, DSECT, COM e de cada LOCTR. Um LOCTR cujo símbolo já tenha sido especificado em outro comando START, DSECT, CSECT, COM ou LOCTR continua a geração do objeto usando o endereço do location counter respectivo; no final, o objeto da seção será um único, com os "pedaços" arranjados. Exemplo:

4949

Page 50: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

PROGRAMA OBJETO GERADO

PGM1A PGM1 CSECT PGM1A (loc. counter PGM1) PGM1A . PGM1C (loc. counter PGM1) PGM1A . PGM1E (loc. counter PGM1) PGM1A . PGM1G (loc. counter PGM1)PGM1B X LOCTR PGM1B (loc. counter X)PGM1B AREA1 DS CL80 PGM1F (loc. counter X)PGM1B AREA2 DS CL4 PGM1D (loc. counter Y) PGM1C PGM1 LOCTR PGM1C . PGM1C . PGM1C . PGM1D Y LOCTR PGM1D TAB1 DS CL10000 PGM1D TAB2 DS CL20000 PGM1E PGM1 LOCTR PGM1E . PGM1E . PGM1E . PGM1F X LOCTR PGM1F AREA11 DC C'*' PGM1F AREA12 DC F'0' PGM1G PGM1 LOCTR PGM1G LTORG END

Se dentro de uma seção for usado um LOCTR cujo símbolo é o de um outro que esteja em outra seção, esta outra seção é continuada com o location counter em questão.

----------------------------------------------------------------------------AMODE (Adressing Mode - Modo de endereçamento)

Este comando é utilizado para especificar ao montador Assembler o modo de endereçamento a ser associado a uma Control Section. O seu formato é:

símbolo AMODE n

n podendo ser 24 ou 31 ou ANY.

O símbolo é opcional. Se ele estiver ausente, o modo de endereçamento será associado à Control Section sem nome que deve existir no programa.Se o símbolo estiver presente, o modo de endereçamento será associado à Control Section que tiver nome igual ao especificado no símbolo.O operando indica qual modo de endereçamento deve ser associado à Control Section; pode ser 24 (endereçamento de 24 bits), 31 (endereçamento de 31 bits) ou ANY (a Control Section não é sensível ao modo de endereçamento).Não pode haver dois ou mais AMODE para uma mesma Control Section.O comando AMODE pode estar em qualquer lugar do programa.AMODE 24 é incompatível com RMODE ANY.Os defaults para AMODE e RMODE quando só um deles (ou nenhum) é especificado são os seguintes:

5050

Page 51: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Especificado Assumido

nenhum AMODE 24 e RMODE 24AMODE 24 RMODE 24AMODE 31 RMODE 24AMODE ANY RMODE 24RMODE 24 AMODE 24RMODE ANY AMODE 31

----------------------------------------------------------------------------RMODE (Residence Mode - Modo de residência)

Este comando é utilizado para especificar ao montador Assembler o modo de residência a ser associado a uma Control Section. O seu formato é:

símbolo RMODE n

n podendo ser 24 ou ANY.

O símbolo é opcional. Se ele estiver ausente, o modo de residência será associado à Control Section sem nome que deve existir no programa.Se o símbolo estiver presente, o modo de residência será associado à Control Section que tiver nome igual ao especificado no símbolo.O operando indica qual modo de residência deve ser associado à Control Section; pode ser 24 (residência de 24 bits, isto é, a CSECT deve ficar abaixo dos 16 MB) ou ANY (residência de 24 ou de 31 bits, isto é, a CSECT pode ficar tanto abaixo quanto acima dos 16 MB).Não pode haver dois ou mais AMODE para uma mesma Control Section.O comando AMODE pode estar em qualquer lugar do programa.AMODE 24 é incompatível com RMODE ANY.Os defaults para AMODE e RMODE quando só um deles (ou nenhum) é especificado são os seguintes:

Especificado Assumido

nenhum AMODE 24 e RMODE 24AMODE 24 RMODE 24AMODE 31 RMODE 24AMODE ANY RMODE 24RMODE 24 AMODE 24RMODE ANY AMODE 31

5151

Page 52: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----------------------------------------------------------------------------ENTRY (Entrada)

Este comando identifica símbolos definidos no programa que contém o ENTRY, e que serão usados por outros programas. O seu formato é:

ENTRY símbolo(,símbolo...)

No programa que usa o símbolo, ele deve ser definido através de um comando EXTRN.

----------------------------------------------------------------------------EXTRN (External - Externo)

Este comando permite identificar símbolos referidos num programa, mas definidos em outro programa. Seu formato é o seguinte:

EXTRN símbolo(,símbolo...)

No programa que define o símbolo, deve haver um comando ENTRY para ele.

PROG1 START 0 . . ROTINA EQU * . . ENTRY ROTINA END

PROG2 START 0 . . CONST DC A(ROTINA) . . EXTRN ROTINA END

----------------------------------------------------------------------------WXTRN

Este comando é análogo ao EXTRN, com as seguintes diferenças:- com o comando EXTRN, o Linkage Editor faz uma pesquisa automática nas bibliotecas para achar o módulo que contém os símbolos especificados como operandos no comando EXTRN.- com o comando WXTRN não é feita essa pesquisa automática. O Linkage Editor somente resolverá as referências feitas através do comando WXTRN se os símbolos especificados nele estão definidos: -- num módulo que é linkeditado e carregado junto com o programa que tem o comando WXTRN ou -- num módulo trazido de uma biblioteca devido à presença de um comando EXTRN em outro módulo linkeditado e carregado junto com o programa que tem o comando WXTRN.

Seu formato é o seguinte:

WXTRN símbolo(,símbolo ....... )Ex:

WXTRN MOD

5252

Page 53: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----------------------------------------------------------------------------USING (Usando)

O comando USING informa ao montador:

A) Qual é (ou quais são) o(s) registrador(es) base do programa (através do segundo operando em diante)

B) Qual o conteúdo do(s) registrador(es) base (através do primeiro operando).

O seu formato é o seguinte:

USING x,R1(,R2,R3 .......R16)

Sendo x uma expressão que indica ao montador o conteúdo do primeiro registrador base especificado (R1). Para o segundo registrador base, se especificado, será assumido conteúdo igual a V+4096. Para o terceiro, será assumido V+8192, e assim por diante.Ex:

USING *,3,8

Neste exemplo, os registradores base serão o 3 (que deverá ter o endereço contido no Location Counter) e o 8 (que deverá ter o endereço contido no Location Counter + 4096).

Observar que o comando USING apenas avisa o montador qual deverá ser o conteúdo do registrador base quando o programa for executado. Cabe ao programador providenciar a carga do registrador base (em geral via instrução BALR).

Observar também que, no caso de DSECT's, o comando USING deve especificar como primeiro operando o nome que foi dado à DSECT.

----------------------------------------------------------------------------DROP (Por de lado, Deixar)

Este comando tem por função indicar ao montador que um (ou mais) registrador que anteriormente havia sido especificado como base (através de um comando USING), não deve mais ser base. O seu formato é o seguinte:

DROP (R1(,R2,R3 ..........R16))

Sendo que R1 .........R16 é a relação dos registradores que não devem mais ser base. Ex:

DROP 3,8

Se não for especificado nenhum operando, todos os registradores base serão desassinalados.

5353

Page 54: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----------------------------------------------------------------------------TITLE (Título)

O comando TITLE especifica qual o cabeçalho que deve ser colocado pelo montador Assembler na listagem do programa-fonte que ele fornece. O seu formato é o seguinte:

(símbolo) TITLE a

Símbolo --- em VSE pode ter de 1 a 4 caracteres. Do primeiro comando TITLE que tiver o programa, o montador Assembler pegará o símbolo e o colocará em todos os statements do programa-objeto, nas posições 73 a 76, identificando-o, portanto.

a -- conjunto de 1 ate 100 caracteres colocados entre apóstrofes. Quando o caracter que se desejar colocar no cabeçalho for um apóstrofe (') ou um E comercial (&), então deve-se colocá-lo duas vezes.Ex:

P001 TITLE 'EMISSAO NOTAS FISCAIS'

A cada comando TITLE que for colocado, o montador Assembler providenciará um salto para outra folha na listagem que ele faz dos statements-fonte, imprimindo, a partir dessa hora, o novo cabeçalho especificado.

----------------------------------------------------------------------------EJECT (Ejetar)

O comando EJECT causa um salto para a folha seguinte, na hora em que ele for detectado, na listagem dos statements-fonte que o montador Assembler fornece. O seu formato é o seguinte:

EJECT

Este comando não deve ter símbolo nem operandos.

----------------------------------------------------------------------------SPACE (Espaço)

O comando SPACE, quando detectado pelo montador Assembler, faz com que o montador, na listagem que ele fornece, deixe tantas linhas em branco quantas forem especificadas no operando do SPACE.

O seu formato é:

SPACE n

Sendo que n é um número decimal que indica quantas linhas devem ser deixadas em branco. Ex:

SPACE 3

5454

Page 55: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----------------------------------------------------------------------------PRINT (Impressão)

O comando PRINT é utilizado para controlar a listagem fornecida pelo montador. O seu formato é o seguinte:

PRINT opções

Sendo que as opções são palavras colocadas uma após a outra, separadas por vírgulas, que indicam ao montador o que deve ou não ser listado. As palavras válidas são as seguintes:

ON - A listagem é fornecidaOFF - A listagem não é fornecidaGEN - As instruções geradas por macro-instruções devem ser listadas.NOGEN - As instruções geradas por macro-instruções não devem ser listadas.DATA - As áreas definidas terão todo o seu conteúdo listado.NODATA - As áreas definidas terão somente os 8 primeiros Bytes seus listados.Ex:

PRINT OFF,DATA

Enquanto não for colocado um comando PRINT no programa, será assumido

PRINT ON,GEN,NODATA

Pode haver tantos comandos PRINT no programa quantos se desejar.

----------------------------------------------------------------------------ICTL (Input Control - Controle de Entrada)

Pelo que foi visto quando do estudo da folha de codificação Assembler, pudemos deduzir o seguinte:

--- O símbolo deve começar na posição 1--- Numa instrução, podemos ir até a posição 71--- A continuação, quando existir, deve começar na posição 16

O comando ICTL, se usado, deve ser o primeiro statement do programa-fonte (só pode haver um ICTL num programa), e a sua função é modificar a estrutura explicada acima. O seu formato pode ser um dos 3 seguintes:

ICTL A ou ICTL A,B ou ICTL A,B,C

Sendo:

5555

Page 56: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

A - indica a posição onde começar um símbolo. Pode ser de 1 até 40.B - indica a última posição até onde pode ir uma instrução. Pode ir de 41 a 80. Se omitido, assume-se 71. Deve ser maior ou igual a A+5.C - indica qual a posição de continuação. Pode ser de 2 a 40. Se ele for omitido ou se for colocado 80 no segundo operando, o Assembler assume que não é permitida continuação.

Ex:

ICTL 4,70,71

----------------------------------------------------------------------------ISEQ (Input Sequence - Sequência de Entrada)

A função deste comando é indicar ao montador Assembler que se deseja que ele teste a sequência (crescente) dos statements-fonte. O seu formato é o seguinte:

ISEQ (a,b)

Sendo:

a - número da primeira posição que forma o campo dos statements, campo esse a partir do qual deve ser testada a sequência.b - número da última posição do campo.

OBS:- A <= B

Pode-se colocar quantos ISEQ forem necessários num programa. Se os seus dois operandos forem omitidos, não será testada a sequência.

----------------------------------------------------------------------------PUNCH (Perfure)

O comando PUNCH tem por função ordenar ao montador Assembler a gravação imediata de um statement no programa-objeto. O seu formato é: PUNCH a

Sendo a um conjunto de 1 a 80 caracteres colocados entre apóstrofes. Se o caracter desejado for um apóstrofe (') ou um E comercial (&), ele deve ser colocado duas vezes. Ex:

PUNCH ' CATALR MOD'

Neste caso, o statement teria: pos 1 a 2 : brancos pos 3 a 8 : CATALR pos 9 a 10 : brancos pos 11 a 13 : MOD pos 14 a 80 : brancos

5656

Page 57: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----------------------------------------------------------------------------REPRO (Reproduza)

O comando REPRO indica ao montador Assembler que ele deve gravar no programa-objeto um statement igual ao seguinte ao REPRO.

Este comando não deve ter nem símbolo e nem operando.Ex:

REPRO CATALR MOD

----------------------------------------------------------------------------ORG

O comando ORG tem por função alterar o conteúdo do Location Counter, colocando nele o valor da expressão especificada como operando do ORG. O seu formato é o seguinte:

símbolo ORG expressão

Se não for colocado o seu operando, será colocado no Location Counter o maior conteúdo que ele já teve. Ex:

. . . . . . . . . . . . 0AB84C 0AB94C TABNUM DC 256X'FF' 0AB94C 0AB93C ORG TABNUM+240 0AB93C 0AB946 DC 10X'00' 0AB946 0AB94C ORG . . . Location Counter após o comando Location Counter antes do comando

OBS:- os símbolos usados como operandos do ORG devem ter sido definidos antes do ORG.

----------------------------------------------------------------------------EQU (Equate - Igualar)

A função do comando EQU é associar um símbolo a um endereço, que é fornecido através do operando do EQU. O seu formato é um dos seguintes:

Símbolo EQU a Símbolo EQU a,b Símbolo EQU a,b,c Símbolo EQU a,,c

5757

Page 58: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Sendo:

a - expressão cujo valor seja o endereço a ser associado ao símbolo.b - termo auto-definido que indica o atributo de tamanho desejado para o símbolo.c - termo auto-definido que indica o atributo de tipo que se deseja para o símbolo que se está definindo. Se omitido é assumido U.

Se B for omitido, o Assembler vai assumir um atributo de tamanho de acordo com o atributo de tamanho do primeiro termo (ou único) da esquerda da expressão A:

--- Se ele for uma referência ao Location Counter (*), um termo auto-definido ou uma referência a um atributo de tamanho (L'x), então o atributo de tamanho assumido será 1 (um).

--- Se ele for um símbolo usado como símbolo de um comando DC ou DS, o atributo de tamanho assumido será igual ao atributo de tamanho do símbolo

--- Se ele for um símbolo usado como símbolo de uma instrução de máquina, o atributo de tamanho assumido será igual ao tamanho da instrução (2,4 ou 6 Bytes)

--- Se ele for um símbolo usado como símbolo de um comando ao montador (exceto DC, DS e CCW) o atributo de tamanho assumido será 1.

Ex:

R5 EQU 5INST EQU *OFF EQU X'00'ON EQU X'FF'PAGOU EQU X'80'----------------------------------------------------------------------------OPSYN (Operation Code Synonim - Sinônimo para código de operação)

O comando OPSYN faz uma equivalência entre um símbolo e um código de operação de uma instrução de máquina ou comando ao montador. O seu formato é:

Símbolo OPSYN (código)

Sendo:

Símbolo - qualquer símbolo válido em Assembler ou um código de operação (se o operando não for especificado).

Código - qualquer código de operação válido. Se não for especificado, o comando anula o código de operação colocado como símbolo.

O comando OPSYN deve ser colocado depois do ICTL (se houver ICTL) e pode ser precedido somente por EJECT, ISEQ, PRINT, SPACE e TITLE. Exemplo:

MOVER OPSYN MVCMVC OPSYN----------------------------------------------------------------------------

5858

Page 59: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

PUSH (Empurrar)

O comando PUSH salva o estado atual de PRINT e USING. Pode-se colocá-lo num dos 4 formatos:

PUSH PRINT PUSH USING PUSH PRINT,USING PUSH USING,PRINT

----------------------------------------------------------------------------POP

O comando POP restaura o estado de PRINT e USING salvos pelo comando PUSH. Pode-se colocá-lo num dos 4 formatos:

POP PRINT POP USING POP PRINT,USING POP USING,PRINT

----------------------------------------------------------------------------LTORG

O comando LTORG faz a definição das literais usadas no programa. Antes da definição, ele alinha o Location Counter para o endereço mais próximo múltiplo de 8. Este comando não tem símbolo nem operandos. Ex:

LTORG

----------------------------------------------------------------------------CNOP (Conditional Nop - Nop Condicional)

O comando CNOP alinha o Location Counter para uma Half-Word. Os bytes "desprezados" são preenchidos comX'0700' (instrução NOPR). O seu formato é:

CNOP a,bSendo:a - Pode ser 0, 2, 4 ou 6. Indica em qual Byte da Full-Word ou da Double-Word deve ser posicionado o Location Counter.b - Pode ser 4 ou 8. Indica se o campo deve ser uma Full-Word ou Double-Word.

0,8 2,4 0,4 2,40,4 2,8 4,8 6,8.....half-word... .....half-word... .....half-word... .....half-word..................full-word........... ...............full-word..........................................double-word.............................

Ex:

CNOP 2,4 ----------------------------------------------------------------------------

5959

Page 60: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

COPY (Copiar)

O comando COPY copia comandos Assembler de uma biblioteca. O seu formato é o seguinte:

COPY símbolo

Sendo símbolo o nome com que o conjunto de comandos se encontra catalogado na biblioteca.

Dentro dos comandos não pode haver nem ICTL nem ISEQ. Ex:

COPY EQUREG

----------------------------------------------------------------------------END (Fim)

O comando END deve ser o último statement de um programa fonte. O seu formato é:

END Símbolo

Sendo símbolo o símbolo dado à primeira instrução do programa a ser executado. Ex:

END INICIO

----------------------------------------------------------------------------

EXERCÍCIOS PROPOSTOS

Indicar o conteúdo dos campos definidos através dos comandos ao montador colocados a seguir.No caso de não ser possível (erro de montagem), indicar esta condição.

EP195: DC C'123'

EP196: DC C'+123'

EP197: DC C'-123'

EP198: DC C'12.3'

EP199: DC C'1AB8'

EP200: DC C'01101'

EP201: DC C'A+B=C'

EP202: DC CL4'A'

EP203: DC CL4'ABCDEF'

6060

Page 61: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EP204: DC 3CL2'A'

EP205: DC 2CL3'A,B'

EP206: DC 2C'EU&&VOCE'

EP207: DC C'''S MUSIC'

EP208: DC C'@@OI'

EP209: DC CL3'*'

EP210: DC 3C'*'

EP211: DC X'123'

EP212: DC X'-123'

EP213: DC X'1AB2C3'

EP214: DC X'1AB2F4G3'

EP215: DC XL3'12D'

EP216: DC XL3'AABBCCDDEE'

EP217: DC X'1,22,333,4444'

EP218: DC XL2'1,22,333,4444'

EP219: DC 2X'1,22,333'

EP220: DC 2XL2'1,22,333'

EP221: DC B'01010101'

EP222: DC B'1'

EP223: DC BL2'1111'

EP224: DC B'1,1111111111'

EP225: DC BL2'1,1111111111'

EP226: DC 2B'1000'

EP227: DC 2BL2'1000'

EP228: DC F'10'

EP229: DC F'+10'

6161

Page 62: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EP230: DC F'-10'

EP230: DC F'-15,+16'

EP231: DC 2F'22'

EP232: DC 2F'33,44'

EP233: DC FL3'258'

EP234: DC 2FL1'255'

EP235: DC F'128000'

EP236: DC H'10'

EP237: DC H'+10'

EP238: DC H'-10'

EP239: DC H'-15,+16'

EP240: DC 2H'22'

EP241: DC 2H'33,44'

EP242: DC HL3'258'

EP243: DC 2HL1'255'

EP244: DC H'128000'

EP245: DC P'123'

EP246: DC P'+123'

EP247: DC P'-123'

EP248: DC PL4'456'

EP249: DC PL1'789'

EP250: DC P'1,-22,333,-4444'

EP251: DC PL2'1,-22,333,-4444'

EP252: DC 3P'0'

EP253: DC PL3'0'

EP254: DC 2P'1,22,333'

6262

Page 63: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EP255: DC 2PL2'1,22,333'

EP256: DC Z'123'

EP257: DC Z'+123'

EP258: DC Z'-123'

EP259: DC ZL4'456'

EP260: DC ZL1'789'

EP261: DC Z'1,-22,333,-4444'

EP262: DC ZL3'1,-22,333,-4444'

EP263: DC 3Z'0'

EP264: DC ZL3'0'

EP265: DC 2Z'1,22,333'

EP266: DC 2ZL3'1,22,333'

OBS: para as constantes tipo A, Y e S a seguir, considerar que, a partir da primeira, elas façam parte de um programa, cujo endereço inicial é zero; as áreas definidas por DS devem ser consideradas para efeito do cálculo do endereço. Considerar que o primeiro statement do programa seja um USING *,9.

EP267: SIMBOLO1 DC A(0)

EP268: SIMBAA DC A(127)

EP269: SIMBBB DC A(X'8000')

EP270: SIMBCC DC A(B'1111')

EP271: SIMBDD DC A(C'*')

EP272: SIMBEE DC A(*)

EP273: SIMBFF DS CL17

EP274: SIMBGG DC A(*)

EP275: SIMBHH DC A(SIMBGG)

EP276: SIMBII DC A(SIMBAA+12)

EP277: SIMBJJ DC A(SIMBII-SIMBBB)

EP278: SIMBKK DC AL1(*-SIMBKK)

EP279: SIMBLL DC 5AL1(*-SIMBLL)

6363

Page 64: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EP280: SIMBMM DC AL2(3,5,7)

EP281: SIMBNN DC A(SIMBII+5*2)

EP282: SIMBOO DC A(SIMBNN+X'80000000')

EP283: SIMBPP DC 4AL2(*-SIMBPP)

EP284: SIMBQQ DC A(SIMBVV)

EP285: SIMBRR DC A(SIMBKK,SIMBJJ)

EP286: SIMBSS DC A(SIMBTT+40)

EP287: SIMBTT DC A(SIMBUU,*,80)

EP288: SIMBUU DC 2A(*-SIMBUU)

EP289: SIMBVV DC A(C'AMO')

EP290: SIMBWW DC A(X'7FFFFFFF')

EP291: YY1 DC Y(SIMBWW)

EP292: YY2 DC Y(10)

EP293: YY3 DC Y(L'YY2)

EP294: SS1 DC S(SIBAA)

EP295: SS2 DC S(SS1)

EP296: SS3 DC S(10)

EP297: SS4 DC S(*)

EP298: SS5 DC A(125),F'33',C'*',2H'6,18'

EP299: SS6 DC X'1,1',B'1,1',C'1,1'

EP300: LASTDC DC 256AL1(255+LASTDC-*)

6464

Page 65: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4) INSTRUÇÕES DE MÁQUINA

Didaticamente, dividiremos as instruções de máquina por função (somente as que serão objeto de nosso estudo - , não veremos as privilegiadas e as de ponto flutuante). Os grupos, segundo as funções executadas, são os seguintes:

a) Movimento de Dados de Memória para Memória

Movimentação simples : MVC, MVN, MVZ, MVI, MVO, MVCIN, ZAP, MVCL Movimentação com mudança de formato dos dados : PACK, UNPK

b) Operações aritméticas com campos de memória em compactado : AP, SP, MP, DP, SRP

c) Comparação Memória com memória : CP, CLC, CLI, CLCL Registrador com memória : C, CH, CL, CLM Registrador com registrador : CR, CLR d) Desvio Mnemônicos normais : BC, BCR Mnemônicos B, BR, NOP, NOPR, BE, BER, BL, BLR, BH, BHR, BO, BORestendidos : BZ, BZR, BM, BMR, BP, BPR, BNE, BNER, BNL, BNLR, BNH, BNHR BNO, BNOR, BNZ, BNZR, BNM, BNMR, BNP, BNPR

e) Controle de Loop : BCT, BCTR, BXH, BXLE

f) Edição : ED, EDMK

g) Tradução e teste de bytes : TR, TRT

h) Shift (deslocamento) em registradores : SLL, SRL, SLDL, SRDL SLA, SRA, SLDA, SRDA

i) Booleanas : N, O, X, NR, OR, XR, NI, OI, XI, NC, OC, XC

j) Carga e Desvio : BALR, BAL, BASR, BAS, BASSM, BSM

k) Movimento de Dados de Registrador para Memória Movimentação simples : ST, STH, STM, STC, STCM Movimentação com mudança de formato dos dados : CVD

l) Movimento de dados de Memória para Registrador : L, LH, LM, IC, ICM Movimentação com mudança de formato dos dados : CVB

m) Movimento de Dados de Registrador p/ Registrador : LR, LPR, LNR, LCR, LTR

n) Operações aritméticas com registradores (dados em binário) : AR, SH, MR, DR, ALR, SLR

o) Operações Aritméticas com Registradores e Memória (dados em binário): A, S, M, D, AH, SH, MH, AL, SL

p) Outras : LA, TM, EX, SVC, MC, SPM, STCK, TS, CD, CDS, IPM

6565

Page 66: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Algumas observações que são importantes:

1 - As instruções SS-L, que tem, portanto, um único tamanho, são: MVN, MVC, MVZ, NC, CLC, OC, XC, TR, TRT, ED, EDMK, MVCIN

2 - As instruções SS-L1/L2, que tem, portanto, dois tamanhos, são: MVO, PACK, UNPK, ZAP, CP, AP, SP, MP, DP

3 - A instrução SRP é excessão no grupo das SS, à medida que faz referência a um tamanho (em metade do seu segundo byte), e a um arredondamento (na outra metade desse segundo byte).

4 - As instruções, em geral, quando algum operando é afetado, alteram o primeiro operando. As exceções são: CVD, STC, ST, STH, STCM, STM

5 - As instruções de ponto flutuante tem códigos de operação desde X'20' até X'3F' e desde X'60' até X'7F'.

6666

Page 67: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-1) INSTRUÇÕES DE MOVIMENTO DE MEMÓRIA PARA MEMÓRIA

MVC (Move Character - Movimentar Caracteres)Código de máquina D2 (Instrução SS - L)Condition code não é alteradoInterrupções Possíveis 0004,0005

A instrução MVC move um campo de memória para outro campo de memória, byte a byte, da esquerda para a direita. Ex:

MVC CPOA,CPOB

antes depois

CPOB C1 . C2 . C3 C1 . C2 . C3CPOA C4 . C5 . C6 C1 . C2 . C3

O campo emissor é o segundo operando, e permanece inalterado após a execução da instrução. O campo receptor é o primeiro operando.Ambos devem ter o mesmo tamanho.

MVC ARGRAV+5(2),ARLEIT+2 MVC ARGRAV,ARLEIT MVC ARIMP,=CL133'b' MVC ARIMP(1),=C'b' MVC ARIMP+1(132),ARIMP MVC 0(2,5),8(13) MVC ARCOMP,7(15) MVC 138(7,5),VALOR

MVZ (Move Zones - Movimentar Zonas)Código de máquina D3 (Instrução SS - L)Condition code Não é alteradoInterrupções Possíveis 0004,0005

A instrução MVZ é análoga à MVC, com a diferença de que ela move somente a parte de zona dos bytes. Ex:

MVZ CPOA,CPOB

antes depois CPOB 12 . 34 . 56 12 . 34 . 56CPOA 78 . 9A . BC 18 . 3A . 5C

MVZ ARIMP+58(1),=X'F0' MVZ ARAUX+1(19),ARAUX MVZ INST+1(1),0(7) MVZ 5(2,7),AUX MVZ 29(3,8),1(9)

6767

Page 68: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

MVN (Move Numerics - Movimentar Numéricos)Código de máquina D1 (Instrução SS - L)Condition code Não é alteradoInterrupções Possíveis 0004,0005

A instrução MVN é análoga à MVC, com a diferença de que ela move somente a parte numérica dos bytes. Ex:

MVN CPOA,CPOB

antes depoisCPOB 12 . 34 . 56 12 . 34 . 56CPOA 78 . 9A . BC 72 . 94 . B6

MVN TOTAL+5(1),=X'0C' MVN ARAUX+1(19),ARAUX MVN INST+1(10),0(7) MVN 5(2,7),AUX MVN 29(3,8),1(9)

MVI (Move Immediate - Movimentar Imediato)Código de máquina 92 (Instrução SI)Condition code não é alteradoInterrupções Possíveis 0004,0005

A instrução MVI movimenta um byte de memória (o 2. byte da instrução - o operando imediato) para outro byte de memória. O 2º operando é o campo emissor (operando imediato) e o 1º operando é o campo receptor.

O operando imediato pode ser especificado somente através de um termo auto-definido. Ex:

MVI CPOA,C'*' ou MVI CPOA,X'5C' ou MVI CPOA,B'01011100' ou MVI CPOA,92 antes depoisoperando Imediato 5C 5CCPOA 12 5C

MVI ARIMP+72,C'/' MVI 0(4),X'80'

6868

Page 69: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

MVO (Move with Offset – Movimetar com deslocamento)Código de máquina F1 (Instrução SS – L1 e L2)Condition code Não é alteradoInterrupções Possíveis 0004,0005

A instrução MVO move o campo especificado no 2ºoperando para o campo especificado no 1º operando da direita para a esquerda, da seguinte forma:

A parte numérica do último byte à direita do 1º operando permanece inalterada. A parte numérica do último byte à direita do 2º operando é colocada na parte de zona do último byte à direita do 1º operando; e assim por diante. Se o 1º operando (campo receptor) não for suficientemente grande para receber todo o 2º operando (campo emissor) os meios-bytes à esquerda serão truncados.

Se o 1º operando for maior que o suficiente para conter o 2º operando, a instrução preencherá com 0's à esquerda. Ex:

MVO CPOA,CPOB

Antes Depois

1º Caso CPOB 12 . 34 . 56 12 . 34 . 56 CPOA 78 . 9A 45 . 6A

2º Caso CPOB AB . 72 AB . 72 CPOA 4A . 5C . B9 . FC 00 . 0A . B7 . 2C

Outros exemplos:

MVO ARCALC(5),ARCALC(4) MVO 0(4,7),ARCALC MVO AREA,2(5,8) MVO 2(7,13),19(5,15)

ZAP (Zero and Add Packed – Zerar e Somar em Compactado) Código de máquina F8 (Instrução SS – L1 e L2)Condition code 00 Se o campo movido = 0

01 Se o campo movido < 010 Se o campo movido > 011 Overflow

Interrupções Possíveis 0001,0004,0005,0007,000A

A instrução ZAP movimenta o campo especificado no 2º operando (campo emissor) para o campo especificado no 1º operando (campo receptor). O emissor permanece inalterado, e deve estar obrigatoriamente em compactado.

A movimentação é feita da direita para a esquerda.

6969

Page 70: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Se o emissor for maior (em tamanho) que o receptor, os algarismos em excesso à esquerda serão truncados.

Se o emissor for menor (em tamanho) que o receptor, o ZAP preencherá à esquerda com zeros. Ex:

ZAP CPOA,CPOB

Antes Depois

1º Caso CPOB 12 . 34 . 5C 12 . 34 . 5C CPOA B4 . F8 34 . 5C

2º Caso CPOB 12 . 3C 12 . 3C CPOA 07 . B8 . 92 00 . 12 . 3C

Outros exemplos:

ZAP TOTAL,=P'0' ZAP TOTAL,TOTAL ZAP CONTLIN,=P'2'

MVCL (Move Long – Mover [campo] Longo) Código de máquina 0E (Instrução RR)Condition code 00 Tamanhos do 1. e 2º operandos são iguais

01 Tamanho do 1º operando é menor10 Tamanho do 1º operando é maior11 Movimento não efetuado

Interrupções Possíveis 0004,0005,0006

Tanto o 1º como o 2º operandos especificados devem ser registradores pares, os quais indicam (cada um deles) conjuntos de registradores par-ímpar, os quais chamaremos de R1 e R1+1 e R2 e R2+1.

Esta instrução movimenta um campo de memória para outro campo de memória, byte a byte, da esquerda para a direita.

O endereço do campo receptor deve estar nos 3 últimos bytes à direita de R1.

O endereço do campo emissor deve estar nos 3 últimos bytes à direita de R2.

O tamanho (número de bytes) do campo receptor deve estar nos 3 últimos bytes à direita de R1+1.

O tamanho (número de bytes) do campo emissor deve estar nos 3 últimos bytes à direita de R2+1.

O 1. byte à esquerda de R2+1 deve conter o caracter de preenchimento.

O conteúdo do 1. byte à esquerda de R1, R2 e R1+1 é desprezado.

A movimentação de um campo para outro termina quando for completado o tamanho do campo receptor.

7070

Page 71: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Se o campo emissor for menor que o campo receptor, os bytes à direita que sobrarem do campo receptor serão preenchidos com o caracter de preenchimento.

Como parte da execução da instrução, os tamanhos dos dois campos são comparados, e o resultado é indicado pelo condition code.

Além disso, é feito um teste para verificar se haverá ou não sobreposição destrutiva dos campos.

Dá-se o nome de sobreposição destrutiva ao fato de o campo receptor ser usado como emissor depois que algum dado seja movido sobre ele.(Lembrar que o movimento é feito byte a byte).

Caso vá haver uma sobreposição destrutiva, o movimento não é efetuado.

O último byte à direita do campo emissor é calculado usando-se os tamanhos dos campos receptor e emissor (aquele que for menor).

Se o campo emissor ultrapassar ou não do byte 16.777.215 para o byte 0, o movimento é efetuado nos seguintes casos: quando não ultrapassar, o movimento é executado quando o byte mais à

esquerda do campo receptor coincide ou está à esquerda do byte mais à esquerda do campo emissor, ou se o byte mais à esquerda do campo receptor está à direita do byte (que participa da operação) mais à direita do campo emissor.

quando ultrapassar, o movimento é executado quando o byte mais à esquerda do campo receptor coincide ou está à esquerda do byte mais à esquerda do campo emissor, e se o byte mais à esquerda do campo receptor está à direita do byte (que participa da operação) mais à direita do campo emissor.

Após efetuado o movimento, temos que: Os 3 últimos bytes à direita de R1+1 (tamanho do campo receptor) ficam com

zero. Aos 3 últimos bytes à direita de R1 (endereço do campo receptor) é somado

o tamanho originalmente especificado em R1+1. Dos 3 últimos bytes à direita de R2+1 (tamanho do campo emissor) é

subtraido o número de bytes movidos do campo emissor para o receptor. Aos 3 últimos bytes à direita de R2 (endereço do campo emissor) é somado o

número de bytes movidos do campo emissor para o receptor. byte mais à esquerda, tanto de R1 quanto de R2, fica com 0, mesmo quando o

movimento não é efetuado. byte mais à esquerda, tanto de R1+1 quanto de R2+1, não é alterado.

Ex: MVCL 2,8

7171

Page 72: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

PACK (Compactar) Código de máquina F2 (Instrução SS – L1 e L2)Condition code não é alteradoInterrupções Possíveis 0004,0005

A instrução PACK movimenta um campo de memória para outro campo de memória, transformando-o de zonado para compactado. A movimentação é feita da direita para a esquerda, da seguinte forma (o 2º operando é o campo emissor e o 1º operando é o campo receptor):

O byte mais à direita do campo emissor é invertido e colocado no byte mais à direita do campo receptor (Inverter = a sua parte de zona vira parte numérica, e a sua parte numérica vira parte de zona). Em seguida, cada parte numérica de cada byte do campo emissor é colocada num meio byte do campo receptor, desprezando-se as partes de zona do campo emissor.

Se o receptor for maior que o necessário, ele será preenchido com zeros à esquerda.

Se ele for menor que o necessário, os algarismos em excesso serão truncados.

O 2º operando permanece inalterado.Ex: PACK CPOA,CPOB

antes depois

1ºcaso CPOB F1 . F2 . F3 . F4 F1 . F2 . F3 . F4 CPOA 00 . B7 . 2A 01 . 23 . 4F

2ºcaso CPOB F1 . F2 . F3 . F4 F1 . F2 . F3 . F4 CPOA C9 . 4A 23 . 4F

3ºcaso CPOB 9A . 48 . F9 . DB 9A . 48 . F9 . DB CPOA 19 . B7 . DF 0A . 89 . BD

Observar, pelo 3º Caso, que o campo emissor não é testado quando ao fato de ele estar em zonado e, consequentemente, o campo receptor pode não ficar em compactado. Outros exemplos:

PACK VALOR,ARLEIT+5(9) PACK QUANTO+2(7),2(8,5) PACK 0(10,2),AREA PACK 2(5,7),2(3,8) PACK DOUBLE,DOUBLE PACK BYTE,BYTE

7272

Page 73: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

UNPK (Unpack – descompactar) Código de máquina F3 (Instrução SS – L1 e L2)Condition code não é alterado Interrupções Possíveis 0004,0005

A instrução UNPK movimenta um campo de memória para outro campo de memória, transformando-o de compactado para zonado.

Não é feito nenhum teste quanto à validade dos campos.

O 1º operando é o campo receptor e o 2º operando é o campo emissor.

A movimentação é feita da direita para a esquerda, da seguinte forma:

O byte mais à direita do campo emissor é invertido e colocado no byte mais à direita do campo receptor (inverter = a sua parte de zona vira parte numérica, e a sua parte numérica vira parte de zona). Em seguida, cada meio byte do campo emissor é colocado na parte numérica de um byte do campo receptor, sendo que na parte de zona do byte do campo receptor é colocado X'F'.

O 2º operando permanece inalterado.

Se o campo receptor for menor que o necessário, os algarismos em excesso serão truncados.

Se o campo receptor for maior que o necessário, os bytes em excesso serão preenchidos com X'F0'. Ex:

UNPK CPOA,CPOB

antes depois1. caso CPOB 12 . 34 . 5C 12 . 34 . 5C CPOA 92 . B8 . 4C . D0 F2 . F3 . F4 . C52. caso CPOB 12 . 3C 12. 3C CPOA 92 . B8 . 4C . D0 F0 . F1 . F2 . C3

Outros exemplos:

UNPK ARGRAV+5(12),TOTLIQ UNPK AX2,2(3,7) UNPK 17(10,8),T4B2F+3(5) UNPK 2(13,10),0(5,3)

7373

Page 74: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

MVCI (Move Inverse – Mover invertido)Código de máquina E8 (Instrução SS – L)Condition code Não é alterado Interrupções Possíveis 0001,0004,0005

Esta instrução move o conteúdo do 2º operando (campo emissor) para o 1º operando (campo receptor), invertendo a sequência.

Observar que o endereço especificado do 1º operando é o do seu byte mais à esquerda, enquanto o endereço do segundo operando é o do seu byte mais à direita.

O movimento é feito byte a byte; para o emissor, é da direita para a esquerda, e para o receptor é da esquerda para a direita.Se houver sobreposição de mais de um byte entre emissor e receptor, os resultados são imprevisíveis. Exemplo:

MVCIN A(3),B+2

antes depois

B C1 . C2 . C3 C1 . C2 . C3 A C4 . C5 . C6 C3 . C2 . C1

7474

Page 75: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-2) INSTRUÇÕES ARITMÉTICAS COM CAMPOS COMPACTADOS

AP (Add Packed – Somar em compactado) Código de máquina FA (Instrução SS – L1 e L2)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0001,0004,0005,0007,000A

A instrução AP efetua a soma entre dois campos de memória que estejam no formato compactado.

O resultado da soma é colocado no campo especificado no 1º operando.

O campo especificado no 2º operando fica inalterado. Ex:

AP CPOA,CPOB

antes depois

CPOB 12 . 3C 12 . 3CCPOA 12 . 34 . 5C 12 . 46 . 8C

Outros exemplos:

AP CONTLIN,=P'1' AP ARL+2(5),ARL+7(2) AP TOTAL,2(3,7) AP 4(3,8),PRT AP 7(12,8),14(2,3) AP ANTER,ATUAL

SP (Subtract Packed – Subtrair em compactado) Código de máquina FB (Instrução SS – L1 e L2)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0001,0004,0005,0007,000A

A instrução SP efetua a subtração entre dois campos de memória que estejam no formato compactado.

O campo especificado no 1º operando tem o minuendo;O campo especificado no 2º operando tem o subtraendo.

Após efetuada a subtração, o resto é colocado no campo especificado no 1º operando.

O campo especificado no 2º operando permanece inalterado.

Ex.: SP CPOA,CPOB

7575

Page 76: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

antes depois

CPOB 98 . 7C 98 . 7CCPOA 12 . 34 . 5C 11 . 35 . 8C

Outros exemplos:

SP VALOR,VALOR SP TOTAL,=P'1' SP AE+5(8),AE+15(3) SP 0(2,7),4(1,8)

MP (Multiply Packed – Multiplicar em compactado) Código de máquina FC (Instrução SS – L1 e L2)Condition code Não é alterado Interrupções Possíveis 0001,0004,0005,0006,0007

A instrução MP efetua a multiplicação entre dois campos de memória que estejam no formato compactado.

O resultado da multiplicação é colocado no campo especificado no 1º operando.

O 2º operando pode ter tamanho máximo de 8 bytes.

O tamanho do 2º operando deve obrigatoriamente ser menor que o tamanho do 1º operando.

Se o tamanho do 2º operando for maior que 8 ou for menor ou igual ao tamanho do 1º operando, haverá interrupções de programa (código 0006).

O 1º operando deve ter tantos algarismos em zero (à esquerda) quantos forem os algarismos do 2º operando; se isto não acontecer, haverá interrupção de programa (código 0007). Ex:

MP CPOA,CPOB antes depois

CPOB 99 . 9C 99 . 9C CPOA 00 . 09 . 99 . 9C 99 . 89 . 00 . 1C

Outros exemplos:

MP PERCENT,=P'20' MP 2(13,4),7(3,5)

7676

Page 77: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

DP (Divide Packed – Dividir em compactado) Código de máquina FD (Instrução SS – L1 e L2)Condition code Não é alterado Interrupções Possíveis 0004,0005,0006,0007,000B

A interrupção DP efetua a divisão entre dois campos de memória que estejam no formato decimal compactado.

O 1º operando deve conter o dividendo, e o 2º operando deve conter o divisor. Após efetuada a divisão, o cociente e o resto são colocados no campo especificado no 1º operando. O campo especificado no 2º operando permanece inalterado.

O tamanho do 2º operando (divisor) não pode ser maior que 8 bytes, nem maior ou igual ao tamanho do 1º operando; se uma dessas duas condições ocorrer, haverá interrupção de programa (código 0006).

O resto da divisão é colocado à direita do campo 1º operando, com tamanho do divisor. No restante do 1º operando, à esquerda, é colocado o cociente da divisão. O 2º operando permanece inalterado.

A interrupção de programa por código 000B é causada quando: tamanho do cociente é maior que o tamanho a ele reservado no 1º operando. dividendo não tem pelo menos um 0 (zero) à esquerda. divisor é o número 0.Ex:

DP CPOA,CPOB antes depois

CPOB 00 . 2C 00 . 2CCPOA 00 . 00 . 45 . 67 . 8C 22 . 83 . 9C . 00 . 0C

Outros exemplos:

DP VALOR,=P'5' DP 2(4,7),0(1,1) DP PERCT,0(2,7) DP 4(12,5),1(3,7)

7777

Page 78: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

SRP (Shift and Round Packed – Deslocar e arredondar compactado) Código de máquina F0 (Instrução SS)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0001,0004,0005,0007,000A

O seu formato de máquina é o seguinte:

CO = 1 byte (código de operação)L1 = 1/2 byte (tamanho do primeiro operando - 1)I3 = 1/2 byte (operando imediato (terceiro operando)E1 = 2 bytes (B1D1D1D1 endereço base+deslocamento do primeiro operando)E2 = 2 bytes (B2D2D2D2 endereço base+deslocamento do segundo operando)

O campo especificado no 1º operando sofre um deslocamento de dígitos (algarismos) na direção e quantidade de dígitos especificada pelo endereço do 2º operando, e, quando o deslocamento é para a direita, é feito um arredondamento, o qual é especificado no 3. operando.

O endereço do 2º operando não é usado para especificação de dados; os 6 últimos bits à direita do número que representa o endereço do 2º operando são analisados da seguinte maneira: 1º bit à esquerda indica o sentido do deslocamento: se estiver desligado,

o deslocamento é à esquerda; se estiver ligado, o deslocamento e à direita.

Os outros 5 bits formam um número que indica quantos dígitos devem ser deslocados (se o deslocamento for à direita, este número está negativo).

O campo especificado no 1º operando deve estar em compactado.

O arredondamento é feito somando-se o número especificado no 3. operando ao último dígito deslocado, e, se for 1, esse 1 é somado ao número resultante do deslocamento. Vejamos os seguintes exemplos:

SRP TOTAL,61,5

TOTAL antes 12 . 34 . 56 . 78 . 9C depois 00 . 01 . 23 . 45 . 7C

SRP TOTAL,3,0 TOTAL antes 12 . 34 . 56 . 78 . 9C depois 45 . 67 . 89 . 00 . 0C

Estas regras facilitam a especificação do sentido e da quantidade de algarismos do deslocamento:DESLOCAMENTO PARA A ESQUERDA = ESPECIFICAR DIRETO O NUMERO DE ALGARISMOS SRP TOTAL,3,5 desloca 3 casas para a esquerda

DESLOCAMENTO PARA A DIREITA = ESPECIFICAR (64 - QTDD DE ALGARISMOS) SRP TOTAL,64-3,5 desloca 3 casas para a direita

7878

Page 79: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-3) INSTRUÇÕES DE COMPARAÇÃO

CP (Compare Packed – Comparar em compactado) Código de máquina F9 (Instrução SS – L1 e L2)Condition code 00 1ºoperando = 2ºoperando

01 1ºoperando < 2ºoperando10 1ºoperando > 2ºoperando 11 O condition code nunca fica em 11 após um CP

Interrupções Possíveis 0005,0007

A instrução CP efetua a comparação algébrica entre dois campos de memória que estejam no formato decimal compactado. Os dois campos permanecem inalterados. Ex:

CP CPOA,CPOB CP CONTLIN,=P'1' CP 0(5,9),=P'0' CP TOTAL,2(5,9)

CLC (Compare Logical Character – Comparar Caracteres Logicamente) Código de máquina D5 (Instrução SS – L)Condition code 00 1ºoperando = 2ºoperando

01 1ºoperando < 2ºoperando10 1ºoperando > 2ºoperando 11 O condition code nunca fica em 11 após um CLC

Interrupções Possíveis 0005

A interrupção CLC faz a comparação lógica (bit a bit, da esquerda para a direita) entre dois campos de memória. Ex:

CLC CPOA,CPOB CLC AE+78(2),=C'*1' CLC 4(2,7),2(9) CLC ID,2(7) CLC 194(5,11),AE+3

CLI (Compare Logical Immediate - Comparar Logicamente com Operando Imediato) Código de máquina 95 (Instrução SI)Condition code 00 1ºoperando = 2ºoperando

01 1ºoperando < 2ºoperando10 1ºoperando > 2ºoperando 11 O condition code nunca fica em 11 após um CLI

Interrupções Possíveis 0005

A instrução CLI faz a comparação lógica entre dois campos de memória (1 byte cada). O seu 2º operando deve ser um termo auto definido. Ex:

CLI AE+79,C'*' CLI 2(5),X'00' CLI BYTE,B'11110000' CLI NOP+1,240

7979

Page 80: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

CLCL (Compare Logocal Character Long – Comparar Logicamente campos longos)Código de máquina 0F (Instrução RR)Condition code 00 1ºoperando = 2ºoperando ou ambos os operandos

tem tamanho 0.01 1ºoperando < 2ºoperando10 1ºoperando > 2ºoperando11 Nunca o condition code fica em 11 após um CLCL

Interrupções Possíveis 0005,0006

Tanto o 1. como o 2º operandos especificados devem ser registradores pares, os quais indicam (cada um deles) conjuntos de registradores par-ímpar, os quais chamaremos de R1 e R1+1 e R2 e R2+1.

Esta instrução compara dois campos de memória, do mesmo modo que um CLC.

O endereço do campo 1º operando deve estar nos 3 últimos bytes à direita de R1.

O endereço do campo 2º operando deve estar nos 3 últimos bytes à direita de R2.

O tamanho (número de bytes) do 1º operando deve estar nos 3 últimos bytes à direita de R1+1.

O tamanho (número de bytes) do 2º operando deve estar nos 3 últimos bytes à direita de R2+1.

O 1º byte à esquerda de R2+1 deve conter o caracter de preenchimento.

O conteúdo do 1º byte à esquerda de R1, R2 e R1+1 é desprezado.

A comparação é feita bit a bit, da esquerda para a direita. Ela termina quando é encontrada uma desigualdade entre bits, ou quando o tamanho do maior operando for alcançado.

Se os operandos não tiverem o mesmo tamanho, o menor é estendido com o caracter de preenchimento (para a comparação - a expansão é feita internamente, sem alteração de campos).

Se a execução da instrução termina por causa de uma desigualdade, temos que: Do conteúdo dos 3 últimos bytes à direita de R1+1 e R2+1 é subtraído o

número de bytes iguais, a menos que a desigualdade tenha ocorrido com o caracter de preenchimento, sendo que, neste caso, os 3 últimos bytes à direita de R1+1 ou R2+1 (o que indicar o menor tamanho) são zerados.

Ao conteúdo dos 3 últimos bytes à direita de R1 e R2 é somado o número de bytes iguais.

Se os 2 operandos forem iguais (incluindo o caracter de preenchimento, se necessário), temos que: Os 3 últimos bytes à direita de R1+1 e R2+1 são zerados. Aos 3 últimos bytes à direita de R1 e R2 é somado o número de bytes

iguais.

Em ambos os casos, o 1º byte à esquerda de R1 e R2 é zerado, e o 1º byte à esquerda de R1+1 e R2+1 não são alterados. Ex:

CLCL 2,8

8080

Page 81: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

C (Compare) Código de máquina 59 (Instrução RX)Condition code 00 1ºoperando = 2ºoperando

01 1ºoperando < 2ºoperando10 1ºoperando > 2ºoperando 11 O condition code nunca fica em 11 após um C

Interrupções Possíveis 0005

A instrução C efetua a comparação algébrica entre um número binário contido num registrador (especificado no 1º operando) e um número binário contido num campo de memória de 4 bytes (especificado no 2º operando - em geral uma Full-Word). Ex:

C 9,CPO C 8,=F'0' C 13,=A(TABELA+430) C 1,2(4) C 1,2(,4) C 1,2(7,4)

CH (Compare Halfword) Código de máquina 49 (Instrução RX)Condition code 00 1ºoperando = 2ºoperando

01 1ºoperando < 2ºoperando10 1ºoperando > 2ºoperando 11 O condition code nunca fica em 11 após um CH

Interrupções Possíveis 0005

A instrução CH efetua a comparação algébrica entre um número binário contido num registrador (especificado no 1º operando) e um número binário contido num campo de memória de 2 bytes (especificado no 2º operando - em geral uma Half-Word). Para efetuar a comparação o campo de 2 bytes é colocado (internamente, na UCP) em 4 bytes; a expansão do campo de 2 para 4 bytes é feita colocando-se os seus 2 bytes nos 2 bytes à direita do campo de 4 bytes, e, nos seus 2 bytes à direita todos os bits ficam em 0 ou 1, dependendo de como estiver o bit mais à esquerda do campo de 2 bytes. Ex:

CH 9,CPO CH 8,=H'0' CH 13,=Y(TABELA+430) CH 1,2(4) CH 1,2(,4) CH 1,2(7,4)

8181

Page 82: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

CL (Compare Logical – Compare Logicamente) Código de máquina 55 (Instrução RX)Condition code 00 1ºoperando = 2ºoperando

01 1ºoperando < 2ºoperando10 1ºoperando > 2ºoperando 11 O condition code nunca fica em 11 após um CL

Interrupções Possíveis 0005

A instrução CL efetua uma comparação lógica entre o conteúdo de um registrador (especificado no 1º operando) e o conteúdo de um campo de 4 bytes (Especificado no 2º operando - em geral uma Full-Word). Ex:

CL 9,CPO CL 8,=F'0' CL 1,2(4) CL 1,2(,4) CL 1,2(7,4)

CLM (Compare Logical Characters Under Mask - Comparar campos lógicamente, sob máscara) Código de máquina BD (Instrução RS)Condition code 00 Os bytes selecionados são iguais, ou a máscara

é zero.01 Campo selecionado do 1ºoperando é menor10 Campo selecionado do 1ºoperando é maior11 Nunca o condition code fica em 11 após um CLM

Interrupções Possíveis 0005

O conteúdo do registrador 1º operando é comparado logicamente com o conteúdo do campo de memória 2º operando, sob o controle de uma máscara, e o resultado é indicado no condition code. O seu formato de máquina é o seguinte:

CO = 1 byte (código de operação)R1 = 1/2 byte (registrador primeiro operando)M3 = 1/2 byte (máscara)E2 = 2 bytes (endereço base+deslocamento do segundo operando)

Os 4 bits da máscara, da esquerda para a direita, correspondem aos 4 bytes do registrador especificado no 1ºoperando. Os bytes do registrador que tiverem os seus bits correspondentes na máscara ligados, são considerados como um "campo" contíguo, e comparados com o campo especificado no último operando da instrução (2º operando), o qual deve ter tantos bytes de tamanho quantos forem os bits da máscara ligados. Os bytes do registrador cujos bits correspondentes na máscara estiverem desligados, não participam da operação. Ex: CLM 5,B'1011',ARCOMP

Neste caso o "campo" formado pelos 1º, 3º e 4º bytes do registrador 5, será comparado o campo de 3 bytes denominado ARCOMP.

8282

Page 83: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

CR (Compare Register – Comparar Registradores) Código de máquina 19 (Instrução RR)Condition code 00 1ºoperando = 2ºoperando

01 1ºoperando < 2ºoperando10 1ºoperando > 2ºoperando11 O condition code nunca fica em 11 após um CR

Interrupções Possíveis nenhuma

A instrução CR faz uma comparação algébrica entre um número binário contido num registrador (especificado no 1º operando) e outro número binário contido em outro registrador (especificado no 2º operando). Ex:

CR 4,5

CLR (Compare Logical Register – Comparar Registradores Logicamente) Código de máquina 15 (Instrução RR)Condition code 00 1ºoperando = 2ºoperando

01 1ºoperando < 2ºoperando10 1ºoperando > 2ºoperando11 O condition code nunca fica em 11 após um CLR

Interrupções Possíveis Nenhuma

A instrução CLR faz uma comparação lógica entre o conteúdo de um registrador (especificado no 1º operando) e o conteúdo de outro registrador (especificado no 2º operando). Ex:

CLR 4,5

8383

Page 84: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-4) INSTRUÇÕES DE DESVIO

4-4-1) Introdução

As instruções de desvio são duas: BC (instrução RX) e BCR (instrução RR).

No entanto, elas possuem uma série de códigos mnemônicos auxiliares, denominados estendidos, para facilitar o seu uso.

O funcionamento das instruções de desvio é baseado no estado do Condition Code e de uma máscara de 4 bits existente na instrução, na metade à esquerda de seu segundo byte.

Os 4 estados em que o Condition Code pode se encontrar são: 00, 01, 10 e 11.

A cada um desses estados atribui-se um código que o representa:

ESTADO CÓDIGO00 801 410 211 1

A MÁSCARA indica em que condição deve ser efetuado o desvio, e, como ocupa meio byte, pode ir de X'0' a X'F' (em decimal, de 0 a 15).

Se a máscara estiver com 8, o desvio será efetuado se o condition code estiver em B'00' ; se ela estiver em 4, o desvio ocorrerá se o condition code estiver em B'01'; máscara 2 causa desvio se o condition code estiver em B'10"; e, finalmente, máscara 1 acarreta desvio se o condition code estiver posicionado em B'11'.

Pode-se fazer combinação dessas condições, somando-se os valores referentes aos códigos do condition code. Por exemplo, a máscara estando em X'C', significa que o desvio deve ser efetuado caso o condition code esteja em 8 ou 4 (8 + 4 = C).

Se a máscara for zero, não será efetuado desvio (NOP/NOPR = no operation).

Se a máscara for 15 (X'F') será efetuado o desvio independentemente do estado do condition code, pois 15 é a soma dos 4 códigos (8+4+2+1); é o desvio incondicional.

As instruções de desvio que especificarem máscara de 1 a 14 são as de desvio condicional (desviam condicionalmente, dependendo do posicionamento do condition code).

Vejamos, a seguir, a tabela de mnemônicos normais (BC ou BCR) e suas máscaras possíveis, e seus respectivos mnemônicos estendidos.

8484

Page 85: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

--------------------------------------------------------------------------- USO MNEMÔNICO SIGNIFICADO BC/BCR EQUIVALENTE --------------------------------------------------------------------------- Geral B ou BR Desvia sempre BC 15 ou BCR 15 NOP ou NOPR Nao Desvia BC 0 ou BCR 0--------------------------------------------------------------------------- Apos BH ou BHR Desvia se A > B BC 2 ou BCR 2 Comparações BL ou BLR Desvia se A < B BC 4 ou BCR 4 BE ou BER Desvia se A = B BC 8 ou BCR 8 BNH ou BNHR Desvia se A < ou = B BC 13 ou BCR 13 BNL ou BNLR Desvia se A > ou = B BC 11 ou BCR 11 BNE ou BNLR Desvia se A não = B BC 7 ou BCR 7--------------------------------------------------------------------------- Apos BO ou BOR Desvia se overflow BC 1 ou BCR 1 Instruções BP ou BPR Desvia se R > 0 BC 2 ou BCR 2 Aritmeticas BM ou BMR Desvia se R < 0 BC 4 ou BCR 4 BZ ou BZR Desvia se R = 0 BC 8 ou BCR 8 BNP ou BNPR Desvia se R < ou = 0 BC 13 ou BCR 13 BNM ou BNMR Desvia se R > ou = 0 BC 11 ou BCR 11 BNZ ou BNZR Desvia se R não = 0 BC 7 ou BCR 7---------------------------------------------------------------------------Apos um TM BO ou BOR Desvia se todos 1 BC 1 ou BCR 1 BM ou BMR Desvia se misturados BC 4 ou BCR 4 BZ ou BZR Desvia se todos 0 BC 8 ou BCR 8 BNO ou BNOR Desvia se nem todos 1 BC 14 ou BCR 14---------------------------------------------------------------------------

OBS: - A = 1º operando ; B = 2º operando ; R = 1º operando após a conta

O significado das instruções é o seguinte:

B = Branch (Desvie)NOP = No Operation (Sem operação - não desvie)BH = Branch High (Desvie se Maior)BL = Branch Low (Desvie se Menor)BE = Branch Equal (Desvie se Igual)BNH = Branch Not High (Desvie se Nao Maior)BNL = Branch Not Low (Desvie se Nao Menor)BNE = Branch Not Equal (Desvie se Nao Igual)BO = Branch If Overflow (Desvie se Overflow)BP = Branch If Plus (Desvie se Mais)BM = Branch If Minus (Desvie se Menos)BZ = Branch If Zero (Desvie se Zero)BNP = Branch If Not Plus (Desvie se Nao Mais)BNM = Branch If Not Minus (Desvie se Nao Menos)BNZ = Branch If Not Zero (Desvie se Nao Zero)BO = Branch If Ones (Desvie se Um's)BM = Branch If Mixed (Desvie se Misturados)BZ = Branch If Zeros (Desvie se Zeros)BNO = Branch If Not Ones (Desvie se Nao UM's)

8585

Page 86: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

BC (Branch on Condition – Desviar na Condição) Código de máquina 47 (Instrução RX)Condition code Não é alterado Interrupções Possíveis Nenhuma

Esta instrução efetua (ou não) um desvio para outra instrução. Seu formato é:CO = 1 byte (código de operação)M1 = 1/2 byte (MÁSCARA)X2 = 1/2 byte (indexador do endereço do segundo operando)E2 = 2 bytes (base+deslocamento do endereço do segundo operando)

O endereço do 2º operando é o endereço da instrução para onde deve ser efetuado o desvio. A MÁSCARA indica em que condição deve haver o desvio.

Se a condição especificada na máscara não for satisfeita, o desvio não será efetuado, isto é, o processamento continuará na instrução seguinte ao BC.Usando o BC, o 1º operando é a máscara, e o 2ºoperando é uma indicação da instrução para onde deve ser efetuado o desvio. Se o mnemônico estendido for usado, deve-se especificar um único operando equivalente ao 2º operando do BC (a máscara estará implícita no código de operação mnemônico). Ex: BC 8,VOLTA BE VOLTANeste caso, será efetuado o desvio para VOLTA se o condition code tiver 00. Outros exemplos: B LER BH AGAIN BL COMPARA BE 0(2) BE 0(,4) BE 0(2,4)

BCR (Branch on Condition Register – Desviar [para endereço de registrador] na Condição) Código de máquina 07 (Instrução RX)Condition code Não é alterado Interrupções Possíveis Nenhuma

A instrução BCR é análoga ao BC e tem o seguinte formato de máquina:CO = 1 byte (código de operação = 07)M1 = 1/2 byte (MÁSCARA)R2 = registrador segundo operando

Ela ocasiona um desvio (ou não) para a instrução cujo endereço esteja no registrador operando.Usando BCR, o primeiro operando é a máscara, e o segundo é o número do registrador que contém o endereço da instrução para onde será efetuado o desvio. Se usarmos o mnemônico estendido, o único operando especificado é o número do registrador que é o segundo operando da instrução (mas único na especificação). Exemplos: BCR 2,10 BR 7 BNER 10 BLR 15

8686

Page 87: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-5) INSTRUÇÕES DE CONTROLE DE LOOP

BCT (Branch on Count – Desvie na condição [de contagem] testada) Código de máquina 46 (Instrução RX)Condition code Não é alterado Interrupções Possíveis Nenhuma

A instrução BCT tem dois operandos: o 1. é um registrador, e o 2. é o endereço de uma instrução.A sua função é a seguinte:O BCT subtrai 1 do registrador especificado no 1º operando e, em seguida, compara o número resultante com zeros: Se o resultado não for zero, será efetuado um desvio para a instrução

especificada no 2º operando. Se o resultado for zero, não será efetuado o desvio, continuando o

processamento através da instrução seguinte ao BCT.

Exemplos: BCT 5,VOLTA BCT 2,0(4,7) BCT 2,0(4) BCT 2,0(,7)

BCTR (Branch on Count Register – Desvie na condição [de contagem] testada para [endereço contido em] registrador) Código de máquina 06 (Instrução RX)Condition code Não é alterado Interrupções Possíveis Nenhuma

A instrução BCTR tem dois operandos registradores. A sua função é a seguinte:O BCTR subtrai 1 do registrador especificado no 1º operando e, em seguida, compara o número resultante com zeros; Se o resultado não for zero, será efetuado um desvio para a instrução cujo

endereço estiver no registrador 2º operando. Se o resultado for zero, não será efetuado o desvio, continuando o

processamento através da instrução seguinte ao BCTR.

IMPORTANTE: Se o registrador 2º operando for o registrador 0 (zero) o desvio não será efetuado.

Exemplos: BCTR 2,7 BCTR 4,0

8787

Page 88: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

BXH (Branch on Index High – Desvie se o Índice for Maior) Código de máquina 86 (Instrução RX)Condition code Não é alterado Interrupções Possíveis Nenhuma

O 1º e o 2º operandos especificados são registradores.O 3º operando é o endereço de uma instrução.O funcionamento desta instrução é o seguinte:

O conteúdo do registrador especificado no 2º operando é somado ao conteúdo do registrador especificado no 1º operando, ficando o resultado da soma no registrador especificado no 1º operando.

Em seguida, o resultado da soma é comparado com: O conteúdo do registrador especificado no 2º operando, se ele for ímpar ou

O conteúdo do registrador seguinte ao especificado no 2º operando, se este for par.

Se o resultado da comparação for: Maior, será efetuado um desvio para a instrução cujo endereço estiver especificado no 3. operando.

Menor ou igual, não será efetuado o desvio, continuando o processamento através da instrução seguinte ao BXH.

Exemplos:

BXH 7,8,COMPARA BXH 7,9,COMPARA BXH 7,9,8(4)

BXLE (Branch on Index Low or Equal – Desvie se o Índice for Menor ou Igual) Código de máquina 87 (Instrução RS)Condition code Não é alterado Interrupções Possíveis Nenhuma

A instrução BXLE é análoga ao BXH, com a diferença de que o desvio será efetuado se o resultado da comparação der menor ou igual; e se o resultado der maior não será efetuado o desvio.

Exemplos:

BXLE 7,8,COMPARA BXLE 7,9,COMPARA BXLE 7,9,8(4)

8888

Page 89: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-6) INSTRUÇÕES DE EDIÇÃO

ED (Edit – Editar) Código de máquina DE (Instrução SS – L)Condition code 00 Último Campo = 0

01 Último Campo < 010 Último Campo > 011 O condition code nunca fica em 11 após o ED

Interrupções Possíveis 0004,0005,0007

O seu formato é o seguinte:

(símbolo) ED camporeceptor,campoemissor

O campo emissor (segundo operando) é transformado de compactado para zonado, e colocado no campo receptor (primeiro operando), substituindo, assim, o modelo da edição (que estava no primeiro operando).

A edição inclui controle de sinal e pontuação, e a supressão e proteção de zeros não significativos.Pode-se editar diversos campos numa só operação.

O tamanho especificado refere-se apenas ao 1º operando.

O 2º operando deve estar no formato compactado. Se algum byte do 2º operando tiver em sua parte de zona configuração A, B, C, D , E ou F, então haverá interrupção de programa (0007).

A edição é feita da esquerda para a direita.

Durante a edição, cada caracter do campo receptor (modelo), pode ter um dos três destinos: Não é modificado É substituído por um algarismo do campo emissor, transformado para zonado. É substituído pelo primeiro caracter à esquerda do campo receptor (denominado CARACTER DE PREENCHIMENTO).

Qual das 3 ações acima é executada, é determinado pelo conteúdo do modelo e se o algarismo a ser editado é zero ou não.

Examinemos como é formado o modelo de edição: O seu 1º Byte à esquerda é o caracter de preenchimento; se for X'20' ou X'21', a ação correspondente é tomada após ele ter sido assinalado como caracter de preenchimento.

Cada um dos bytes seguintes pode ter um dos seguintes conteúdos: SELETOR DE DÍGITOS (X'20') INÍCIO DE SIGNIFICÂNCIA (X'21') SEPARADOR DE CAMPOS (X'22') Qualquer outro

Quando, na edição, é detectado um X'20' ou X'21' no 1º operando, a instrução verifica duas coisas:

O INDICADOR DE SIGNIFICANCIA (é um indicador da UCP que pode estar ligado --ON-- ou desligado --OFF--), que, chamaremos abreviadamente de S-TRIGGER.

O algarismo correspondente no 2º operando. Como resultado dessa verificação, temos que o caracter do modelo (X'20' ou X'21') será

8989

Page 90: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

substituído pelo algarismo do 2º operando transformado para zonado, ou pelo caracter de preenchimento.

Quanto ao S-TRIGGER, temos que: Ele é colocado OFF no início da edição, após ser encontrado um X'22', ou após ser encontrado na parte numérica de um byte do 2º operando uma configuração A, C, E ou F (número positivo).

Ele é colocado ON após ser encontrado um X'21' ou quando é encontrado um X'20' cujo algarismo correspondente no 2º operando não seja 0; ainda nestes dois casos, o S-TRIGGER só é colocado ON se o byte do 2º operando não tiver nem A, nem C, nem E, e nem F, na sua parte numérica.

O separador de campos (X'22') identifica campos numa edição de vários campos. Ele é sempre substituído pelo caracter de preenchimento. Exemplos:

MVC ARIMP+5(10),MODELO ED ARIMP+5(10),TOTAL . .MODELO DC X'4020204B202126B2020'

Antes: TOTAL 00.12.34.5C ARIMP+5(10) 40.20.20.4B.20.21.20.6B.20.20.20

Depois: TOTAL 00.12.34.5C ARIMP+5(10) 40.40.40.40.F1.F2.F3.6B.F4.F5 b b b b 1 2 3 , 4 5

Outros Exemplos do ED: ED 0(5,7),CPO ED ARIMP+17(8),ISDRT ED 4(12,9),2(10)

EDMK (Edit and Mark – Editar e Marcar) Código de máquina DF (Instrução SS – L)Condition code 00 Último Campo = 0

01 Último Campo < 010 Último Campo > 011 O condition code nunca fica em 11 após o EDMK

Interrupções Possíveis 0004,0005,0007

A instrução EDMK é análoga a instrução ED, com a diferença de que ela coloca no registrador 1 (nos bits 8 a 31; os bits 0 a 7 permanecem inalterados) o endereço do byte do 1º operando que recebeu o primeiro algarismo significativo.OBS:- O endereço não é colocado quando a significância foi forçada (via X'21').Ex: EDMK ARIMP+5(10),TOTAL

9090

Page 91: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-7) INSTRUÇÕES DE TRADUÇÃO E TESTE DE BYTES

TR (Translate – Traduzir) Código de máquina DC (Instrução SS – L)Condition code Não é alterado Interrupções Possíveis 0004,0005

A instrução TR movimenta o conteúdo do 2º operando para o 1º operando, de acordo com o conteúdo do 1º operando. Para tanto, ela processa da esquerda para a direita, byte a byte, da seguinte forma: ela soma o conteúdo de um byte do 1º operando ao endereço do 2º operando; o byte cujo endereço foi encontrado, será movido para o byte do 1º

operando.

Ex: TR ACSD,TABELA

Antes ACSD 02.00.08.FF.05 TABELA I C1.48.B9.D7.A1.C3.D9.5C.4B ........1A .......... 256 bytes ................

Depois ACSD B9.C1.4B.1A.C3 TABELA não é alterado

Outros exemplos:

TR 0(5,7),0(10) TR ARIMP+7(10),TABASTER TR 2(5,124),CAMP

TRT (Translate and Test – Traduzir e Testar) Código de máquina DD (Instrução SS – L)Condition code 00 Todos os bytes testados estavam em X'00'

01 O teste parou num byte que não era o último a ser testado.10 O teste foi ate o último byte a ser testado, o qual não estava em X'00'11 O condition code nunca fica em 11 após um TRT

Interrupções Possíveis 0005

A instrução TRT testa bytes do campo especificado no 2º operando, verificando se eles estão ou não em X'00'. O primeiro que for testado e que não esteja em X'00' faz com que a execução da instrução seja encerrada.

O 1º operando indica quais os bytes do 2º operando a testar: o TRT soma o conteúdo de um byte do 1º operando ao endereço do 2º operando; o byte cujo endereço foi encontrado é que será testado.Quando é encontrado um byte que não esteja em X'00', a instrução coloca no registrador 1 (nos seus bits 8 a 31; os bits 0 a 7 não são alterados) o endereço do byte do 1º operando cujo conteúdo levou ao byte do 2º operando que não estava em X'00"; além disso, ela coloca no último byte à direita do

9191

Page 92: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

registrador 2 (os seus bits 0 a 23 não são alterados) o conteúdo do byte do 2º operando que não estava em X'00'. A instrução TRT é, em geral, usada num dos casos abaixo:

a) Testar se um campo (1º operando) está no formato decimal zonado - campo numérico:

TRT CART+9(6),TABNUM BZ NUMÉRICO . . . TABNUM DC 240X'FF',10X'00',6X'FF'

b) Testar se um campo (1º operando) é alfabético (só tem letras e brancos)

TRT CART+9(6),TABALFAB BZ FABETICO . . TABALFAB DC CL256X'FF' ORG TABALFAB+C' ' DC X'00' ORG TABALFAB+C'A' DC 9X'00' ORG TABALFAB+C'J' DC 9X'00' ORG TABALFAB+C'S' DC 8X'00' ORG

c) Achar o 1º byte de um campo que tenha determinado caracter (* no exemplo).

TRT 0(80,7),TABASTER BZ NOTASTER aqui o registrador 1 tem o endereço do byte desejado . . . TABASTER DC 256X'00' ORG TABASTER+C'*' DC X'FF' ORG

9292

Page 93: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-8) SHIFT EM REGISTRADORES

As instruções de deslocamento em registradores deslocam bits de registradores para a esquerda ou para a direita.Podemos ter os seguintes tipos de deslocamentos:a) Simples - só um registrador participa do Shiftb) Duplos - dois registradores seguidos (conjunto par-ímpar; deve-se especificar o registrador par) participarão do Shiftc) Lógicos - todos os bits são deslocados para a esquerda ou para a direita.d) Algébricos - o bit do sinal (o mais à esquerda do registrador) não é deslocado.

Todas as instruções de Shift são RS, e os bits 12 a 15 dessas instruções são ignorados pela UCP.Os 6 bits mais à direita do número que é o endereço do 2º operando, formam um número que indica quantas "casas" devem ser deslocadas.

SLL (Shift Left Logical – Deslocamento Simples Lógico à esquerda)Código de máquina 89 (Instrução RS)Condition code Não é alterado Interrupções Possíveis Nenhuma

Pode-se deslocar 32 "casas" no máximo. Exemplo: SLL 5,2

Registrador 5 antes do Shift

B9 . 4F . FF . FF

Registrador 5 após o Shift

E5 . 3F . FF . FC

SRL (Shift Right Logical – Deslocamento Simples Lógico à direita)Código de máquina 88 (Instrução RS)Condition code Não é alterado Interrupções Possíveis Nenhuma

Pode-se deslocar 32 "casas" no máximo. Exemplo: SRL 5,2

Registrador 5 antes do Shift

B9 . 4F . FF . FF

Registrador 5 após o Shift

2E . 53 . FF . FF

9393

Page 94: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

SLDL (Shift Left Double Logical – Deslocamento Duplo Lógico à esquerda)Código de máquina 8D (Instrução RS)Condition code Não é alterado Interrupções Possíveis 0006

Pode-se deslocar 63 "casas" no máximo.

Ex: SLDL 8,4

Registradores 8 e 9 antes do Shift

12 . FE . 3D . 4C . 5B . 6A . 78 . 90

8 9

Registradores 8 e 9 após o Shift

2F . E3 . D4 . C5 . B6 . A7 . 89 . 00

8 9

SRDL (Shift Right Double Logical – Deslocamento Duplo Lógico à direita)Código de máquina 8C (Instrução RS)Condition code Não é alterado Interrupções Possíveis 0006

Pode-se deslocar 63 "casas" no máximo.

Ex: SRDL 8,4

Registradores 8 e 9 antes do Shift

12 . FE . 3D . 4C . 5B . 6A . 78 . 90

8 9

Registradores 8 e 9 após o Shift

01 . 2F . E3 . D4 . C5 . B6 . A7 . 89

8 9

9494

Page 95: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

SLA (Shift Left Algebraic – Deslocamento Simples Algébrico à esquerda)Código de máquina 8B (Instrução RS)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis Nenhuma

Pode-se deslocar 15 "casas" no máximo. Ex:

SLA 5,3

Registrador 5 antes do Shift

FF . 80 . 9A . 00

Registrador 5 após o Shift

FC . 00 . 50 . 00

SRA (Shift Right Algebraic – Deslocamento Simples Algébrico à direita)Código de máquina 8A (Instrução RS)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 O condition code nunca fica em 11 após um SRA

Interrupções Possíveis Nenhuma

Pode-se deslocar 15 "casas" no máximo. Ex:

SRA 5,3

Registrador 5 antes do Shift

FF . 80 . 0A . 00

Registrador 5 após o Shift

8F . F0 . 01 . 40

9595

Page 96: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

SLDA (Shift Left Double Algebraic – Deslocamento Duplo Algébrico à esquerda)Código de máquina 8F (Instrução RS)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0004, 0008

Pode-se deslocar 63 "casas" no máximo. Exemplo:

SLDA 8,3

Registradores 8 e 9 antes do Shift

B4 . 20 . 08 . 91 . C4 . 00 . 02 . FF

8 9

Registradores 8 e 9 após o Shift

A1 . 00 . 44 . 8E . 20 . 00 . 17 . F8

8 9

SRDA (Shift Right Double Algebraic – Deslocamento Duplo Algébrico à direita)Código de máquina 8E (Instrução RS)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 O condition code nunca fica em 11 após um SRDA

Interrupções Possíveis 0006

Pode-se deslocar 63 "casas" no máximo. Exemplo:

SRDA 8,3

Registradores 8 e 9 antes do Shift

B4 . 20 . 08 . 91 . C4 . 00 . 02 . FF

8 9

Registradores 8 e 9 após o Shift

86 . 84 . 01 . 12 . 38 . 80 . 00 . 5F

8 9

9696

Page 97: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-9) INSTRUÇÕES DE ÁLGEBRA BOOLEANA

São instruções que modificam o conteúdo do 1º operando de acordo com o seu conteúdo, e o do 2º operando (máscara).

Existem 3 tipos de instruções booleanas: AND, OR e EXCLUSIVE OR.

Para facilitar a compreensão do funcionamento de cada uma delas, vejamos as seguintes regras práticas, considerando-se que a operação é efetuada bit a bit, aplicando-se o bit da máscara no bit correspondente do primeiro operando, o qual é alterado (ou não) de acordo com o seguinte:

Instruções tipo AND: Bit da máscara = 0 então bit resultante = 0 Bit da máscara = 1 então bit resultante não é alterado

Instruções tipo OR: Bit da máscara = 0 então bit resultante não é alterado Bit da máscara = 1 então bit resultante = 1

Instruções tipo EXCLUSIVE OR: Bit da máscara = 0 então bit resultante não é alterado Bit da máscara = 1 então bit resultante é o inverso (se era 0 fica 1 e se era 1 fica 0)

O segundo operando (máscara) especificado nunca é alterado.

N (And – E)Código de máquina 54 (Instrução RX)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um N11 O condition code nunca fica em 11 após um N

Interrupções Possíveis 0005

A instrução N executa um AND entre um registrador (especificado no 1º operando) e um campo de memória de 4 bytes (especificado no 2º operando - em geral uma Full-Word). Ex:

N 13,CAMPOF

Antes Depois

Reg. 13 B4 . EF . 2F . A8 00 . 00 . 00 . A8CAMPOF 00 . 00 . 00 . FF 00 . 00 . 00 . FF

Outros exemplos:

N 11,=F'15' N 3,0(4) N 3,0(,4) N 3,0(8,4)

9797

Page 98: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

O (Or – Ou)Código de máquina 56 (Instrução RX)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um O11 O condition code nunca fica em 11 após um O

Interrupções Possíveis 0005

A instrução O executa um OR entre um registrador (Especificado no 1º operando) e um campo de memória de 4 bytes (especificado no 2º operando - em geral uma Full-Word). Ex:

O 13,CAMPOF

Antes Depois

Reg. 13 B4 . EF . 2F . A8 B4 . EF . 2F . FFCAMPOF 00 . 00 . 00 . FF 00 . 00 . 00 . FF

X (Exclusive Or – Ou exclusivo)Código de máquina 57 (Instrução RX)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um X11 O condition code nunca fica em 11 após um X

Interrupções Possíveis 0005

A instrução X executa um EXCLUSIVE OR entre um registrador (especificado no 1º operando) e um campo de memória de 4 bytes (Especificado no 2º operando - em geral uma Full-Word). Ex:

X 13,CAMPOF

antes depois

Reg. 13 B4 . EF . 2F . A8 B4 . EF . 2F . 57CAMPOF 00 . 00 . 00 . FF 00 . 00 . 00 . FF

9898

Page 99: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

NR (And Register – E entre registradores)Código de máquina 14 (Instrução RR)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um NR11 O condition code nunca fica em 11 após um NR

Interrupções Possíveis Nenhuma

A instrução NR executa um AND entre 2 registradores. Ex:

NR 5,8

Antes Depois

Reg. 5 B4 . EF . 2F . A8 00 . 00 . 00 . A8Reg. 8 00 . 00 . 00 . FF 00 . 00 . 00 . FF

OR (Or Register – Ou entre registradores)Código de máquina 16 (Instrução RR)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um OR11 O condition code nunca fica em 11 após um OR

Interrupções Possíveis Nenhuma

A instrução OR executa um OR entre 2 registradores. Ex:

OR 5,8

Antes Depois

Reg. 5 B4 . EF . 2F . A8 B4 . EF . 2F . FFReg. 8 00 . 00 . 00 . FF 00 . 00 . 00 . FF

XR (Exclusive or Register – Ou exclusivo entre registradores)Código de máquina 17 (Instrução RR)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um XR11 O condition code nunca fica em 11 após um XR

Interrupções Possíveis Nenhuma

A instrução XR executa um EXCLUSIVE OR entre 2 registradores. Ex:

XR 5,8

Antes Depois

Reg. 5 B4 . EF . 2F . A8 B4 . EF . 2F . 57Reg. 8 00 . 00 . 00 . FF 00 . 00 . 00 . FF

9999

Page 100: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

NI (And Immediate – E [com operando] imediato)Código de máquina 94 (Instrução SI)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um NI11 O condition code nunca fica em 11 após um NI

Interrupções Possíveis 0004, 0005

A instrução NI executa um AND entre 2 campos de memória (um byte cada). Ex:

NI BYTE,X'0F'

antes depois

BYTE B4 04Op.Imed. 0F 0F

OI (Or Immediate – Ou [com operando] imediato)Código de máquina 96 (Instrução SI)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um OI11 O condition code nunca fica em 11 após um OI

Interrupções Possíveis 0004, 0005

A instrução OI executa um Or entre 2 campos de memória (um byte cada). Ex:

OI BYTE,X'0F'

antes depois

BYTE B4 BF Op.Imed. 0F 0F

XI (Exclusive Or Immediate – Ou exclusivo [com operando] imediato)Código de máquina 97 (Instrução SI)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um OI11 O condition code nunca fica em 11 após um OI

Interrupções Possíveis 0004, 0005

A instrução XI executa um EXCLUSIVE OR entre 2 campos de memória (um byte cada). Exemplo: Antes Depois

BYTE B4 BBOp.Imed. 0F 0F

100100

Page 101: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

NC (And Character – E entre campos com caracteres) Código de máquina D4 (Instrução SS – L)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um NC11 O condition code nunca fica em 11 após um NC

Interrupções Possíveis 0004, 0005

A instrução NC executa um AND entre 2 campos de memória. Ex:

NC CPOA,CPOB

antes depois

CPOA EF . 2F . A8 00 . 00 . A8CPOB 00 . 00 . FF 00 . 00 . FF

OC (Or Character – Ou entre campos com caracteres) Código de máquina D6 (Instrução SS – L)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um OC11 O condition code nunca fica em 11 após um OC

Interrupções Possíveis 0004, 0005

A instrução OC executa um OR entre 2 campos de memória. Ex:

OC CPOA,CPOB

Antes Depois

CPOA EF . 2F . A8 EF . 2F . FFCPOB 00 . 00 . FF 00 . 00 . FF

XC (Exclusive Or Character – Ou exclusivo entre campos com caracteres) Código de máquina D7 (Instrução SS – L)Condition code 00 Resultado = 0

01 Resultado <> 010 O condition code nunca fica em 10 após um XC11 O condition code nunca fica em 11 após um XC

Interrupções Possíveis 0004, 0005

A instrução XC executa um EXCLUSIVE OR entre 2 campos de memória. Ex:

XC CPOA,CPOB

antes depois

CPOA EF . 2F . A8 EF . 2F . 57 CPOB 00 . 00 . 00 00 . 00 . FF

101101

Page 102: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-10) INSTRUÇÕES DE CARGA E DESVIO

BALR (Branch and Link Register – Desviar e ligar via registrador)Código de máquina 05 (Instrução RR)Condition code Não é alterado Interrupções Possíveis Nenhuma

A instrução BALR carrega no registrador especificado no 1º operando o endereço da instrução (do byte) seguinte ao BALR e, em seguida, desvia para a instrução cujo endereço esteja no registrador especificado no 2º operando.OBS:- 1) Se o registrador 2º operando for o registrador 0, o desvio não

será feito. 2) Para carregar o endereço no registrador 1º operando, o BALR nele

coloca os 4 últimos bytes à direita da PSW atual (BC mode).

Ex: BALR 3,0 BALR 14,15

BAL (Branch and Link – Desviar e ligar)Código de máquina 45 (Instrução RX)Condition code Não é alterado Interrupções Possíveis Nenhuma

A instrução BAL é análoga ao BALR. A diferença é que seu 2º operando especifica o endereço de uma instrução para onde sempre será efetuado o desvio. Ex: BAL 9,ROTINA BAL 14,CABEC BAL 7,2(5) BAL 7.2(,8) BAL 7,2(5,8)

BAS (Branch and Save – Desviar e salvar)Código de máquina 4D (Instrução RR)Condition code Não é alterado Interrupções Possíveis Nenhuma

O endereço da instrução seguinte (do byte seguinte à instrução BAS) é carregado no registrador 1º operando (carregando nos bytes 1,2 e 3 do registrador os bytes 5, 6 e 7 da PSW atual), e em seguida é efetuado um desvio para a instrução especificada no 2º operando.O primeiro byte à esquerda do registrador 1º operando é zerado, e esta é a diferença entre o BAS e o BAL, pois o BAL, ao carregar o endereço do byte seguinte no registrador 1º operando, ele o faz dos 4 últimos bytes da PSW atual, trazendo o conteúdo do byte 4 da PSW para o byte 0 do registrador 1º operando. Exemplo:

BAS 14, ROT

102102

Page 103: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

BASR (Branch and Save Register – Desviar para endereço em registrador e salvar)Código de máquina 0D (Instrução RR)Condition code Não é alterado Interrupções Possíveis Nenhuma

O endereço da instrução seguinte (do byte seguinte à instrução BASR) é carregado no registrador 1º operando (carregando nos bytes 1,2 e 3 do registrador os bytes 5, 6 e 7 da PSW atual), e em seguida é efetuado um desvio para a instrução cujo endereço está no registrador 2º operando.O primeiro byte à esquerda do registrador 1º operando é zerado, e esta é a diferença entre o BASR e o BALR, pois o BALR, ao carregar o endereço do byte seguinte no registrador 1º operando, ele o faz dos 4 últimos bytes da PSW atual, trazendo o conteúdo do byte 4 da PSW para o byte 0 do registrador 1º operando. Se o registrador 2º operando for o zero, não é efetuado o desvio. Exemplo:

BASR 14, 15

BASSM (Branch and Save and Set Mode – Desviar, salvar e posicionar modo)Código de máquina 0C (Instrução RR)Condition code Não é alterado Interrupções Possíveis Nenhuma

O endereço da instrução seguinte (do byte seguinte à instrução BASSM) é carregado no registrador 1º operando (carregado dos bytes 4, 5, 6 e 7 da PSW atual), e em seguida é carregado nos bytes 4 a 7 da PSW atual o conteúdo do registrador 2º operando, incluindo o bit de addressing mode e o endereço da próxima instrução; isto causa um posicionamento do addressing mode e o desvio para a instrução.Se o registrador 2º operando for o zero, não é feita a carga da PSW. Exemplo:

BASSM 14, 15

BSM (Branch and Set Mode – Desviar e posicionar modo)Código de máquina 0B (Instrução RR)Condition code Não é alterado Interrupções Possíveis Nenhuma

O bit 32 da PSW atual (addressing mode) é carregado no bit 0 do registrador 1º operando (os bits 1-31 do registrador 1º operando não são alterados), e em seguida é carregado nos bytes 4 a 7 da PSW atual o conteúdo do registrador 2º operando, incluindo o bit de addressing mode e o endereço da próxima instrução; isto causa um posicionamento do addressing mode e o desvio para a instrução.Se o registrador 2º operando for o zero, não é feita a carga da PSW. Exemplo:

BSM 14, 15

103103

Page 104: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-11) INSTRUÇÕES DE MOVIMENTO DE DADOS DE REGISTRADOR PARA MEMORIA

ST (Store – Armazenar)Código de máquina 50 (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0004,0005

O conteúdo do registrador especificado no 1º operando é colocado no campo de memória de 4 bytes especificado no 2º operando (em geral uma Full-Word).O registrador 1º operando permanece inalterado. Ex:

ST 14,SALVA ST 14,FULL+4 ST 14,0(2) ST 14,0(,8) ST 14,0(2,8)

STH (Store Halfword – Armazenar halfword)Código de máquina 40 (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0004,0005

O conteúdo dos 2 últimos bytes à direita do registrador especificado no 1º operando é colocado no campo de memória de 2 bytes especificado no 2º operando (em geral uma Half-Word). O registrador 1º operando permanece inalterado. Ex:

STH 14,SALVA+18 STH 14,HALF STH 14,0(2) STH 14,0(,8) STH 14,0(2,8) STH 0,CPO

STM (Store Multiple – Armazenar Múltiplos)Código de máquina 90 (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0004,0005

Esta instrução trabalha com 3 operandos: os 2 primeiros especificados são registradores e o terceiro é um endereço de memória.A instrução STM coloca o conteúdo do conjunto de n registradores (indicado pelos registradores especificados) no campo de memória de (n.4) bytes especificado no último operando. Ex:

104104

Page 105: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

STM 14,1,SALVA

<------- SALVA -------------------------------->

<----------><---------><----------><----------> Reg. 14 Reg.15 Reg.0 Reg.1

Outro Exemplo:

STM 1,7,2(10)

STC (Store Character – Armazenar um byte)Código de máquina 42 (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0004,0005

O conteúdo do último byte à direita do registrador especificado no 1º operando (o qual permanece inalterado) é colocado no campo de 1 byte especificado no 2º operando. Ex:

STC 4,BYTE STC 8,0(5) STC 8,0(,9) STC 8,0(5,9)

STCM (Store Characters under Mask – Armazenar caracteres por máscara)Código de máquina BE (Instrução RS)Condition code Não é alterado Interrupções Possíveis 0004,0005

O seu formato de máquina é o seguinte:

CO = 1 byte (código de operação)R1 = 1/2 byte (registrador primeiro operando)M3 = 1/2 byte (máscara terceiro operando)E2 = 2 bytes (base+deslocamento do segundo operando)

Os 4 bits da máscara, da esquerda para a direita, correspondem aos 4 bytes do registrador especificado no 1º operando.Os bytes do registrador que tiverem os seus bits correspondentes na máscara ligados, são considerados como um "campo" contíguo, e movidos para o campo de memória especificado no último operando da instrução (2º operando), o qual deve ter tantos bytes de tamanho quantos forem os bits da máscara ligados.O registrador 1º operando não é alterado. Ex:

STCM 5,B'1010',SAVE

Neste caso, o "campo" formado pelos 1. e 2. bytes do registrador 5, será movido para o campo de memória de 2 bytes denominado SAVE.

105105

Page 106: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

CVD (Convert to decimal – Converter [de binário] para [decimal] compactado)Código de máquina 4E (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0004,0005

O número (binário) contido no registrador especificado no 1º operando é convertido para formato decimal compactado e colocado no campo de memória de 8 bytes (em geral uma Double-Word) especificado no 2º operando.OBS:- número positivo: sinal C número negativo: sinal DExemplos:

CVD 8,DOUBLE CVD 8,0(5,9) CVD 8,0(,9) CVD 8,0(5)

106106

Page 107: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-12) INSTRUÇÕES DE MOVIMENTO DE DADOS DE UM CAMPO DE MEMÕRIA PARA REGISTRADOR

L (Load – Carregar)Código de máquina 58 (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0005

O conteúdo do campo de memória de 4 bytes especificado no 2º operando (em geral uma Full-Word) será colocado no registrador especificado no 1º operando. O campo de memória permanece inalterado. Ex:

L 7,FULL L 14,SALVA L 8,0(10) L 8,0(,11) L 8,0(10,11) L 5,=F'200'

LH (Load Halfword – Carregar halfword)Código de máquina 48 (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0005

O conteúdo do campo de 2 bytes especificados no 2º operando (em geral uma Half-Word) será colocado nos 2 últimos bytes à direita do registrador especificado no 1º operando; os 2 bytes à esquerda do registrador terão os seus bits posicionados do mesmo modo que estiver o 1º bit à esquerda do campo, o qual permanece inalterado. Ex: LH 5,CPO

Antes Depois

Reg. 5 00 . 00 . 00 . 00 FF . FF . 8A . B4CPO 8A . B4 8A . B4

Outro Exemplo:

Antes Depois

Reg. 5 FF . FF . FF . FF 00 . 00 . 7A . B4CPO 7A . B4 7A . B4

Outros exemplos:

LH 7,HALF LH 8,0(10) LH 8,0(,11) LH 8,0(10,11) LH 8,=H'200'

107107

Page 108: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LM (Load Multiple – Carregar Múltiplos)Código de máquina 98 (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0005

Esta instrução trabalha com 3 operandos: os 2 primeiros especificados são registradores, e o terceiro especificado é um endereço de memória. A instrução LM coloca o conteúdo de um campo de memória de (n x 4) bytes no conjunto de n registradores (indicado pelos dois primeiros operandos). Ex:

LM 14,1,SALVA

<------- SALVA -------------------------------->

<----------><---------><----------><----------> Reg. 14 Reg.15 Reg.0 Reg.1

IC (Insert Character – Inserir Byte)Código de máquina 43 (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0005

O conteúdo do campo de um byte especificado no 2º operando é colocado no último byte à direita do registrador especificado no 1º operando.Os outros 3 bytes do registrador permanecem inalterados. Exemplo:

IC 4,BYTE IC 8,0(5) IC 8,0(,9) IC 8,0(5,9) IC 9,=C'A'

108108

Page 109: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

ICM (Insert Character under Mask – Inserir bytes sob máscara)Código de máquina BF (Instrução RS)Condition code 00 Todos os bits inseridos estão em 0, ou a

máscara é 0.01 O 1º bit do campo inserido está em 1.10 O 1º bit do campo inserido está em 0, e nem todos os bits inseridos estão em 0. 11 Nunca o condition code fica em 11 após um ICM.

Interrupções Possíveis 0005

O seu formato de máquina é o seguinte:

CO = 1 byte (código de operação)R1 = 1/2 byte (registrador primeiro operando)M3 = 1/2 byte (máscara terceiro operando)E2 = 2 bytes (base+deslocamento do segundo operando)

Os 4 bits da máscara, da esquerda para a direita, correspondem aos 4 bytes do registrador especificado no 1º operando.O campo de memória especificado no último operando da instrução (2º operando), deve ter tantos bytes quantos forem os bits da máscara ligados. Os bytes do campo de memória são movidos, um a um, da esquerda para a direita, para os bytes do registrador 1º operando que tiverem os bits correspondentes na máscara ligados.Os bytes do registrador 1º operando que tiverem os bits correspondentes na máscara desligados, permanecem inalterados. Ex:

ICM 5,B'1010',SAVE

Neste caso, o 1º byte de SAVE será movido para o 1º byte do registrador 5, e o 2º byte de SAVE será movido para o 3º byte do registrador 5.

CVB (Convert to binary – Converter [de compactado] para binário)Código de máquina 4F (Instrução RX)Condition code Não é alteradoInterrupções Possíveis 0005, 0007, 0009

O número compactado que esta no campo de 8 bytes especificado no 2º operando (em geral uma Double-Word), o qual permanece inalterado, é transformado para binário e colocado no registrador especificado no 1º operando. Ex:

CVB 8,DOUBLE CVB 8,0(5,9) CVB 8,0(,9) CVB 8,0(5)

109109

Page 110: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-13) INSTRUÇÕES DE MOVIMENTO DE DADOS DE REGISTRADOR PARA REGISTRADOR

LR (Load Register – Carregar registrador)Código de máquina 18 (Instrução RR)Condition code Não é alteradoInterrupções Possíveis Nenhuma

O conteúdo do registrador especificado no 2º operando é colocado no registrador especificado no 1º operando. Ex:

LR 4,5

LPR (Load Positive Register – Carregar registrador positivo)Código de máquina 10 (Instrução RR)Condition code 00 Resultado = 0

01 Nunca o condition code fica em 1 após um LPR.10 Resultado > 011 Overflow

Interrupções Possíveis 0008

O número binário contido no registrador especificado no 2º operando (o qual permanece inalterado) é transformado para positivo e colocado no registrador especificado no 1º operando.Números positivos não sofrem transformação.Números negativos são transformados por complementação.O overflow ocorre quando o maior número negativo é complementado; neste caso, o número permanece inalterado. Ex:

LPR 4,5

LNR (Load Negative Register – Carregar registrador negativo)Código de máquina 11 (Instrução RR)Condition code 00 Resultado = 0

01 Resultado < 010 Nunca o condition code fica em 10 após um LNR11 Nunca o condition code fica em 10 após um LNR

Interrupções Possíveis Nenhuma

O número binário contido no registrador especificado no 2º operando (O qual permanece inalterado) é transformado para negativo (por complementação) e colocado no registrador especificado no 1º operando.Números negativos não são transformados.O zero permanece inalterado com sinal positivo. Ex:

LNR 4,5

110110

Page 111: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LCR (Load Complement Register – Carregar o complemento do registrador)Código de máquina 13 (Instrução RR)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0008

O número binário contido no registrador especificado no 2º operando (o qual permanece inalterado) é complementado (se for positivo fica negativo e vice-versa) e colocado no registrador especificado no 1º operando. O overflow ocorre quando o maior número negativo é complementado. EX:

LCR 4,5 LCR 4,4

LTR (Load and test Register – Carregar e testar registrador)Código de máquina 12 (Instrução RR)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Nunca o condition code fica em 10 após um LTR

Interrupções Possíveis Nenhuma

O conteúdo do registrador especificado no 2º operando (o qual permanece inalterado) é colocado no registrador especificado no 1º operando. Ex:

LTR 5,8 LTR 4,4

111111

Page 112: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-14) OPERAÇÕES ARITMÉTICAS ENTRE REGISTRADORES

AR (Add Register – Somar registradores)Código de máquina 1A (Instrução RR)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0008

O conteúdo do registrador especificado no 2º operando (o qual não é alterado) é somado algebricamente ao conteúdo do registrador especificado no 1º operando (ambos os números em binário) e o resultado é colocado no registrador 1º operando. Ex:

AR 7,8 AR 2,2

SR (Subtract Register – Subtrair registradores)Código de máquina 1B (Instrução RR)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0008

O número binário contido no registrador especificado no 2º operando é subtraído algebricamente do número binário contido no registrador especificado no 1º operando, e o resto é colocado no registrador 1º operando.Portanto: Minuendo : 1ºoperando Subtraendo : 2ºoperando Resto : 1ºoperandoEx: SR 7,8 SR 2,2

MR (Multiply Register – Multiplicar registradores)Código de máquina 1C (Instrução RR)Condition code Não é alterado Interrupções Possíveis 0006

O 1º operando especificado deve ser um registrador par (o número binário nele contido será desprezado, a menos que ele seja o multiplicador).

O número binário contido no registrador especificado no 2º operando será o multiplicador. O produto será colocado no conjunto de 2 registradores (par-ímpar) indicado pelo 1º operando: o registrador par será ele mesmo, e o ímpar será o seguinte a ele.

O multiplicando será o número binário do registrador ímpar do conjunto par-ímpar indicado pelo 1º operando. Exemplo:

MR 4,9

112112

Page 113: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Multiplicando: Reg.5Multiplicador: Reg.9Produto : Numero binário de 64 bits contido nos registradores 4 e 5, em conjunto.

DR (Divide Register – Dividir registradores)Código de máquina 1D (Instrução RR)Condition code Não é alteradoInterrupções Possíveis 0006,0009

O 1º operando especificado deve ser um registrador par. O número contido nele e no registrador ímpar seguinte a ele (número binário com 64 bits) será o dividendo.O número binário contido no registrador especificado no 2º operando será o divisor.Após a divisão, o registrador ímpar receberá o quociente. Ex:

DR 4,9

Dividendo : Número binário de 64 bits (sinal + 63 bits), contido nos registradores 4 e 5, em conjunto.Divisor : Reg. 9Resto : Reg. 4Quociente : Reg. 5

Resto ou quociente = 0: sinal sempre positivoSinal do resto = Sinal do dividendo

ALR (Add Logical Register – Somar registradores logicamente)Código de máquina 1E (Instrução RR)Condition code 00 Resultado = 0, não perde sinal

01 Resultado <> 0, não perde sinal10 Resultado = 0, perde sinal11 Resultado <> 0, perde sinal

Interrupções Possíveis Nenhuma

É efetuada uma soma lógica entre os números binários (considerados com 32 bits cada, positivos) contidos nos registradores especificados como operandos. O resultado é colocado no registrador 1º operando. Ex:

ALR 7,12

113113

Page 114: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

SLR (Subtract Logical Register – Subtrair registradores logicamente)Código de máquina 1F (Instrução RR)Condition code 00 Nunca o condition code fica em 00 após um SLR

01 Resultado <> 0, não perde sinal10 Resultado = 0, perde sinal11 Resultado <> 0, perde sinal

Interrupções Possíveis Nenhuma

É efetuada uma subtração lógica entre os números binários (considerados com 32 bits cada, positivos) contidos no 1º operando (minuendo) e 2º operando (subtraendo). O resto é colocado no registrador 1º operando. Ex:

SLR 7,12

114114

Page 115: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-15) OPERAÇÕES ARITMÉTICAS ENTRE REGISTRADORES E CAMPOS DE MEMÕRIA

A (Add – Somar)Código de máquina 5A (Instrução RX)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0005,0008

Esta instrução efetua a soma algébrica entre um número binário contido num registrador (especificado no 1º operando) e um número binário contido num campo de memória de 4 bytes (especificado no 2º operando; em geral uma Full-Word). O resultado é colocado no registrador 1º operando. Ex:

A 5,=F'259' A 7,FULL A 7,4(2,8) A 7,4(2) A 7,4(,8)

S (Subtract – Subtrair)Código de máquina 5B (Instrução RX)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0005,0008

Esta instrução efetua a subtração algébrica entre um número binário contido num registrador (especificado no 1º operando - é o Minuendo) e um número binário contido num campo de memória de 4 bytes (especificado no 2º operando; em geral uma Full-Word - é o Subtraendo).O resto é colocado no registrador 1º operando. Ex:

S 5,=F'259' S 7,FULL S 7,4(2,8) S 7,4(2) S 7,4(,8)

M (Multiply – Multiplicar)Código de máquina 5C (Instrução RX)Condition code Não é alteradoInterrupções Possíveis 0005,0006

Esta instrução efetua uma multiplicação entre dois números binários.O registrador especificado no 1º operando deve ser par.O registrador ímpar seguinte deve conter o Multiplicando.O campo de memória de 4 bytes especificado no 2º operando (em geral uma Full-Word) deve conter o Multiplicador.O resultado é um número binário de 64 bits que é colocado no conjunto de registradores par-ímpar indicado pelo 1º operando. Exemplo:

115115

Page 116: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

M 6,CPOA

Neste caso, temos: Multiplicando: Reg. 7 Multiplicador: CPOA Produto : Regs. 6 e 7 juntos

Outros exemplos: M 6,=F'256' M 6,FULL M 6,4(2,8) M 6,4(2) M 6,4(,8) M 6,CPO+8 M 6,CPO+4(1)

D (Divide – Dividir)Código de máquina 5D (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0005,0006,0008

Esta instrução efetua uma divisão entre dois números binários.O registrador especificado no 1º operando deve ser par.O dividendo é um número binário de 64 bits contido no conjunto de registradores par-ímpar indicado no 1º operando.O divisor é um número contido num campo de memória de 4 bytes (especificado no 2º operando - em geral uma Full-Word).Após efetuada a divisão, o resto será colocado no registrador par do conjunto par-ímpar; o quociente será colocado no registrador ímpar do conjunto par-ímpar. Exemplo:

D 6,CPOA

Neste caso, temos: Dividendo : Regs. 6 e 7 juntos Divisor : CPOA Quociente : Reg. 7 Resto : Reg. 6

Outros exemplos:

D 6,=F'256' D 6,FULL D 6,4(2,8) D 6,4(2) D 6,4(,8) D 6,CPO+8 D 6,CPO+4(1)

116116

Page 117: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

AH (Add Halfword – Somar hafword)Código de máquina 4A (Instrução RX)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0005,0008

Esta instrução efetua uma soma algébrica entre dois números binários.Um deles esta localizado no registrador especificado no 1º operando, e o outro num campo de memória de 2 bytes especificado no 2º operando (em geral uma Half-Word).Antes de efetuada a soma pela UCP, o 2º operando é expandido na UCP para que fique com 32 bits (o bit de sinal é expandido a esquerda); aí então é feita a adição. O resultado é colocado no registrador 1º operando. Ex:

AH 5,=H'259' AH 5,HALF AH 5,4(2,8) AH 5,4(2) AH 5,4(,8)

SH (Subtract Halfword – Subtrair hafword)Código de máquina 4B (Instrução RX)Condition code 00 Resultado = 0

01 Resultado < 010 Resultado > 011 Overflow

Interrupções Possíveis 0005,0008

Esta instrução efetua uma subtração algébrica entre dois números binários.Um deles está localizado no registrador especificado no 1º operando, e o outro num campo de memória de 2 bytes especificado no 2º operando (em geral uma Half-Word).Antes de efetuada a subtração pela UCP, o 2º operando é expandido na UCP para que fique com 32 bits (o bit de sinal é expandido a esquerda); aí então é feita a subtração. O resultado é colocado no registrador 1º operando. Ex:

SH 5,=H'259' SH 5,HALF SH 5,4(2,8) SH 5,4(2) SH 5,4(,8)

117117

Page 118: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

MH (Multiply Halfword – Multiplicar hafword)Código de máquina 4C (Instrução RX)Condition code Não é alterado Interrupções Possíveis 0005

Esta instrução efetua uma multiplicação algébrica entre dois números binários.Um deles esta localizado no registrador especificado no 1º operando, e o outro num campo de memória de 2 bytes especificado no 2º operando (em geral uma Half-Word).Antes de efetuada a multiplicação pela UCP, o 2º operando é expandido na UCP para que fique com 32 bits (o bit de sinal é expandido a esquerda); aí então é feita a multiplicação. O Resultado é colocado no registrador 1º operando.OBS:- em caso de overflow (condição esta que não é indicada pelo condition code) o bit de sinal do produto pode não estar correto. Produto = 0, sinal positivo.Ex:

MH 5,=H'259' MH 5,HALF MH 5,4(2,8) MH 5,4(2) MH 5,4(,8)

AL (Add Logical – Somar logicamente)Código de máquina 5E (Instrução RX)Condition code 00 Resultado = 0, não perde sinal

01 Resultado <> 0, não perde sinal10 Resultado = 0, perde sinal11 Resultado <> 0, perde sinal

Interrupções Possíveis 0005

Esta instrução efetua uma soma lógica entre dois números binários.Um deles está localizado no registrador especificado no 1º operando. O outro, num campo de memória de 4 bytes especificado no 2º operando (em geral uma Full-Word).O resultado é colocado no registrador 1º operando. Ex:

AL 5,=F'259' AL 5,FULL AL 5,4(2,8) AL 5,4(2) AL 5,4(,8)

118118

Page 119: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

SL (Subtract Logical – Subtrair logicamente)Código de máquina 5F (Instrução RX)Condition code 00 O condition code nunca fica em 00 após um SL

01 Resultado <> 0, não perde sinal10 Resultado = 0, perde sinal11 Resultado <> 0, perde sinal

Interrupções Possíveis 0005

Esta instrução efetua uma subtração lógica entre dois números binários.Um deles localizado no registrador especificado no 1º operando.O outro, num campo de memória de 4 bytes especificado no 2º operando (em geral uma Full-Word).O resultado é colocado no registrador 1º operando. Ex:

SL 5,=F'259' SL 5,FULL SL 5,4(2,8) SL 5,4(2) SL 5,4(,8)

119119

Page 120: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

4-16) OUTRAS INSTRUÇÕES

LA (Load Address – Carregar Endereço)Código de máquina 41 (Instrução RX)Condition code Não é alterado Interrupções Possíveis Nenhuma

Esta instrução calcula o endereço real do 2º operando especificado (um endereço qualquer de memória), e o coloca nos 3 últimos bytes à direita do registrador, especificado no 1º operando). No primeiro byte à esquerda do registrador são colocados zeros binários. Ex:

LA 5,TABELA LA 5,CPO+17 LA 5,CPO+17(9) LA 5,2(4,8) LA 5,2(4) LA 5,2(,8) LA 5,2(5) LA 5,0(5) LA 5,200

TM (Test Under Mask – Testar com máscara)Código de máquina 91 (Instrução SI)Condition code 00 Todos os bits testados estão desligados, ou a

máscara é 001 Dos bits testados, alguns estão ligados e outros desligados10 Nunca o condition code fica em 10 após um TM11 Todos os bits testados estão ligados

Interrupções Possíveis 0005

Esta instrução testa bits do campo de 1 byte especificado no 1º operando, a partir da máscara especificada no 2º operando (termo auto-definido), a qual indica quais são os bits que devem ser testados.Os bits ligados na máscara indicam que os seus correspondentes no 1º operando devem ser testados. Após o teste, o condition code é posicionado. Ex:

TM BYTE,X'9C'

Neste caso, os bits 0, 3, 4 e 5 de BYTE serão testados. Outros exemplos:

TM CHAVE,B'10000001' TM 0(4),240 TM 2(8),X'80'

120120

Page 121: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EX (Execute)Código de máquina 44 (Instrução RX)Condition code o seu posicionamento (ou não) depende da instrução

que for executadaInterrupções Possíveis 0003,0005,0006

A instrução especificada no 2º operando é modificada (temporariamente) de acordo com o conteúdo do registrador especificado no 1º operando, e executada.O segundo byte da instrução especificada sofre um OR de acordo com o conteúdo do último byte à direita do registrador 1º operando; em seguida, a instrução é executada.IMPORTANTE: 1) nenhum dos 2 operandos é alterado, pois o OR é feito internamente, na UCP. 2) se o registrador 1º operando for o registrador 0, o OR não será feito.Ex:

EX 5,MVC . . . MVC MVC 0,(0,12),=CL256'b'

SVC (Supervisor Call – Chamada ao Supervisor)Código de máquina 0A (Instrução RR)Condition code Permanece inalterado na PSW velha Interrupções Possíveis Nenhuma

O seu formato de Máquina é o seguinte:

CO = 1 byte (código de operação)SVC nro = 1 byte (número do SVC)

Esta instrução causa interrupção de programa, através de uma chamada ao programa supervisor, chamada essa que pede a ele que execute alguma função.O código especificado no único operando (entre 0 e 255) indica qual a função desejada. Ex: SVC 0 SVC 7

Exemplos de SVC's de MVS:

X'00' (000) = EXCP/XDAP X'13' (019) = OPENX'01' (001) = WAIT/WAITR/PRTOV X'14' (020) = CLOSEX'02' (002) = POST X'23' (035) = WTO/WTORX'04' (004) = GETMAIN X'24' (036) = WTLX'05' (005) = FREEMAIN X'5D' (093) = TGET/TPUTX'0B' (011) = TIME X'63' (099) = DYNALLOCX'0D' (013) = ABEND X'6B' (107) = MODESET

121121

Page 122: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

MC (Monitor Call – Chamada do monitor)Código de máquina AF (Instrução SI)Condition code Permanece inalteradoInterrupções Possíveis 0006,0040

Esta instrução causa uma interrupção de programa, se o bit que mascara esta situação no registrador de controle 8 estiver ligado.Os bits de máscara no registrador de controle 8 são os bits 16 a 31, e que correspondem às classes 0 a 15, respectivamente.No operando imediato, os 4 primeiros bits à esquerda (bits 8 a 11 da instrução) devem estar em zero. Os bits 12 a 15 (a metade da direita do segundo byte da instrução) especificam um número binário que indica qual a classe de interrupção desejada; se o bit a ela referente no registrador de controle 8 estiver ligado, será causada a interrupção.O endereço do segundo operando não faz referência a um campo de memória, e sim indicam um código que deve ser colocado na fullword de endereço X'000156' de memória.Se a máscara referente à interrupção desejada estiver desligada no registrador de controle 8, a instrução funciona como um NOP. Exemplo: MC MONITCOD,7

SPM (Set Program Mask – estabelecer máscara de programa)Código de máquina 04 (Instrução RR)Condition code fica com o conteúdo dos bits 2 e 3 do reg. 1º

operandoInterrupções Possíveis nenhuma

Os bits 12 a 15 da instrução (onde haveria o registrador 2º operando) são ignorados. O conteúdo do registrador 1º operando é usado como base para colocar o condition code e a máscara de programa na PSW atual.Os bits 2 e 3 do registrador 1º operando tem seu conteúdo colocado no condition code da PSW atual, e os bits 4,5,6 e 7 tem seu conteúdo colocado na máscara de programa da PSW atual.Os bits 0 e 1, e os bits 8 a 31 do registrador 1º operando são ignorados. Ex: SPM 8

IPM (Insert Program Mask – inserir máscara de programa)Código de máquina B222 (Instrução RRE)Condition code Não é alteradoInterrupções Possíveis Nenhuma

Os bits 16-23 (terceiro byte) e 28-31 (segunda metade do quarto byte) da instrução são ignorados.O condition code e a máscara de programa da PSW atual são colocados nos bits 2-3 )condition code) e 4-7 (máscara de programa) do registrador primeiro (e único) operando; Os bits 0-1 do registrador são zerados e os bits 8-31 não são alterados. Exemplo: IPM 8

122122

Page 123: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

STCK (Store clock – armazenar clock)Código de máquina B205 (Instrução S)Condition code 00 O clock está em estado de set

01 O clock não está em estado de set10 O clock está em estado de erro 11 Nunca fica em 11 após um STCK

Interrupções Possíveis 0004

O conteúdo do TOD clock é armazenado no campo de 8 bytes especificado como operando. O clock deve estar em estado de set, stop ou não-set.As posições à direita não providas pelo TOD clock são preenchidas com zeros.Se o TOD clock está em estado de erro, o conteúdo do campo é imprevisível.Se ele está não operacional, é colocado zeros no campo. Exemplo: STCK DW

TS (Test and Set – Testar e posicionar) Código de máquina 93 (Instrução S)Condition code 00 Bit mais à esquerda desligado

01 Bit mais à esquerda ligado10 Nunca fica em 10 após um TS 11 Nunca fica em 11 após um TS

Interrupções Possíveis 0004,0005

O segundo byte da instrução é ignorado.O bit mais à esquerda do único byte do operando é testado para ver se está ligado ou desligado; o condition code é posicionado, e o byte tem todos os seus bits ligados (fica com X'FF'). Exemplo: TS BYTE

CS (Compare and Swap – Comparar e Trocar) Código de máquina BA (Instrução RS)Condition code 00 1º e 2º operandos são iguais, o 3. Operando foi

colocado no 2º operando01 1º e 2º operandos são diferentes, o 2º operando foi colocado no 1º operando10 Nunca fica em 10 após um CS 11 Nunca fica em 11 após um CS

Interrupções Possíveis 0004,0005,0006

O primeiro e o terceiro operandos são registradores.O segundo operando é um campo de memória (full-word).O conteúdo do registrador 1º operando é comparado com o conteúdo da full-word. Se eles forem iguais, o conteúdo do registrador 3º operando é colocado na full-word(store). Se eles forem diferentes, o conteúdo da full-word é colocado no registrador 1º operando (load). Exemplo: CS 5,8,FWAntes: R5 00.BF.C4.20 R8 7D.48.C0.00 FW 00.BF.C4.20Depois: R5 00.BF.C4.20 R8 7D.48.C0.00 FW 7D.48.C0.00

Outro exemplo: CS 5,8,FWAntes: R5 00.BF.C4.20 R8 7D.48.C0.00 FW 00.FF.EE.DDDepois: R5 00.FF.EE.DD R8 7D.48.C0.00 FW 00.FF.EE.DD

123123

Page 124: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

CDS (Compare Double and Swap – Comparar double e Trocar) Código de máquina BB (Instrução RS)Condition code 00 1º e 2º operandos são iguais, o 3º operando foi

colocado no 2º operando01 1º e 2º operandos são diferentes, o 2º operando foi colocado no 1º operando10 Nunca fica em 10 após um CDS 11 Nunca fica em 11 após um CDS

Interrupções Possíveis 0004,0005,0006

O primeiro e o terceiro operandos são registradores pares, e são considerados os registradores R1 e R1+1 como 1º operando, e R3 e R3+1 como 3º operando.O segundo operando é um campo de memória (double-word).O conteúdo dos registradores R1 e R1+1 é comparado com o conteúdo da double word. Se eles forem iguais, o conteúdo dos registradores R3 e R3+1 é colocado na double-word (store). Se eles forem diferentes, o conteúdo da double-word é colocado nos registradores R1 e R1+1 (load). Exemplo:

CDS 4,8,DW

Antes: R4/R5 00.BF.C4.20.50.CC.A0.00 R8/R9 7D.48.C0.00.00.00.00.02 DW 00.BF.C4.20.50.CC.A0.00

Depois: R4/R5 00.BF.C4.20.50.CC.A0.00 R8/R9 7D.48.C0.00.00.00.00.02 DW 7D.48.C0.00.00.00.00.02

Outro exemplo: CDS 4,8,DW

Antes: R4/R5 00.CC.DD.EE.FF.FF.FF.FF R8/R9 7D.48.C0.00.00.00.00.02 DW 00.BF.C4.20.50.CC.A0.00

Depois: R4/R5 00.BF.C4.20.50.CC.A0.00 R8/R9 7D.48.C0.00.00.00.00.02 DW 00.BF.C4.20.50.CC.A0.00

124124

Page 125: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5 - MACRO-INSTRUÇÕES

5-1 INTRODUÇÃO

Os comandos de montagem condicional formam uma "linguagem" através da qual especifica-se ao montador Assembler o que desejamos seja feito em tempo de montagem. Embora esses comandos possam ser usados mesmo sem a especificação de macro-instruções, é nelas em que se aplica com maior intensidade toda a versatilidade permitida através dos comandos de montagem condicional, cuja relação repetimos a seguir:

ACTR LCLA GBLA SETA ANOP MHELPAGO LCLB GBLB SETB AREAD MNOTEAIF LCLC GBLC SETC

Além desses comandos ao montador, outros existem, específicos para uso na elaboração de macro-instruções, quais sejam:

MACRO MEXIT MEND

As macro instruções podem tanto residir numa biblioteca fonte (onde, normalmente, ele faz busca automática), ou podem estar no próprio programa que as utiliza. Neste caso, elas devem preceder qualquer statement fonte, e sua presença é detectada pelo montador através dos comandos que identificam o ponto onde ela(s) começa(m) e termina(m).Esses comandos são, respectivamente, o MACRO (indica o início de uma macro-instrução) e o MEND (indica o seu fim).O statement que se segue ao MACRO identifica, entre outras coisas, o nome da macro que se está especificando. Vejamos o aspecto geral de um programa onde se deseja especificar duas macro-instruções, chamadas CALCULA e EXIBE.

MACRO(símbolo) CALCULA (parâmetros) . especificação da macro . MEND MACRO(símbolo) EXIBE (parâmetros) . especificação da macro . MENDPROGRAMA CSECT . . programa . . . END

125125

Page 126: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-2 SÍMBOLOS VARIÁVEIS E DE SEQUÊNCIA

Para que possamos explorar o universo das macro-instruções, dois conceitos se fazem necessários: SÍMBOLOS VARIÁVEIS e SÍMBOLOS DE SEQÜÊNCIA, embora eles possam ser utilizados num programa, independentemente da presença de macro-instruções.

Símbolos VARIÁVEIS são aqueles cujo primeiro caracter é o & (E comercial).

Eles permitem que se faça referência a uma variável, sendo, toda vez que são encontrados pelo montador, substituídos pelo conteúdo da variável.

Vejamos, por exemplo, o símbolo variável &SYSDATE. Ele se refere a uma variável interna do montador Assembler, cujo conteúdo é a data corrente, com 8 bytes; se utilizarmos o comando

MINEDATE DC C'&SYSDATE'

o montador irá gerar

+MINEDATE DC C'06/04/90'

Existem alguns símbolos variáveis já definidos pelo Assembler. São eles:

&SYSDATE = data (da montagem) no formato da data do sistema (dma ou mda);se for dma o formato será 8 bytes com dd/mm/aa

&SYSTIME = hora (da montagem) com 5 bytes no formato hh.mm

&SYSNDX = contador de macro instruções chamadas. Vejamos este exemplo: MACRO MAK1 . . . MEND MACRO MAK2 . . MAK1 . . MEND . . MAK1 nesta chamada, &SYSNDX tem 1 . MAK1 nesta chamada, &SYSNDX tem 2 . MAK2 nesta chamada, dentro das instruções de MAK2 &SYSNDX tem 3 e dentro da MAK1 tem 4 . &SYSNDX sai da chamada de MAK2 com 4 .

126126

Page 127: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

&SYSPARM = nele é colocado o conteúdo do SYSPARM (vindo via JCL), para ser testado durante a montagem (não pode ser modificado).

&SYSLOC = contém o nome do location counter em uso no momento.

&SYSECT = tem o nome da seção (CSECT, DSECT ou START) ativa quando a macro foi chamada. Exemplo:

MACRO DEFDSEK NOME DSECT A1 DS CL4 A2 DS CL4 A3 DS CL4 &SYSECT CSECT MEND

&SYSLIST = recurso para referenciar um parâmetro posicional, sem o uso do seu símbolo variável. Pode ser usado como &SYSLIST(n) ou como &SYSLIST(n,m). Supondo a macro

MACRO MAK &P1,&P2,&P3 . . . MEND

se nos referirmos a &SYSLIST(1) estaremos nos referenciando a &P1 &SYSLIST(2) refere-se a &P2 e &SYSLIST(3) refere-se a &P3. Se a macro for chamada da seguinte forma: MAK ALFA,BETA,GAMA &SYSLIST(1) vale 'ALFA', &SYSLIST(2) vale 'BETA' e &SYSLIST(3) vale 'GAMA'. Pode-se também usar o conceito de sublista (subparâmetros). Se a macro for chamada da seguinte forma: MAK (AA,AB,AC),(BA,BB),CC &SYSLIST(1,1) vale 'AA' &SYSLIST(1,2) vale 'AB' &SYSLIST(1,3) vale 'AC' &SYSLIST(2,1) vale 'BA' &SYSLIST(2,2) vale 'BB' &SYSLIST(1) vale 'CC'

Se especificarmos n como zero, será pego o símbolo que tenha sido colocado na chamada da macro.

Tanto n quanto m podem ser expressões.

Pode-se referenciar o atributo N'&SYSLIST, que tem o número de operandos.

127127

Page 128: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Além desses símbolos variáveis, podemos criar outros, respeitando as seguintes regras:- máximo 8 caracteres- primeiro caracter deve ser &- os demais podem ser letras (A até Z), algarismos decimais (0 até 9), ou então um dos caracteres: $ # @

Os símbolos variáveis definidos através de LCLC ou GBLC podem ser subscritos. Neste caso deve-se usar a forma &simbolo(p,t) sendo p a primeira posição a ser considerada do string e t o tamanho com que o string deve ser considerado.

Aos símbolos variáveis e aos ordinários estão associados atributos que descrevem algumas características dos campos. Os principais atributos são:

L'campo = ATRIBUTO DE TAMANHO indica o tamanho do campoT'campo = ATRIBUTO DE TIPO indica o tipo de campo. Pode ter, entre outros: O = operando omitido I = instrução de máquina C = constante tipo C P = constante tipo PS'campo = ATRIBUTO DE ESCALA pode ser usado para campos numéricos. No caso de campos binários tem o valor do modificador de escala, e no caso de campos decimais tem o número de dígitos especificados após o ponto decimal.I'campo = ATRIBUTO DE INTEIRO tem um valor que depende do tamanho e do atributo de escala do campoK'simbolovariável = ATRIBUTO DE CONTAGEM tem um número que indica quantos caracteres tem um operando de uma macro instrução ou quantos caracteres tem um campo do Assembler definido através do SETN'simbolovariável = ATRIBUTO DE NÚMERO contém o número de sub-operandos de um operando de uma macro instruçãoD'simboloordinário = ATRIBUTO DE DEFINIÇÃO indica se o símbolo referenciado foi definido antes do statement onde o teste usando o D' é feito. Este atributo não tem conteúdo; simplesmente indica uma condição (que pode ser falsa ou verdadeira) para uso no AIF.

Quanto aos SÍMBOLOS DE SEQUÊNCIA, eles são identificados pelo fato de o primeiro caracter ser um ponto (.). Os restantes podem ser no máximo 7, e pode-se usar as letras, os algarismos decimais e os símbolos $ # e @.Os símbolos de sequência são usados para identificar pontos do programa-fonte, de tal forma que possam ser referenciados em comandos que efetuem desvios condicionais ou incondicionais a esses pontos. Observar que esses símbolos não fazem parte da Tabela de Símbolos Ordinários, e servem somente para orientação do montador Assembler, em tempo de montagem, portanto. Adiante veremos mais alguns detalhes.

128128

Page 129: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-3 EXPRESSÕES

Uma expressão é um conjunto de termos (1 a 19) e dos respectivos operadores aritméticos, que podem ser: símbolos ordinários, símbolos variáveis, termos auto-definidos e referências a atributos. Na realidade são as mesmas expressões vistas no item 2-4-2; elas podem ter como termos também os símbolos variáveis.

Uma expressão pode ser usada para especificar: um endereço, um tamanho, um modificador (num DC ou DS), um fator de duplicação ou um operando.

As expressões podem ser absolutas (independem dos endereços dos símbolos) ou relocáveis (variam de acordo com o endereço dos símbolos nela usados).

Uma expressão pode ter no máximo 6 níveis de parênteses.

Os operadores podem operar sobre um termo ou sobre dois termos. Ex: +A opera sobre um termo (só pode ser soma (+) ou subtração (-) A-B opera sobre dois termos; pode ser soma (+), subtração (-), divisão (/) ou multiplicação (*)

A resolução das expressões é efetuada seguindo-se as seguintes regras:- cada termo é calculado individualmente- se a expressão tiver parênteses, o Assembler calcula as expressões mais internas, considerando o seu resultado como termo da expressão que tinha o parênteses, e assim por diante até a eliminação de todos os níveis de parênteses- as operações aritméticas são efetuadas da esquerda para a direita; primeiro são resolvidas as operações de operadores de um termo, depois as operações de multiplicação e divisão de operadores de 2 termos e depois as de soma e subtração de operadores de 2 termos- na divisão, o resultado considerado é o cociente inteiro, sendo o resto desprezado- divisão por zero resulta zero- um termo (ou valores intermediários) pode estar entre -231 e +231-1

129129

Page 130: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-4 VARIÁVEIS DE MONTAGEM : DECLARAÇÃO E ATRIBUIÇÃO DE CONTEÚDO

Podemos nos utilizar de variáveis próprias, por nós definidas, e que nos auxiliem nos controles necessários à expansão da macro.

Existem dois tipos de variáveis: LOCAIS e GLOBAIS.As variáveis LOCAIS tem "vida" durante a resolução da macro, enquanto as GLOBAIS são válidas durante toda a montagem.

Para a declaração das variáveis locais, devemos nos utilizar dos comandos LCLA, LCLB e LCLC.

O comando LCLA declara variáveis locais aritméticas decimais.O comando LCLB declara variáveis locais aritméticas binárias.O comando LCLC declara variáveis locais alfanuméricas (character).

Não se deve especificar nada na parte de símbolos, e na parte de operandos especifica-se os símbolos das variáveis que se deseja declarar.

Exemplos:

LCLA &VL1 LCLA &VLA2,&VLA3

LCLB &VLB1 LCLB &VLB2,&VLB3

LCLC &VLC1 LCLC &VLC2,&VLC3

Para a colocação de valores nessas variáveis, utiliza-se os comandos SETA, SETB e SETC, respectivamente para as variáveis definidas através do LCLA, LCLB e LCLC.

Na parte do símbolo do comando desejado, especifica-se o nome da variável onde se deseja seja colocado um valor.Na parte de operandos coloca-se uma expressão cujo resultado seja aquele que se deseja como conteúdo da variável.

Exemplos:

&VLA1 SETA 2&VLB1 SETB 101&VLC1 SETC 'GENTE'&VLA2 SETA 2+&VLA1&VLB2 SETB 1001+11&VLC2 SETC 'ABCDEF'&VLA3 SETA 2+L'CAMPO&VLB3 SETB 1+11+111&VLC3 SETC 'MUDOU'

130130

Page 131: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

Para a declaração das variáveis globais, devemos nos utilizar dos comandos GBLA, GBLB e GBLC.

O comando GBLA declara variáveis globais aritméticas decimais.O comando GBLB declara variáveis globais aritméticas binárias.O comando GBLC declara variáveis globais alfanuméricas (character).

Não se deve especificar nada na parte de símbolos, e na parte de operandos especifica-se os símbolos das variáveis que se deseja declarar.

Exemplos:

GBLA &VGA1 GBLA &VGA2,&VGA3

GBLB &VGB1 GBLB &VGB2,&VGB3

GBGB &VGB1 GBLC &VGC2,&VGC3

Para a colocação de valores nessas variáveis, utiliza-se os comandos SETA, SETB e SETC, respectivamente para as variáveis definidas através do GBLA, GBLB e GBLC.

Na parte do símbolo do comando desejado, especifica-se o nome da variável onde se deseja seja colocado um valor.Na parte de operandos coloca-se uma expressão cujo resultado seja aquele que se deseja como conteúdo da variável.

Exemplos:

&VGA1 SETA 2&VGB1 SETB 101&VGC1 SETC 'GENTE'&VGA2 SETA 2+&VLA1&VGB2 SETB 1001+11&VGC2 SETC 'ABCDEF'&VGA3 SETA 2+L'CAMPO&VGB3 SETB 1+11+111&VGC3 SETC 'MUDOU'

131131

Page 132: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-5 ANOP, MNOTE E AREAD

ANOP

O comando ANOP causa uma não operação pelo montador Assembler, permitindo identificar um ponto do programa fonte através de um símbolo de sequência, sem a necessidade de ter alguma operação associada. Exemplo: MACRO YYY . . ..TESTE ANOP . . . MEND

MNOTE

O comando MNOTE tem por finalidade exibir uma mensagem de aviso ao programa. O aviso pode ser tanto um comentário quanto uma mensagem de erro. Seu formato é o seguinte:

MNOTE codigoseveridade,'mensagem'

O código de severidade pode ser * , o que indica simples comentário; a vantagem em relação ao * na posição 1 é que o Assembler faz no MNOTE a substituição dos símbolos variáveis. Exemplo:

MACRO QUALKER &PARAM MNOTE *,'O PARAMETRO INFORMADO FOI &PARAM' DC C'&PARAM' MEND

Uma chamada da macro desta forma: QUALKER ALBERTO ao ser expandida geraria:

+ *,O PARAMETRO INFORMADO FOI ALBERTO+ DC C'ALBERTO'

O código de severidade, quando diferente de * (um número de 0 a 255) indica um erro de montagem, e está associado ao PARM do montador. Se o sub-parâmetro FLAG do PARM estiver com FLAG(0), que é o default, as mensagens de erro dos MNOTE com código de severidade zero ou maior serão listadas como erro. FLAG(8) irá suprimir mensagens de erro para as mensagens com código de severidade 0 a 7.

132132

Page 133: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

AREAD

Este comando tem por função colocar um valor num string definido através do comando LCLC ou GBLC. O conteúdo a ser colocado é o conteúdo do(s) "statement(s)" seguinte(s) à chamada da macro que contenha o(s) comando(s) AREAD. Seu formato é o seguinte:

simbolovariavel AREAD ousimbolovariavel AREAD NOSTMT ousimbolovariavel AREAD NOPRINT

Se não for especificado o operando, o statement lido é impresso e a ele é associado um número (número de statement); se for especificado NOSTMT, o statement lido é listado, mas a ele não é atribuído um número; e se for especificado NOPRINT, o statement lido não é listado, e a ele também não é atribuído um número. Exemplo:

Se este for o fonte do programa:

MACRO MEXAR LCLC &VAR1,&VAR2 &VAR1 AREAD DC C'&VAR1' &VAR2 AREAD DC C'&VAR2' MEND PROGRAMA CSECT MEXAR PRIMEIRA LEITURA VIA AREAD DA PRIMEIRA CHAMADA DA MEXAR SEGUNDA LEITURA VIA AREAD DA PRIMEIRA CHAMADA DA MEXAR MEXAR PRIMEIRA LEITURA DA SEGUNDA CHAMADA DA MEXAR SEGUNDA LEITURA DA SEGUNDA CHAMADA DA MEXAR END

O programa gerado terá:

PROGRAMA CSECT MEXAR+ DC C'PRIMEIRA LEITURA VIA AREAD DA PRIMEIRA CHAMADA DA MEXAR'+ DC C'SEGUNDA LEITURA VIA AREAD DA PRIMEIRA CHAMADA DA MEXAR' MEXAR+ DC C'PRIMEIRA LEITURA DA SEGUNDA CHAMADA DA MEXAR '+ DC C'SEGUNDA LEITURA DA SEGUNDA CHAMADA DA MEXAR' END

133133

Page 134: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-6 MHELP

O comando MHELP tem por finalidade controlar um conjunto de recursos de trace e dump para macros, de forma a facilitar a sua depuração.Para tanto, o Assembler usa uma full-word, a qual tem um número que indica o valor máximo desejado para o &SYSNDX (se o valor for maior que 255 - quando &SYSNDX alcançar o valor, a geração da macro é terminada), e, além disso, o último byte à direita (byte 3) indica as opções de trace.IMPORTANTE: o número é tratado como único, mas tem funções ambíguas.

BYTE 3 = BIT 0 = (B'10000000') = MHELP supression. se ligado, anula as opções em vigor do MHELP. BIT 1 = (B'01000000') = macro hex dump. usada em conjunto com as opções dos bits 5, 4 e 3, causará uma listagem (dump) dos parâmetros e dos símbolos carater (SETC) em EBCDIC e em hexa. Os símbolos do sistema serão listados somente em EBCDIC. BIT 2 = (B'00100000') = global supression. suprime a listagem dos símbolos globais nas condições pedidas pelos bits 4 e 5. BIT 3 = (B'00010000') = macro entry dump. causa a listagem (dump) dos valores dos parâmetros logo após a chamada da macro. BIT 4 = (B'00001000') = macro exit dump. causa a listagem (dump) dos valores dos símbolos variáveis com valores colocados pelos comandos SET, antes de MEXIT ou de MEND. BIT 5 = (B'00000100') = macro AIF dump causa a listagem (dump) dos valores dos símbolos variáveis com valores colocados pelos comandos SET, antes de cada AIF. BIT 6 = (B'00000010') = macro branch trace. se ligado, gera uma linha de trace para cada AGO ou AIF que ocasionaram um desvio. Nessa linha indica o statement "de" onde foi efetuado o desvio e o statement "para" onde foi efetuado o desvio. Esta opção não fica ativa para macros de bibliotecas. BIT 7 = (B'00000001') = macro call trace. controla trace de chamada de macro (gera uma linha com o nome da macro chamada, seu nível de aninhamento e o valor do &SYSNDX.

Exemplos:

MHELP 256 limita a &SYSNDX a 256 MHELP 1 trace macro calls MHELP 256+1 limita &SYSNDX a 257 e faz trace dos macros calls

134134

Page 135: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-7 DESVIOS - AGO, ACTR E AIF

O comando AGO indica que o montador deve dirigir-se, interpretativamente, a um ponto do programa fonte identificado através de um símbolo de sequência.O comando ACTR indica a quantidade máxima de desvios interpretados que podem ser efetuados através do AGO ou do AIF (veja próximo tópico). Ex:

MACRO XXXXX LCLA &A ACTR 1000 . . ..LUP ANOP . . AGO .LUP . . MEND

O comando AIF tem por função efetuar um teste (em tempo de montagem) e desviar condicionalmente para determinado ponto nos statements que compõem a macro-instrução.

O seu formato é:

(símbolo de AIF (expressão operador expressão)símbolodesequênciasequência)

Vejamos alguns exemplos:

AIF (&A LT &B).AMENOR.TESTE AIF ('&PRM1' NE '').VEIOPR1 AIF (&VGA1+1 EQ 99).JAFEZ

Os operadores podem ser:

EQ (equal to - igual a) NE (not equal to - diferente de) LT (less than - menor que) GT (greater than - maior que) LE (less or equal to - menor ou igual) GE (greater than or equal to - maior ou igual).

Dentro da especificação pode-se também utilizar os operadores lógicos AND ou OR, como por exemplo:

AIF (&A GT 5 OR &A LT 9).NAFAIXA

135135

Page 136: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-8 PARÂMETROS POSICIONAIS E KEYWORD

Uma macro instrução pode ter dois tipos de parâmetros: posicionais e keyword.Pode ter também os dois tipos, desde que os posicionais sejam especificados antes dos keyword, e estes em qualquer ordem.

Os parâmetros POSICIONAIS são aqueles que são identificados pela sua posição relativa no conjunto de parâmetros. Eles necessitam ser especificados na ordem adequada, e, caso se queira omitir algum, isso deve ser indicado através da presença de uma vírgula. Exemplo:

MACRO MACPA1 &P1,&P2,&P3X DC A(&P1)Y DC A(&P2)Z DC A(&P3)

MEND

Neste caso, o campo X será definido com conteúdo dependente do primeiro parâmetro, o campo Y com conteúdo dependente do segundo parâmetro e o campo Z com conteúdo dependente do terceiro parâmetro.A chamada da macro, especificando-se os três parâmetros, deve ser :

MACPA1 ALFA,BETA,GAMA

Caso fosse omitido algum dos parâmetros, isso ocasionaria erro de montagem, pois haveria a tentativa de gerar uma constante de endereço de uma expressão não informada.Se especificássemos MACPA1 FLD,,CPO então seria gerado:

DC A(FLD) DC A() DC A(CPO)onde o segundo comando DC tem erro de sintaxe.Para que seja possível omitir um parâmetro, quase sempre deve ser feito um teste pela própria macro a respeito de sua existência, de forma a gerar somente o que for necessário em função da omissão do(s) parâmetro(s). O teste deve ser feito com o comando AIF, da seguinte forma:

ASSIM OU ENTÃO

MACRO MACRO MACPA1 &P1,&P2,&P3 MACPA1 &P1,&P2,&P3 AIF ('&P1' EQ '').NG1 AIF (T'&P1 EQ 'O').NG1X DC A(&P1) X DC A(&P1).NG1 AIF ('&P2' EQ '').NG2 .NG1 AIF (T'&P2 EQ 'O').NG2Y DC A(&P2) Y DC A(&P2).NG2 AIF ('&P3' EQ '').NG3 .NG2 AIF (T'&P3 EQ 'O').NG3Z DC A(&P3) Z DC A(&P3).NG3 ANOP .NG3 ANOP

MEND MEND

136136

Page 137: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

De uma forma ou de outra, à medida que o teste é feito e que o comando DC é "bypassado" caso o parâmetro tenha sido omitido, não seria feita a tentativa de gerar o DC de uma expressão não fornecida, e, consequentemente, não haveria erro de montagem devido a isso.

Os parâmetros KEYWORD são especificados através de palavras-chave (seguidas do carater =), o que permite ao montador identificá-lo. Devido a isso, podem ser especificados em qualquer ordem e ser usados na chamada da macro também em qualquer ordem.Além disso, os parâmetros keyword permitem que se coloque um valor "default"; neste caso, se não forem especificados na chamada da macro, será entendido pelo montador como se ele tivesse sido especificado tendo como conteúdo o valor do default colocado na definição da macro. Vejamos o seguinte exemplo:

MACRO MACPA1 &P2=,&P1=,&P3=X DC A(&P1)Y DC A(&P2)Z DC A(&P3)

MEND

Neste caso, nenhum dos parâmetros tem valor default, de forma que se fosse feita uma chamada da macro com MACPA1 P3=FLD,P2=FFF,P1=TT seria gerado:

DC A(TT) DC A(FFF) DC A(FLD)

Mas, se a chamada fosse feita com MACPA1 P3=FLD,P1=TT seria gerado:

DC A(TT) DC A() DC A(FLD)

Caso a macro tivesse sido definida assim:

MACRO MACPA1 &P2=KKK,&P1=WWW,&P3=YYYX DC A(&P1)Y DC A(&P2)Z DC A(&P3)

MEND

e a sua chamada fosse MACPA1 P3=FLD,P1=TT seria gerado:

DC A(TT) DC A(KKK) DC A(FLD)

Portanto, se não houver valores default, e o conteúdo for necessário para efeito de sintaxe, cabe à macro testar se o(s) parâmetro(s) foi(foram) informado(s) ou não, para gerar os statements adequadamente.

137137

Page 138: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-9 FUNCIONAMENTO DAS MACROS - EXEMPLOS

5-9-1 Macro sem símbolo e sem parâmetros

MACRO SIMPLES DC C'CAMPO GERADO PELA MACRO SIMPLES' MEND EXMAC001 START . . . SIMPLES+ DC C'CAMPO GERADO PELA MACRO SIMPLES' . . . SIMPLES+ DC C'CAMPO GERADO PELA MACRO SIMPLES' . . . END

5-9-2 Macro com símbolo fixo e sem parâmetros

MACRO MACSIM NOME DC C'CAMPO GERADO PELA MACRO MACSIM' MEND EXMAC002 START . . . MACSIM+NOME DC C'CAMPO GERADO PELA MACRO MACSIM' . . . MACSIM+NOME DC C'CAMPO GERADO PELA MACRO MACSIM' . . . END

Observar que neste caso, haveria erro de montagem, à medida em que foi definido mais do que um campo com o mesmo símbolo. Cabe ao programador, sabendo das convenções e limitações de uma macro em particular, não transgredir essas normas, pois o erro não é, neste caso, da macro, e sim originário do fato de ela ter sido impropriamente chamada duas vezes.

138138

Page 139: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-9-3 Macro com símbolo variável e sem parâmetros

MACRO MACVAR &LAB DC C'CAMPO GERADO PELA MACRO MACVAR' MEND EXMAC003 START . . . ANA MACVAR+ANA DC C'CAMPO GERADO PELA MACRO MACVAR' . . . BETE MACVAR+BETE DC C'CAMPO GERADO PELA MACRO MACVAR' . . . END

5-9-4 Macro com símbolo variável e com 1 parâmetro posicional

MACRO &JJJ MACTOK &VAL &JJJ DC F'&VAL' MEND EXMAC004 START . . CIDA MACTOK 256+CIDA DC F'256' . . DIANA MACTOK 100+DIANA DC F'100' . . ELISA MACTOK Esta chamada causaria erro de montagem+ELISA DC F'' . . END

139139

Page 140: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-9-5 Macro com símbolo variável e com 2 parâmetros posicionais

MACRO &KKK MACTIK &VALX,&VALY &KKK DC F'&VALX,&VALY' MEND EXMAC005 START . . MACTIK -1,-2+ DC F'-1,-2' . . FERNANDA MACTIK 256,100+FERNANDA DC F'256,100' . . GILDA MACTIK 100,256+GILDA DC F'100,256' . . HEBE MACTIK 300 Esta chamada causaria erro de montagem+HEBE DC F'300,' . . IEDA MACTIK ,300 Esta chamada causaria erro de montagem+IEDA DC F',300' . . END

5-9-6 Macro com símbolo variável e com 1 parâmetro keyword (sem default)

MACRO &LL MACTAK &VAL= &LL DC F'&VAL' MEND EXMAC006 START . . JULIA MACTAK VAL=256+JULIA DC F'256' . . . MACTAK Esta chamada causaria erro de montagem,, pois . não foi especificado o parâmetro END

140140

Page 141: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-9-7 Macro com símbolo variável e com 1 parâmetro keyword (com default)

MACRO &MVVB MACTEK &VAL=06 &MVVB DC F'&VAL' MEND EXMAC007 START . . MACTEK VAL=256+ DC F'256' . . MACTEK + DC F'06' . . KAREN MACTEK +KAREN DC F'06' . . LIGIA MACTEK VAL=88 +LIGIA DC F'88' . . END

5-9-8 Macro com símbolo variável e com 2 parâmetros keyword (sem default)

MACRO &TA MACTUK &VAL=,&NUM= &TA DC F'&VAL,&NUM' MEND EXMAC008 START . . MARTA MACTUK VAL=22,NUM=33+MARTA DC F'22,33' . . MACTUK NUM=55,VAL=77+ DC F'77,55' . . MACTUK NUM=3 Esta chamada causaria erro de montagem, . pois VAL não foi especificado . MACTUK VAL=99 Esta chamada causaria erro de montagem, . pois NUM não foi especificado . MACTUK Esta chamada causaria erro de montagem . pois não foram especificados parâmetros . END

141141

Page 142: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

5-9-9 Macro com símbolo variável e com 2 parâmetros keyword (com default)

MACRO &TOO MACTOO &VAL=19,&NUM=54 &TOO DC F'&VAL,&NUM' MEND EXMAC009 START . . NADIA MACTOO VAL=22,NUM=33+NADIA DC F'22,33' . . MACTOO NUM=55,VAL=77+ DC F'77,55' . . MACTOO NUM=3+ DC F'19,3' . . MACTOO VAL=99+ DC F'99,54' . . MACTOO+ DC F'19,54' . . END

142142

Page 143: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

A P E N D I C E S

APÊNDICE A - INSTRUÇÕES DE MÁQUINAAPÊNDICE B - TABELA DE POTÓNCIASAPÊNDICE C - TABELA DE CARACTERES EBCDICAPÊNDICE D - CARACTERES DE CONTROLE (Impressão)APÊNDICE E - INTERRUPÇÕES POR ERRO DE PROGRAMAAPÊNDICE F - TRUQUES ÚTEIS A PROGRAMAS ASSEMBLERAPÊNDICE G - ALGUMAS MACROS MVSAPÊNDICE H - EXEMPLO DE PROGRAMA EM MVSAPÊNDICE I - ALGUMAS MACROS VSEAPÊNDICE J - EXEMPLO DE PROGRAMA EM VSEAPÊNDICE K - ALGUMAS MACROS VMAPÊNDICE L - EXEMPLO DE PROGRAMA EM VMAPÊNDICE M - MACROS XEGUEI E TCHAUAPÊNDICE N - EXEMPLO 1 DE SUBROTINAAPÊNDICE O - EXEMPLO 2 DE SUBROTINAAPÊNDICE P - MONTAGEM DE PROGRAMA DE DEMONSTRAÇÃO 1APÊNDICE Q - MONTAGEM DE PROGRAMA DE DEMONSTRAÇÃO 2

143143

Page 144: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE A - INSTRUÇÕES

Esta tabela apresenta o conjunto de instruções da arquitetura ESA.Está dividida em duas colunas principais: a da esquerda, apresenta as instruções por ordem alfabética de seu mnemônico Assembler; a da direita as apresenta por ordem de código (hexa) de operação.

Cada uma das duas colunas principais contém as seguintes informações:

a) código mnemônico Assembler.b) código de operaçãoc) tipo de instruçãod) posicionamento do Condition Code (se tiver S, a instrução o posiciona)e) PF = instrução de ponto flutuante P = instrução privilegiada Q = instrução semi-privilegiada I = instrução interrompível

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

------ 00 ----- - --- ------ 00 ----- - --- ------ 02 ----- - --- PR 0101 E S Q ------ 03 ----- - --- UPT 0102 E S I ------ 08 ----- - --- ------ 02 ----- - --- ------ 09 ----- - --- ------ 03 ----- - --- ------ 52 ----- - --- SPM 04 RR ------ 53 ----- - --- BALR 05 RR ------ 61 ----- - --- BCTR 06 RR ------ 62 ----- - --- BCR 07 RR ------ 63 ----- - --- ------ 08 ----- - --- ------ 64 ----- - --- ------ 09 ----- - --- ------ 65 ----- - --- SVC 0A RR ------ 66 ----- - --- BSM 0B RR ------ 71 ----- - --- BASSM 0C RR ------ 72 ----- - --- BASR 0D RR ------ 73 ----- - --- MVCL 0E RR S I ------ 74 ----- - --- CLCL 0F RR S I ------ 75 ----- - --- LPR 10 RR S ------ 76 ----- - --- LNR 11 RR S ------ 77 ----- - --- LTR 12 RR S ------ 81 ----- - --- LCR 13 RR S ------ 84 ----- - --- NR 14 RR S ------ 85 ----- - --- CLR 15 RR S ------ 9C ----- - --- OR 16 RR S ------ 9D ----- - --- XR 17 RR S ------ 9E ----- - --- LR 18 RR ------ 9F ----- - --- CR 19 RR S

144144

Page 145: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

------ A0 ----- - --- AR 1A RR S ------ A1 ----- - --- SR 1B RR S ------ A2 ----- - --- MR 1C RR ------ A3 ----- - --- DR 1D RR ------ A7 ----- - --- ALR 1E RR S ------ A8 ----- - --- SLR 1F RR S ------ A9 ----- - --- LPDR 20 RR S PF ------ AA ----- - --- LNDR 21 RR S PF ------ AB ----- - --- LTDR 22 RR S PF ------ B0 ----- - --- LCDR 23 RR S PF ------ B3 ----- - --- HDR 24 RR PF ------ B4 ----- - --- LRDR 25 RR PF ------ B5 ----- - --- MXR 26 RR PF ------ B8 ----- - --- MXDR 27 RR PF ------ B9 ----- - --- LDR 28 RR PF ------ BC ----- - --- CDR 29 RR S PF ------ C0 ----- - --- ADR 2A RR S PF ------ C1 ----- - --- SDR 2B RR S PF ------ C2 ----- - --- MDR 2C RR PF ------ C3 ----- - --- DDR 2D RR PF ------ C4 ----- - --- AWR 2E RR S PF ------ C5 ----- - --- SWR 2F RR S PF ------ C6 ----- - --- LPER 30 RR S PF ------ C7 ----- - --- LNER 31 RR S PF ------ C8 ----- - --- LTER 32 RR S PF ------ C9 ----- - --- LCER 33 RR S PF ------ CA ----- - --- HER 34 RR PF ------ CB ----- - --- LRER 35 RR PF ------ CC ----- - --- AXR 36 RR S PF ------ CD ----- - --- SXR 37 RR S PF ------ CE ----- - --- LER 38 RR PF ------ CF ----- - --- CER 39 RR S PF ------ D0 ----- - --- AER 3A RR S PF ------ D8 ----- - --- SER 3B RR S PF ------ E0 ----- - --- MER 3C RR PF ------ E1 ----- - --- DER 3D RR PF ------ E2 ----- - --- AUR 3E RR S PF ------ E3 ----- - --- SUR 3F RR S PF ------ E6 ----- - --- STH 40 RX ------ E7 ----- - --- LA 41 RX ------ E9 ----- - --- STC 42 RX ------ EA ----- - --- IC 43 RX ------ EB ----- - --- EX 44 RX ------ EC ----- - --- BAL 45 RX ------ ED ----- - --- BCT 46 RX ------ EE ----- - --- BC 47 RX ------ EF ----- - --- LH 48 RX ------ F4 ----- - --- CH 49 RX S

145145

Page 146: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

------ F5 ----- - --- AH 4A RX S ------ F6 ----- - --- SH 4B RX S ------ F7 ----- - --- MH 4C RX ------ FE ----- - --- BAS 4D RX ------ FF ----- - --- CVD 4E RX A 5A RX S CVB 4F RX AD 6A RX S PF ST 50 RX ADR 2A RR S PF LAE 51 RX AE 7A RX S PF ------ 52 ----- - AER 3A RR S PF ------ 53 ----- - AH 4A RX S N 54 RX S AL 5E RX S CL 55 RX S ALR 1E RR S O 56 RX S AP FA SSt1t2 S X 57 RX S AR 1A RR S L 58 RX AU 7E RX S PF C 59 RX S AUR 3E RR S PF A 5A RX S AW 6E RX S PF S 5B RX S AWR 2E RR S PF M 5C RX AXR 36 RR S PF D 5D RX BAKR B240 RRE Q AL 5E RX S BAL 45 RX SL 5F RX S BALR 05 RR STD 60 RX BAS 4D RX ------ 61 ----- - BASR 0D RR ------ 62 ----- - BASSM 0C RR ------ 63 ----- - BC 47 RX ------ 64 ----- - BCR 07 RR ------ 65 ----- - BCT 46 RX ------ 66 ----- - BCTR 06 RR MXD 67 RX BSM 0B RR LD 68 RX BXH 86 RS CD 69 RX S BXLE 87 RS AD 6A RX S C 59 RX S SD 6B RX S CD 69 RX S PF MD 6C RX CDR 29 RR S PF DD 6D RX CDS BB RS S AW 6E RX S CE 79 RX S PF SW 6F RX S CER 39 RR S PF STE 70 RX CFC B21A S S ----- 71 - - --- CH 49 RX S ------ 72 ----- - CL 55 RX S ------ 73 ----- - CLC D5 SS/L S ------ 74 ----- - CLCL 0F RR S ------ 75 ----- - --- CLI 95 SI S ------ 76 ----- - --- CLM BD RS S ------ 77 ----- - CLR 15 RR S LE 78 RX CP F9 SSt1t2 S CE 79 RX S

146146

Page 147: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

CPYA B24D RRE AE 7A RX S PF CR 19 RR S SE 7B RX S PF CS BA RS S ME 7C RX PF CSCH B230 S S P DE 7D RX PF CVB 4F RX AU 7E RX S PF CVD 4E RX SU 7F RX S PF D 5D RX SSM 80 S P DD 6D RX PF ------ 81 ----- - --- DDR 2D RR PF LPSW 82 S (1) P DE 7D RX PF Diagnose 83 - (2) DER 3D RR PF ------ 84 ----- - --- Diagnose 83 - (2) ------ 85 ----- - --- DP FD SSt1t2 BXH 86 RS DR 1D RR BXLE 87 RS DXR B22D RRE PF SRL 88 RS EAR B24F RRE SLL 89 RS ED DE SS/L S SRA 8A RS S P EDMK DF SS/L S SLA 8B RS S EPAR B226 RRE Q SRDL 8C RS EREG B249 RRE Q SLDL 8D RS ESAR B227 RRE Q SRDA 8E RS S ESTA B24A RRE S Q SLDA 8F RS S EX 44 RX STM 90 RS HDR 24 RR PF TM 91 SI S HER 34 RR PF MVI 92 SI HSCH B231 S S P TS 93 S S IAC B224 RRE S Q NI 94 SI S IC 43 RX CLI 95 SI S ICM BF RS S OI 96 SI S IPK B20B S Q XI 97 SI S IPM B222 RRE LM 98 RS IPTE B221 RRE P TRACE 99 RS P ISKE B229 RRE P LAM 9A RS IVSK B223 RRE Q STAM 9B RS L 58 RX ------ 9C ----- - --- LA 41 RX ------ 9D ----- - --- LAE 51 RX ------ 9E ----- - --- LAM 9A RS ------ 9F ----- - --- LASP E500 SSE S P ------ A0 ----- - --- LCDR 23 RR S PF ------ A1 ----- - --- LCER 33 RR S PF ------ A2 ----- - --- LCR 13 RR S ------ A3 ----- - --- LCTL B7 RS P VAE A400 VST LD 68 RX PF VSE A401 VST LDR 28 RR PF VME A402 VST LE 78 RX PF VDE A403 VST LER 38 RR PF VMAE A404 VST LH 48 RX VMSE A405 VST

147147

Page 148: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

LM 98 RS VMCE A406 VST LNDR 21 RR S PF VACE A407 VST LNER 31 RR S PF VCE A408 VST LNR 11 RR S VL A409 VST LPDR 20 RR S PF VLE A409 VST LPER 30 RR S PF VLM A40A VST LPR 10 RR S VLME A40A VST LPSW 82 S (1) P VLY A40B VST LR 18 RR VLYE A40B VST LRA B1 RX S P VST A40D VST LRDR 25 RR PF VSTE A40D VST LRER 35 RR PF VSTM A40E VST LTDR 22 RR S PF VSTME A40E VST LTER 32 RR S PF VSTK A40F VST LTR 12 RR S VSTKE A40F VST LURA B24B RRE P VAD A410 VST M 5C RX VSD A411 VST MC AF SI VMD A412 VST MD 6C RX PF VDD A413 VST MDR 2C RR PF VMAD A414 VST ME 7C RX PF VMSD A415 VST MER 3C RR PF VMCD A416 QST MH 4C RX VACD A417 VST MP FC SSt1t2 VCD A418 VST MR 1C RR VLD A419 VST MSCH B232 S S P VLMD A41A VST MSTA B247 RRE Q VLYD A41B VST MVC D2 SS/L VSTD A41D VST MVCDK E50F SSE Q VSTMD A41E VST MVCIN E8 SS/L VSTKD A41F VST MVCK D9 SSr1r2 S Q VA A420 VST MVCL 0E RR S I VS A421 VST MVCP DA SSr1r2 S Q VM A422 VST MVCS DB SSr1r2 S Q VN A424 VST MVCSK E50E SSE Q VO A425 VST MVI 92 SI VX A426 VST MVN D1 SS/L VC A428 VST MVO F1 SSt1t2 VLH A429 VST MVZ D3 SS/L VLINT A42A VST MXD 67 RX PF VSTH A42D VST MXDR 27 RR PF VAES A480 QST MXR 26 RR PF VSES A481 QST N 54 RX S VMES A482 QST NC D4 SS/L S VDES A483 QST NI 94 SI S VMAES A484 QST NR 14 RR S VMSES A485 QST O 56 RX S VCES A488 QST OC D6 SS/L S VADS A490 QST

148148

Page 149: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

OI 96 SI S VSDS A491 QST OR 16 RR S VMDS A492 QST PACK F2 SSt1t2 VDDS A493 QST PALB B248 RRE P VMADS A494 QST PC B218 S Q VMSDS A495 QST PR 0101 E S Q VCDS A498 QST PT B228 RRE Q VAS A4A0 QST PTLB B20D S P VSS A4A1 QST RCHP B23B S S P VMS A4A2 QST RRBE B22A RRE S P VNS A4A4 QST RSCH B238 S S P VOS A4A5 QST S 5B RX S VXS A4A6 QST SAC B219 S Q VCS A4A8 QST SAL B237 S P VAER A500 VV SAR B24E RRE VSER A501 VV SCHM B23C S P VMER A502 VV SCK B204 S S P VDER A503 VV SCKC B206 S P VMCER A506 VV SD 6B RX S PF VACER A507 VV SDR 2B RR S PF VCER A508 VV SE 7B RX S PF VLER A509 VV SER 3B RR S PF VLR A509 VV SH 4B RX S VLMER A50A VV SIE B214 S IP VLMR A50A VV SIGP AE RS S P VLZER A50B VV SL 5F RX S VLZR A50B VV SLA 8B RS S VADR A510 VV SLDA 8F RS S VSDR A511 VV SLDL 8D RS VMDR A512 VV SLL 89 RS VDDR A513 VV SLR 1F RR S VMCDR A516 VV SP FB SSt1t2 S VACDR A517 VV SPKA B20A S Q VCDR A518 VV SPM 04 RR VLDR A519 VV SPT B208 S P VLMDR A51A VV SPX B210 S P VLZDR A51B VV SR 1B RR S VAR A520 VV SRA 8A RS S P VSR A521 VV SRDA 8E RS S VMR A522 VV SRDL 8C RS VNR A524 VV SRL 88 RS VOR A525 VV SRP F0 SSt1i3 S VXR A526 VV SSAR B225 RRE Q VCR A528 VV SSCH B233 S S P VLPER A540 VV SSKE B22B RRE P VLNER A541 VV SSM 80 S P VLCER A542 VV ST 50 RX VLPDR A550 VV STAM 9B RS VLNDR A551 VV

149149

Page 150: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

STAP B212 S P VLCDR A552 VV STC 42 RX VLPR A560 VV STCK B205 S S VLNR A561 VV STCKC B207 S P VLCR A562 VV STCM BE RS VAEQ A580 QV STCPS B23A S P VSEQ A581 QV STCRW B239 S S P VMEQ A582 QV STCTL B6 RS P VDEQ A583 QV STD 60 RX PF VMAEQ A584 QV STE 70 RX PF VMSEQ A585 QV STH 40 RX VCEQ A588 QV STIDP B202 S P VLEQ A589 QV STM 90 RS VLMEQ A58A QV STNSM AC S P VADQ A590 QV STOSM AD S P VSSDQ A591 QV STPT B209 S P VMDQ A592 QV STPX B211 S P VDDQ A593 QV STSCH B234 S S P VMADQ A594 QV STURA B246 RRE P VMSDQ A595 QV SU 7F RX S PF VCDQ A596 QV SUR 3F RR S PF VLDQ A599 QV SVC 0A RR VLMDQ A59A QV SW 6F RX S PF VAQ A5A0 QV SWR 2F RR S PF VSQ A5A1 QV SXR 37 RR S PF VMQ A5A2 QV TAR B24C RRE S Q VNQ A5A4 QV TB B22C RRE S P VOQ A5A5 QV TM 91 SI S VXQ A5A6 QV TPI B236 S S P VCQ A5A8 QV TPROT E501 SSE S P VLQ A5A9 QV TR DC SS/L VLMQ A5AA QV TRACE 99 RS P VMXSE A600 VR TRT DD SS/L S VMNSE A601 VR TS 93 S S VMXAE A602 VR TSCH B235 S S P VLELE A608 VR UNPK F3 SSt1t2 VXELE A609 VR UPT 0102 E S VMXSD A610 VR VA A420 VST VMNSD A611 VR VACD A417 VST VMXAD A612 VR VACDR A517 VV VLELD A618 VR VACE A407 VST VXELD A619 VR VACER A507 VV VSPSD A61A VR VACRS A6CB S P VZPSD A61B VR VACSV A6CA S P VLEL A628 VR VAD A410 VST VXEL A629 VR VADQ A590 QV VTVM A640 RRE VADR A510 VV VCVM A641 RRE VADS A490 QST VCZVM A642 RRE S

150150

Page 151: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

VAE A400 VST VCOVM A643 RRE S VAEQ A580 QV VXVC A644 RRE VAER A500 VV VLVCU A645 RRE S VAES A480 QST VXVMM A646 RRE VAQ A5A0 QV VRRS A648 RRE VAR A520 VV VRSVC A649 RRE VAS A4A0 QST VRSV A64A RRE VC A428 VST VLVM A680 VS VCD A418 VST VLCVM A681 VS VCDQ A596 QV VSTVM A682 VS VCDR A518 VV VNVM A684 VS VCDS A498 QST VOVM A685 VS VCE A408 VST VXVM A686 VS VCEQ A588 QV VSRSV A6C0 S VCER A508 VV VMRSV A6C1 S VCES A488 QST VSRRS A6C2 S VCOVM A643 RRE S VMRRS A6C3 S VCQ A5A8 QV VLVCA A6C4 S S VCR A528 VV VRCL A6C5 S VCS A4A8 QST VSVMM A6C6 S VCVM A641 RRE VSTVP A6C8 S VCZVM A642 RRE S VACSV A6CA S P VDD A413 VST VACRS A6CB S P VDDQ A593 QV ------ A7 ----- - --- VDDR A513 VV ------ A8 ----- - --- VDDS A493 QST ------ A9 ----- - --- VDE A403 VST ------ AA ----- - --- VDEQ A583 QV ------ AB ----- - --- VDER A503 VV STNSM AC SI P VDES A483 QST STOSM AD SI P VL A409 VST SIGP AE RS S P VLBIX E428 RSE S MC AF SI VLCDR A552 VV ------ B0 ----- - --- VLCER A542 VV LRA B1 RX S P VLCR A562 VV STIDP B202 S P VLCVM A681 VS SCK B204 S S P VLD A419 VST STCK B205 S S VLDQ A599 QV SCKC B206 S P VLDR A519 VV STCKC B207 S P VLE A409 VST SPT B208 S P VLEL A628 VR STPT B209 S P VLELD A618 VR SPKA B20A S Q VLELE A608 VR PK B20B S Q VLEQ A589 QV PTLB B20D S P VLER A509 VV SPX B210 S P VLH A429 VST STPX B211 S P VLI E400 RSE STAP B212 S P VLID E410 RSE SIE B214 S IP

151151

Page 152: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

VLIE E400 RSE PC B218 S Q VLINT A42A VST SAC B219 S Q VLM A40A VST CFC B21A S S I VLMD A41A VST IPTE B221 RRE P VLMDQ A59A QV IPM B222 RRE VLMDR A51A VV IVSK B223 RRE Q VLME A40A VST IAC B224 RRE S Q VLMEQ A58A QV SSAR B225 RRE Q VLMER A50A VV EPAR B226 RRE Q VLMQ A5AA QV ESAR B227 RRE Q VLMR A50A VV PT B228 RRE Q VLNDR A551 VV ISKE B229 RRE P VLNER A541 VV RRBE B22A RRE S P VLNR A561 VV SSKE B22B RRE P VLPDR A550 VV TB B22C RRE S P VLPER A540 VV DXR B22D RRE PF VLPR A560 VV CSCH B230 S S P VLQ A5A9 QV HSCH B231 S S P VLR A509 VV MSCH B232 S S P VLVCA A6C4 S S SSCH B233 S S P VLVCU A645 RRE S STSCH B234 S S P VLVM A680 VS TSCH B235 S S P VLY A40B VST TPI B236 S S P VLYD A41B VST SAL B237 S P VLYE A40B VST RSCH B238 S S P VLZDR A51B VV STCRW B239 S S P VLZER A50B VV STCPS B23A S P VLZR A50B VV RCHP B23B S S P VM A422 VST SCHM B23C S P VMAD A414 VST BAKR B240 RRE Q VMADQ A594 QV STURA B246 RRE P VMADS A494 QST MSTA B247 RRE Q VMAE A404 VST PALB B248 RRE P VMAEQ A584 QV EREG B249 RRE Q VMAES A484 QST ESTA B24A RRE S Q VMCD A416 QST LURA B24B RRE P VMCDR A516 VV TAR B24C RRE S Q VMCE A406 VST CPYA B24D RRE VMCER A506 VV SAR B24E RRE VMD A412 VST EAR B24F RRE VMDQ A592 QV ------ B3 ----- - --- VMDR A512 VV ------ B4 ----- - --- VMDS A492 QST ------ B5 ----- - --- VME A402 VST STCTL B6 RS P VMEQ A582 QV LCTL B7 RS P VMER A502 VV ------ B8 ----- - --- VMES A482 QST ------ B9 ----- - --- VMNSD A611 VR CS BA RS S

152152

Page 153: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

VMNSE A601 VR CDS BB RS S VMQ A5A2 QV ------ BC ----- - --- VMR A522 VV CLM BD RS S VMRRS A6C3 S STCM BE RS VMRSV A6C1 S ICM BF RS S VMS A4A2 QST ------ C0 ----- - --- VMSD A415 VST ------ C1 ----- - --- VMSDQ A595 QV ------ C2 ----- - --- VMSDS A495 QST ------ C3 ----- - --- VMSE A405 VST ------ C4 ----- - --- VMSEQ A585 QV ------ C5 ----- - --- VMSES A485 QST ------ C6 ----- - --- VMXAD A612 VR ------ C7 ----- - --- VMXAE A602 VR ------ C8 ----- - --- VMXSD A610 VR ------ C9 ----- - --- VMXSE A600 VR ------ CA ----- - --- VN A424 VST ------ CB ----- - --- VNQ A5A4 QV ------ CC ----- - --- VNR A524 VV ------ CD ----- - --- VNS A4A4 QST ------ CE ----- - --- VNVM A684 VS ------ CF ----- - --- VO A425 VST ------ D0 ----- - --- VOQ A5A5 QV MVN D1 SS/L VOR A525 VV MVC D2 SS/L VOS A4A5 QST MVZ D3 SS/L VOVM A685 VS NC D4 SS/L S VRCL A6C5 S CLC D5 SS/L S VRRS A648 RRE OC D6 SS/L S VRSV A64A RRE XC D7 SS/L S VRSVC A649 RRE ------ D8 ----- - --- VS A421 VST MVCK D9 SSr1r2 S Q VSD A411 VST MVCP DA SSr1r2 S Q VSDQ A591 QV MVCS DB SSr1r2 S Q VSDR A511 VV TR DC SS/L VSDS A491 QST TRT DD SS/L S VSE A401 VST ED DE SS/L S VSEQ A581 QV EDMK DF SS/L S VSER A501 VV ------ E0 ----- - --- VSES A481 QST ------ E1 ----- - --- VSLL E425 RSE ------ E2 ----- - --- VSPSD A61A VR ------ E3 ----- - --- VSQ A5A1 QV VLI E400 RSE VSR A521 VV VLIE E400 RSE VSRL E424 RSE VSTI E401 RSE VSRRS A6C2 S VSTIE E401 RSE VSRSV A6C0 S VLID E410 RSE VSS A4A1 QST VSTID E411 RSE VST A40D VST VSRL E424 RSE

153153

Page 154: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO ---------

Mnemônico Cod.Instr Tipo CC PF/IPQ Mnemônico Cod.Instr Tipo CC PF/IPQ

VSTD A41D VST VSLL E425 RSE VSTE A40D VST VLBIX E428 RSE S VSTH A42D VST LASP E500 SSE S P VSTI E401 RSE TPROT E501 SSE S P VSTID E411 RSE MVCSK E50E SSE Q VSTIE E401 RSE MVCDK E50F SSE Q VSTK A40F VST ------ E6 ----- - --- VSTKD A41F VST ------ E7 ----- - --- VSTKE A40F VST MVCIN E8 SS/L VSTM A40E VST ------ E9 ----- - --- VSTMD A41E VST ------ EA ----- - --- VSTME A40E VST ------ EB ----- - --- VSTVM A682 VS ------ EC ----- - --- VSTVP A6C8 S ------ ED ----- - --- VSVMM A6C6 S ------ EE ----- - --- VTVM A640 RRE ------ EF ----- - --- VX A426 VST SRP F0 SSt1I3 S VXEL A629 VR MVO F1 SSt1t2 VXELD A619 VR PACK F2 SSt1t2 VXELE A609 VR UNPK F3 SSt1t2 VXQ A5A6 QV ------ F4 ----- - --- VXR A526 VV ------ F5 ----- - --- VXS A4A6 QST ------ F6 ----- - --- VXVC A644 RRE ------ F7 ----- - --- VXVM A686 VS ZAP F8 SSt1t2 S VXVMM A646 RRE CP F9 SSt1t2 S VZPSD A61B VR AP FA SSt1t2 S X 57 RX S SP FB SSt1t2 S XC D7 SS/L S MP FC SSt1t2 XI 97 SI S DP FD SSt1t2 XR 17 RR S ------ FE ----- - --- ZAP F8 SSt1t2 S ------ FF ----- - ---

154154

Page 155: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE B - TABELAS DE POTÊNCIAS DE 2 E 16

POTÊNCIAS DE 2 E DE 16

16**00 = 2**00 = 1 16**08 = 2**32 = 4.294.967.296 2**01 = 2 2**33 = 8.589.934.592 2**02 = 4 2**34 = 17.179.869.184 2**03 = 8 2**35 = 34.359.738.36816**01 = 2**04 = 16 16**09 = 2**36 = 68.719.476.736 2**05 = 32 2**37 = 137.438.953.472 2**06 = 64 2**38 = 274.877.906.944 2**07 = 128 2**39 = 549.755.813.88816**02 = 2**08 = 256 16**10 = 2**40 = 1.099.511.627.776 2**09 = 512 2**41 = 2.199.023.255.552 2**10 = 1.024 2**42 = 4.398.046.511.104 2**11 = 2.048 2**43 = 8.796.093.022.20816**03 = 2**12 = 4.096 16**11 = 2**44 = 17.592.186.044.416 2**13 = 8.192 2**45 = 35.184.372.088.832 2**14 = 16.384 2**46 = 70.368.744.177.664 2**15 = 32.768 2**47 = 140.737.488.355.32816**04 = 2**16 = 65.536 16**12 = 2**48 = 281.474.976.710.656 2**17 = 131.072 2**49 = 562.949.953.421.312 2**18 = 262.144 2**50 = 1.125.899.906.842.624 2**19 = 524.288 2**51 = 2.251.799.813.685.24816**05 = 2**20 = 1.048.576 16**13 = 2**52 = 4.503.599.627.370.496 2**21 = 2.097.152 2**53 = 9.007.199.254.740.992 2**22 = 4.194.304 2**54 = 18.014.398.509.481.984 2**23 = 8.388.608 2**55 = 36.028.797.018.963.96816**06 = 2**24 = 16.777.216 16**14 = 2**56 = 72.057.594.037.927.936 2**25 = 33.554.432 2**57 = 144.115.188.075.855.872 2**26 = 67.108.864 2**58 = 288.230.376.151.711.744 2**27 = 134.217.728 2**59 = 576.460.752.303.423.48816**07 = 2**28 = 268.435.456 16**15 = 2**60 = 1.152.921.504.606.846.976 2**29 = 536.870.912 2**61 = 2.305.843.009.213.693.952 2**30 = 1.073.741.824 2**62 = 4.611.686.018.427.387.904 2**31 = 2.147.483.648 16**00 = 2**63 = 9.223.372.036.854.775.808

1K = 1024 1M = 1.048.576 1G = 1.073.741.824 1T = 1.099.511.627.776

155155

Page 156: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

POTÊNCIAS DE 16 MULTIPLICADAS POR 0...15

POTÊNCIA 0 POTÊNCIA 1 POTÊNCIA 2 POTÊNCIA 3

00 0 00 0 00 0 00 001 1 01 16 01 256 01 4.09602 2 02 32 02 512 02 8.19203 3 03 48 03 768 03 12.28804 4 04 64 04 1.024 04 16.38405 5 05 80 05 1.280 05 20.48006 6 06 96 06 1.536 06 24.57607 7 07 112 07 1.792 07 28.67208 8 08 128 08 2.048 08 32.76809 9 09 144 09 2.304 09 36.86410 10 10 160 10 2.560 10 40.96011 11 11 176 11 2.816 11 45.05612 12 12 192 12 3.072 12 49.15213 13 13 208 13 3.328 13 53.24814 14 14 224 14 3.584 14 57.34415 15 15 240 15 3.840 15 61.440

POTÊNCIA 4 POTÊNCIA 5 POTÊNCIA 6 POTÊNCIA 7

00 0 00 0 00 0 00 0 01 65.536 01 1.048.576 01 16.777.216 01 268.435.456 02 131.072 02 2.097.152 02 33.554.432 02 536.870.912 03 196.608 03 3.145.728 03 50.331.648 03 805.306.368 04 262.144 04 4.194.304 04 67.108.864 04 1.073.741.824 05 327.680 05 5.242.880 05 83.886.080 05 1.342.177.280 06 393.216 06 6.291.456 06 100.663.296 06 1.610.612.736 07 458.752 07 7.340.032 07 117.440.512 07 1.879.048.192 08 524.288 08 8.388.608 08 134.217.728 08 2.147.483.648 09 589.824 09 9.437.184 09 150.994.944 09 2.415.919.104 10 655.360 10 10.485.760 10 167.772.160 10 2.684.354.560 11 720.896 11 11.534.336 11 184.549.376 11 2.952.790.016 12 786.432 12 12.582.912 12 201.326.592 12 3.221.225.472 13 851.968 13 13.631.488 13 218.103.808 13 3.489.660.928 14 917.504 14 14.680.064 14 234.881.024 14 3.758.096.384 15 983.040 15 15.728.640 15 251.658.240 15 4.026.531.840

156156

Page 157: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE C - CARACTERES EBCDIC

HEX CARAC-

TER

HEX CARATER HEX CARATER HEX CARATER HEX CARATER HEX CARAC-

TER

00 30 60 - hífen 90 C0 { abre chave F0 001 31 61 / barra 91 i C1 A F1 102 32 62 92 j C2 B F2 203 33 63 93 k C3 C F3 304 34 64 94 l C4 D F4 405 35 65 95 m C5 E F5 506 36 66 96 n C6 F F6 607 37 67 97 o C7 G F7 708 38 68 98 p C8 H F8 809 39 69 99 q C9 I F9 90A 3A 6A 9A r CA FA 0B 3B 6B , virgula 9B CB FB 0C 3C 6C % percentual 9C CC FC 0D 3D 6D _ underscore 9D CD FD 0E 3E 6E > maior 9E CE FE 0F 3F 6F ?

interrogação9F CF FF

10 40 70 A0 D0 } fecha chave 11 41 71 A1 D1 J 12 42 72 A2 s D2 K 13 43 73 A3 t D3 L 14 44 74 A4 u D4 M 15 45 75 A5 v D5 N 16 46 76 A6 w D6 O 17 47 77 A7 x D7 P 18 48 78 A8 y D8 Q 19 49 79 A9 z D9 R 1A 4A 7A : 2 pontos AA DA 1B 4B . ponto 7B # número AB DB 1C 4C < menor 7C @ arroba AC DC 1D 4D ( abre arênteses 7D ' apostrofe AD DD 1E 4E + mais 7E = igual AE DE 1F 4F | barra vertical 7F " aspas AF DF 20 50 & E comercial 80 B0 E0 \ barra invertida 21 51 81 a B1 E1 22 52 82 b B2 E2 S 23 53 83 c B3 E3 T 24 54 84 d B4 E4 U 25 55 85 e B5 E5 V 26 56 86 f B6 E6 W 27 57 87 g B7 E7 X 28 58 88 h B8 E8 Y 29 59 89 B9 E9 Z 2A 5A ! exclamação 8A BA EA 2B 5B $ cifrão 8B BB EB 2C 5C * asterisco 8C BC EC 2D 5D ) fecha parênteses 8D BD ED 2E 5E ; ponto e vírgula 8E BE EE 2F 5F not 8F BF EF

157157

Page 158: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE D - CONTROLE DE IMPRESSÃO

HEXA---SIGNIFICADO------------------------------CARACTERES DE MÁQUINA--------

01 Imprime na linha em que estiver posicionado, e fica posicionado nela09 Imprime na linha em que estiver posicionado, depois salta 1 linha11 Imprime na linha em que estiver posicionado, depois salta 2 linhas19 Imprime na linha em que estiver posicionado, depois salta 3 linhas89 Imprime na linha em que estiver posicionado, depois salta para o canal 191 Imprime na linha em que estiver posicionado, depois salta para o canal 299 Imprime na linha em que estiver posicionado, depois salta para o canal 3A1 Imprime na linha em que estiver posicionado, depois salta para o canal 4A9 Imprime na linha em que estiver posicionado, depois salta para o canal 5B1 Imprime na linha em que estiver posicionado, depois salta para o canal 6B9 Imprime na linha em que estiver posicionado, depois salta para o canal 7C1 Imprime na linha em que estiver posicionado, depois salta para o canal 8C9 Imprime na linha em que estiver posicionado, depois salta para o canal 9D1 Imprime na linha em que estiver posicionado, depois salta para o canal 10D9 Imprime na linha em que estiver posicionado, depois salta para o canal 11E1 Imprime na linha em que estiver posicionado, depois salta para o canal 120B Salta 1 linha13 Salta 2 linhas1B Salta 3 linhas8B Salta para o canal 193 Salta para o canal 29B Salta para o canal 3A3 Salta para o canal 4AB Salta para o canal 5B3 Salta para o canal 6BB Salta para o canal 7C3 Salta para o canal 8CB Salta para o canal 9D3 Salta para o canal 10DB Salta para o canal 11E3 Salta para o canal 12

----HEXA----SIGNIFICADO-----------------------------CARACTERES ASA-----------

40 Salta 1 linha, imprime, e fica posicionado na linha impressa0 F0 Salta 2 linhas, imprime, e fica posicionado na linha impressa- 60 Salta 3 linhas, imprime, e fica posicionado na linha impressa+ 4E Imprime na linha em que estiver posicionado e continua nela1 F1 Salta para o canal 1, imprime, e fica posicionado na linha impressa2 F2 Salta para o canal 2, imprime, e fica posicionado na linha impressa3 F3 Salta para o canal 3, imprime, e fica posicionado na linha impressa4 F4 Salta para o canal 4, imprime, e fica posicionado na linha impressa5 F5 Salta para o canal 5, imprime, e fica posicionado na linha impressa6 F6 Salta para o canal 6, imprime, e fica posicionado na linha impressa7 F7 Salta para o canal 7, imprime, e fica posicionado na linha impressa8 F8 Salta para o canal 8, imprime, e fica posicionado na linha impressa9 F9 Salta para o canal 9, imprime, e fica posicionado na linha impressaA C1 Salta para o canal 10, imprime, e fica posicionado na linha impressaB C2 Salta para o canal 11, imprime, e fica posicionado na linha impressaC C3 Salta para o canal 12, imprime, e fica posicionado na linha impressa

158158

Page 159: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE E - INTERRUPÇÕES POR ERRO DE PROGRAMA

0001 - OPERAÇÃO = O código de operação da instrução é inválido, isto é, não corresponde a nenhuma instrução executável.

0002 - OPERAÇÃO PRIVILEGIADA = O programa tentou executar uma instrução privilegiada, isto é, que só pode ser executada pelo supervisor.

0003 - EXECUTE = Foi dada uma instrução Execute para outra instrução Execute.

0004 - PROTEÇÃO = Uma instrução do programa tentou estragar uma área fora da sua partição.

0005 - ENDEREÇAMENTO = Uma instrução do programa fez referência a endereço não existente.

0006 - ESPECIFICAÇÃO = A instrução especificou algo de errado, como, por exemplo, uma instrução que trabalhe com registradores de ponto flutuante, e especifique registrador 3, que não existe.

0007 - DADOS = Os campos que uma instrução utiliza não estão no formato que deveriam estar.

0008 - OVERFLOW DE PONTO FIXO = A instrução faz alguma operação com um registrador geral e nele não cabe o resultado.

0009 - DIVISÃO DE PONTO FIXO = Numa divisão em binário o divisor é 0.

000A - OVERFLOW DECIMAL = Numa operação entre campos em compactado, o campo de resultado não é suficientemente grande para conter o resultado.

000B - DIVISÃO DECIMAL = Numa divisão em compactado, o divisor é 0.

000C - OVERFLOW DE EXPOENTE = Para operações com números em ponto flutuante.

000D - UNDERFLOW DE EXPOENTE = Para operações com números em ponto flutuante.

000E - SIGNIFICÂNCIA = Para operações com números em ponto flutuante.

000F - DIVISÃO EM PONTO FLUTUANTE = Para operações em ponto flutuante.

159159

Page 160: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE F - TRUQUES ÚTEIS A PROGRAMAS ASSEMBLER

a) Para zerar o primeiro byte à esquerda de um registrador:

LA 5,0(5) ou LA 5,0(,5) ou LA 5,0(0,5)

b) Para somar um número (compreendido entre 1 e 4095 em um registrador que não seja o registrador 0 :

LA 5,n(5)

sendo n o número desejado.

c) Para multiplicar o número contido num campo em compactado por 2 :

AP CPO,CPO

d) Para zerar um campo compactado :

SP CPO,CPO ou ZAP CPO,=P'0'

e) Para multiplicar o número contido num registrador :

multiplicação por 2 : SLL 5,1 multiplicação por 4 : SLL 5,2 multiplicação por 8 : SLL 5,3 etc ...

f) Para dividir o número contido num registrador :

divisão por 2 : SRL 5,1 divisão por 4 : SRL 5,2 divisão por 8 : SRL 5,3 etc ...

g) Para reduzir uma área a zeros binários :

XC AREA,AREA

h) Para inverter a posição de 2 campos, sem necessidade de uso de área auxiliar:

XC A,B XC B,A XC A,B

160160

Page 161: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

i) Para movimentar um caracter qualquer para todas as posições de um campo:

MVI CAMPO,C' ' MVC CAMPO+1(L'CAMPO-1),CAMPO

j) Para transformar um NOP em branch:

ABC NOP DESV OI ABC+1,X'F0'

k) Para transformar um branch em NOP :

ABC B DESV . . . NI ABC+1,X'0F'

l) Para subtrair 1 de um registrador :

BCTR 5,0

161161

Page 162: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE G - MACRO INSTRUÇÕES MVS

{ } = ESCOLHER UM ITEM[ ] = OPCIONAL _[simbolo] OPEN (arq1,[{INPUT/OUTPUT}][,arq2,[{INPUT/OUTPUT}]...])

[simbolo] CLOSE (arq1,[opcoes][,arq2[,[opcoes]...]])

[simbolo] GET arq,area

[simbolo] PUT arq,area

simbolo DCB DDNAME=xxxxxxx DSORG=PS EODAD=simbolo MACRF={PM/GM} RECFM=FB[A/M]

Exemplos:

GET DISCO,ARLEIT PUT DISKSAI,ARGRAV OPEN (DISCO,(INPUT)) OPEN (DISCO) OPEN (DISCO,,DISKSAI,(OUTPUT) CLOSE (DISCO) CLOSE (DISCO,,DISKSAI) OPEN (RELAT,(OUTPUT) CLOSE (RELAT)

DISCO DCB DDNAME=DDENTRA,DSORG=PS,EODAD=FIMFILE,MACRF=(GM),RECFM=FBDISKSAI DCB DDNAME=DDSAI,DSORG=PS,MACRF=(PM),RECFM=FBRELAT DCB DDNAME=DDREL,DSORG=PS,MACRF=(PM),RECFM=FBA

162162

Page 163: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE H - EXEMPLO DE PROGRAMA MVS

*-------------------------------------------------------- PROGMVS START 0 USING *,3 INDICA REGISTRADOR BASE STM 14,12,12(13) SALVA REGISTRADORES NA * SAVE AREA DO CHAMADOR LR 3,15 CARREGA ENTRY POINT NO 3 ST 13,SAVE+4 SALVA END DA SAVE AREA DO* CHAMADOR NA MINHA SAVE LA 15,SAVE END DA MINHA SAVE NO 15 ST 15,8(13) SALVA END DA MINHA SAVE * NA SAVEAREA DO CHAMADOR LR 13,15 DEIXA END DA MINHA NO 13*-------------------------------------------------------- L 1,0(1) ENDERECO DO PARM NO REG.1 MVC PARMLEN+2(2),0(1) SALVA TAMANHO DO PARM L 15,PARMLEN CARREGA TAMANHO DO PARM LTR 15,15 VE SE VEIO PARM BZ COMECAR SE TAMANHO ZERO, NAO VEIO BCTR 15,0 SUBTRAI 1 DO 15 EX 15,MOVEPARM SALVA PARM B COMECAR VAI PROCESSAR O PGMMOVEPARM MVC PARMTXT(0),2(1) MOVE O PARM PARA AREA DO PGMSAVE DC 18F'0' SAVE AREA DO PROGRAMAPARMTXT DC CL100' ' AREA PARA O PARMPARMLEN DC F'0' FULL PARA TAMANHO PARM*-------------------------------------------------------- COMECAR EQU * OPEN (ENTRA,(INPUT),SAI,(OUTPUT))LER GET ENTRA,WENTRA MVC WSAI,WENTRA PUT SAI,WSAI B LERFIMINP CLOSE (ENTRA,,SAI)*-------------------------------------------------------- TERMINAR EQU * SR 2,2 ZERA REG 2 L 13,SAVE+4 RESTAURA ENDERECO DA* SAVE AREA DO CHAMADOR ST 2,16(13) RETURN CODE NO LUGAR* DE ONDE SERA RESTAURADO O REG 15 LM 14,12,12(13) RESTAURA REGISTRADORES BR 14 VOLTA *-------------------------------------------------------- WENTRA DS CL50WSAI DS CL50ENTRA DCB DDNAME=DDENTRA,DSORG=PS,EODAD=FIMINP,MACRF=(GM),RECFM=FBSAI DCB DDNAME=DDSAI,DSORG=PS,MACRF=(PM),RECFM=FB END

163163

Page 164: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE I - MACRO INSTRUÇÕES VSE

{ } = ESCOLHER UM ITEM[ ] = OPCIONAL

[simbolo] OPEN arq1[,arq2,...]

[simbolo] CLOSE arq1[,arq2,...]

[simbolo] GET arq,area

[simbolo] PUT arq,area

simbolo DTFSD DEVADDR=SYSxxx [EOFADDR=simbolo] TYPEFLE={INPUT/OUTPUT} RECFORM=FIXBLK RECSIZE=nnnn BLKSIZE=nnnn IOAREA1=simbolo WORKA=YES

simbolo DTFPR DEVADDR= RECFORM= RECSIZE= BLKSIZE= CTLCHR= IOAREA1= WORKA=YES

Exemplos:

GET DISCO,ARLEIT PUT DISKSAI,ARGRAV OPEN DISCO OPEN DISCO,DISKSAI CLOSE DISCO CLOSE DISCO,DISKSAI OPEN RELAT CLOSE RELAT

DISCO DTFSD EOFADDR=FIMFILE,TYPEFLE=INPUT,RECFORM=FIXBLK,RECSIZE=50, X BLKSIZE=5000,IOAREA1=BUFIN,WORKA=YESDISKSAI DTFSD TYPEFLE=OUTPUT,RECFORM=FIXBLK,RECSIZE=50,BLKSIZE=5000, X IOAREA1=BUFOUT,WORKA=YESRELAT DTFPR DEVADDR=SYSLST,RECFORM=FIXUNB,RECSIZE=133,BLKSIZE=133, X CTLCHR=ASA,IOAREA1=BUFPR,WORKA=YES

164164

Page 165: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE J - EXEMPLO DE PROGRAMA VSE

*-------------------------------------------------------- PROGVSE START 0 USING *,3 INDICA REGISTRADOR BASE STM 14,12,12(13) SALVA REGISTRADORES NA * SAVE AREA DO CHAMADOR LR 3,15 CARREGA ENTRY POINT NO 3 BCTR 3,0 SUBTRAI 1 DO R3 BCTR 3,0 SUBTRAI MAIS 1. R3=ENTRY POINT*-------------------------------------------------------- COMECAR EQU * OPEN ENTRA,SAILER GET ENTRA,WENTRA MVC WSAI,WENTRA PUT SAI,WSAI B LERFIMINP CLOSE ENTRA,SAI*-------------------------------------------------------- TERMINAR EQU * EOJ*-------------------------------------------------------- WENTRA DS CL50WSAI DS CL50ENTRA DTFSD EOFADDR=FIMINP,TYPEFLE=INPUT,RECFORM=FIXBLK,RECSIZE=50, X BLKSIZE=5000,IOAREA1=BUFIN,WORKA=YESDISKSAI DTFSD TYPEFLE=OUTPUT,RECFORM=FIXBLK,RECSIZE=50,BLKSIZE=5000, X IOAREA1=BUFOUT,WORKA=YES LTORGBUFIN DS CL5000BUFOUT DS CL5008 END

165165

Page 166: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE K - MACRO INSTRUÇÕES VM

{ } = ESCOLHER UM ITEM[ ] = OPCIONAL

FSREAD 'fn ft fm',ERROR=simbolo,BUFFER=simbolo,BSIZE=tamanho,FORM=E FSWRITE 'fn ft fm',BUFFER=simbolo,BSIZE=tamanho,RECFM={F/V}

Exemplos:

FSREAD 'ENTRADA DADOS A',ERROR=MAYBEEND,BUFFER=ARLEIT,BSIZE=50,X FORM=E FSWRITE 'SAIDA DADOS A',BUFFER=ARGRAV,BSIZE=50,RECFM=F

166166

Page 167: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE L - EXEMPLO DE PROGRAMA VM

*-------------------------------------------------------- PROGVM START 0 USING *,3 INDICA REGISTRADOR BASE STM 14,12,12(13) SALVA REGISTRADORES NA * SAVE AREA DO CHAMADOR LR 3,15 CARREGA ENTRY POINT NO 3 ST 13,SAVE+4 SALVA END DA SAVE AREA DO* CHAMADOR NA MINHA SAVE LA 15,SAVE END DA MINHA SAVE NO 15 ST 15,8(13) SALVA END DA MINHA SAVE * NA SAVEAREA DO CHAMADOR LR 13,15 DEIXA END DA MINHA NO 13*-------------------------------------------------------- COMECAR EQU *LE FSREAD 'ENTRADA DADOS A,'ERROR=MAYBEFIM,BUFFER=WENTRA, X BSIZE=50,FORM=E MVC WSAI,WENTRA FSWRITE 'SAIDA DADOS A',BUFFER=WSAI,BSIZE=50,RECFM=F B LEMAYBEFIM EQU * C 15,=F'12' VE SE TEVE ERRO OU SE FOI FIM ARQ BE TERMINAR SE FOI FIM DE ARQUIVO, DESVIA WRTERM 'ERRO DE LEITURA DO ARQUIVO ENTRADA' LA 2,4 RETURN CODE NO REG 2 B FINAL*-------------------------------------------------------- TERMINAR EQU * SR 2,2 ZERA REG 2FINAL L 13,SAVE+4 RESTAURA ENDERECO DA* SAVE AREA DO CHAMADOR ST 2,16(13) RETURN CODE NO LUGAR* DE ONDE SERA RESTAURADO* O REG 15 LM 14,12,12(13) RESTAURA REGISTRADORES BR 14 VOLTA *-------------------------------------------------------- WENTRA DS CL50WSAI DS CL50SAVE DC 18F'0' END

167167

Page 168: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE M - MACRO INSTRUÇÕES XEGUEI E TCHAU

*-----------------------------------------------------------* MACRO XEGUEI *----------------------------------------------------------- MACRO&LABEL XEGUEI &SISTOP=.*-----------------------------------------------------------.* DEFINICAO DAS VARIAVEIS DE MONTAGEM .*----------------------------------------------------------- GBLA &XEGAY GBLC &QUALSO.*-----------------------------------------------------------.* CONSISTENCIA DOS DADOS .*-----------------------------------------------------------&XEGAY SETA &XEGAY+1 AIF (&XEGAY EQ 1).FIRST1 MNOTE 12,'MACRO SO PODE SER CHAMADA UMA VEZ' MEXIT.FIRST1 ANOP AIF ('&LABEL' NE '').VEIOLAB MNOTE 8,'LABEL (NOME DO PROGRAMA) OMITIDO' MEXIT.VEIOLAB ANOP AIF ('&SISTOP' NE '').VEIOOP MNOTE 4,'PARAMETRO SISTOP OMITIDO' MEXIT.VEIOOP ANOP AIF ('&SISTOP' EQ 'VSE').VSEMVS1 AIF ('&SISTOP' EQ 'MVS').VSEMVS1 MNOTE 4,'PARAMETRO SISTOP INVALIDO' MEXIT.VSEMVS1 ANOP.*-----------------------------------------------------------.* GERA TANTO PARA VSE QUANTO PARA MVS .*-----------------------------------------------------------*-----------------------------------------------------------&LABEL START 0*-----------------------------------------------------------* EQUATES DOS REGISTRADORES PARA A CROSS REFERENCE *-----------------------------------------------------------R0 EQU 0R1 EQU 1R2 EQU 2R3 EQU 3R4 EQU 4R5 EQU 5R6 EQU 6R7 EQU 7R8 EQU 8R9 EQU 9R10 EQU 10R11 EQU 11R12 EQU 12R13 EQU 13R14 EQU 14R15 EQU 15

168168

Page 169: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

AIF ('&SISTOP' EQ 'MVS').MVS.*-----------------------------------------------------------.* GERA PARA O CASO DE VSE .*-----------------------------------------------------------.VSE ANOP&QUALSO SETC 'SISTEMAVSE'*-----------------------------------------------------------* ESTABELECE OS REGISTRADORES BASE EM TEMPO DE MONTAGEM* E OS CARREGA EM TEMPO DE EXECUCAO*----------------------------------------------------------- USING *,3,4,5,6,7 INDICA REGISTRADORES BASE E SEU* CONTEUDO PRESUMIDO NA EXECUCAO BALR 3,0 CARREGA PRIMEIRO REG BASE BCTR 3,0 SUBTRAI 1 BCTR 3,0 SUBTRAI MAIS 1, E R3 = LOAD POINT* = ENTRY POINT LA 4,1 COLOCA NRO 1 NO REG 4 LA 4,4095(3,4) R4 = R3 + 4096 LA 5,1 COLOCA NRO 1 NO REG 5 LA 5,4095(4,5) R5 = R4 + 4096 LA 6,1 COLOCA NRO 1 NO REG 6 LA 6,4095(5,6) R6 = R5 + 4096 LA 7,1 COLOCA NRO 1 NO REG 7 LA 7,4095(6,7) R7 = R6 + 4096*----------------------------------------------------------- EJECT MEXIT.*-----------------------------------------------------------.* GERA PARA O CASO DE MVS .*-----------------------------------------------------------.MVS ANOP*-----------------------------------------------------------* ESTABELECE OS REGISTRADORES BASE EM TEMPO DE MONTAGEM* E OS CARREGA EM TEMPO DE EXECUCAO*----------------------------------------------------------- USING *,3,4,5,6,7 INDICA REGISTRADORES BASE E SEU* CONTEUDO PRESUMIDO NA EXECUCAO STM 14,12,12(13) SALVA REGISTRADORES NA SAVEAREA* DO CHAMADOR LR 3,15 CARREGA ENTRY POINT/LOAD POINT NO R3 LA 4,1 COLOCA NRO 1 NO REG 4 LA 4,4095(3,4) R4 = R3 + 4096 LA 5,1 COLOCA NRO 1 NO REG 5 LA 5,4095(4,5) R5 = R4 + 4096 LA 6,1 COLOCA NRO 1 NO REG 6 LA 6,4095(5,6) R6 = R5 + 4096 LA 7,1 COLOCA NRO 1 NO REG 7 LA 7,4095(6,7) R7 = R6 + 4096

169169

Page 170: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

*-----------------------------------------------------------* ACERTA POINTERS PARA SAVEAREAS*----------------------------------------------------------- ST 13,SAVEZZZZ+4 SALVA ENDERECO DA SAVEAREA DO* CHAMADOR NA MINHA SAVEAREA LA 15,SAVEZZZZ ENDERECO DA MINHA SAVEAREA NO 15 ST 15,8(13) SALVA ENDERECO DA MINHA SAVEAREA* NA SAVEAREA DO CHAMADOR LR 13,15 DEIXA ENDER DA MINHA SAVE NO 13*-----------------------------------------------------------* PEGA O PARM E O DEIXA EM PARMTEXT*----------------------------------------------------------- L 1,0(1) ENDERECO DO PARM NO REG 1 MVC PARMLEN@+2(2),0(1) SALVA TAMANHO DO PARM L 15,PARMLEN@ TAMANHO DO PARM NO 15 LTR 15,15 VE SE VEIO PARM BZ PARMLEN@+4 SE TAMANHO ZERO, NAO VEIO PARM BCTR 15,0 SUBTRAI 1 DO 15 EX 15,*+4+4 SALVA PARM NA MINHA AREA B PARMLEN@+4 VAI EXECUTAR O PROGRAMA MVC PARMTEXT(0),2(1) MOVE O PARM PARA MINHA AREA*-----------------------------------------------------------* DEFINE AS AREAS*-----------------------------------------------------------SAVEZZZZ DC 18F'0' MINHA SAVEAREAPARMTEXT DC CL100' ' MINHA AREA PARA O PARMPARMLEN@ DC F'0' TAMANHO DO PARM*----------------------------------------------------------- EJECT&QUALSO SETC 'SISTEMAMVS' MEND************************************************************************ MACRO TCHAU *********************************************************************** MACRO&SIMBALO TCHAU &RETCODE=.*-----------------------------------------------------------.* DEFINICAO DAS VARIAVEIS DE MONTAGEM .*----------------------------------------------------------- GBLA &XEGAY GBLC &QUALSO.*-----------------------------------------------------------.* CONSISTENCIA DOS DADOS .*----------------------------------------------------------- AIF (&XEGAY EQ 1).VEIOXEG MNOTE 12,'MACRO TCHAU USADA SEM MACRO XEGUEI' MEXIT.VEIOXEG ANOP AIF ('&QUALSO' EQ 'SISTEMAMVS').MVS

170170

Page 171: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

.*-----------------------------------------------------------

.* GERA PARA O CASO DE VSE

.*-----------------------------------------------------------

.VSE ANOP EOJ MEXIT.*-----------------------------------------------------------.* GERA PARA O CASO DE MVS .*-----------------------------------------------------------.MVS ANOP AIF ('&RETCODE' NE '').YESRC&SIMBALO SR 2,2 RETURN CODE NO 2 AGO .RCOK.YESRC ANOP&SIMBALO LA 2,&RETCODE CARREGA RETURN CODE NO 2.RCOK ANOP L 13,SAVEZZZZ+4 RESTAURA ENDERECO DA SAVEAREA* DO CHAMADOR ST 2,16(13) JOGA RETURN CODE NO LUGAR DE ONDE* VAI SER RESTAURADO O 15 LM 14,12,12(13) RESTAURA REGISTRADORES BR 14 BYE BYE ...*----------------------------------------------------------- MEND

171171

Page 172: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE N - EXEMPLO DE SUBROTINA

*-----------------------------------------------------------* ESTA SUBROTINA RECEBE UM CAMPO DE 6 BYTES COM UMA DATA EM * ZONADO (PRIMEIRO PARAMETRO) E A TRANSFORMA EM UMA DATA EM * COMPACTADO SEM SINAL, DEVOLVENDO ESSA INFORMACAO NO CAMPO* SEGUNDO PARAMETRO. SE A DATA NAO FOR NUMERICA, ELA NAO FAZ* A CONVERSAO E DEVOLVE RETURN CODE 4; SE FOR NUMERICA, FAZ A* CONVERSAO E DEVOLVE RETURN CODE 0*-----------------------------------------------------------SUBROT START 0 USING *,3 STM 14,12,12(13) LR 3,15 ST 13,SAVEROT+4 LA 15,SAVEROT ST 15,8(13) LR 13,15* L 11,0(1) L 12,4(1)* TRT 0(6,11),TABNUM BZ ISZONADO B SAIROT4ISZONADO EQU * PACK 0(2,12),0(3,11) PACK 1(2,12),2(3,11) PACK W(2),4(3,11) MVC 2(1,12),WSAIROT EQU * L 13,4(13) LM 14,12,12(13) SR 15,15 BR 14SAIROT4 EQU * L 13,4(13) LM 14,12,12(13) LA 15,4 BR 14TABNUM DC 240X'FF',10X'00'6X'FF'W DS CL2SAVEROT DC 18F'0' END

172172

Page 173: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE O - EXEMPLO 2 DE SUBROTINA

*-----------------------------------------------------------* ESTA SUBROTINA RECEBE N PARAMETROS, DOS QUAIS OS N-1 PRIMEIROS* SAO CAMPOS ZONADOS COM 3 BYTES COM CONTEUDO FORNECIDO PELO* PROGRAMA CHAMADOR. O N-ESIMO CAMPO E' DO CHAMADOR E E' UMA * FULL WORD ONDE A ROTINA DEVE DEVOLVER A SOMATORIA DOS NUMEROS* CONTIDOS NOS N-1 PRIMEIROS CAMPOS, NO FORMATO BINARIO * SE ALGUM NUMERO NAO ESTIVER EM ZONADO, A ROTINA NAO FAZ A SOMA* E DEVOLVE RETURN CODE 4.* SE FOR PASSADO MENOS DO QUE 2 PARAMETROS OU MAIS DO QUE 5* ELA DEVOLVE RETURN CODE 8 E NAO FAZ A SOMATORIA*-----------------------------------------------------------SOMATOR START 0 USING *,15 B PULAINIC DC 18F'0' DC CL8'SOMATOR' DC CL8'&SYSDATE' DC CL8'&SYSTIME'PULAINIC DS 0H STM 14,12,12(13) ST 15,8(13) ST 13,8(15) LA 3,4(15) DROP 15 USING SUBROT,3,4 LA 4,4095(3) LA 4,1(4) LR 9,1* L 11,0(9) R11 = ENDERECO PARM 1 TM 0(9),X'80' BO VOLTA8 VEIO 1 PARAMETRO = ERRO TRT 0(3,11),TABNUM BNZ VOLTA4 PACK W,0(3,11) AP TOTDW,W* L 11,4(9) R11 = ENDERECO PARM 2 TM 4(9),X'80' BO VOLTA ESTE E' O ULTIMO PARAMETRO TRT 0(3,11),TABNUM BNZ VOLTA4 PACK W,0(3,11) AP TOTDW,W* L 11,8(9) R11 = ENDERECO PARM 3 TM 8(9),X'80' BO VOLTA ESTE E' O ULTIMO PARAMETRO TRT 0(3,11),TABNUM BNZ VOLTA4 PACK W,0(3,11) AP TOTDW,W

173173

Page 174: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

* L 11,12(9) R11 = ENDERECO PARM 4 TM 12(9),X'80' BO VOLTA ESTE E' O ULTIMO PARAMETRO TRT 0(3,11),TABNUM BNZ VOLTA4 PACK W,0(3,11) AP TOTDW,W* L 11,16(9) R11 = ENDERECO PARM 5 TM 16(9),X'80' BZ VOLTA8 ESTE NAO E' O ULTIMO PARAMETRO TRT 0(3,11),TABNUM BNZ VOLTA4 PACK W,0(3,11) AP TOTDW,W*VOLTA EQU * CVB 8,TOTDW ST 8,TOTDW MVC 0(4,11),TOTDWSAIROT EQU * L 13,4(13) LM 14,12,12(13) SR 15,15 BR 14VOLTA4 EQU * L 13,4(13) LM 14,12,12(13) LA 15,4 BR 14VOLTA8 EQU * L 13,4(13) LM 14,12,12(13) LA 15,8 BR 14TABNUM DC 240X'FF',10X'00'6X'FF'TOTDW DS DW DS CL3 END

174174

Page 175: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE P - MONTAGEM DE PROGRAMA DE DEMONSTRAÇÃO 1

EXTERNAL SYMBOL DICTIONARY SYMBOL TYPE ID ADDR LENGTH LD ID FLAGS PROGDEMO SD 0001 000000 000AF3 00 FORA ER 0002 Z LD 000844 0001 SUBROT ER 0003

175175

Page 176: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 1 * 1 2 3 2 *23456789012345678901234567890123456 3 *----------------------------------- 4 *----------------------------------- 5 * ESTE PROGRAMA E' PARA DEMONSTRAR 6 * COMANDOS AO MONTADOR ASSEMBLER 7 *----------------------------------- 8 MACRO 9 MYMAK 10 DC C'GERADO PELA MYMAK' 11 MEND 12 *-----------------------------------000000 13 PROGDEMO START 0 00000 14 USING *,3,4,5,6,7 15 * 16 * AVISA QUE OS REGISTRADORES BASE 17 * SERAO O 3, 4, 5, 6 E 7 18 * E QUE SEUS CONTEUDOS PRESUMIDOS 19 * EM TEMPO DE EXECUCAO SERAO 20 * R3 = 000000 21 * R4 = 001000 22 * R5 = 002000 23 * R6 = 003000 24 * R7 = 004000 25 *----------------------------------- 26 * SIMBOLOS 27 *----------------------------------- 28 1ABCDEF EQU * IEV147 *** ERROR *** SYMBOL TOO LONG, OR 1ST CHARACTER NOT A LETTER -- IEV167 *** ERROR *** REQUIRED NAME MISSING 00000 29 SIMBOLOPODESTER63CARACTERES EQU * 30 *----------------------------------- 31 * PRINT GEN/NOGEN 32 *----------------------------------- 33 * ESTA' COM O DEFAULT PRINT GEN 34 MYMAK 000000 C7C5D9C1C4D640D7 35+ DC C'GERADO PELA MYMAK' 36 * VOU MUDAR PARA PRINT NOGEN 37 PRINT NOGEN 38 * VOU RESTAURAR O DEFAULT 39 PRINT GEN 40 MYMAK 000011 C7C5D9C1C4D640D7 41+ DC C'GERADO PELA MYMAK' 42 *----------------------------------- 43 * PRINT DATA/NODATA 44 *----------------------------------- 45 * ESTA' COM O DEFAULT PRINT NODATA 000022 C1D3C2C5D9E3D6 46 DC CL7'ALBERTO' 000029 C1D3C2C5D9E3D65C 47 DC CL8'ALBERTO*' 000031 C1D3C2C5D9E3C9D5 48 DC CL10'ALBERTINHO'

176176

Page 177: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 49 * VOU MUDAR PARA PRINT DATA 50 PRINT DATA 00003B C1D3C2C5D9E3D6 51 DC CL7'ALBERTO' 000042 C1D3C2C5D9E3D65C 52 DC CL8'ALBERTO*' 00004A C1D3C2C5D9E3C9D5 53 DC CL10'ALBERTINHO' 000052 C8D6 54 * VOU RESTAURAR O DEFAULT 55 PRINT NODATA 000054 C1D3C2C5D9E3D6 56 DC CL7'ALBERTO' 00005B C1D3C2C5D9E3D65C 57 DC CL8'ALBERTO*' 000063 C1D3C2C5D9E3C9D5 58 DC CL10'ALBERTINHO' 59 *----------------------------------- 60 * PRINT ON/OFF 61 *----------------------------------- 62 * ESTA' COM O DEFAULT PRINT ON 63 *----------------------------------- 64 * ESTE STMT VAI SER IMPRESSO 65 * DEPOIS DO STMT *++++++++++ 66 * VAI TER 67 * UM PRINT OFF 68 * UM HIDE DS CL1 69 * UM DC A(HIDE) 70 * E UM PRINT ON 71 *++++++++++ 72 PRINT OFF 75 PRINT ON 76 *----------------------------------- 77 * EQUATES 78 *----------------------------------- 00001 79 R1 EQU 1 00074 80 LABEL EQU * 000074 81 DIVDENDO DS CL16 00074 82 COCIENTE EQU DIVDENDO,12 00080 83 RESTO EQU DIVDENDO+12,4,C'P' 00004 84 TAMRESTO EQU L'RESTO 000FF 85 BYTEON EQU X'FF' 000084 D203 A00B F007 0000B 00007 86 MOVTRECO MVC 11(4,10),7(15) 00084 87 MOVCOISA EQU MOVTRECO 88 *----------------------------------- 89 * ORG 90 *-----------------------------------00008A 5C5C5C5C5C5C5C5C 91 CAMPO DC 8C'*' 000092 0008C 92 ORG CAMPO+2 00008C 00 93 DC X'00' 00008D 00092 94 ORG 95 * . . 000092 5C5C5C5C5C5C5C5C 96 OUTRORG DC 8C'*' 00009A 00097 97 ORG *-3 000097 00 98 DC X'00' 000098 0009A 99 ORG

177177

Page 178: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 100 * . . 00009A 4040404040404040 101 TABELA DC CL256' ' 00019A 0009A 102 ORG TABELA +X'10' 00009A FF 103 DC X'FF' 00009B 0015B 104 ORG TABELA+C'A' 00015B FF 105 DC X'FF' 00015C 00194 106 ORG TABELA+256-X'6' 000194 FF 107 DC X'FF' 000195 000A9 108 ORG TABELA+B'1111' 0000A9 FF 109 DC X'FF' 0000AA 0019A 110 ORG 111 *----------------------------------- 112 * OPSYN 113 *----------------------------------- 114 MOVER OPSYN MVC 00019A D200 2000 4003 00000 00003 115 MOVER 0(1,2),3(4) 0001A0 D200 2000 4003 00000 00003 116 MVC 0(1,2),3(4) 117 MVC OPSYN 0001A6 D200 2000 4003 00000 00003 118 MOVER 0(1,2),3(4) 119 MVC 0(1,2),3(4) IEV057 *** ERROR *** UNDEFINED OP-CODE -- MVC 120 MOVER OPSYSN IEV057 *** ERROR *** UNDEFINED OP-CODE -- OPSYSN 0001AC D200 2000 4003 00000 00003 121 MOVER 0(1,2),3(4) 122 MVC 0(1,2),3(4) IEV057 *** ERROR *** UNDEFINED OP-CODE -- MVC 123 MVC OPSYN MVC IEV057 *** ERROR *** UNDEFINED OP-CODE -- MVC 0001B2 D200 2000 4003 00000 00003 124 MOVER 0(1,2),3(4) 125 MVC 0(1,2),3(4) IEV057 *** ERROR *** UNDEFINED OP-CODE -- MVC 126 *----------------------------------- 127 * CCW 128 *-----------------------------------0001B8 090001C060000085 129 PGMCANAL CCW X'09',ARIMP,X'60',1330001C0 4040404040404040 130 ARIMP DC CL133' ' 131 *----------------------------------- 132 * DC TIPO C 133 *-----------------------------------000245 134 DCCC DC CL257'*' IEV068 *** ERROR *** LENGTH ERROR -- L257'*' 000245 5C40404040404040 135 DCCC1 DC CL256'*' 000345 5C4040 136 DCC2 DC CL3'*' 000348 5C5C5C 137 DCC4 DC 3C'*' 00034B 7D50 138 DCC5 DC C'''&&' 139 *----------------------------------- 140 * DC TIPO X 141 *-----------------------------------00034D 142 DC XL257'FF' IEV068 *** ERROR *** LENGTH ERROR -- L257'FF'

178178

Page 179: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 00034D 0000000000000000 143 DC XL256'FF' 00044D 0000FF 144 DC XL3'FF' 000450 FFFFFF 145 DC 3X'FF' 146 *----------------------------------- 147 * DC TIPO B 148 *-----------------------------------000453 149 DC BL257'1' IEV068 *** ERROR *** LENGTH ERROR -- L257'1' 000453 0000000000000000 150 DC BL256'1' 000553 000001 151 DC BL3'1' 000556 010101 152 DC 3B'1' 153 *----------------------------------- 154 * DC TIPO F 155 *-----------------------------------000559 156 DC FL9'1' IEV068 *** ERROR *** LENGTH ERROR -- L9'1' 000559 0000000000000001 157 DC FL8'1' 158 PRINT DATA 000561 000000 000564 0000000000000001 159 DC F'0,1,2,3,4,5,6,7,8' 00056C 0000000200000003 000574 0000000400000005 00057C 0000000600000007 000584 00000008 000588 000000090000000A 160 DC F'9,10,11,12,13,14' 000590 0000000B0000000C 000598 0000000D0000000E 0005A0 161 DC F'-1,-2,-3,-4,-5,-6,' IEV074 *** ERROR *** ILLEGAL SYNTAX IN EXPRESSION -- ' 0005A0 FFFFFFF9FFFFFFF8 162 DC F'-7,-8,-9,-10,-11' 0005A8 FFFFFFF7FFFFFFF6 0005B0 FFFFFFF5 163 PRINT NODATA 164 *----------------------------------- 165 * DC TIPO H 166 *-----------------------------------0005B4 167 DC HL9'15' IEV068 *** ERROR *** LENGTH ERROR -- L9'15' 0005B4 000000000000000F 168 DC HL8'15' 169 PRINT DATA 0005BC 0000000100020003 170 DC H'0,1,2,3,4,5,6,7,8' 0005C4 0004000500060007 0005CC 0008 0005CE 0009000A000B000C 171 DC H'9,10,11,12,13,14' 0005D6 000D000E 0005DA 172 DC H'-1,-2,-3,-4,-5,-6,' IEV074 *** ERROR *** ILLEGAL SYNTAX IN EXPRESSION -- ' 0005DA FFF9FFF8FFF7FFF6 173 DC H'-7,-8,-9,-10,-11' 0005E2 FFF5 174 PRINT NODATA

179179

Page 180: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 175 *----------------------------------- 176 * DC TIPO E 177 *----------------------------------- 178 PRINT DATA 0005E4 0000000041100000 179 DC E'0,1,2,3,4,5,6,7,8' 0005EC 4120000041300000 0005F4 4140000041500000 0005FC 4160000041700000 000604 41800000 000608 4190000041A00000 180 DC E'9,10,11,12,13,14' 000610 41B0000041C00000 000618 41D0000041E00000 000620 181 DC E'-1,-2,-3,-4,-5,-6,' IEV074 *** ERROR *** ILLEGAL SYNTAX IN EXPRESSION -- ' 000620 C1700000C1800000 182 DC E'-7,-8,-9,-10,-11' 000628 C1900000C1A00000 000630 C1B00000 183 PRINT NODATA 184 *----------------------------------- 185 * DC TIPO D 186 *----------------------------------- 187 PRINT DATA 000634 00000000 000638 0000000000000000 188 DC D'0,1,2,3,4,5,6,7,8' 000640 4110000000000000 000648 4120000000000000 000650 4130000000000000 000658 4140000000000000 000660 4150000000000000 000668 4160000000000000 000670 4170000000000000 000678 4180000000000000 000680 4190000000000000 189 DC D'9,10,11,12,13,14' 000688 41A0000000000000 000690 41B0000000000000 000698 41C0000000000000 0006A0 41D0000000000000 0006A8 41E0000000000000 0006B0 190 DC D'-1,-2,-3,-4,-5,-6,' IEV074 *** ERROR *** ILLEGAL SYNTAX IN EXPRESSION -- ' 0006B0 C170000000000000 191 DC D'-7,-8,-9,-10,-11' 0006B8 C180000000000000 0006C0 C190000000000000 0006C8 C1A0000000000000 0006D0 C1B0000000000000 192 PRINT NODATA 193 *----------------------------------- 194 * DC TIPO L 195 *----------------------------------- 196 PRINT DATA

180180

Page 181: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 0006D8 0000000000000000 197 DC L'0,1,2,3,4,5,6,7,8' 0006E0 0000000000000000 0006E8 4110000000000000 0006F0 3300000000000000 0006F8 4120000000000000 000700 3300000000000000 000708 4130000000000000 000710 3300000000000000 000718 4140000000000000 000720 3300000000000000 000728 4150000000000000 000730 3300000000000000 000738 4160000000000000 000740 3300000000000000 000748 4170000000000000 000750 3300000000000000 000758 4180000000000000 000760 3300000000000000 000768 4190000000000000 198 DC L'9,10,11,12,13,14' 000770 3300000000000000 000778 41A0000000000000 000780 3300000000000000 000788 41B0000000000000 000790 3300000000000000 000798 41C0000000000000 0007A0 3300000000000000 0007A8 41D0000000000000 0007B0 3300000000000000 0007B8 41E0000000000000 0007C0 3300000000000000 0007C8 199 DC L'-1,-2,-3,-4,-5,-6,' IEV074 *** ERROR *** ILLEGAL SYNTAX IN EXPRESSION -- ' 0007C8 C170000000000000 200 DC L'-7,-8,-9,-10,-11' 0007D0 B300000000000000 0007D8 C180000000000000 0007E0 B300000000000000 0007E8 C190000000000000 0007F0 B300000000000000 0007F8 C1A0000000000000 000800 B300000000000000 000808 C1B0000000000000 000810 B300000000000000 201 PRINT NODATA 202 *----------------------------------- 203 * DC TIPO P 204 *-----------------------------------000818 205 DC PL17'1' IEV068 *** ERROR *** LENGTH ERROR -- L17'1' 000818 0000000000000000 206 DC PL16'1' 000828 00009C 207 DC PL3'9'

181181

Page 182: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 00082B 9C9C9C 208 DC 3P'9' 209 *----------------------------------- 210 * DC TIPO Z 211 *-----------------------------------00082E 212 DC ZL17'1' IEV068 *** ERROR *** LENGTH ERROR -- L17'1' 00082E F0F0F0F0F0F0F0F0 213 DC ZL16'1' 00083E F0F0C9 214 DC ZL3'9' 000841 C9C9C9 215 DC 3Z'9' 216 *----------------------------------- 217 * DC TIPO A / DC TIPO V / ENTRY/EXTR 218 *-----------------------------------000844 219 Z DS CL4 000848 00000000 220 A1 DC A(0) 00084C 00000FFF00007D00 221 A2 DC A(4095,32000) 000854 00001000 222 A3 DC A(X'1000') 000858 0000000F 223 A4 DC A(B'1111') 00085C 00005C5C 224 A5 DC A(C'**') 000860 0000085C 225 DC A(A5) 000864 0000086C 226 DC A(A5+16) 000868 0000084C 227 DC A(A5-16) 00086C 0000086C 228 DC A(*) 000870 00000004 229 DC A(L'A1) 000874 8000084C 230 DC A(A2+X'80000000') 000878 00 231 A11 DC AL1(*-A11) 000879 0001020304050607 232 A12 DC 8AL1(*-A12) 000881 FF00010203040506 233 A13 DC 8AL1(255+*-A13) 000889 000000 00088C 00000000 234 DC A(FORA) 235 EXTRN FORA 236 ENTRY Z 000890 00000000 237 DC V(SUBROT) 238 CALL SUBROT,(ENTRA,SAI) 000894 239+ CNOP 0,4 000894 47F0 389C 0089C 240+ B *+8 000898 00000000 241+IHB0003B DC V(SUBROT) 00089C 242+ CNOP 0,4 00089C 4110 38A4 008A4 243+ LA 1,IHB0004 0008A0 47F0 38AC 008AC 244+ B IHB0004A 008A4 245+IHB0004 EQU * 0008A4 000008B2 246+ DC A(ENTRA) P0008A8 000008B5 247+ DC A(SAI) 008AC 248+IHB0004A EQU * 0008AC 58F0 3898 00898 249+ L 15,IHB0003B 0008B0 05EF 250+ BALR 14,15 0008B2 00012C 251 ENTRA DC PL3'12' 0008B5 252 SAI DS CL400 253 *----------------------------------- 254 * DC TIPO Y 255 *-----------------------------------

182182

Page 183: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 000A45 00 000A46 00740074 256 DC Y(LABEL,COCIENTE) IEV066 ** WARNING ** RELOCATABLE Y-TYPE CONSTANT IEV066 ** WARNING ** RELOCATABLE Y-TYPE CONSTANT 000A4A 0FFF7D00 257 Y2 DC Y(4095,32000) 000A4E 1000 258 Y3 DC Y(X'1000') 000A50 000F 259 Y4 DC Y(B'1111') 000A52 5C5C 260 Y5 DC Y(C'**') 000A54 085C 261 DC Y(A5) IEV066 ** WARNING ** RELOCATABLE Y-TYPE CONSTANT 000A56 086C 262 DC Y(A5+16) IEV066 ** WARNING ** RELOCATABLE Y-TYPE CONSTANT 000A58 084C 263 DC Y(A5-16) IEV066 ** WARNING ** RELOCATABLE Y-TYPE CONSTANT 000A5A 4FFF 264 DC Y(PROGDEMO+X'4FFF') IEV066 ** WARNING ** RELOCATABLE Y-TYPE CONSTANT 000A5C 5000 265 DC Y(PROGDEMO+X'5000') IEV066 ** WARNING ** RELOCATABLE Y-TYPE CONSTANT 000A5E 7FFF 266 DC Y(PROGDEMO+X'7FFF') IEV066 ** WARNING ** RELOCATABLE Y-TYPE CONSTANT 000A60 8000 267 DC Y(PROGDEMO+X'8000') IEV066 ** WARNING ** RELOCATABLE Y-TYPE CONSTANT IEV072 *** ERROR *** DATA ITEM TOO LARGE 268 *----------------------------------- 269 * ALINHAMENTOS 270 *-----------------------------------000A68 271 DS 0D 000A68 272 AAALIN DS C 000A6C 273 DS 0F 000A6C 274 DS C 000A6D 000000 000A70 275 DC 0F'-1' 000A70 276 DS C 000A71 00 000A72 277 DC 0H'-1' 000A72 278 DS C 000A73 00 000A74 279 DC 0A(0) 000A74 280 DS C 000A75 000000 000A78 281 DC 0D'0' 000A78 282 DS C 000A79 00 000A7A 283 DC 0Y(0) 000A7A 284 DS C 000A7B 00 000A7C 285 DC 0S(BYTE) IEV044 *** ERROR *** UNDEFINED SYMBOL 000A7C 286 DS C 000A7D 000000

183183

Page 184: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 000A80 FFFFFFFF 287 DC 1F'-1' 000A84 288 DS C 000A85 00 000A86 FFFF 289 DC 1H'-1' 000A88 290 DS C 000A89 000000 000A8C 00000000 291 DC 1A(0) 000A90 292 DS C 000A91 00000000000000 000A98 0000000000000000 293 DC 1D'0' 000AA0 294 DS C 000AA1 00 000AA2 0000 295 DC 1Y(0) 000AA4 296 DS C 000AA5 00 000AA6 3A68 297 DC 1S(AAALIN) 000AA8 298 DS C 299 * CNOPS 000AB0 300 DS 0D 000AB0 301 DS C 000AB1 00 000AB2 070007000700 302 CNOP 0,8 000AB8 303 DS CL9 000AC1 00 000AC2 0700 304 CNOP 4,8 000AC4 305 DS CL5 000AC9 00 000ACA 306 CNOP 2,8 000ACA 307 DS CL7 000AD1 00 000AD2 07000700 308 CNOP 6,8 000AD6 309 DS CL3 000AD9 00 000ADA 0700 310 CNOP 0,4 000ADC 311 DS CL5 000AE1 00 000AE2 312 CNOP 2,4 313 *----------------------------------- 314 * DS 315 *-----------------------------------000AE2 316 DATA DS 0CL6 000AE2 317 DIA DS CL2 000AE4 318 MES DS CL2 000AE6 319 ANO DS CL2 000AE8 320 DS CL300000 IEV068 *** ERROR *** LENGTH ERROR -- L300000 000AE8 321 CAMPO DS 3CL2 IEV043 *** ERROR *** PREVIOUSLY DEFINED SYMBOL -- CAMPO 000AEE 322 DS C,P 000AF0 323 DS X'0A0B0C'

184184

Page 185: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 000AF3 324 DS CL300000 IEV068 *** ERROR *** LENGTH ERROR -- L300000 325 *----------------------------------- 326 END

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RELOCATION DICTIONARY POS.ID REL.ID FLAGS ADDRESS 0001 0001 0C 000070 0001 0001 08 0001B9 0001 0001 0C 000860 0001 0001 0C 000864 0001 0001 0C 000868 0001 0001 0C 00086C 0001 0001 0C 000874 0001 0001 0C 0008A4 0001 0001 0C 0008A8 0001 0001 04 000A46 0001 0001 04 000A48 0001 0001 04 000A54 0001 0001 04 000A56 0001 0001 04 000A58 0001 0001 04 000A5A 0001 0001 04 000A5C 0001 0001 04 000A5E 0001 0001 04 000A60 0001 0002 0C 00088C 0001 0003 1C 000890 0001 0003 1C 000898

185185

Page 186: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

CROSS REFERENCE SYMBOL LEN VALUE DEFN REFERENCES AAALIN 00001 000A68 0272 0297 ANO 00002 000AE6 0319 ARIMP 00133 0001C0 0130 0129 A1 00004 000848 0220 0229 A11 00001 000878 0231 0231 A12 00001 000879 0232 0232 A13 00001 000881 0233 0233 A2 00004 00084C 0221 0230 A3 00004 000854 0222 A4 00004 000858 0223 A5 00004 00085C 0224 0225 0226 0227 0261 0262 0263 BYTE ****UNDEFINED**** 0285 BYTEON 00001 000000FF 0085 CAMPO 00001 00008A 0091 0092 CAMPO 00001 00000000 0321 ****DUPLICATE**** COCIENTE 00012 00000074 0082 0256 DATA 00006 000AE2 0316 DCCC 00001 000245 0134 DCCC1 00256 000245 0135 DCC2 00003 000345 0136 DCC4 00001 000348 0137 DCC5 00002 00034B 0138 DIA 00002 000AE2 0317 DIVDENDO 00016 000074 0081 0082 0083 ENTRA 00003 0008B2 0251 0246 FORA 00001 00000000 0235 0234 HIDE 00001 00006D 0073 0074 IHB0003B 00004 000898 0241 0249 IHB0004 00001 000008A4 0245 0243 IHB0004A 00001 000008AC 0248 0244 LABEL 00001 00000074 0080 0256 MES 00002 000AE4 0318 MOVCOISA 00006 00000084 0087 MOVTRECO 00006 000084 0086 0087 OUTRORG 00001 000092 0096 PGMCANAL 00008 0001B8 0129 PROGDEMO 00001 00000000 0013 0264 0265 0266 0267 RESTO 00004 00000080 0083 0084 R1 00001 00000001 0079 SAI 00400 0008B5 0252 0247 SIMBOLOPODESTER63CARACTERES 00001 00000000 0029 TABELA 00256 00009A 0101 0102 0104 0106 0108 TAMRESTO 00001 00000004 0084 Y2 00002 000A4A 0257 Y3 00002 000A4E 0258 Y4 00002 000A50 0259 Y5 00002 000A52 0260 Z 00004 000844 0219 0236

186186

Page 187: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

DIAGNOSTIC CROSS REFERENCE AND ASSEMBLER S THE FOLLOWING STATEMENTS WERE FLAGGED 000028 000119 000120 000122 000123 000125 000134 000142 000149 000156 000 000205 000212 000256 000261 000262 000263 000264 000265 000266 000267 000 30 STATEMENTS FLAGGED IN THIS ASSEMBLY 12 WAS HIGHEST SEVERITY CO OVERRIDING PARAMETERS- LINECOUNT(50),XREF(FULL) OPTIONS FOR THIS ASSEMBLY DECK, NOOBJECT, LIST, XREF(FULL), NORENT, NOTEST, NOBATCH, ALIGN, ESD, R FLAG(0), SYSPARM() NO OVERRIDING DD NAMES 312 CARDS FROM SYSIN 216 CARDS FROM SYSLIB 572 LINES OUTPUT 73 CARDS OUTPUT

187187

Page 188: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

APÊNDICE Q - MONTAGEM DE PROGRAMA DE DEMONSTRAÇÃO 2

EXTERNAL SYMBOL DICTIONARY SYMBOL TYPE ID ADDR LENGTH LD ID FLAGS REGSBASE SD 0001 000000 0050D5 00

188188

Page 189: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 1 *----------------------------------- 2 * 1 2 3 3 *23456789012345678901234567890123456 4 *----------------------------------- 5 *----------------------------------- 6 * ESTE PROGRAMA NAO PODE SER 7 * EXECUTADO POIS NAO FUNCIONA. 8 * SEU OBJETIVO E' DEMONSTRAR O FUN- 9 * CIONAMENTO DE REGISTRADORES BASE 10 *-----------------------------------000000 11 REGSBASE START 0 00000 12 USING *,3,4,5,6,7 13 * 14 * AVISA QUE OS REGISTRADORES BASE 15 * SERAO O 3, 4, 5, 6 E 7 16 * E QUE SEUS CONTEUDOS PRESUMIDOS 17 * EM TEMPO DE EXECUCAO SERAO 18 * R3 = 000000 19 * R4 = 001000 20 * R5 = 002000 21 * R6 = 003000 22 * R7 = 004000 23 *----------------------------------- 00000 24 USING DSEQUIT,11 25 * 26 * AVISA QUE OS CAMPOS DA DSECT TERAO 27 * O REGISTRADOR 11 COMO BASE 28 *----------------------------------- 29 *----------------------------------- 30 * ESTE PRIMEIRO BLOCO E SERVIDO PELO 31 * REGISTRADOR BASE 3. ESTE BLOCO VAI 32 * DO ENDERECO 000000 ATE O 000FFF 33 *----------------------------------- 00000 34 BLOCO1 EQU * 000000 35 DS CL4096 001000 00000 36 ORG BLOCO1 000000 37 DS CL1024 000400 38 A DS CL16 000410 39 B DS CL16 40 * . . 000420 3400 41 DC S(A) 000422 3410 42 DC S(B) 000424 400040165000502C 43 DC S(C,D,E,F) 00042C 6000604270007058 44 DC S(G,H,I,J) 45 * . . 000434 D20F 3400 3410 00400 00410 46 MVC A,B 00043A D215 4000 4016 01000 01016 47 MVC C,D 000440 D22B 5000 502C 02000 0202C 48 MVC E,F 000446 D241 6000 6042 03000 03042 49 MVC G,H 00044C D257 7000 7058 04000 04058 50 MVC I,J

189189

Page 190: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 51 * . . 000452 D20F 3400 7058 00400 04058 52 MVC A,J 000458 D257 7000 3410 04000 00410 53 MVC I,B 00045E D215 4000 6000 01000 03000 54 MVC C,G 000464 D24C 6042 4016 03042 01016 55 MVC H,D 56 * . . 00046A D20F 3400 B000 00400 00000 57 MVC A,DSEKCPO1 000470 D215 4000 B00B 01000 0000B 58 MVC C,DSEKCPO2 000476 0000 0000 0000 00000 00000 59 MVC E,DSEKCOP3 IEV044 *** ERROR *** UNDEFINED SYMBOL 00047C D241 6000 B021 03000 00021 60 MVC G,DSEKCPO4 000482 D257 7000 B02C 04000 0002C 61 MVC I,DSEKCPO5 000488 D20A B037 B042 00037 00042 62 MVC DSEKCPO6,DSEKCPO7 63 * . . 00048E 41C0 7FFF 04FFF 64 LA 12,Z-1 000492 0000 0000 00000 65 LA 12,Z+1 IEV034 *** ERROR *** ADDRESSABILITY ERROR 000496 0000 0000 00000 66 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 00049A 58C0 34A8 004A8 67 L 12,=A(Z) 00049E D20F 3400 34AC 00400 004AC 68 MVC A,=C'*' 69 * . . 0004A8 70 LTORG , 0004A8 00005000 71 =A(Z) 0004AC 5C 72 =C'*' 73 * . . 0004AD 00 0004AE D20F 3400 40E4 00400 010E4 74 MVC A,=C'*' 0004B4 0000 0000 00000 75 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 0004B8 58C0 40E0 010E0 76 L 12,=A(Z) 77 * . . 0004BC 01000 78 ORG , 79 *----------------------------------- 80 * ESTE SEGUNDO BLOCO E SERVIDO PELO 81 * REGISTRADOR BASE 4. ESTE BLOCO VAI 82 * DO ENDERECO 001000 ATE O 001FFF 83 *----------------------------------- 01000 84 BLOCO2 EQU * 001000 85 DS CL4096 002000 01000 86 ORG BLOCO2 001000 87 C DS CL22 001016 88 D DS CL33 89 * . . 001037 00 001038 D20F 3400 3410 00400 00410 90 MVC A,B 00103E D215 4000 4016 01000 01016 91 MVC C,D 001044 D22B 5000 502C 02000 0202C 92 MVC E,F 00104A D241 6000 6042 03000 03042 93 MVC G,H 001050 D257 7000 7058 04000 04058 94 MVC I,J

190190

Page 191: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 95 * . . 001056 D20F 3400 7058 00400 04058 96 MVC A,J 00105C D257 7000 3410 04000 00410 97 MVC I,B 001062 D215 4000 6000 01000 03000 98 MVC C,G 001068 D24C 6042 4016 03042 01016 99 MVC H,D 100 * . . 101 * VOU TIRAR O 5 DA TABELA DE BASES 102 * . . 103 DROP 5 00106E D20F 3400 3410 00400 00410 104 MVC A,B 001074 D215 4000 4016 01000 01016 105 MVC C,D 00107A 0000 0000 0000 00000 00000 106 MVC E,F IEV034 *** ERROR *** ADDRESSABILITY ERROR IEV034 *** ERROR *** ADDRESSABILITY ERROR 001080 D241 6000 6042 03000 03042 107 MVC G,H 001086 D257 7000 7058 04000 04058 108 MVC I,J 109 * . . 110 * VOU FAZER O 5 VOLTAR 'A TABELA DE 111 * BASES, COM O MESMO CONTEUDO 112 * . . 02000 113 USING REGSBASE+X'2000',5 00108C D20F 3400 3410 00400 00410 114 MVC A,B 001092 D215 4000 4016 01000 01016 115 MVC C,D 001098 D22B 5000 502C 02000 0202C 116 MVC E,F 00109E D241 6000 6042 03000 03042 117 MVC G,H 0010A4 D257 7000 7058 04000 04058 118 MVC I,J 119 * . . 0010AA D20F 3400 B000 00400 00000 120 MVC A,DSEKCPO1 0010B0 D215 4000 B00B 01000 0000B 121 MVC C,DSEKCPO2 0010B6 0000 0000 0000 00000 00000 122 MVC E,DSEKCOP3 IEV044 *** ERROR *** UNDEFINED SYMBOL 0010BC D241 6000 B021 03000 00021 123 MVC G,DSEKCPO4 0010C2 D257 7000 B02C 04000 0002C 124 MVC I,DSEKCPO5 0010C8 D20A B037 B042 00037 00042 125 MVC DSEKCPO6,DSEKCPO7 126 * . . 0010CE 0000 0000 00000 127 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 0010D2 58C0 40E0 010E0 128 L 12,=A(Z) 0010D6 D20F 3400 40E4 00400 010E4 129 MVC A,=C'*' 130 * . . 0010E0 131 LTORG , 0010E0 00005000 132 =A(Z) 0010E4 5C 133 =C'*' 134 * . . 0010E5 00 0010E6 D20F 3400 50D4 00400 020D4 135 MVC A,=C'*' 0010EC 0000 0000 00000 136 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 0010F0 58C0 50D0 020D0 137 L 12,=A(Z) 138 * . .

191191

Page 192: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 0010F4 02000 139 ORG , 140 *----------------------------------- 141 * ESTE TERCEIRO BLOCO E SERVIDO PELO 142 * REGISTRADOR BASE 5. ESTE BLOCO VAI 143 * DO ENDERECO 002000 ATE O 002FFF 144 *----------------------------------- 02000 145 BLOCO3 EQU * 002000 146 DS CL4096 003000 02000 147 ORG BLOCO3 002000 148 E DS CL44 00202C 149 F DS CL55 150 * . . 002063 00 002064 D20F 3400 3410 00400 00410 151 MVC A,B 00206A D215 4000 4016 01000 01016 152 MVC C,D 002070 D22B 5000 502C 02000 0202C 153 MVC E,F 002076 D241 6000 6042 03000 03042 154 MVC G,H 00207C D257 7000 7058 04000 04058 155 MVC I,J 156 * . . 002082 D20F 3400 7058 00400 04058 157 MVC A,J 002088 D257 7000 3410 04000 00410 158 MVC I,B 00208E D215 4000 6000 01000 03000 159 MVC C,G 002094 D24C 6042 4016 03042 01016 160 MVC H,D 161 * . . 00209A D20F 3400 B000 00400 00000 162 MVC A,DSEKCPO1 0020A0 D215 4000 B00B 01000 0000B 163 MVC C,DSEKCPO2 0020A6 0000 0000 0000 00000 00000 164 MVC E,DSEKCOP3 IEV044 *** ERROR *** UNDEFINED SYMBOL 0020AC D241 6000 B021 03000 00021 165 MVC G,DSEKCPO4 0020B2 D257 7000 B02C 04000 0002C 166 MVC I,DSEKCPO5 0020B8 D20A B037 B042 00037 00042 167 MVC DSEKCPO6,DSEKCPO7 168 * . . 0020BE 0000 0000 00000 169 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 0020C2 58C0 50D0 020D0 170 L 12,=A(Z) 0020C6 D20F 3400 50D4 00400 020D4 171 MVC A,=C'*' 172 * . . 0020D0 173 LTORG , 0020D0 00005000 174 =A(Z) 0020D4 5C 175 =C'*' 176 * . . 0020D5 00 0020D6 D20F 3400 60FC 00400 030FC 177 MVC A,=C'*' 0020DC 0000 0000 00000 178 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 0020E0 58C0 60F8 030F8 179 L 12,=A(Z) 180 * . . 0020E4 03000 181 ORG , 182 *----------------------------------- 183 * ESTE QUARTO BLOCO E SERVIDO PELO

192192

Page 193: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 184 * REGISTRADOR BASE 6. ESTE BLOCO VAI 185 * DO ENDERECO 003000 ATE O 003FFF 186 *----------------------------------- 03000 187 BLOCO4 EQU * 003000 188 DS CL4096 004000 03000 189 ORG BLOCO4 003000 190 G DS CL66 003042 191 H DS CL77 192 * . . 00308F 00 003090 D20F 3400 3410 00400 00410 193 MVC A,B 003096 D215 4000 4016 01000 01016 194 MVC C,D 00309C D22B 5000 502C 02000 0202C 195 MVC E,F 0030A2 D241 6000 6042 03000 03042 196 MVC G,H 0030A8 D257 7000 7058 04000 04058 197 MVC I,J 198 * . . 0030AE D20F 3400 7058 00400 04058 199 MVC A,J 0030B4 D257 7000 3410 04000 00410 200 MVC I,B 0030BA D215 4000 6000 01000 03000 201 MVC C,G 0030C0 D24C 6042 4016 03042 01016 202 MVC H,D 203 * . . 0030C6 D20F 3400 B000 00400 00000 204 MVC A,DSEKCPO1 0030CC D215 4000 B00B 01000 0000B 205 MVC C,DSEKCPO2 0030D2 0000 0000 0000 00000 00000 206 MVC E,DSEKCOP3 IEV044 *** ERROR *** UNDEFINED SYMBOL 0030D8 D241 6000 B021 03000 00021 207 MVC G,DSEKCPO4 0030DE D257 7000 B02C 04000 0002C 208 MVC I,DSEKCPO5 0030E4 D20A B037 B042 00037 00042 209 MVC DSEKCPO6,DSEKCPO7 210 * . . 0030EA 0000 0000 00000 211 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 0030EE 58C0 60F8 030F8 212 L 12,=A(Z) 0030F2 D20F 3400 60FC 00400 030FC 213 MVC A,=C'*' 214 * . . 0030F8 215 LTORG , 0030F8 00005000 216 =A(Z) 0030FC 5C 217 =C'*' 218 * . . 0030FD 00 0030FE D20F 3400 712C 00400 0412C 219 MVC A,=C'*' 003104 0000 0000 00000 220 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 003108 58C0 7128 04128 221 L 12,=A(Z) 222 * . . 00310C 04000 223 ORG , 224 *----------------------------------- 225 * ESTE QUINTO BLOCO E SERVIDO PELO 226 * REGISTRADOR BASE 7. ESTE BLOCO VAI 227 * DO ENDERECO 004000 ATE O 004FFF 228 *-----------------------------------

193193

Page 194: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 04000 229 BLOCO5 EQU * 004000 230 DS CL4096 005000 04000 231 ORG BLOCO5 004000 232 I DS CL88 004058 233 J DS CL99 234 * . . 0040BB 00 0040BC D20F 3400 3410 00400 00410 235 MVC A,B 0040C2 D215 4000 4016 01000 01016 236 MVC C,D 0040C8 D22B 5000 502C 02000 0202C 237 MVC E,F 0040CE D241 6000 6042 03000 03042 238 MVC G,H 0040D4 D257 7000 7058 04000 04058 239 MVC I,J 240 * . . 0040DA D20F 3400 7058 00400 04058 241 MVC A,J 0040E0 D257 7000 3410 04000 00410 242 MVC I,B 0040E6 D215 4000 6000 01000 03000 243 MVC C,G 0040EC D24C 6042 4016 03042 01016 244 MVC H,D 245 * . . 0040F2 D20F 3400 B000 00400 00000 246 MVC A,DSEKCPO1 0040F8 D215 4000 B00B 01000 0000B 247 MVC C,DSEKCPO2 0040FE 0000 0000 0000 00000 00000 248 MVC E,DSEKCOP3 IEV044 *** ERROR *** UNDEFINED SYMBOL 004104 D241 6000 B021 03000 00021 249 MVC G,DSEKCPO4 00410A D257 7000 B02C 04000 0002C 250 MVC I,DSEKCPO5 004110 D20A B037 B042 00037 00042 251 MVC DSEKCPO6,DSEKCPO7 252 * . . 004116 0000 0000 00000 253 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 00411A 58C0 7128 04128 254 L 12,=A(Z) 00411E D20F 3400 712C 00400 0412C 255 MVC A,=C'*' 256 * . . 004128 257 LTORG , 004128 00005000 258 =A(Z) 00412C 5C 259 =C'*' 260 * . . 00412D 00 00412E 0000 0000 0000 00000 00000 261 MVC A,=C'*' IEV034 *** ERROR *** ADDRESSABILITY ERROR 004134 0000 0000 00000 262 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 004138 0000 0000 00000 263 L 12,=A(Z) IEV034 *** ERROR *** ADDRESSABILITY ERROR 264 * . . 00413C 05000 265 ORG , 266 *----------------------------------- 267 * ESTE SEXTO BLOCO NAO TEM BASE QUE 268 * O ATENDA. TODOS OS SEUS ENDERECOS 269 * NAO PODEM SER CONVERTIDOS EM 270 * BASE+DESLOCAMENTO 271 *-----------------------------------

194194

Page 195: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 005000 272 Z DS CL80 273 * . . 005050 D20F 3400 3410 00400 00410 274 MVC A,B 005056 D215 4000 4016 01000 01016 275 MVC C,D 00505C D22B 5000 502C 02000 0202C 276 MVC E,F 005062 D241 6000 6042 03000 03042 277 MVC G,H 005068 D257 7000 7058 04000 04058 278 MVC I,J 279 * . . 00506E D20F 3400 7058 00400 04058 280 MVC A,J 005074 D257 7000 3410 04000 00410 281 MVC I,B 00507A D215 4000 6000 01000 03000 282 MVC C,G 005080 D24C 6042 4016 03042 01016 283 MVC H,D 284 * . . 005086 D20F 3400 B000 00400 00000 285 MVC A,DSEKCPO1 00508C D215 4000 B00B 01000 0000B 286 MVC C,DSEKCPO2 005092 0000 0000 0000 00000 00000 287 MVC E,DSEKCOP3 IEV044 *** ERROR *** UNDEFINED SYMBOL 005098 D241 6000 B021 03000 00021 288 MVC G,DSEKCPO4 00509E D257 7000 B02C 04000 0002C 289 MVC I,DSEKCPO5 0050A4 D20A B037 B042 00037 00042 290 MVC DSEKCPO6,DSEKCPO7 291 * . . 0050AA 0000 0000 00000 292 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 0050AE 0000 0000 00000 293 L 12,=A(Z) IEV034 *** ERROR *** ADDRESSABILITY ERROR 0050B2 0000 0000 0000 00000 00000 294 MVC A,=C'*' IEV034 *** ERROR *** ADDRESSABILITY ERROR 295 * . . 0050B8 296 LTORG , 0050B8 00005000 297 =A(Z) 0050BC 5C 298 =C'*' 299 * . . 0050BD 00 0050BE 0000 0000 0000 00000 00000 300 MVC A,=C'*' IEV034 *** ERROR *** ADDRESSABILITY ERROR 0050C4 0000 0000 00000 301 LA 12,Z IEV034 *** ERROR *** ADDRESSABILITY ERROR 0050C8 0000 0000 00000 302 L 12,=A(Z) IEV034 *** ERROR *** ADDRESSABILITY ERROR 303 *----------------------------------- 304 * ESTA E' A DSECT DSEQUIT. 305 * OS SEUS CAMPOS SERAO ENDERECADOS 306 * PELO REGISTRADOR 11 307 *-----------------------------------000000 308 DSEQUIT DSECT 000000 309 DSEKCPO1 DS CL11 00000B 310 DSEKCPO2 DS CL11 000016 311 DSEKCPO3 DS CL11 000021 312 DSEKCPO4 DS CL11 00002C 313 DSEKCPO5 DS CL11

195195

Page 196: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 000037 314 DSEKCPO6 DS CL11 000042 315 DSEKCPO7 DS CL11 316 *----------------------------------- 317 * VOLTO PARA A CSECT DO PROGRAMA 318 *-----------------------------------0050CC 319 REGSBASE CSECT , 320 END , 0050D0 00005000 321 =A(Z) 0050D4 5C 322 =C'*'

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RELOCATION DICTIONARY POS.ID REL.ID FLAGS ADDRESS 0001 0001 0C 0004A8 0001 0001 0C 0010E0 0001 0001 0C 0020D0 0001 0001 0C 0030F8 0001 0001 0C 004128 0001 0001 0C 0050B8 0001 0001 0C 0050D0

196196

Page 197: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

CROSS REFERENCE SYMBOL LEN VALUE DEFN REFERENCES A 00016 000400 0038 0041 0046 0052 0057 0068 0074 0090 0096 0104 0 0193 0199 0204 0213 0219 0235 0241 0246 0255 0B 00016 000410 0039 0042 0046 0053 0090 0097 0104 0114 0151 0158 0BLOCO1 00001 00000000 0034 0036 BLOCO2 00001 00001000 0084 0086 BLOCO3 00001 00002000 0145 0147 BLOCO4 00001 00003000 0187 0189 BLOCO5 00001 00004000 0229 0231 C 00022 001000 0087 0043 0047 0054 0058 0091 0098 0105 0115 0121 0 0275 0282 0286 D 00033 001016 0088 0043 0047 0055 0091 0099 0105 0115 0152 0160 0DSEKCOP3 ****UNDEFINED**** 0059 0122 0164 0206 0248 0287 DSEKCPO1 00011 000000 0309 0057 0120 0162 0204 0246 0285 DSEKCPO2 00011 00000B 0310 0058 0121 0163 0205 0247 0286 DSEKCPO3 00011 000016 0311 DSEKCPO4 00011 000021 0312 0060 0123 0165 0207 0249 0288 DSEKCPO5 00011 00002C 0313 0061 0124 0166 0208 0250 0289 DSEKCPO6 00011 000037 0314 0062 0125 0167 0209 0251 0290 DSEKCPO7 00011 000042 0315 0062 0125 0167 0209 0251 0290 DSEQUIT 00001 00000000 0308 0024 E 00044 002000 0148 0043 0048 0059 0092 0106 0116 0122 0153 0164 0F 00055 00202C 0149 0043 0048 0092 0106 0116 0153 0195 0237 0276 G 00066 003000 0190 0044 0049 0054 0060 0093 0098 0107 0117 0123 0 0277 0282 0288 H 00077 003042 0191 0044 0049 0055 0093 0099 0107 0117 0154 0160 0I 00088 004000 0232 0044 0050 0053 0061 0094 0097 0108 0118 0124 0 0278 0281 0289 J 00099 004058 0233 0044 0050 0052 0094 0096 0108 0118 0155 0157 0REGSBASE 00001 00000000 0011 0113 0319 Z 00080 005000 0272 0064 0065 0066 0071 0075 0127 0132 0136 0169 0 0297 0301 0321 =A(Z) 00004 0004A8 0071 0067 =A(Z) 00004 0010E0 0132 0076 0128 =A(Z) 00004 0020D0 0174 0137 0170 =A(Z) 00004 0030F8 0216 0179 0212 =A(Z) 00004 004128 0258 0221 0254 =A(Z) 00004 0050B8 0297 0263 0293 =A(Z) 00004 0050D0 0321 0302 =C'*' 00001 0004AC 0072 0068 =C'*' 00001 0010E4 0133 0074 0129 =C'*' 00001 0020D4 0175 0135 0171 =C'*' 00001 0030FC 0217 0177 0213 =C'*' 00001 00412C 0259 0219 0255 =C'*' 00001 0050BC 0298 0261 0294 =C'*' 00001 0050D4 0322 0300

197197

Page 198: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

DIAGNOSTIC CROSS REFERENCE AND ASSEMBLER S THE FOLLOWING STATEMENTS WERE FLAGGED 000059 000065 000066 000075 000106 000122 000127 000136 000164 000169 000 000261 000262 000263 000287 000292 000293 000294 000300 000301 000302 26 STATEMENTS FLAGGED IN THIS ASSEMBLY 8 WAS HIGHEST SEVERITY CO OVERRIDING PARAMETERS- LINECOUNT(50),XREF(FULL) OPTIONS FOR THIS ASSEMBLY DECK, NOOBJECT, LIST, XREF(FULL), NORENT, NOTEST, NOBATCH, ALIGN, ESD, R FLAG(0), SYSPARM() NO OVERRIDING DD NAMES 308 CARDS FROM SYSIN 0 CARDS FROM SYSLIB 452 LINES OUTPUT 24 CARDS OUTPUT

198198

Page 199: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

PROGRAMAS PROPOSTOS

EXERCÍCIO 01

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (ZIG). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 5 5 X Informação ALFA6 15 10 X Informação BETA16 30 15 X Informação GAMA31 50 20 X Informação DELTA

Exemplo:

12345678901234567890123456789012345678901234567890 ("régua")

AAAAABBBBBBBBBBCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDD11111222222222233333333333333344444444444444444444-----**********&&&&&&&&&&&&&&&====================

---------------------------------------------------------------------------SAIDA : Arquivo em disco sequencial (ZAG). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 15 15 X Informação GAMA16 20 5 X Informação ALFA21 40 20 X Informação DELTA41 50 10 X Informação BETA

Exemplo:

12345678901234567890123456789012345678901234567890 ("régua")

CCCCCCCCCCCCCCCAAAAADDDDDDDDDDDDDDDDDDDDBBBBBBBBBB33333333333333311111444444444444444444442222222222&&&&&&&&&&&&&&&-----====================**********

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de ZIG lido, gravar um registro de ZAG.

199199

Page 200: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 02

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (TIC). Tem no máximo 10 registros. Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 4 4 X Informação a5 8 4 X Informação b9 12 4 X Informação c13 16 4 X Informação d17 20 4 X Informação e21 24 4 X Informação f25 28 4 X Informação g29 32 4 X Informação h33 36 4 X Informação i37 40 4 X Informação j

Exemplo:

1234567890123456789012345678901234567890 ("régua")

AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJ1111222233334444555566667777888899990000LLLLMMMMOOOOPPPPQQQQRRRRSSSSTTTTUUUUXXXX

---------------------------------------------------------------------------SAIDA : Arquivo em disco sequencial (TAC). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 4 4 B Número registro5 8 4 X Informação n9 20 12 X zeros binários

Exemplo: (em hexadecimal)

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

00000001C1C1C1C100000000000000000000000000000002F2F2F2F200000000000000000000000000000003D6D6D6D6000000000000000000000000

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de TIC lido, gravar um registro de TAC, onde a informação n corresponde ao n-ésimo campo do registro de entrada, sendo n = número do registro. Por exemplo, o registro 1 vai ter a informação a gravada; o registro 2 vai ter a informação b; e assim por diante.

200200

Page 201: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 03

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (ENTRA). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 50 50 X Informação qualquer

Exemplo:

1234567890123456789012345678901234567890 ("régua")

TEXTO LIVRE PARA DAR ASAS A IMAGINACAOMOVE SPACES TO LINHA-DE-IMPRESSAO

OKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOK

---------------------------------------------------------------------------SAIDA : Arquivo em disco sequencial (SAI). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 4 4 B Número registro5 8 4 B quantos brancos9 12 4 B quantos não brancos13 20 8 X X'FF' em todos bytes

Exemplo: (em hexadecimal)

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

00000001000000080000002AFFFFFFFFFFFFFFFF000000020000000A00000028FFFFFFFFFFFFFFFF000000030000003200000000FFFFFFFFFFFFFFFF000000040000000000000032FFFFFFFFFFFFFFFF

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de ENTRA lido, considerá-lo como uma tabela de 50 elementos de 1 byte cada; pesquisar cada byte para saber se ele está em branco (X'40') ou não, e ir acumulando em dois acumuladores a quantidade de bytes brancos e não-brancos detectada. Após "varrer" o registro inteiro em suas 50 posições, gravar um registro de SAI.

201201

Page 202: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 04

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (TOP). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 4 4 B Número a5 8 4 B Número b9 12 4 B Número c13 20 8 X brancos

Exemplo: (em hexadecimal)

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

00000001000000020000000340404040404040400000000700000006000000054040404040404040000000090000000A000000024040404040404040

---------------------------------------------------------------------------SAIDA : Arquivo em disco sequencial (DOWN). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 4 4 B Número registro5 8 4 B menor número9 12 4 B maior número13 20 8 X X'FF' em todos bytes

Exemplo: (em hexadecimal)

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

000000010000000100000003FFFFFFFFFFFFFFFF000000020000000500000007FFFFFFFFFFFFFFFF00000003000000020000000AFFFFFFFFFFFFFFFF

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de TOP lido, determinar dos 3 números fornecidos (a, b, c) qual deles é o menor e qual deles é o maior; gravar, então, um registro de DOWN.

202202

Page 203: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 05

---------------------------------------------------------------------------ENTRADA 1 : Arquivo em disco sequencial (EU)

Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 4 4 B Número a 5 8 4 P Número b9 12 4 Z Número c13 20 8 C Filler

Exemplo:

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

000000010000123CF0F0F1F10000000000000000000000020000124CF0F0F1F20000000000000000000000030000125CF0F0F1F30000000000000000

---------------------------------------------------------------------------SAIDA : Arquivo sequencial em disco (ELA). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 4 4 B Número do registro 5 14 10 Z Média ponderada15 20 6 C Filler

Exemplo:

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

00000001F0F0F0F0F0F0F0F0F4F500000000000000000002F0F0F0F0F0F0F0F0F4F600000000000000000003F0F0F0F0F0F0F0F0F4F7000000000000

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro lido em EU calcular a média ponderada (MP):MP = ( (a.7) + (b.8) + (c.9) ) / 24e gravar um registro de ELA.

203203

Page 204: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 06

---------------------------------------------------------------------------ENTRADA 1 : Arquivo em disco sequencial (VEMTAB)

Lay-out: Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 5 5 C Código cidade6 30 25 C Nome cidade

Exemplo:

123456789012345678901234567890 ("régua")

00003BOM JESUS DE PIRAPORA00001SAO PAULO00002SAO JOAO DO CAIUA

---------------------------------------------------------------------------ENTRADA 2 : Arquivo em disco sequencial (VEMMAIS)

Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 5 5 C Código cidade6 30 25 C Nome prefeito

Exemplo:

123456789012345678901234567890 ("régua")

00001PREFEITO DA CIDADE 0000100002ALBERTO ROMANO SCHIESARI00003QUITERIA SILVEIRA

204204

Page 205: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

---------------------------------------------------------------------------SAIDA : Relatório (VAI). Lay-out:

123456789012345678901234567890123456789012345678901234567890 ("régua")

xxxxx xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxcod nome cidade nome prefeitocid

Exemplo:

123456789012345678901234567890123456789012345678901234567890 ("régua")

00001 SAO PAULO PREFEITO DA CIDADE 0000100002 SAO JOAO DO CAIUA ALBERTO ROMANO SCHIESARI00003 BOM JESUS DE PIRAPORA QUITERIA SILVEIRA

---------------------------------------------------------------------------PROCESSAMENTO

Numa primeira fase, o programa deve ler o arquivo VEMTAB e montar uma tabela em memória com o código da cidade e o nome da cidade, onde cada elemento é oriundo de um registro lido. O arquivo VEMTAB pode ter no máximo 6000 registros; testar a quantidade, para, no caso de ela exceder os 6000, cancelar o programa.Terminada essa fase, iniciar a segunda fase, na qual deve-se ler VEMMAIS e, para cada registro lido, imprimir uma linha de VAI, onde o nome da cidade deve ser obtido através de pesquisa sequencial na tabela montada durante a primeira fase do programa.

205205

Page 206: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 07

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (PAZ). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 4 4 B Informação qualquer5 20 16 C Brancos

Exemplo: (em hexadecimal)

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

C1F200AA404040404040404040404040404040405C614EFF40404040404040404040404040404040

---------------------------------------------------------------------------SAIDA : Relatório (AMOR). Lay-out:

123456789012345678901234567890123456789012345678901234567890 ("régua")

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "dump" (em EBCDIC) do conteúdo dos 4 bytes iniciais do registro de PAZ

Exemplo:

123456789012345678901234567890123456789012345678901234567890 ("régua")

1100000111110010000000001010101001011100011000010100111011111111

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de PAZ lido, determinar, para cada um dos bits dos 4 primeiros bytes do registros, se eles estão ligados ou desligados. Cada um que estiver ligado, deve ser representado na posição respectiva da linha de impressão com 1; e, se estiver desligado, deve ser representado com 0.Observar que a representação na linha de impressão, para que possa ser visualizada, deve ser feita em EBCDIC: se for 0, o conteúdo do byte na linha de impressão deve ser X'F0'; se for 1, o conteúdo deverá ser X'F1'.

206206

Page 207: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 08

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (ROMEU). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 4 4 B Número a5 9 5 Z Número b10 12 3 P Número c13 20 8 C Brancos

Exemplo: (em hexadecimal)

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

0000000AF1F2F3F4D501234C404040404040404000000011F0F0F1F9F900002D4040404040404040

---------------------------------------------------------------------------SAIDA : Relatório (JULIETA). Lay-out:

123456789012345678901234567890123456789012345678901234567890 ("régua")

RELATORIO DE CALCULOS PAG xxx

xxxxxxxxxx NEGATIVO ou xxxxxxxxxx NEGATIVO ou POSITIVO ou POSITIVO ou ZERO ZEROresultado result1 resto

Exemplo:

123456789012345678901234567890123456789012345678901234567890 ("régua")

RELATORIO DE CALCULOS PAG 001

0000062909 NEGATIVO 0000000001 NEGATIVO 0000001082 POSITIVO 0000000000 ZERO

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de ROMEU lido, efetuar o seguinte cálculo:RESULT1 = ((a+b)*5)-cCalcular, em seguida, o resto da divisão RESULT1/2.Imprimir uma linha de JULIETA de acordo com o lay-out, controlando fim de folha através de contador de linhas (máximo 10 linhas de detalhe por página).

207207

Page 208: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 09

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (TRISTAO). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 6 6 Z Data na forma DDMMAA1 2 2 Z Dia3 4 2 Z Mes5 6 2 Z Ano7 20 14 C Brancos

Exemplo:

12345678901234567890 ("régua")

280288311290121091---------------------------------------------------------------------------SAIDA : Relatório (ISOLDA). Lay-out:

123456789012345678901234567890123456789012345678901234567890 ("régua")

ddmmaa ddmmaa data fornecida data calculada

Exemplo:

123456789012345678901234567890123456789012345678901234567890 ("régua")

280288 010388311290 010191121091 131091

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de TRISTAO lido, calcular, com base na data fornecida, a data correspondente ao dia seguinte; respeitar os meses com 30 ou 31 dias, e no caso de fevereiro, considerar os anos bissextos ou não, para efeito do número máximo de dias (29 ou 28).Imprimir uma linha de ISOLDA de acordo com o lay-out.

208208

Page 209: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 10

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (JOHN). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 20 20 C Informação qualquer

Exemplo: (em hexadecimal)

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

F1C34E000102030405060708090A0B0C0D0E0F1E61506B1112131415161718191A1B1C1D1E1F2021A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3---------------------------------------------------------------------------SAIDA : Relatório (LENNON). Lay-out:

12345678901234567890123456789012345678901234567890123456789012 ("régua")

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx... dump em hexa do registro de john ... .... dump em carater

Exemplo:

12345678901234567890123456789012345678901234567890123456789012 ("régua")

F1C34E000102030405060708090A0B0C0D0E0F1E 1C+.................61506B1112131415161718191A1B1C1D1E1F2021 /&,.................A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3 ....................

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de JOHN lido, exibir uma linha de LENNON onde apareça o dump em hexa dos dados lidos em JOHN, e também o dump em caráter, observando-se que os caracteres não imprimíveis devem aparecer como um ponto.Considerar como caracteres imprimíveis os algarismos decimais, as letras maiúsculas, e os caracteres especiais . , + - / ? & $ * ( )

209209

Page 210: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 11

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (MICRO). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 20 20 C Informação qualquer

Exemplo: (em hexadecimal)

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua")

81828384858687888940404040404040404040409192939495969798994040404040404040404040A2A3A4A5A6A7A8A9404040404040404040404040---------------------------------------------------------------------------SAIDA : Relatório (MACRO). Lay-out:

12345678901234567890123456789012345678901234567890123456789012 ("régua")

xxxxxxxxxxxxxxxxxxxxdump em carater do registro de micro

Exemplo:

12345678901234567890123456789012345678901234567890123456789012 ("régua")

ABCDEFGHIJKLMNOPQRSTUVWXYZ---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de MICRO lido, exibir uma linha de MACRO onde apareça o dump em carater dos dados lidos em JOHN, e transformados. Considerar que MICRO tenha em seu conteúdo somente letras minúsculas e brancos, e a transformação deve consistir na conversão das letras minúsculas em maiúsculas, deixando os brancos inalterados.

210210

Page 211: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 12

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (HONEY). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 6 6 Z Data na forma DDMMAA7 20 14 C Brancos

Exemplo:

12345678901234567890 ("régua")

130190150291300392---------------------------------------------------------------------------SAIDA : Relatório (MOON). Lay-out:

12345678901234567890123456789012345678901234567890123456789012 ("régua")

ddmmaa yyddddata gregoriana data juliana

Exemplo:

12345678901234567890123456789012345678901234567890123456789012 ("régua")

130190 90013150291 91046300392 92090---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de HONEY lido, exibir uma linha de MOON, onde a data juliana tenha sido obtida através de uma sub-rotina externa que converterá a data gregoriana em juliana. Deve-se fornecer como parâmetros da sub-rotina 2 campos: o que tem a data gregoriana e o que terá a data juliana. A data gregoriana deverá ser consistida:- deve ser numérica- mes não pode ser menor que 1 nem maior que 12- dia deve ser compatível com o mes, considerando-se o caso dos anos bissextos.

211211

Page 212: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIO 13

---------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (FREE). Lay-out:

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 60 60 C Texto livre

Exemplo:

123456789012345678901234567890123456789012345678901234567890 ("régua")

ESTOU APRENDENDO ASSEMBLER E JA SEI QUASE TUDO 123 $ &&& WORD LOTUS DOS MVS 123 ***** LASTLAA B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 0 A B C D E F G H I J K L M N O P Q R S T U V W---------------------------------------------------------------------------SAIDA : Relatório (WAY). Lay-out:

12345678901234567890123456789012345678901234567890123456789012 ("régua")

REGISTRO zzn qqnro registro quantidade de strings

Exemplo:

12345678901234567890123456789012345678901234567890123456789012 ("régua")

REGISTRO 1 11REGISTRO 2 7REGISTRO 3 30REGISTRO 4 30

---------------------------------------------------------------------------PROCESSAMENTO

Para cada registro de FREE lido, exibir uma linha de WAY, onde apareça a quantidade de strings existentes no registro de entrada. Considerar como string um conjunto de caracteres não brancos que terminem com um branco (ou no fim do registro).

212212

Page 213: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

EXERCÍCIOS RESOLVIDOS

ER01 - Exibir o conteúdo do registrador 12 nas posições 11 a 18 de uma linha de tela, de tal forma a visualizar seu conteúdo, exibido, portanto, em EBCDIC.

SOLUÇÃO:

ST 12,FULL UNPK AREA+10(9),FULL(5) TR AREA+10(8),TAB MVI AREA+18,C' '

FULL DS FAREA DC CL80' 'TAB DC 256X'00' ORG TAB+C'0' DC C'0123456789ABCDEF' ORG

213213

Page 214: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

ER02 - Dada uma tabela com 1000 elementos com 8 bytes cada, elaborar uma rotina que faça nela uma pesquisa binária, baseando-se num argumento existente num campo de memória de 5 bytes denominado ARG.

OBS. cada elemento da tabela é composto de um campo chave de 5 bytes e outro de 3 bytes, o qual deve ser colocado num campo de memória de 3 bytes chamado RESULT.

SOLUÇÃO:

PRG3 XEGUEI . . ...montagem da TABELA e de ARG... . LA 6,=A(TABELA)+1000*8 LA 5,=A(TABELA)VOLTA CLC 0(5,5),ARG BE ACHOU LA 5,8(5) CR 5,6 BH FIM B VOLTAACHOU LA 5,5(5) MVC RESULT,0(3,5)FIM TCHAUARG DC CL5'0'RESULT DC CL3'0' LTORG LTORGTABELA DS 1000CL8 END PRG3

214214

Page 215: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

ER03 - Considerar em um programa os seguintes campos:

VINIC (VALOR INICIAL) VINCR (INCREMENTO) VMAX (VALOR MAXIMO)

Eles já estão inicializados com números compactados positivos.Montar uma tabela de 5000 elementos, cada qual com 5 bytes, que deverão conter números compactados, a saber: ELEMENTO1 = VINIC ELEMENTO2 = VINIC + VINCR ELEMENTO3 = VINIC + ELEMENTO2 . . . ELEMENTOn = VINIC + ELEMENTO n-1sendo n=5000, ou aquele que tiver valor igual ou menor mais próximo de VMAX.Depois de montada a tabela, varre-la (somente os elementos preenchidos), acumulando os valores dos campos, do último para o primeiro.

SOLUÇÃO:

PRG6 XEGUEI . . ...inicializacao dos campos... . L 6,=A(TABELA) MVC VATUAL,VINICVOLTO C 6,=A(TABELA+5000*5) BNL FASE2 CP VATUAL,VMAX BH FASE2 MVC 0(5,6),VATUAL+3 A 6,=F'5' AP VATUAL,VINCR B VOLTOFASE2 S 6,=F'5' C 6,=A(TABELA) BL FIM AP VTOT,0(5,6) B FASE2FIM TCHAU*------------------------------ DEFINICAO DAS AREAS AUXILIARESVTOT DC PL8'0'VATUAL DC PL8'0'VINIC DC PL8'0'VINCR DC PL8'0'VMAX DC PL8'0' LTORG LTORGTABELA DS 5000PL5 END PRG6

215215

Page 216: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

ER04 - Utilizando a instrução TR, movimentar uma área de memória (AL) para outra (AG), conforme lay-outs a seguir.

Lay-out de AL-------------

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 50 50 C Informação ALFA51 70 20 C Informação BETA71 120 50 C Informação GAMA121 200 80 C Informação DELTA201 220 20 C Informação PI221 256 36 C Informação OMEGA

Lay-out de AG-------------

Posição Posição Tamanho For- DadoInicial Final (bytes) mato

1 20 20 C Informação PI21 70 50 C Informação GAMA71 106 36 C Informação OMEGA107 156 50 C Informação ALFA157 176 20 C Informação BETA177 256 80 C Informação DELTA

SOLUÇÃO:

TR AG,AL*-----------------------------------------------------------* DEFINICAO DAS AREAS AL E AG **-----------------------------------------------------------

AL DS CL256AG DS 0CL256AG1 DC 20AL1(*-AG1+200)AG2 DC 50AL1(*-AG2+70)AG3 DC 36AL1(*-AG3+220)AG4 DC 50AL1(*-AG4+0)AG5 DC 20AL1(*-AG5+50)AG6 DC 80AL1(*-AG6+120)

216216

Page 217: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

ER05 - Exemplo pgm assembler que le um arquivo e imprime um relatorio

Se o arquivo de entrada (80 posições, formato livre) tiver o seguinte conteúdo :

REGISTRO 1 ....................................................................*REGISTRO 2 ...+....2....+....3....+....4....+....5....+....6....+....7....+....0REGISTRO 3 !I'M COMIN' HOME, I'VE DONE MY TIME NOW I'VE GOT TO KNOW WHAT IS AND ISN'T MINE IF YOU RECEIVED MY LETTER TELLING YOU I'D SOON BE FREE THEN YOU'LL KNOW JUST WHAT TO DO IF YOU STILL WANT ME IF YOU STILL WANT ME WHOA, TIE A YELLOW RIBBON 'ROUND THE OLD OAK TREE IT'S BEEN THREE LONG YEARS DO YA STILL WANT ME? IF I DON'T SEE A RIBBON ROUND THE OLD OAK TREE I'LL STAY ON THE BUS FORGET ABOUT US PUT THE BLAME ON ME IF I DON'T SEE A YELLOW RIBBON ROUND THE OLD OAK TREE BUS DRIVER, PLEASE LOOK FOR ME'CAUSE I COULDN'T BEAR TO SEE WHAT I MIGHT SEE I'M REALLY STILL IN PRISON AND MY LOVE, SHE HOLDS THE KEY A SIMPLE YELLOW RIBBON'S WHAT I NEED TO SET ME FREE I WROTE AND TOLD HER PLEASE HOA, TIE A YELLOW RIBBON ROUND THE OLD OAK TREE IT'S BEEN THREE LONG YEARS DO YA STILL WANT ME? IF I DON'T SEE A RIBBON ROUND THE OLD OAK TREE I'LL STAY ON THE BUS FORGET ABOUT US PUT THE BLAME ON ME IF I DON'T SEE A YELLOW RIBBON ROUND THE OLD OAK TREE NOW THE WHOLE DAMNED BUS IS CHEERIN' AND I CAN'T BELIEVE I SEE A HUNDRED YELLOW RIBBONS ROUND THE OLD OAK TREE *** ULTIMO REGISTRO !!! ***

E o programa for o seguinte :

PGMASM CSECT PRINT DATA USING *,3,4 ESTABELECE REGISTRADORES 3 E 4 * COMO BASE STM 14,12,12(13) SALVA REGISTRADORES NA SAVEAREA * DO CHAMADOR (SIST OPERACIONAL) LR 3,15 SALVA ENDERECO PONTO DE CARGA LA 3,0(3) ZERA PRIM BYTE A ESQUERDA LA 4,1 CARREGA NRO 1 LA 4,4095(3,4) DEIXA O 4 COM 4096 A + QUE O 3 ST 13,MYSAVE+4 SALVA O 13 (ENDER SAVEAREA DO* CHAMADOR) NA SAVEAREA+4 LA 15,MYSAVE CARREGA ENDER SAVEAREA DO PROG ST 15,8(13) SALVA END SAVEAREA DO PROG* NA SAVEAREA+8 DO CHAMADOR LR 13,15 ENDER SAVEAREA DO PROG NO 13

217217

Page 218: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

ABRIR EQU * OPEN (ENTRA,INPUT) ABRE ARQUIVO ENTRADA OPEN (RELAT,OUTPUT) ABRE ARQUIVO RELATORIOLEDENOVO BAL 14,LERENTRA EXECUTA ROTINA LEITURA CLI FIMENTRA,C'S' VERIFICA SE EOF BE FECHAR SE EOF DESVIA PARA FECHAR NAOCABOU EQU * SE NAO EOF BAL 14,IMPRIME EXECUTA ROTINA DE IMPRESSAO B LEDENOVO DESVIA PARA LER OUTRO REGISTRO FECHAR CLOSE (ENTRA,,RELAT) FECHA ARQUIVOS LA 2,0 ZERA REGISTRADOR 2 L 13,MYSAVE+4 RESTAURA END.SAVEAREA CHAMADOR ST 2,16(13) RETURN CODE ZERO ONDE VAI * RESTAURAR REGISTRADOR 15 LM 14,12,12(13) RESTAURA REGISTRADORES BR 14 TERMINA PROGRAMA *--------------------------------------------------------------------- * ROTINA DE LEITURA ------------------------------------------- *--------------------------------------------------------------------- DC A(0) PARA GUARDAR ENDERECO RETORNO LERENTRA EQU * PROCEDIMENTO DE LEITURA ST 14,LERENTRA-4 SALVA ENDERECO RETORNO * (INSTRUCAO SEGUINTE AO BAL) GET ENTRA,AE LE REGISTRO LOGICO AP WLIDOS,=P'1' SOMA 1 EM CONTADOR LIDOS B SAILER DESVIA PARA SAIDA ROTINA EOFENTRA EQU * SE EOF NO GET VEM PRA CA MVI FIMENTRA,C'S' CONSTANTE 'S' PARA FLAG EOF SAILER EQU * SAIDA L 14,LERENTRA-4 PEGA ENDERECO DE RETORNO BR 14 VOLTA PARA APOS O BAL *--------------------------------------------------------------------- * IMPRIME ------------------------------------------- *--------------------------------------------------------------------- DC A(0) PARA GUARDAR ENDERECO RETORNO IMPRIME EQU * PROCEDIMENTO DE IMPRESSAO ST 14,IMPRIME-4 SALVA ENDERECO DE RETORNO CP WLINS,=P'24' COMPARA SE FIM DE FOLHA BNH IMPMESMO SE MENOR OU IGUAL DESVIA BAL 14,CABEC SE MAIOR EXECUTA ROTINA CABEC IMPMESMO EQU * MVI AS,C' ' ESPACEJAMENTO SIMPLES UNPK LDETNRO,WLIDOS DESCOMPACTA NRO REG LIDO OI LDETNRO+4,X'F0' FORCA ZONA 'F' MVC LDETTXT,AE REG LIDO PARA LINHA DETALHE MVC AS,LDET LINHA DETALHE PARA LINHA GERAL PUT RELAT,AS IMPRIME AP WLINS,=P'1' SOMA 1 NO CONTADOR DE LINHAS SAIIMPRI EQU * SAIDA DA ROTINA L 14,IMPRIME-4 RESTAURA ENDERECO PARA VOLTAR BR 14 VOLTA PARA INSTRUCAO APOS BAL *--------------------------------------------------------------------- * CABECALHO ------------------------------------------- *--------------------------------------------------------------------- DC A(0) PARA GUARDAR ENDERECO RETORNO CABEC EQU * PROCEDIMENTO DE CABECALHO ST 14,CABEC-4 SALVA ENDERECO PARA RETORNO ZAP WLINS,=P'0' ZERA CONTADOR DE LINHAS AP WPAGS,=P'1' SOMA 1 NO CONTADOR DE PAGINAS MVI AS,C'1' ESPACEJAMENTO : SALTAR FOLHA

218218

Page 219: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

MVC LCABZPAG,=X'4020204B202120' MASCARA DE EDICAO ED LCABZPAG,WPAGS EDITA NRO DA PAGINA MVC AS,LCABZ LINHA LCABZ PARA LINHA GERAL PUT RELAT,AS IMPRIME LINHA LCABZ MVC AS,LCAB1 LINHA CABEC1 PARA LINHA GERAL PUT RELAT,AS IMPRIME LINHA CABEC1 MVI AS,C' ' ESPACEJAMENTO SIMPLES MVC AS,LCAB2 LINHA CABEC2 PARA LINHA GERAL PUT RELAT,AS IMPRIME LINHA CABEC2 MVC AS,LCAB3 LINHA CABEC3 PARA LINHA GERAL PUT RELAT,AS IMPRIME LINHA EM BRANCO AP WLINS,=P'3' SOMA 3 NO CONTADOR DE LINHAS SAICABEC EQU * SAIDA DA ROTINA L 14,CABEC-4 RESTAURA ENDER VOLTA NO REG14 BR 14 VOLTA PARA APOS O BAL *--------------------------------------------------------------------- * DECLARACAO DAS VARIAVEIS ------------------------------------------- *--------------------------------------------------------------------- MYSAVE DC 18F'0' SAVE AREA FIMENTRA DC C'N' FLAG INDICATIVO DE FIM DE ARQ WLIDOS DC PL3'0' CONTADOR REGS LIDOS WPAGS DC PL3'0' CONTADOR PAGINAS WLINS DC PL3'99' CONTADOR LINHAS AE DS CL80 AREA PARA LEITURA ARQ ENTRADA AS DS CL133 AREA PARA SAIDA ARQ IMPRESSAO * * LINHAS DO RELATORIO ------------------------------------------- * LCABZ DS 0CL133 PROXIMOS 133 BYTES = LCABZ DC CL1'1' DC C'PAG. ' LCABZPAG DC CL7' ' DC CL120' ' * LCAB1 DS 0CL133 PROXIMOS 133 BYTES = LCAB1 DC CL1' ' DC CL5'REG.#' DC CL1' ' DC 20C'-' DC CL40'* CONTEUDO DO REG LIDO *' DC 20C'-' DC CL47' ' * LCAB2 DS 0CL133 PROXIMOS 133 BYTES = LCAB2 DC CL1' ' DC CL5'-----' DC CL1' ' DC 20C'-' DC CL40'----------------------------------------' DC 20C'-' DC CL46' ' * LCAB3 DC CL133' ' LINHA EM BRANCO * LDET DS 0CL133 LINHA DE DETALHE DC CL1' ' LDETNRO DC CL5' ' DC CL1' ' LDETTXT DC CL80' ' DC CL46' '

219219

Page 220: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

* *--------------------------------------------------------------------- * DECLARACAO DOS ARQUIVOS ------------------------------------------- *--------------------------------------------------------------------- ENTRA DCB DDNAME=ENTRA,LRECL=80,EODAD=EOFENTRA,DSORG=PS,MACRF=GM RELAT DCB DDNAME=RELAT,LRECL=133,DSORG=PS,MACRF=PM,RECFM=FBA *--------------------------------------------------------------------- * LITERAIS ------------------------------------------- *--------------------------------------------------------------------- LTORG *--------------------------------------------------------------------- END

Então o relatório terá o seguinte formato :

PAG. 1REG.# --------------------* CONTEUDO DO REG LIDO *------------------------- -------------------------------------------------------------------------------- 00001 REGISTRO 1 ....................................................................*00002 REGISTRO 2 ...+....2....+....3....+....4....+....5....+....6....+....7....+....000003 REGISTRO 3 !00004 I'M COMIN' HOME, I'VE DONE MY TIME 00005 NOW I'VE GOT TO KNOW WHAT IS AND ISN'T MINE 00006 IF YOU RECEIVED MY LETTER TELLING YOU I'D SOON BE FREE 00007 THEN YOU'LL KNOW JUST WHAT TO DO 00008 IF YOU STILL WANT ME 00009 IF YOU STILL WANT ME 00010 WHOA, TIE A YELLOW RIBBON 'ROUND THE OLD OAK TREE 00011 IT'S BEEN THREE LONG YEARS 00012 DO YA STILL WANT ME? 00013 IF I DON'T SEE A RIBBON ROUND THE OLD OAK TREE 00014 I'LL STAY ON THE BUS00015 FORGET ABOUT US 00016 PUT THE BLAME ON ME 00017 IF I DON'T SEE A YELLOW RIBBON ROUND THE OLD OAK TREE 00018 BUS DRIVER, PLEASE LOOK FOR ME 00019 'CAUSE I COULDN'T BEAR TO SEE WHAT I MIGHT SEE 00020 I'M REALLY STILL IN PRISON 00021 AND MY LOVE, SHE HOLDS THE KEY

PAG. 2REG.# --------------------* CONTEUDO DO REG LIDO *------------------------- -------------------------------------------------------------------------------- 00022 A SIMPLE YELLOW RIBBON'S WHAT I NEED TO SET ME FREE 00023 I WROTE AND TOLD HER PLEASE 00024 HOA, TIE A YELLOW RIBBON ROUND THE OLD OAK TREE 00025 IT'S BEEN THREE LONG YEARS 00026 DO YA STILL WANT ME? 00027 IF I DON'T SEE A RIBBON ROUND THE OLD OAK TREE 00028 I'LL STAY ON THE BUS 00029 FORGET ABOUT US 00030 PUT THE BLAME ON ME 00031 IF I DON'T SEE A YELLOW RIBBON ROUND THE OLD OAK TREE00032 NOW THE WHOLE DAMNED BUS IS CHEERIN' 00033 AND I CAN'T BELIEVE I SEE 00034 A HUNDRED YELLOW RIBBONS ROUND THE OLD OAK TREE

220220

Page 221: Assembler Mainframes Ibm

ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI

00035 *** ULTIMO REGISTRO !!! ***

221221