ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI ASSEMBLER para Mainframes IBM Prof. Alberto Romano Schiesari (1a edição: 1974; última revisão:Julho/2009) 11 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 22 SUMÁRIO 1. Introdução.................................................................................................................................................................................................. 7 1-1 A Linguagem Assembler ..................................................................................................................................................................... 7 1-2 Revisão dos Sistemas de Numeração Binário e Hexadecimal ............................................................................................................. 7 1-2-1 Conversões ................................................................................................................................................................................... 8 1-2-1-1 Conversão de decimal para binário ....................................................................................................................................... 8 1-2-1-2 Conversão de decimal para hexadecimal ............................................................................................................................ 10 1-2-1-3 Conversão de binário para hexadecimal.............................................................................................................................. 11 1-2-1-4 Conversão de hexadecimal para binário.............................................................................................................................. 12 1-2-1-5 Conversão de binário para decimal ..................................................................................................................................... 13 1-2-1-6 Conversão de hexadecimal para decimal ............................................................................................................................ 14 1-2-2 Operações aritméticas ................................................................................................................................................................ 15 1-2-2-1 Soma em binário ................................................................................................................................................................. 15 1-2-2-2 Subtração em binário .......................................................................................................................................................... 16 1-2-2-3 Soma em hexadecimal......................................................................................................................................................... 17 1-2-2-4 Subtração em hexadecimal.................................................................................................................................................. 18 1-3. Arquitetura de Mainframes IBM ...................................................................................................................................................... 19 1-3-1 Visão Geral ................................................................................................................................................................................ 19 1-3-2 Endereçamento ........................................................................................................................................................................... 22 BASE + DESLOCAMENTO........................................................................................................................................................... 22 INDEXADOR + BASE + DESLOCAMENTO............................................................................................................................... 23 Deslocamento máximo; uso de bases............................................................................................................................................... 24 Carga de registradores base ................................................................................................................................................................. 26 1-3-3 Representação de Dados............................................................................................................................................................. 29 1-3-3-1 Formato binário de ponto fixo............................................................................................................................................. 29 1-3-3-2 Formato decimal zonado ..................................................................................................................................................... 30 1-3-3-3 Formato decimal compactado ............................................................................................................................................. 30 1-3-3-4 Formato caracter (padrão EBCDIC) ................................................................................................................................... 30 1-3-4 Representação de Instruções ...................................................................................................................................................... 31 RR - 2 bytes .................................................................................................................................................................................... 31 E - 2 bytes ...................................................................................................................................................................................... 31 QST - 4 bytes ................................................................................................................................................................................... 31 QV - 4 bytes.................................................................................................................................................................................... 31 RRE - 4 bytes................................................................................................................................................................................... 31 RS - 4 bytes..................................................................................................................................................................................... 31 RX - 4 bytes .................................................................................................................................................................................... 31 S - 4 bytes ...................................................................................................................................................................................... 31 SI - 4 bytes ...................................................................................................................................................................................... 31 VR - 4 bytes .................................................................................................................................................................................... 32 VS - 4 bytes..................................................................................................................................................................................... 32 VST - 4 bytes ................................................................................................................................................................................... 32 VV - 4 bytes.................................................................................................................................................................................... 32 RSE - 6 bytes ................................................................................................................................................................................... 32 SS - 6 bytes ..................................................................................................................................................................................... 32 SSE - 6 bytes.................................................................................................................................................................................... 32 2. Montador Assembler e Especificação de Elementos ............................................................................................................................... 37 2-1. Introdução......................................................................................................................................................................................... 37 2-1-1 O Montador Assembler .............................................................................................................................................................. 37 2-1-2 O Statement Assembler .............................................................................................................................................................. 39 2-2. Símbolo ............................................................................................................................................................................................ 39 2-3. Código de Instrução.......................................................................................................................................................................... 40 2-3-1 Instruções ao Montador.............................................................................................................................................................. 40 2-3-2 Instruções de Máquina ............................................................................................................................................................... 40 2-3-3 Macro-Instruções........................................................................................................................................................................ 40 2-4. Operandos e Comentários................................................................................................................................................................. 40 2-4-1 Operandos em Registrador ......................................................................................................................................................... 40 2-4-2 Operandos em Memória ............................................................................................................................................................. 41 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 33 2-4-2-1 Termos de Expressões......................................................................................................................................................... 41 2-4-2-2 Expressões para referência de Operandos........................................................................................................................... 42 2-5. Continuação de Statements............................................................................................................................................................... 44 2-6. Identificação e Sequência de Statements .......................................................................................................................................... 44 3. Instruções ao Montador Assembler.......................................................................................................................................................... 45 3-1. Instruções para definição de áreas .................................................................................................................................................... 45 DC (Define Constant - Definir Constante)........................................................................................................................................... 45 TABELA DE CONSTANTES......................................................................................................................................................... 46 DC tipo C......................................................................................................................................................................................... 47 DC tipo X......................................................................................................................................................................................... 47 DC tipo B......................................................................................................................................................................................... 47 DC tipo F ......................................................................................................................................................................................... 48 DC tipo H......................................................................................................................................................................................... 48 DC tipo P ......................................................................................................................................................................................... 48 DC tipo Z ......................................................................................................................................................................................... 48 DC tipo A......................................................................................................................................................................................... 49 DC tipo Y......................................................................................................................................................................................... 50 DC tipo S ......................................................................................................................................................................................... 50 DC tipo V......................................................................................................................................................................................... 50 DC tipo Q......................................................................................................................................................................................... 50 DS (Define Storage - Definir Memória) .............................................................................................................................................. 51 3-2. Literais.............................................................................................................................................................................................. 52 3-3. Outras instruções ao montador ......................................................................................................................................................... 53 CCW ou CCW0 (Channel Command Word - Palavra de Comando de Canal).................................................................................... 53 CCW1 (Channel Command Word - Palavra de Comando de Canal)................................................................................................... 54 START (Começo)................................................................................................................................................................................ 55 CSECT (Control Section - Seção de Controle).................................................................................................................................... 55 DSECT (Dummy Section - Seção Simulada)....................................................................................................................................... 56 DXD (Define External Dummy Section - Definir Dummy Section Externa)....................................................................................... 56 CXD..................................................................................................................................................................................................... 57 COM (Blank Common Control Section - Seção de Controle Branca Comum) ................................................................................... 57 LOCTR (Multiple Location Counters - Múltiplos Contadores de localização) ................................................................................... 58 AMODE (Adressing Mode - Modo de endereçamento) ...................................................................................................................... 59 RMODE (Residence Mode - Modo de residência) .............................................................................................................................. 59 ENTRY (Entrada)................................................................................................................................................................................ 60 EXTRN (External - Externo) ............................................................................................................................................................... 60 WXTRN............................................................................................................................................................................................... 60 USING (Usando) ................................................................................................................................................................................. 61 DROP (Por de lado, Deixar) ................................................................................................................................................................ 61 TITLE (Título)..................................................................................................................................................................................... 62 EJECT (Ejetar) .................................................................................................................................................................................... 62 SPACE (Espaço).................................................................................................................................................................................. 62 PRINT (Impressão).............................................................................................................................................................................. 63 ICTL (Input Control - Controle de Entrada) ........................................................................................................................................ 63 ISEQ (Input Sequence - Sequência de Entrada)................................................................................................................................... 64 PUNCH (Perfure) ................................................................................................................................................................................ 64 REPRO (Reproduza) ........................................................................................................................................................................... 64 ORG..................................................................................................................................................................................................... 65 EQU (Equate - Igualar)........................................................................................................................................................................ 65 OPSYN (Operation Code Synonim - Sinônimo para código de operação).......................................................................................... 66 PUSH (Empurrar) ................................................................................................................................................................................ 66 POP...................................................................................................................................................................................................... 66 LTORG................................................................................................................................................................................................ 66 CNOP (Conditional Nop - Nop Condicional)...................................................................................................................................... 67 COPY (Copiar) .................................................................................................................................................................................... 67 END (Fim) ........................................................................................................................................................................................... 67 4. Instruções de Máquina ............................................................................................................................................................................. 71 4-1. Instruções de movimento de memória para memória ....................................................................................................................... 73 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 44 MVC (Move Character - Movimentar Caracteres) .............................................................................................................................. 73 MVZ (Move Zones – Movimentar Zonas)........................................................................................................................................... 74 MVN (Move Numerics - Movimentar Numéricos).............................................................................................................................. 74 MVI (Move Immediate - Movimentar Imediato)................................................................................................................................. 75 MVO (Move with Offset – Movimetar com deslocamento) ................................................................................................................ 76 ZAP (Zero and Add Packed – Zerar e Somar em Compactado) .......................................................................................................... 77 MVCL (Move Long – Mover [campo] Longo) ................................................................................................................................... 78 PACK (Compactar).............................................................................................................................................................................. 79 UNPK (Unpack – descompactar)......................................................................................................................................................... 80 MVCIN (Move Inverse – Mover invertido)......................................................................................................................................... 81 4-2. Instruções aritméticas com campos compactados............................................................................................................................. 82 AP (Add Packed – Somar em compactado) ......................................................................................................................................... 82 SP (Subtract Packed – Subtrair em compactado)................................................................................................................................. 83 MP (Multiply Packed – Multiplicar em compactado).......................................................................................................................... 84 DP (Divide Packed – Dividir em compactado).................................................................................................................................... 84 SRP (Shift and Round Packed – Deslocar e arredondar compactado)................................................................................................. 85 4-3. Instruções de comparação................................................................................................................................................................. 86 CP (Compare Packed – Comparar em compactado) ............................................................................................................................ 86 CLC (Compare Logical Character – Comparar Caracteres Logicamente)........................................................................................... 86 CLI (Compare Logical Immediate - Comparar Logicamente com Operando Imediato)...................................................................... 86 CLCL (Compare Logocal Character Long – Comparar Logicamente campos longos) ....................................................................... 87 C (Compare) ........................................................................................................................................................................................ 88 CH (Compare Halfword) ..................................................................................................................................................................... 88 CL (Compare Logical – Compare Logicamente)................................................................................................................................. 89 CLM (Compare Logical Characters Under Mask - Comparar campos lógicamente, sob máscara) ..................................................... 89 CR (Compare Register – Comparar Registradores) ............................................................................................................................. 90 CLR (Compare Logical Register – Comparar Registradores Logicamente) ........................................................................................ 90 4-4. Instruções de desvio ......................................................................................................................................................................... 91 4-4-1 Introdução e mnemônicos........................................................................................................................................................... 91 4-4-2 Instruções de desvio condicional e incondicional ...................................................................................................................... 93 BC (Branch on Condition – Desviar na Condição).............................................................................................................................. 93 BCR (Branch on Condition Register – Desviar [para endereço de registrador] na Condição) ............................................................ 93 4-5. Instruções de controle de loop .......................................................................................................................................................... 94 BCT (Branch on Count – Desvie na condição [de contagem] testada) ................................................................................................ 94 BCTR (Branch on Count Register – Desvie na condição [de contagem] testada para [endereço contido em] registrador) ................ 94 BXH (Branch on Index High – Desvie se o Índice for Maior) ............................................................................................................ 95 BXLE (Branch on Index Low or Equal – Desvie se o Índice for Menor ou Igual).............................................................................. 96 4-6. Instruções de edição ......................................................................................................................................................................... 97 ED (Edit – Editar)................................................................................................................................................................................ 97 EDMK (Edit and Mark – Editar e Marcar) .......................................................................................................................................... 98 4-7. Instruções de tradução e teste de bytes ............................................................................................................................................. 99 TR (Translate – Traduzir) .................................................................................................................................................................... 99 TRT (Translate and Test – Traduzir e Testar) ................................................................................................................................... 100 4-8. Shift (deslocamento de bits) em registradores ................................................................................................................................ 101 SLL (Shift Left Logical – Deslocamento Simples Lógico à esquerda) .............................................................................................. 101 SRL (Shift Right Logical – Deslocamento Simples Lógico à direita)................................................................................................ 101 SLDL (Shift Left Double Logical – Deslocamento Duplo Lógico à esquerda) ................................................................................. 102 SRDL (Shift Right Double Logical – Deslocamento Duplo Lógico à direita)................................................................................... 102 SLA (Shift Left Algebraic – Deslocamento Simples Algébrico à esquerda) ..................................................................................... 103 SRA (Shift Right Algebraic – Deslocamento Simples Algébrico à direita) ....................................................................................... 103 SLDA (Shift Left Double Algebraic – Deslocamento Duplo Algébrico à esquerda)......................................................................... 104 SRDA (Shift Right Double Algebraic – Deslocamento Duplo Algébrico à direita) .......................................................................... 104 4-9. Instruções de álgebra booleana....................................................................................................................................................... 105 N (And – E) ....................................................................................................................................................................................... 105 O (Or – Ou)........................................................................................................................................................................................ 106 X (Exclusive Or – Ou exclusivo) ....................................................................................................................................................... 106 NR (And Register – E entre registradores) ........................................................................................................................................ 107 OR (Or Register – Ou entre registradores) ........................................................................................................................................ 107 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 55 XR (Exclusive or Register – Ou exclusivo entre registradores)......................................................................................................... 107 NI (And Immediate – E [com operando] imediato) ........................................................................................................................... 108 OI (Or Immediate – Ou [com operando] imediato) ........................................................................................................................... 108 XI (Exclusive Or Immediate – Ou exclusivo [com operando] imediato)........................................................................................... 108 NC (And Character – E entre campos com caracteres)...................................................................................................................... 109 OC (Or Character – Ou entre campos com caracteres) ...................................................................................................................... 109 XC (Exclusive Or Character – Ou exclusivo entre campos com caracteres) ..................................................................................... 109 4-10. Instruções de carga e desvio ......................................................................................................................................................... 110 BALR (Branch and Link Register – Desviar e ligar via registrador) ................................................................................................. 110 BAL (Branch and Link – Desviar e ligar).......................................................................................................................................... 111 BAS (Branch and Save – Desviar e salvar) ....................................................................................................................................... 112 BASR (Branch and Save Register – Desviar para endereço em registrador e salvar)........................................................................ 113 BASSM (Branch and Save and Set Mode – Desviar, salvar e posicionar modo) .............................................................................. 114 BSM (Branch and Set Mode – Desviar e posicionar modo) .............................................................................................................. 115 4-11. Instruções de movimento de dados de registrador para memória ................................................................................................. 116 ST (Store – Armazenar)..................................................................................................................................................................... 116 STH (Store Halfword – Armazenar halfword)................................................................................................................................... 116 STM (Store Multiple – Armazenar Múltiplos) .................................................................................................................................. 117 STC (Store Character – Armazenar um byte) .................................................................................................................................... 117 STCM (Store Characters under Mask – Armazenar caracteres por máscara) .................................................................................... 118 CVD (Convert to decimal – Converter [de binário] para [decimal] compactado) ............................................................................. 118 4-12. Instruções de movimento de dados de campo de memória para registrador................................................................................. 119 L (Load – Carregar) ........................................................................................................................................................................... 119 LH (Load Halfword – Carregar halfword)......................................................................................................................................... 119 LM (Load Multiple – Carregar Múltiplos)......................................................................................................................................... 120 IC (Insert Character – Inserir Byte) ................................................................................................................................................... 120 ICM (Insert Character under Mask – Inserir bytes sob máscara)....................................................................................................... 121 CVB (Convert to binary – Converter [de compactado] para binário) ................................................................................................ 121 4-13. Instruções de movimento de dados de registrador para registrador .............................................................................................. 122 LR (Load Register – Carregar registrador) ........................................................................................................................................ 122 LPR (Load Positive Register – Carregar registrador positivo) .......................................................................................................... 122 LNR (Load Negative Register – Carregar registrador negativo) ....................................................................................................... 123 LCR (Load Complement Register – Carregar o complemento do registrador).................................................................................. 123 LTR (Load and test Register – Carregar e testar registrador) ............................................................................................................ 124 4-14. Operações aritméticas entre registradores .................................................................................................................................... 125 AR (Add Register – Somar registradores) ......................................................................................................................................... 125 SR (Subtract Register – Subtrair registradores) ................................................................................................................................. 125 MR (Multiply Register – Multiplicar registradores) .......................................................................................................................... 126 DR (Divide Register – Dividir registradores) .................................................................................................................................... 126 ALR (Add Logical Register – Somar registradores logicamente)...................................................................................................... 127 SLR (Subtract Logical Register – Subtrair registradores logicamente) ............................................................................................. 127 4-15. Operações aritméticas entre registradores e campos de memória................................................................................................. 128 A (Add – Somar)................................................................................................................................................................................ 128 S (Subtract – Subtrair) ....................................................................................................................................................................... 128 M (Multiply – Multiplicar) ................................................................................................................................................................ 129 D (Divide – Dividir) .......................................................................................................................................................................... 129 AH (Add Halfword – Somar hafword) .............................................................................................................................................. 130 SH (Subtract Halfword – Subtrair hafword) ...................................................................................................................................... 130 MH (Multiply Halfword – Multiplicar hafword) ............................................................................................................................... 131 AL (Add Logical – Somar logicamente)............................................................................................................................................ 131 SL (Subtract Logical – Subtrair logicamente).................................................................................................................................... 132 4-16. Outras instruções .......................................................................................................................................................................... 133 LA (Load Address – Carregar Endereço) .......................................................................................................................................... 133 TM (Test Under Mask – Testar com máscara) .................................................................................................................................. 133 EX (Execute) ..................................................................................................................................................................................... 134 SVC (Supervisor Call – Chamada ao Supervisor) ............................................................................................................................. 134 MC (Monitor Call – Chamada do monitor) ....................................................................................................................................... 135 SPM (Set Program Mask – estabelecer máscara de programa).......................................................................................................... 135 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 66 IPM (Insert Program Mask – inserir máscara de programa) .............................................................................................................. 135 STCK (Store clock – armazenar clock) ............................................................................................................................................. 136 TS (Test and Set – Testar e posicionar) ............................................................................................................................................. 136 CS (Compare and Swap – Comparar e Trocar) ................................................................................................................................. 136 CDS (Compare Double and Swap – Comparar double e Trocar) ...................................................................................................... 137 5. Macro-Instruções ................................................................................................................................................................................... 138 5-1. Introdução....................................................................................................................................................................................... 138 5-2. Símbolos variáveis e de sequência.................................................................................................................................................. 139 5-3. Expressões ...................................................................................................................................................................................... 142 5-4. Variáveis de montagem : declaração e atribuição de conteúdo ...................................................................................................... 143 5-5. ANOP, MNOTE e AREAD............................................................................................................................................................ 145 ANOP.............................................................................................................................................................................................. 145 MNOTE ........................................................................................................................................................................................... 145 5-6. MHELP .......................................................................................................................................................................................... 147 5-7. Desvios - AGO, ACTR E AIF ........................................................................................................................................................148 5-8. Parâmetros posicionais e keyword.................................................................................................................................................. 149 5-9. Funcionamento das macros - exemplos .......................................................................................................................................... 151 5-9-1 Macro sem símbolo e sem parâmetros...................................................................................................................................... 151 5-9-2 Macro com símbolo fixo e sem parâmetros.............................................................................................................................. 151 5-9-3 Macro com símbolo variável e sem parâmetros ....................................................................................................................... 152 5-9-4 Macro com símbolo variável e com 1 parâmetro posicional .................................................................................................... 152 5-9-5 Macro com símbolo variável e com 2 parâmetros posicionais ................................................................................................. 153 5-9-6 Macro com símbolo variável e com 1 parâmetro keyword (sem default)................................................................................. 153 5-9-7 Macro com símbolo variável e com 1 parâmetro keyword (com default) ................................................................................ 154 5-9-8 Macro com símbolo variável e com 2 parâmetros keyword (sem default) ............................................................................... 154 5-9-9 Macro com símbolo variável e com 2 parâmetros keyword (com default)............................................................................... 155 A P E N D I C E S ............................................................................................................................................................................. 156 APÊNDICE A - Instruções (ordem alfabética de mnemônico e ordem código de instrução)................................................................ 157 APÊNDICE B - Tabelas de potências de 2 e 16 .................................................................................................................................... 168 APÊNDICE C - Caracteres EBCDIC .................................................................................................................................................... 170 APÊNDICE D - Caracteres ASCII ........................................................................................................................................................ 171 APÊNDICE E – Caracteres de controle de impressão........................................................................................................................... 172 APÊNDICE F - Interrupções por erro de programa............................................................................................................................... 173 APÊNDICE G - Truques úteis a programas Assembler......................................................................................................................... 174 APÊNDICE H – Exemplos de macro instruções MVS.......................................................................................................................... 176 APÊNDICE I - Exemplo de programa MVS ......................................................................................................................................... 177 APÊNDICE J – Exemplos de macro Instruções VSE............................................................................................................................ 178 APÊNDICE K - Exemplo de programa VSE......................................................................................................................................... 179 APÊNDICE L – Exemplo de macro instruções VM .............................................................................................................................. 180 APÊNDICE M - Exemplo de programa VM ......................................................................................................................................... 181 APÊNDICE N - Macro instruções XEGUEI e TCHAU........................................................................................................................ 182 APÊNDICE O - Exemplo de Subrotina ................................................................................................................................................. 186 APÊNDICE P - Exemplo 2 de subrotina ............................................................................................................................................... 187 APÊNDICE Q - Montagem de programa de demonstração 1................................................................................................................ 189 APÊNDICE R - Montagem de programa de demonstração 2 ................................................................................................................ 202 EXERCíCIOS PROPOSTOS .................................................................................................................................................................... 213 EXERCÍCIOS RESOLVIDOS .................................................................................................................................................................. 228 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 77 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 0 1 2 3 4 5 6 7 HEXA 0 1 2 3 4 5 6 7 BINÁRIO DECIMAL HEXA 0000 0001 0010 0011 0100 0101 0110 0111 8 9 10 11 12 13 14 15 8 9 A B C D E F BINÁRIO 1000 1001 1010 1011 1100 1101 1110 1111 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 88 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 77 / 2 38 / 2 19 / 2 9 / 2 4 / 2 2 / 2 1 / 2 = = = = = = = = cociente cociente cociente cociente cociente cociente cociente cociente 77 38 19 9 4 2 1 0 resto resto resto resto resto resto resto resto 0 1 0 1 1 0 0 1 Portanto, o número binário 10011010 vale 154 em decimal. Se o número for negativo: Converter o mesmo número decimal positivo para binário, conforme exposto acima Inverter os bits (bit 0 transformar em 1; bit 1 transformar em 0) Somar 1 (ver item 1.2.2.1 – Somar em binário) Preencher com 1’s à esquerda até completar a quantidade de bits do campo desejado (16 se half-word, 32 se full-word ou 32 se double-word) Exemplos: (154)10 = (10011010)2 10011010 invertido : 01100101 somando 1 : + 1 -------01100110 completando à esquerda com 1’s para completar 16 bites (half-word): 1111111101100110 Portanto: (-154)10 = (1111111101100110)2 = (FF66)16 (7)10 = (111)2 111 invertido : somando 1 : + 000 1 -------001 completando à esquerda com 1’s para completar 16 bites (half-word): 1111111111111001 Portanto: (-7)10 = (1111111111111001)2 = (FFF9)16 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 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 99 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 10 10 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 77160 / 16 4822 / 16 301 / 16 13 / 16 = = = = = cociente 77160 resto 7 cociente 4822 resto 8 cociente 301 resto 6 cociente 18 resto 13 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 11 11 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 12 12 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 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 1 1 0 0 1 1 0 1 . . . . . . . . . (2**8) (2**7) (2**6) (2**5) (2**4) (2**3) (2**2) (2**1) (2**0) = = = = = = = = = 1 1 1 0 0 1 1 0 1 . . . . . . . . . 256 128 64 32 16 8 4 2 1 = = = = = = = = = 256 128 64 0 0 8 4 0 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 13 13 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 A C 5 F . . . . . (16**4) (16**3) (16**2) (16**1) (16**0) = 1 . (16**4) = 1 . = 10 . (16**3) = 10 . = 12 . (16**2) = 12 . = 5 . (16**1) = 5 . = 15 . (16**0) = 15 . 65536 4096 256 16 1 = = = = = 65536 40960 3072 80 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 14 14 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 1 1 + + + + 0 1 0 1 = = = = 0 1 1 0 e vai 1 para a "casa" da esquerda Exemplos: 11001001 + 1010 ----------11010011 1001111011 + 110110 ------------1010110001 111 + 1 -----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 15 15 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 1 1 0 + - 0 0 1 1 = = = = 0 1 0 tira-se 1 da "casa" da esquerda (que fica valendo 1 a menos), e que vem para a "casa" presente valendo 2 Exemplos: 11001001 1010 ----------10111111 1001111011 110110 ------------1001000101 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 100 1 -----11 100 1000 --------...1111100 16 16 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 17 17 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 + 123 ------1BD7 CF55 + 102D ------DF82 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 A2BC89 + F00F --------A3AC98 FFF + 4 ------1003 F0F0 + CCCC -------1BDBC ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 18 18 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 - 123 ------1991 CF55 - 102D ------BF28 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 A2BC89 F00F --------A1CC7A FFF 4 ------FFB 0 2 -------...FFE ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 19 19 1-3. Arquitetura de Mainframes 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. O principal criador da arquitetura /360 foi Gene Amdahl (1922-). Gene Amdahl 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... Alguns desses elementos são: 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 20 20 Um sistema mainframe 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. LAYOUT 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 externa BYTE 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 problema BYTES 2-3 (BITS 16-31) = Interruption code BYTE 4 BITS 32-33 = ILC = Instruction length code BITS 34-35 = CC = Condition code BITS 36-39 = máscara de programa BYTES 5-7 (BITS 40-63) = Instruction address LAYOUT 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 externa BYTE 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 problema BYTE 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ância BYTE 3 (BITS 24-31) = 00000000 BYTE 4 (BITS 32-39) = 00000000 BYTES 5-7 (BITS 40-63) = Instruction address ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LAYOUT 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 externa BYTE 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 problema BYTE 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ância BYTE 3 (BITS 24-31) = 00000000 BYTE 4 BIT 32 = 0 = 24 bit addressing = 1 = 31 bit addressing BYTE 4/5/6/7 (BITS 33-63) = Instruction address LAYOUT DA PSW ATUAL (ESA MODE) BYTE 0 BIT BIT BIT BIT BIT BIT BYTE 1 BITS BIT BIT BIT BIT BYTE 2 BIT 0 1 2-4 5 6 7 8-11 12 13 14 15 16-17 = 0 = máscara de program-event recording = 000 = translation mode = máscara de I/O = máscara externa = chave de proteção = 1 = máscara de machine-check = 1 = estado de wait = 1 = estado de programa problema = 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ância BYTE 3 (BITS 24-31) = 00000000 BYTE 4 BIT 32 = 0 = 24 bit addressing = 1 = 31 bit addressing BYTE 4/5/6/7 (BITS 33-63) = Instruction address 21 21 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 22 22 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 seriam feitas de forma indireta (Base + Deslocamento ou Base + Deslocamento + Indexador). BASE + DESLOCAMENTO 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): Conteúdo do registrador Base = 0AB428 Deslocamento = C5A Endereço do campo de memória = 0AC082 dependendo da arquitetura utilizada. ou 610AB428 C5A 610AC082 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 23 23 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 Conteúdo do registrador Base Deslocamento Endereço do campo de memória = C0A800 = 002800 = F84 = C0DF84 ou ou ou 30C0A800 10002800 F84 40C0DF84 dependendo da arquitetura utilizada. Exemplo de uso: endereçar itens de tabela. AC AM BA SC SP TO MT MS PB RS CE RN PA DF GO Endereço inicial da tabela : Símbolo = TABUFS (transformado pelo montador em base + deslocamento) Endereço do item desejado (8o) = Endereço inicial da tabela + [ tamanho de 1 item * ( quantidade itens – 1) ] = TABUFS + [ 2 * (8 – 1) ] = TABUFS + 2 * 7 = TABUFS + 14 Endereço do item desejado (8o) = Base+deslocamento de TBUFS + Registrador Indexador (ex.: 17C0A = Indexador=1, Base = 7, deslocamento = C0A) Endereço de TABUFS = na instrução, na forma Base + deslocamento (montador coloca); supor Base=7 e deslocamento = X’C0A’ Conteúdo reg. Indexador = registrador 1 (responsabilidade de nosso programa colocar) com conteúdo X’0000000E’ ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 24 24 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 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; Deslocamento Endereço de memória conteúdo = 00334400 = 123 = 00000123 5) Registrador base = R9; Deslocamento Endereço de memória conteúdo = 00334400 = 123 = 00334523 Deslocamento máximo; uso de bases Por poder ser representado em 1 byte e meio, o deslocamento máximo é X’FFF’ (4095 bytes). Ou seja: se o registrador base tiver x’00000000’ como conteúdo, ele só consegue ser usado como base para fazer referência aos endereços desde x’00000000’ até x’00000FFF’ (endereçamento base+deslocamento). Se uma instrução precisar endereçar 2 campos na forma base+deslocamento: - um deles com endereço x’00000048’ e outro com endereço x’00001CB0’, na hora em que ela for executada, ela precisa mais do que um registrador base preparado convenientemente. Pode-se, por exemplo, ter o registrador C com o conteúdo x’00000000’, e outro registrador (o D, por exemplo) com o conteúdo x’00001000’. O registrador base C (12) endereça o primeiro campo: Base+deslocamento = C048 = Base C (com conteúdo x’00000000’) + Deslocamento x’048’ O registrador base D (13) endereça o segundo campo Base+deslocamento = DCB0 = Base D (com conteúdo x’00001000’) + Deslocamento x’CB0’ Não há como, em uma única instrução, neste caso, usar só um registrador base. Como o registrador zero não é considerado no cálculo de endereços, pode-se usar no máximo 15 registradores base. Como cada base consegue endereçar 4096 bytes (desde o byte cujo endereço é o valor do registrador base +0 até o byte cujo endereço é o valor do registrador base + X’FFF’). Isso significa que 1 registrador base consegue endereçar um conjunto de 4K bytes de memória. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 25 25 Com no máximo 15 registradores base: 15 registradores X 4K cada = Máximo de 60K endereçáveis. Caso o programa seja maior que isso, deve-se dividir o programa em blocos separados, e cada bloco ser “servido” por um conjunto de registradores base, que serão reutilizados (com outros conteúdos), nos demais blocos. Uma sugestão: Pensar em quais serão os registradores bases do programa inteiro, e quais serão os registradores de trabalho. Segue tabela com sugestão para uso dos 16 registradores: 0 = Evitar; usado pelas rotinas dos métodos de acesso e Sist. Op. 1 = Evitar; usado pelas rotinas dos métodos de acesso e Sist. Op. Usado pelas instruções TRT e EDMK 2 = Evitar se necessário ou usar para work; usado pela instrução TRT de edição 3 = Usar como base 4 = Usar como base 5 = Usar como base 6 = Usar como base 7 = Usar como base 8 = Usar como work 9 = Usar como work 10 = Usar como work 11 = Usar como work 12 = Usar como work 13 = Evitar; usado como base de área de salvação de saveareas nos processos de interface entre softwares 14 = Evitar; usado em geral como “guardador” do endereço de volta do programa chamador 15 = Evitar; usado em geral como pointer para efetuar algum desvio para programa chamado Neste caso, há 5 registradores usados como base: R3, R4, R5, R6 e R7 Isso permite endereçar (5 x 4K) = 20K no máximo. Supondo um programa de 60K dividido em 3 trechos (blocos) de 20K cada um, em cada bloco podemos carregar os bases e usar só coisas (instruções e áreas) desse trecho. Memória de 60K bytes Programa com 60K 0K 4K 8K 12K 16K R3 com x’00000000’ R4 com x’00001000’ R5 com x’00002000’ R6 com x’00003000’ R7 com x’00004000’ 20K 0K 4K 8K 12K 16K R3 com x’00005000’ R4 com x’00006000’ R5 com x’00007000’ R6 com x’00008000’ R7 com x’00009000’ 20K 0K 4K 8K 12K 16K 20K R3 com x’0000A000’ R4 com x’0000B000’ R5 com x’0000C000’ R6 com x’0000D000’ R7 com x’0000E000’ ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 26 26 Resumo São endereçados : registradores e bytes de memória (Lembrar que o endereço de um campo de memória é o endereço de seu byte mais à esquerda) Só existe endereçamento DIRETO para registradores: Registradores Gerais = 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F Registradores de Ponto Flutuante = 0,2,4,6 Não existe endereçamento DIRETO para memória. O endereçamento INDIRETO de memória pode ser: - Base + Deslocamento - Indexador + Base + Deslocamento Base + Deslocamento Endereço = Número hexadecimal resultante da soma entre o Número binário contido num Registrador Geral (registrador que nesta hora é chamado de registrador base) + Número hexa contido na instrução, de x’000’ até x’FFF’ “apelidado” de deslocamento Indexador + Base + Deslocamento Endereço = Número hexadecimal resultante da soma entre o Número binário contido num Registrador Geral (registrador que nesta hora é chamado de registrador indexador) + Número binário contido num Registrador Geral (registrador que nesta hora é chamado de registrador base) + Número hexa contido na instrução, de x’000’ até x’FFF’ “apelidado” de deslocamento Carga de registradores base Apesar de não termos visto ainda as instruções, fica aqui neste ponto o registro de como é geralmente feita a preparação do conteúdo dos registradores base. Após ver as instruções BALR, BCTR, LA e L, volte a este ponto para entender como na prática, na maior parte das vezes, é feita a carga do(s) registrador(es) base. Carga de 1 único registrador base PROG START USING LR 0 *,3 3,15 START USING BALR BCTR BCTR 0 *,3 3,0 3,0 3,0 * * CARREGA PRIMEIRO E UNICO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT CARREGAMENTO COM LR MUITO USADO EM MVS ou PROG * * CARREGA ENDERECO SEGUINTE AO BALR SUBTRAI 1 SUBTRAI MAIS 1 NESTE PONTO, O REG 3 ESTAH OK; ELE TEM O ENDERECO DO ENTRY POINT ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI Carga de 2 registradores base Pode fazer assim? PROG START USING LR * LA 0 *,3,4 3,15 CARREGA PRIMEIRO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT 4,4096(4) CARREGA NO 4 O QUE TEM NO 3 + 4096 Não! Por que? Porque o deslocamento máximo é de 4095 (X’FFF’) !!! Dá erro de montagem ! Então tem que fazer assim: PROG * * * * * START USING LR 0 *,3,4 3,15 CARREGA PRIMEIRO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT LA 4,1 CARREGA NRO 1 NO REG 4 LA 4,4095(4) SOMA 4095 FICOU COM 4096 AR 4,3 SOMA O ENTRY POINT. FICOU ENTRY POINT + 4096 OU ENTRY POINT + X’001000’ PRONTO ! R4 CARREGADO OK TAMBEM ! Ou assim: PROG * * * * * START USING LR 0 *,3,4 3,15 CARREGA PRIMEIRO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT LA 4,4095 CARREGA NRO 4095 NO REG 4 LA 4,1(4) SOMA 1 FICOU COM 4096 AR 4,3 SOMA O ENTRY POINT. FICOU ENTRY POINT + 4096 OU ENTRY POINT + X’001000’ PRONTO ! R4 CARREGADO OK TAMBEM ! Até assim: PROG * * * * START USING LR 0 *,3,4 3,15 CARREGA PRIMEIRO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT LA 4,1 CARREGA NRO 1 NO REG 4 LA 4,4095(3,4) SOMA 4095 + ENTRY POINT FICOU COM ENTRY POINT + 4096 OU ENTRY POINT + X’001000’ PRONTO ! R4 CARREGADO OK TAMBEM ! Desse jeito: PROG START USING LR * LA LA * * 0 *,3,4 3,15 CARREGA PRIMEIRO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT 4,2048 CARREGA NRO 2048 NO REG 4 4,2048(3,4) SOMA 2048 + ENTRY POINT FICOU COM ENTRY POINT + 4096 OU ENTRY POINT + X’001000’ 27 27 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI * PRONTO ! R4 CARREGADO OK TAMBEM ! Deste jeitinho... PROG * * * * START USING LR 0 *,3,4 3,15 CARREGA PRIMEIRO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT LA 4,1000 CARREGA NRO 1000 NO REG 4 LA 4,3096(3,4) SOMA 3096 + ENTRY POINT FICOU COM ENTRY POINT + 4096 OU ENTRY POINT + X’001000’ PRONTO ! R4 CARREGADO OK TAMBEM ! Será que pode fazer assim? PROG START USING LR * LA 0 *,3,4 3,15 CARREGA PRIMEIRO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT 4,PROG+4096 CARREGA “DIRETO” ENTRY POINT + 4096 NÃO! Por que não? Porque o endereço PROG+40096 não está no alcance do primeiro base (R3), até então o único carregado corretamente. Dá erro de montagem. Nem assim? PROG START USING LR * L 0 *,3,4 3,15 CARREGA PRIMEIRO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT 4,=A(PROG+4096) CARREGA “DIRETO” ENTRY POINT + 4096 DEPENDE ! O que está sendo carregado no R4 é o conteúdo da literal. Se a literal estiver dentro do alcance do PRIMEIRO REG BASE (R3), QUE É O ÚNICO PREPARADO ATÉ ENTÃO, então PODE. Senão, NÃO PODE! Dá erro de montagem. 28 28 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 29 29 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 +12 -12 Representação em Half-word 00.0C FF.F4 Representação em Full-word 00.00.00.0C FF.FF.FF.F4 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 30 30 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 +12 -12 Representação em decimal zonado F1.C2 F1.D2 ou F1.F2 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 +12 -12 Representação em decimal compactado 01.2C 01.2D ou 01.2F 1-3-3-4 Formato caracter (padrão EBCDIC) Cada caracter ocupa 1 byte. Se o campo for maior, geralmente o preenchimento é à direita com espaços. Um conjunto de caracteres recebe o nome de “string”. Exemplos: String Representação em EBCDIC ALBERTO C1.C3.D2.C5.D9.E4.D6 Alberto C1.93.82.85.99.A4.96 AMO ELA C1.C4.D6.40.C5.D3.C1 +12 4E.F1.F2 -12 60.F1.F2 A título de curiosidade, a representação desses mesmos strings no padrão ASCII é a seguinte: String Representação em ASCII ALBERTO 41.4C.42.45.52.54.4F Alberto 41.6C.62.65.72.74.6F AMO ELA 41.4D.4F.20.45.4C.41 +12 2B.31.32 -12 2D.31.32 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 31 31 1-3-4 Representação de Instruções Existem os seguintes tipos de instruções: RR - 2 bytes CO R1 R2 = 1 byte (código de operação) = 1/2 byte (registrador primeiro operando) = 1/2 byte (registrador segundo operando) E - 2 bytes ambos para o código de operação QST - 4 bytes CO QR3 RT2 VR1 RS2 = = = = = 2 bytes (código de operação) 1/2 byte (registrador geral -GR- ou pto flut -FR- terceiro oper) 1/2 byte (registrador "stride of vector" do segundo operando) 1/2 byte (registrador de vetor primeiro operando) 1/2 byte (registrador end início de vetor do segundo operando) QV - 4 bytes CO QR3 NU VR1 VR2 = = = = = 2 bytes (código de operação) 1/2 byte (registrador geral -GR- ou pto flut -FR- terceiro oper) 1/2 byte (não usado) 1/2 byte (registrador de vetor primeiro operando) 1/2 byte (registrador de vetor segundo operando) RRE - 4 bytes CO NU R1 R2 = = = = 2 bytes (código de operação) 1 byte (não usado) 1/2 byte (registrador primeiro operando) 1/2 byte (registrador segundo operando) RS - 4 bytes CO R1 R3 B2 D2 = = = = = 1 byte (código de operação) 1/2 byte (registrador primeiro operando) 1/2 byte (registrador terceiro operando) 1/2 byte (registrador base do segundo operando) 1 byte e 1/2 (deslocamento do segundo operando) RX - 4 bytes CO R1 X2 B2 D2 = = = = = 1 byte (código de operação) 1/2 byte (registrador primeiro operando) 1/2 byte (registrador indexador do segundo operando) 1/2 byte (registrador base do segundo operando) 1 byte e 1/2 (deslocamento do segundo operando) S - 4 bytes CO B2 D2 = 2 bytes (código de operação) = 1/2 byte (registrador base do segundo operando) = 1 byte e 1/2 (deslocamento do segundo operando) SI - 4 bytes CO I2 B1 D1 = = = = 1 byte (código de operação) 1 byte (operando imediato - segundo operando) 1/2 byte (registrador base do primeiro operando) 1 byte e 1/2 (deslocamento do primeiro operando) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI VR - 4 bytes CO QR3 NU VR1 GR2 = = = = = 2 bytes (código de operação) 1/2 byte (registrador geral -GR- ou pto flut -FR- terceiro oper) 1/2 byte (não usado) 1/2 byte (registrador de vetor primeiro operando) 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) VST - 4 bytes CO VR3 RT2 VR1 RS2 = = = = = 2 bytes (código de operação) 1/2 byte (registrador de vetor terceiro operando) 1/2 byte (registrador "stride of vector" do segundo operando) 1/2 byte (registrador de vetor primeiro operando) 1/2 byte (registrador end início de vetor do segundo operando) VV - 4 bytes CO VR3 NU VR1 VR2 = = = = = 2 bytes (Código de operação) 1/2 byte (registrador de vetor terceiro operando) 1/2 byte (não usado) 1/2 byte (registrador de vetor primeiro operando) 1/2 byte (registrador de vetor segundo operando) RSE - 6 bytes CO R3 NU VR1 NU B2 D2 = = = = = = = 2 bytes (código de operação) 1/2 byte (registrador terceiro operando) 1/2 byte (não usado) 1/2 byte (registrador de vetor primeiro operando) 1/2 byte (não usado) 1/2 byte (registrador base do segundo operando) 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 B1 D1 B2 D2 = = = = = 32 32 2 bytes (código de operação) 1/2 byte (registrador base do primeiro operando) 1 byte e meio (deslocamento do primeiro operando) 1/2 byte (registrador base do segundo operando) 1 byte e meio (deslocamento do segundo operando) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 33 33 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 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 34 34 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 35 35 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 BAR 36 36 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 37 37 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: ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI fonte objeto SYSIN SYSPUNCH macros/ copys SYSLIB asmF=IFOX00 listagem asmH=IEV90 SYSPRINT work objeto SYSUT1 SYSGO objeto SYSUT1 SYSLIN statements de controle SYSIN IEWL outros objetos SYSPRINT executável SYSLMOD SYSLIB executável (de uma LINKLIB) listagem LOADER memória 38 38 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 39 39 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ímbolo b) Posições 10 a 14: Código da Instrução c) Posições 16 a 71: Operandos e Comentários d) Posição 72: Posição de Continuação e) Posições 73 a 80: Identificação e Sequência COMPLETA MVC Símbolo Instrução ou Comando ARIMP,=CL133'b' 1o operando 2o operando LIMPAR ARIMP Comentários Operandos Os operandos são separados um do outro por vírgula. Símbolo (se houver) e instrução devem ser separados por pelo menos 1 espaço em branco. Instrução e operandos (se houver) devem ser separados por pelo menos 1 espaço em branco. Comentários (se houver) devem ser separados dos operandos por pelo menos 1 espaço em branco. 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 de símbolos válidos: ARIMP ARLEIT TOTAL3 VALOR$ $VALOR SOMAR7 A Exemplos de símbolos não-válidos (o segundo é válido no Assembler H): 3TOTAL TRANZAMAZONICA EU E ELA EU-E-ELA CABEC. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 40 40 2-3. Código de Instrução Especifica a instrução. Pode-se especificar um dos 3 tipos: 2-3-1 Instruções ao Montador Sã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, WXTRN c) Controle de Registradores Base: USING, DROP d) Controle da listagem: TITLE, EJECT, SPACE, PRINT e) Controle de programa : ICTL, ISEQ, PUNCH, REPRO, ORG, EQU, OPSYN, PUSH POP, LTORG, CNOP, COPY, END, LOCTR, AMODE, RMODE f) Definição de macro-instrução: AREAD, MACRO, MEXIT, MEND g) Montagem condicional: ACTR, AGO, AIF, ANOP, GBLA, GBLB, GBLC LCLA, LCLB, LCLC, MHELP, MNOTE, SETA, SETB, SETC 2-3-2 Instruções de Máquina Para 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ções Sã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ários Os 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: 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. 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 41 41 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 Termos de Expressões I - SÍMBOLOS, que podem ser de 3 tipos: Ordinários (vistos no item 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. Exemplo: L’WCALC indica o tamanho da variável WCALC. 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: Instruções e áreas, conforme definidas no programa CODIGO CERTO BALR USING BAL CLC BNE AP BAL . . . . DS DC . 3,0 *,3 14,ROTLE CODIGO,=C'1' ERRADO CERTO,=P'1' 14,IMPRIME CL1 PL3'0' Tamanho de cada instrução ou área (em bytes) 2 0 4 6 4 6 4 . . Por ex. 382 bytes . 1 3 . Conteúdo do Location Counter ANTES 000000 000002 000002 000006 00000C 000010 000016 00001A ... Conteúdo do Location Counter DEPOIS 000002 000002 000006 00000C 000010 000016 00001A ... ... ... 000198 000199 00019C 000198 000199 00019C ... Veja que o conteúdo do location counter é atualizado a cada instrução, a cada campo utilizado, a cada byte gasto. Note que o comando ao montador USING (segunda linha do programa) tem 2 operandos, sendo que o primeiro é uma referência ao Location Counter. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 42 42 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. Podem ser de 4 tipos: - 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: 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: Se o caracter desejado for um apóstrofe (') ou um E Comercial (&), ele deve ser colocado duas vezes. Ex: MVI MVI BYTE,C'&&' BYTE,C'''' 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) 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 R2 R3 B1 B2 D1 D2 X2 I2 L L1 L2 CO = = = = = = = = = = = = = Registrador primeiro operando Registrador segundo operando Registrador terceiro operando Registrador Base do primeiro operando Registrador Base do segundo operando Deslocamento do primeiro operando Deslocamento do segundo operando Registrador Indexador do segundo operando Operando Imediato (segundo operando) Tamanho do primeiro e do segundo operandos Tamanho do primeiro operando Tamanho do segundo operando Código de Operação Existem três maneiras de especificarmos um operando de memória: ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 43 43 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: a1. Instruções RX: CO R1,D2(X2,B2) CO R1,D2(X2) assume base 0 CO R1,D2(,B2) assume indexador 0 a2. Instruções RS: a3. Instruções SI: CO R1,R3,D2(B2) CO D1(B1),I2 a4. Instruções SS: (1 tamanho) CO D1(L,B1),D2(B2) a4. Instruções SS: (2 tamanhos) CO D1(L1,B1),D2(L2,B2) Exemplos dos diversos tipos: LA LA LA LM MVI MVC AP 7,382(3,12) 7,382(3) 7,382(,12) 1,12,35(14) 0(5),X'80' 0(2,7),5(11) 4(8,12),0(2,3) RX RX RX RS SI SS SS (L) (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 LA LM MVI MVI MVC MVC AP AP SP 7,TABELA 7,TABELA-30 1,13,SAVE+4 ARIMP+82,C'*' BYTE,C'*' ARIMP+5(6),ARCOMP ARIMP+5(6),ARCOMP+2 TOTAL,=P'1' VALOR,ARLEIT+5(2) 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 44 44 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 CLC CLC ARIMP,=CL133' ' BYTE,=C' ' =C' ', BYTE Para entender melhor, veja adiante os comandos DC e DS. 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 RESPECTIVOS DEPENDENTES' ENTRADA DCB DSORG=PS, DDNAME=DDENTRA, EODAD=FIM, MACRF=(GM) ORGANIZACAO NOME DO DD FIM DE ARQUIVO MACROS USADAS - 2-6. Identificação e Sequência de Statements Em geral, usam-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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 45 45 3. Instruções ao Montador Assembler 3-1. Instruções para definição de áreas DC (Define Constant - Definir Constante) [Símbolo] DC [A1]B1[C1]D1[,[A2]B2[C2]D2,...] 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. Obrigatório. Pode ser: C X B F H E D L P Z A Y S V Q W (Caracter) (Hexadecimal) (Binário) (Full-Word) (Half-Word) (Full-Word - Ponto Flutuante) (Double-Word - Ponto Flutuante) (Duas Double-Words - Ponto Flutuante) (Compactado) (Zonado) (Address - Endereço - 4 bytes) (Address - Endereço - 2 bytes) (Endereço em Base + Deslocamento) (Endereço Externo) (Símbolo que dá nome a DXD ou DSECT) (Endereço Externo sem AUTOLINK) C - Atributo de tamanho. Opcional. 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. Obrigatório. 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' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 46 46 Exemplos: [nome] SEPARAT1 * DC DC [ad]tipo[at]ci 132CL1’*’ ad=132;tipo=C;at=L1;ci=‘*’ Declara 132 áreas de 1 byte SEPARAT2 * DC CL132’*’ ad=omitido;tipo=C;at=L132;ci=‘*’ Declara 1 área de 132 bytes CONTLIN * DC PL2’99’ ad=omitido;tipo=P;at=L2;ci=‘99’ Declara 1 área de 2 bytes ADRSTAB * DC A(TABAGE) ad=omitido;tipo=A;at=omitido;ci=(TABAGE) Declara 1 área de 4 bytes SEPARAT1 * DS 132CL1 ad=132;tipo=C;at=L1;ci=omitido Declara 132 áreas de 1 byte SEPARAT2 * DS CL132 ad=omitido;tipo=C;at=L132;ci=omitido Declara 1 área de 132 bytes CONTLIN * DS PL2 ad=omitido;tipo=P;at=L2 ;ci=omitido Declara 1 área de 2 bytes ADRSTAB * DS A ad=omitido;tipo=A;at=omitido ;ci=omitido Declara 1 área de 4 bytes TABELA DE CONSTANTES TIPO Tamanho assumido Alinhamento Tamanhos Válidos C X B F H P Z D A Y S suficiente suficiente suficiente 4 bytes 2 bytes suficiente suficiente 8 bytes 4 bytes 2 bytes 2 bytes byte byte byte FullWord HalfWord Byte Byte DoubWord FullWord HalfWord HalfWord 1 a 256 1 a 256 1 a 256 1a8 1a8 1 a 16 1 a 16 1a8 1a4 1a2 2 Constantes por operando uma várias várias várias várias várias várias várias várias várias várias Sentido preenchimento E->D D->E D->E D->E D->E D->E D->E -xE->D E->D -x- Completa com Trunca à Caracteres Válidos brancos X’0’ B’0’ (1) (1) X’0’ C’0’ -xB’0’ B’0’ -x- D E E E E E E -xE E -x- qualquer 0aF 0e1 +-0a9 +-0a9 +-0a9 +-0a9 +-0a9 expressão expressão expressão OBS:- (1) 0's se o número for positivo; 1's se o numero for negativo (2) O número máximo que pode ser especificado é 2**31 - 1 (3) O número máximo que pode ser especificado é 2**15 - 1 (4) O ponto decimal não ocupa nada (5) O sinal ocupa 1/2 BYTE Cada carater ocupa 1 byte ½ byte 1 bit (2) (4) (3) (4) ½ byte (5) 1 byte -x-x-x-x- ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 47 47 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 colocá-lo duas vezes. Ex: DC DC DC DC DC DC DC DC DC DC 1CL1'*' 2CL1'*' CL1'*' CL2'*' 2CL2'*' C'ABC' CL1'ABC' C'A&&B' C'ZE''S' C'''' 5C 5C5C 5C 5C40 5C405C40 C1C2C3 C1 C150C2 E5C57DE2 7D 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 DC DC DC DC DC 1XL1'0B' 3X'5C' XL3'5C' XL2'AB0C14' X'1A2' X'00A,B,5A8' 0B 5C5C5C 00005C 0C14 01A2 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 DC DC DC DC DC BL1'0' BL2'010001001' B'0101' BL2'1' 2B'1' B'1,00101,001' 00 0089 05 0001 0101 010501 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 48 48 DC tipo F O número desejado deve ser colocado em decimal. O montador irá converte-lo para binário e colocá-lo na FullWord. 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 DC DC DC F'138' F'+138' F'-138' F'4,392' 0000008A 0000008A FFFFFF76 0000000400000188 DC tipo H Análoga ao tipo F, com a diferença de que o campo é uma Half-Word. Ex.: DC H'138' 008A DC H'+138' 008A DC H'-138' FF76 DC H'4,392' 00040188 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 DC DC DC DC DC DC DC P'122' P'10' P'-345,45,21.6,7' P'0' P'+66' PL3'1' PL2'43556' 3P'1' 122C 010C 345D045C216C7C 0C 066C 00001C 556C 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 DC DC DC DC DC Z'122' Z'-345,45' Z'+66' ZL3'1' ZL2'43556' 3Z'1' F1F2C2 F3F4D5F4C5 F6C6 F0F0C1 F5C6 C1C1C1 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 49 49 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 DC DC DC DC DC DC CAMPO A(TABELA) A(TABELA-50) A(*) A(259) 3A(*-CAMPO) A(TCABC+28*52) A(FIM-COMECO) 00000103 00000000.00000004.00000008 Os endereços relocáveis são ajustados (relocados) pelo Linkeditor e pelo Loader; veja um exemplo: Programa fonte (rotina VALIDAR; supor que endereço de VALIDS seja X’00001BC0’) ... VVV ... ... ... VALIDS ... DC A(VALIDS) DC C’AEIOUaeiou’ Programa objeto a ser chamado (supor tamanho = 4K = X’1000’) ... 00001BC0 ... ... ... C1C5C9D6E481858996A4 ... Programa chamador: vai de X’0000’ a X’9FFF’ Programa objeto chamador (supor tamanho = 40K = X’A000’) ... ... ... CALL VALIDAR ... ... ... ... ... Programa chamador: vai de X’0000’ a X’9FFF’ Lked: Agrega a rotina chamada ao programa chamador e AJUSTA as constantes de endereço relocáveis. O conteúdo de VVV é ajustado para X’0000BBC0’ Programa chamado ficou em X’A000’ (o seu zero é o endereço X’A000’): vai de X’A000’ a X’AFFF’ ... 0000BBC0 ... ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 50 50 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 DC DC DC DC DC Y(TABELA) Y(TABELA-50) Y(*) Y(259) Y(TCABC+28*52) 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 DC DC DC S(TABELA) S(TABELA-50) S(*) 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) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 51 51 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 DS DS DS CL3 XL4 PL4'0' 3CL8 O comando DS admite atributo de duplicação zero (0). Ex: ARLEIT CODIGO DTEM NOME CIDADE DS DS DS DS DS 0CL80 CL10 CL8 CL50 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. Outro uso do comando DS é para fazer redefinição de áreas (atribuir nomes diferentes a mesmas áreas físicas). Veja os exemplos a seguir: AREA1 A1PART1 A1PART2 A1PART3 A1PART4 A1PART5 A1PART6 A1PART7 A1PART8 * AREA2 A2PART1 A2PART2 A2PART3 A2PART4 * AREA3 A3PART1 A3PART2 A3PART3 A3PART4 A3PART5 A3PART6 A3PART7 DS DS DS DS DS DS DS DS DS 0CL80 CL10 CL10 CL10 CL10 CL10 CL10 CL10 CL10 ORG DS DS DS DS DS , VOLTA PARA MESMO ENDEREÇO DE AREA1 0CL80 CL20 CL20 CL20 CL20 ORG DS DS DS DS DS DS DS DS , VOLTA PARA MESMO ENDEREÇO DE AREA1 0CL80 CL5 CL5 CL20 CL30 CL3 CL4 CL13 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 52 52 3-2. Literais Agora que já vimos o comando DC, vejamos o conceito de LITERAL. Literais são áreas de memória referenciadas por meio de seu conteúdo (e não de seu símbolo). Elas são alocadas sem identificação (sem nome). A especificação de conteúdo em geral serve como “identificação” pelo montador, de forma que ele consiga determinar o endereço. No caso do Assembler, ela é especificada num operando, colocando-se um sinal de igual seguido das características com sintaxe análoga à sintaxe das características em comandos DC. Supondo a instrução MVC WAREA,BRANKS Ela faz referência a dois operandos na memória: WAREA e BRANKS Supondo, ainda, que as definições dadas a esses campos sejam as seguintes: WAREA DC CL10' ' BRANKS DC CL10' ' Para mover o conteúdo de BRANKS para WAREA, podemos usar a instrução MVC WAREA,BRANKS : : CONTLIN DC P’66' Neste caso, o campo emissor é um campo declarado com símbolo (label). O mesmo efeito poderia ser obtido por meio do uso da instrução MVC WAREA,=CL120‘ ‘ Aqui o campo emissor é uma literal. Outros exemplos: ZAP MVC CLC AP CLC CP CLC VALOR,=P'0' ARIMP,=CL133'b' ARLEIT+5(2),=C'DB' TOTLIDOS,=P'1' =C'DB',ARLEIT+5 CONTLIN,=P'66' 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 53 53 3-3. 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 autodefinido. 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 IDAW Byte 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 indicado 1 - 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 usado Bytes 6 e 7 = Tamanho (quantidade de bytes a transferir) 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 a b c d - CCW1 a,b,c,d sendo: Command Code Data Address FLAGS 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 indicado 1 - 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 0 Bytes 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) 54 54 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 55 55 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 START X'305' 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 comando 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 B C A C CSECT . . CSECT . . CSECT . . CSECT . . CSECT . END 1 2 3 4 5 CSECT CSECT CSECT A B C = = = 1 2 3 + 4 + 5 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 56 56 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 layout de uma área, sem que para isso seja preciso defini-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 DSN1 A B C D CSN1 START . . DSECT DS DS DS DS CSECT . . END CL2 CL20 CL10 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 DESLOC DXD . . DC 5F Q(CONST) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 57 57 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 A B START . . COM DS DS . . END 0 CL3 CL4 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 58 58 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: PROGRAMA PGM1A PGM1A PGM1A PGM1A PGM1B PGM1B PGM1B PGM1C PGM1C PGM1C PGM1C PGM1D PGM1D PGM1D PGM1E PGM1E PGM1E PGM1E PGM1F PGM1F PGM1F PGM1G PGM1G PGM1 X AREA1 AREA2 PGM1 Y TAB1 TAB2 PGM1 X AREA11 AREA12 PGM1 OBJETO GERADO CSECT . . . LOCTR DS DS LOCTR . . . LOCTR DS DS LOCTR . . . LOCTR DC DC LOCTR LTORG END CL80 CL4 PGM1A PGM1C PGM1E PGM1G PGM1B PGM1F PGM1D (loc. (loc. (loc. (loc. (loc. (loc. (loc. counter counter counter counter counter counter counter PGM1) PGM1) PGM1) PGM1) X) X) Y) CL10000 CL20000 C'*' F'0' 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 59 59 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 é: n podendo ser 24 ou 31 ou ANY. [símbolo] AMODE n 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: Especificado nenhum AMODE 24 AMODE 31 AMODE ANY RMODE 24 RMODE ANY Assumido AMODE 24 RMODE 24 RMODE 24 RMODE 24 AMODE 24 AMODE 31 e RMODE 24 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 é: n podendo ser 24 ou ANY. [símbolo] RMODE n 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 nenhum AMODE 24 AMODE 31 AMODE ANY RMODE 24 RMODE ANY Assumido AMODE 24 RMODE 24 RMODE 24 RMODE 24 AMODE 24 AMODE 31 e RMODE 24 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 60 60 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 ROTINA START . . EQU . . ENTRY END 0 PROG2 * CONST ROTINA START . . DC . . EXTRN END 0 A(ROTINA) ROTINA 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 61 61 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 62 62 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 63 63 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 é fornecida OFF - A listagem não é fornecida GEN - 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 o seguinte: 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: 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 64 64 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 Neste caso, o statement teria: pos pos pos pos pos ' 1 3 9 11 14 a a a a a CATALR 2 8 10 13 80 : : : : : MOD' brancos CATALR brancos MOD brancos 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: CATALR REPRO MOD ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 65 65 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. OBS:- os símbolos usados como operandos do ORG devem ter sido definidos antes 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: Location Counter ANTES do comando . . . 0AB84C 0AB94C 0AB93C 0AB946 . Location Counter APÓS o comando . . . 0AB94C 0AB93C 0AB946 0AB94C . . TABNUM . . . DC ORG DC ORG . 256X'FF' TABNUM+240 10X'00' 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 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 INST OFF ON PAGOU EQU EQU EQU EQU EQU 5 * X'00' X'FF' X'80' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 66 66 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 MVC OPSYN OPSYN MVC 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 67 67 CNOP (Conditional Nop - Nop Condicional) O comando CNOP alinha o Location Counter para uma Half-Word ou Full-word ou double-word. Os bytes "desprezados" são preenchidos com X'0700' (instrução NOPR). O seu formato é: CNOP a,b Sendo: 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. No esquema abaixo, vemos os efeitos dos CNOPs possíveis, mostrados a partir de uma double-word, ou seja: para onde é feito o alinhamento. 0,8 0,4 Ex: 2,8 2,4 CNOP 4,8 0,4 6,8 2,4 2,4 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 68 68 EXERCÍCIOS PROPOSTOS Os exercícios 195 a 300 devem ser considerados como um programa, cujo endereço inicial é zero (X’00000000’), ou seja, a primeira área (exercíco 195) começa no endereço zero. As áreas definas por DS devem ser computadas para determinar os endereços. Assumir que o 1o statement seja USING *,9. 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: EP196: EP197: EP198: EP199: EP200: EP201: EP202: EP203: EP204: EP205: EP206: EP207: EP208: EP209: EP210: EP211: EP212: EP213: EP214: EP215: EP216: EP217: EP218: EP219: EP220: EP221: EP222: EP223: EP224: EP225: EP226: EP227: EP228: EP229: EP230: EP230: EP231: EP232: EP233: EP234: EP235: EP236: EP237: DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC C'123' C'+123' C'-123' C'12.3' C'1AB8' C'01101' C'A+B=C' CL4'A' CL4'ABCDEF' 3CL2'A' 2CL3'A,B' C'ME&&YOU' C'''S MUSIC' C'@@OI' CL3'*' 3C'*' X'123' X'-123' X'1AB2C3' X'1AB2F4G3' XL3'12D' XL3'AABBCCDDEE' X'1,22,333,4444' XL2'1,22,333' 2X'1,22,333' 2XL2'1,22' B'01010101' B'1' BL2'1111' B'1,1111111111' BL2'1,1111111111' 2B'1000' 2BL2'1000' F'10' F'+10' F'-10' F'-15,+16' 2F'22' 2F'33,44' FL3'258' 2FL1'255' F'128000' H'10' H'+10' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI EP238: EP239: EP240: EP241: EP242: EP243: EP244: EP245: EP246: EP247: EP248: EP249: EP250: EP251: EP252: EP253: EP254: EP255: EP256: EP257: EP258: EP259: EP260: EP261: EP262: EP263: EP264: EP265: EP266: EP267: EP268: EP269: EP270: EP271: EP272: EP273: EP274: EP275: EP276: EP277: EP278: EP279: EP280: EP281: EP282: EP283: EP284: EP285: EP286: EP287: EP288: EP289: EP290: SIMBZZ SIMBAA SIMBBB SIMBCC SIMBDD SIMBEE SIMBFF SIMBGG SIMBHH SIMBII SIMBJJ SIMBKK SIMBLL SIMBMM SIMBNN SIMBOO SIMBPP SIMBQQ SIMBRR SIMBSS SIMBTT SIMBUU SIMBVV SIMBWW DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DS DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC H'-10' H'-15,+16' 2H'22' 2H'33,44' HL3'258' 2HL1'255' H'128000' P'123' P'+123' P'-123' PL4'456' PL1'789' P'1,-22,333,-4444' PL2'1,-22,333,-4444' 3P'0' PL3'0' 2P'1,22,333' 2PL2'1,22,333' Z'123' Z'+123' Z'-123' ZL4'456' ZL1'789' Z'1,-22,333,-4444' ZL3'1,-22,333,-4444' 3Z'0' ZL3'0' 2Z'1,22,333' 2ZL3'1,22,333' A(0) A(127) A(X'8000') A(B'1111') A(C'*') A(*) CL17 A(*) A(SIMBGG) A(SIMBAA+12) A(SIMBII-SIMBBB) AL1(*-SIMBKK) 5AL1(*-SIMBLL) AL2(3,5,7) A(SIMBII+5*2) A(SIMBNN+X'80000000') 4AL2(*-SIMBPP) A(SIMBVV) A(SIMBKK,SIMBJJ) A(SIMBTT+40) A(SIMBUU,*,80) 2A(*-SIMBUU) A(C'AMO') A(X'7FFFFFFF') 69 69 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI EP291: EP292: EP293: EP294: EP295: EP296: EP297: EP298: EP299: EP300: YY1 YY2 YY3 SS1 SS2 SS3 SS4 SS5 SS6 LAST DC Y(SIMBWW) DC Y(10) DC Y(L'YY2) DC S(SIMBAA) DC S(SS1) DC S(10) DC S(*) DC A(125),F'33',C'*',2H'6,18' DC X'1,1',B'1,1',C'1,1' DC 256AL1(255+LAST-*) 70 70 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 71 71 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 estendidos : B, BR, NOP, NOPR, BE, BER, BL, BLR, BH, BHR, BO, BOR 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 72 72 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 é exceçã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'. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 73 73 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 é alterado Interrupçõ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.C3 CPOA C4.C5.C6 C1.C2.C3 O campo emissor é o segundo operando. O campo receptor é o primeiro operando. Ambos são tratados com o mesmo tamanho. Supor os operandos com tamanho e conteúdo conforme exibidos na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois MVC WA+5(3),WR+2 40.40.40 E5.C1.D3 E5.C1.D3 E5.C1.D3 MVC WOUT,WIN 00.00.00.00.00 00.00.00.00.1C 00.00.00.00.1C 00.00.00.00.1C MVC NICKNAM,=C’SMAIL’ C3.D9.E8.40.40 E2.D4.C1.C9.D3 E2.D4.C1.C9.D3 E2.D4.C1.C9.D3 Movendo espaços usando área auxiliar de 5 bytes (literal de 5 bytes) MVC WA(5),=CL5’ ‘ 5C.5C.5C.5C.5C 40.40.40.40.40 40.40.40.40.40 40.40.40.40.40 Propagando espaços com área auxiliar de somente 1 byte (a literal) ! Inicialmente move-se espaço para o primeiro byte à esquerda: MVC WA(1),=C’ ‘ 5C.??.??.??.?? 40 40.??.??.??.?? 40 Em seguida, move-se do primeiro para o segundo byte, do segundo para o terceiro e assim por diante (lembre-se que o MVC é executado byte a byte). Veja a seguir a instrução e acompanhe byte a byte o efeito: Instrução com 4 bytes a mover: MVC WA+1(4),WA Primeiro byte movido: 40.??.??.??.?? 40.??.??.??.?? 40.40.??.??.?? 40.40.??.??.?? Segundo byte movido: 40.40.??.??.?? 40.40.??.??.?? 40.40.40.??.?? 40.40.40.??.?? Terceiro byte movido: 40.40.40.??.?? 40.40.40.??.?? 40.40.40.40.?? 40.40.40.40.?? Quarto byte movido: 40.40.40.40.?? 40.40.40.40.?? 40.40.40.40.40 40.40.40.40.40 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI MVZ (Move Zones – Movimentar Zonas) Código de máquina D3 (Instrução SS – L) Condition code Não é alterado Interrupçõ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 CPOB CPOA Antes 12.34.56 78.9A.BC CPOA,CPOB Depois 12.34.56 18.3A.5C Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois MVZ FLDA,FLB 12.34.56 78.9A.BC 72.94.B6 78.9A.BC MVZ TOT,=4C'0' 01.02.03.04.C5 F0.F0.F0.F0.F0 F1.F2.F3.F4.F5 F0.F0.F0.F0.F0 MVN (Move Numerics - Movimentar Numéricos) Código de máquina D1 (Instrução SS - L) Condition code Não é alterado Interrupçõ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 CPOB CPOA Antes 12.34.56 78.9A.BC CPOA,CPOB Depois 12.34.56 72.94.B6 Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois MVN FLDA,FLB 12.34.56 78.9A.BC 18.3A.5C 78.9A.BC MVN TOT+4(1),=X'0C' 00.12.30.00.2F 0C 00.12.30.00.2C 0C 74 74 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 75 75 MVI (Move Immediate - Movimentar Imediato) Código de máquina 92 (Instrução SI) Condition code não é alterado Interrupçõ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 MVI MVI MVI operando Imediato CPOA MVI MVI CPOA,C'*' CPOA,X'5C' CPOA,B'01011100' CPOA,92 Antes 5C 12 ARIMP+72,C'/' 0(4),X'80' Depois 5C 5C ou ou ou ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 76 76 MVO (Move with Offset – Movimetar com deslocamento) Código de máquina F1 (Instrução SS – L1 e L2) Condition code Não é alterado Interrupçõ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 1º Caso 2º Caso 3º Caso Antes Depois Antes Depois CPOA CPOA 78.9A 45.6A CPOB CPOB 12.34.56 12.34.56 CPOA CPOA 4A.5C.B9.FC 00.0A.B7.2C CPOB CPOB AB.72 AB.72 CPOA CPOA 00.00.00.0C 00.01.20.0C CPOB CPOB 00.00.12.00 00.00.12.00 Outros exemplos: MVO MVO MVO MVO ARCALC(5),ARCALC(4) 0(4,7),ARCALC AREA,2(5,8) 2(7,13),19(5,15) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 77 77 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 < 0 10 Se o campo movido > 0 11 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. 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 1º Caso 2º Caso CPOA,CPOB Antes Depois CPOA CPOA B4.F8 34.5C CPOB CPOB 12.34.5C 12.34.5C CPOA CPOB 07.B8.92 00.12.3C CPOA CPOB 12.3C 12.3C Outros exemplos: ZAP ZAP ZAP TOTAL,=P'0' TOTAL,TOTAL CONTLIN,=P'2' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 78 78 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 é menor 10 Tamanho do 1º operando é maior 11 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. O MVCL 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. 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: L 2,=A(RECEPTOR) L 3,=A(L’RECEPTOR) L 8,=A(EMISSOR) L 9,=A(L’EMISSOR) ICM 9,B'1000',=C'*' MVCL 2,8 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI PACK (Compactar) Código de máquina Condition code Interrupções Possíveis 79 79 F2 (Instrução SS – L1 e L2) não é alterado 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 1ºcaso 2ºcaso 3ºcaso Antes Depois CPOA CPOA 00.B7.2A 01.23.4F CPOB CPOB F1.F2.F3.F4 F1.F2.F3.F4 CPOA CPOA C9.4A 23.4F CPOB CPOB F1.F2.F3.F4 F1.F2.F3.F4 CPOA CPOA 19.B7.CA 00.09.BD CPOB CPOB F9.DB F9.DB 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 PACK PACK PACK PACK PACK VALOR,ARLEIT+5(9) QUANTO+2(7),2(8,5) 0(10,2),AREA 2(5,7),2(3,8) DOUBLE,DOUBLE BYTE,BYTE ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 80 80 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 1ºcaso 2ºcaso 3ºcaso CPOA,CPOB Antes Depois CPOA CPOA 00.00.00.00.B7.2A F0.F1.F2.F3.F4.C5 CPOB CPOB 12.34.5C 12.34.5C CPOA CPOA 00.00.B7.2A F2.F3.F4.5F CPOB CPOB 12.34.5F 12.34.5F CPOA CPOA 19.B7.CA FA.F3.BD CPOB CPOB A3.DB A3.DB Outros exemplos: UNPK UNPK UNPK UNPK ARGRAV+5(12),TOTLIQ AX2,2(3,7) 17(10,8),T4B2F+3(5) 2(13,10),0(5,3) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 81 81 MVCIN (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 A C4.C5.C6 B C1.C2.C3 A C3.C2.C1 B C1.C2.C3 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 < 0 10 Resultado > 0 11 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 CPOB CPOA Antes 12.3C 12.34.5C Depois 12.3C 12.46.8C Outros exemplos: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois AP HOWMANY,=P'1' 00.00.5F 1C 00.00.6C 1C AP ARL+2(5),ARL+7(2) 01.23.40.00.0C 98.7C 01.23.40.98.7C 98.7C AP TOTAL,2(3,7) 55.66.77.78.8C 11.11.1D 55.66.66.67.7C 11.11.1D AP 4(3,8),WALFA 01.99.9F 02.0C 02.01.9C 02.0C AP 7(07,8),14(2,3) 00.00.00.00.01.23.4C 00.5C 00.00.00.00.01.23.9C 00.5C AP GRANDTOT,SMALLTOT 00.00.00.0C 00.10.1C 00.00.10.1C 82 82 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 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 < 0 10 Resultado > 0 11 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 Antes 98.7C 12.34.5C CPOB CPOA Outros exemplos: SP SP SP SP Depois 98.7C 11.35.8C VALOR,VALOR TOTAL,=P'1' AE+5(8),AE+15(3) 0(2,7),4(1,8) 83 83 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 84 84 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 CPOB CPOA Antes 99.9C 00.09.99.9C Outros exemplos: MP MP CPOA,CPOB Depois 99.9C 99.89.00.1C PERCENT,=P'20' 2(13,4),7(3,5) 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.2C CPOA 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) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 85 85 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 < 0 10 Resultado > 0 11 Overflow Interrupções Possíveis 0001,0004,0005,0007,000A O seu formato de máquina é o seguinte: CO L1 I3 E1 E2 = = = = = 1 byte (código de operação) 1/2 byte (tamanho do primeiro operando - 1) 1/2 byte (operando imediato (terceiro operando) 2 bytes (B1D1D1D1 endereço base+deslocamento do primeiro operando) 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 Antes Depois SRP TOTAL Antes Depois TOTAL,61,5 12.34.56.78.9C 00.01.23.45.7C TOTAL,3,0 12.34.56.78.9C 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 86 86 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ºoperando 10 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 CP CP CP CPOA,CPOB CONTLIN,=P'1' 0(5,9),=P'0' 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ºoperando 10 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 CLC CLC CLC CLC CPOA,CPOB AE+78(2),=C'*1' 4(2,7),2(9) ID,2(7) 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ºoperando 10 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 CLI CLI CLI AE+79,C'*' 2(5),X'00' BYTE,B'11110000' NOP+1,240 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 87 87 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ºoperando 10 1ºoperando > 2ºoperando 11 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI C (Compare) Código de máquina Condition code Interrupções Possíveis 88 88 59 (Instrução RX) 00 1ºoperando = 2ºoperando 01 1ºoperando < 2ºoperando 10 1ºoperando > 2ºoperando 11 O condition code nunca fica em 11 após um C 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 C C C C C 9,CPO 8,=F'0' 13,=A(TABELA+430) 1,2(4) 1,2(,4) 1,2(7,4) CH (Compare Halfword) Código de máquina Condition code Interrupções Possíveis 49 (Instrução RX) 00 1ºoperando = 2ºoperando 01 1ºoperando < 2ºoperando 10 1ºoperando > 2ºoperando 11 O condition code nunca fica em 11 após um CH 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 CH CH CH CH CH 9,CPO 8,=H'0' 13,=Y(TABELA+430) 1,2(4) 1,2(,4) 1,2(7,4) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 89 89 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ºoperando 10 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 CL CL CL CL 9,CPO 8,=F'0' 1,2(4) 1,2(,4) 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 é menor 10 Campo selecionado do 1ºoperando é maior 11 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 90 90 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ºoperando 10 1ºoperando > 2ºoperando 11 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ºoperando 10 1ºoperando > 2ºoperando 11 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 91 91 4-4. Instruções de desvio 4-4-1 Introdução e mnemônicos 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 00 01 10 11 CÓDIGO 8 4 2 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. 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 Não 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 Aritméticas 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 NOP BH BL BE BNH BNL BNE BO BP BM BZ BNP BNM BNZ BO BM BZ BNO = = = = = = = = = = = = = = = = = = = Branch No Operation Branch High Branch Low Branch Equal Branch Not High Branch Not Low Branch Not Equal Branch If Overflow Branch If Plus Branch If Minus Branch If Zero Branch If Not Plus Branch If Not Minus Branch If Not Zero Branch If Ones Branch If Mixed Branch If Zeros Branch If Not Ones (Desvie) (Sem operação - não desvie) (Desvie se Maior) (Desvie se Menor) (Desvie se Igual) (Desvie se Não Maior) (Desvie se Não Menor) (Desvie se Não Igual) (Desvie se Overflow) (Desvie se Mais) (Desvie se Menos) (Desvie se Zero) (Desvie se Não Mais) (Desvie se Não Menos) (Desvie se Não Zero) (Desvie se Um's) (Desvie se Misturados) (Desvie se Zeros) (Desvie se Não UM's) 92 92 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 93 93 4-4-2 Instruções de desvio condicional e incondicional 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 VOLTA Neste 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 94 94 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 BCT BCT BCT 5,VOLTA 2,0(4,7) 2,0(4) 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 BCTR 2,7 4,0 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 95 95 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,AGAIN BXH 7,9,AGAIN BXH 7,9,8(4) R7 = R8 + R7; Se R7 Se R7 R7 = R9 + R7; Se R7 Se R7 R7 = R9 + R7; Se R7 Com endereço = Se R7 > R9 Desvia para AGAIN; <= R9 próxima instrução > R9 Desvia para AGAIN; <= R9 próxima instrução > R9 Desvia para instrução [ (conteúdo R4) + x’008’ ] <= R9 próxima instrução Exemplo: Usar no fim de uma laço para pesquisa. R7 = começa com o endereço da tabela; somado com o tamanho dos itens da tabela R8 = tamanho dos itens da tabela R9 = endereço do último elemento NOTFOUND : toda tabela varrida; item desejado não achado L R7,=A(TABADRS) L R8,20 L R9,=A(TABADRS+(HOWMANY-1)*LENGTH) NEXTITEM compara item apontado vs desejado se achado, processa e desvia para TABLSEEN se não achado, aponta p/ próximo BXH 7,8,NOTFOUND R7 = R8 + R7; * If R7 > R9 toda tabela varrida; fim da pessquisa * If R7 <= R9 tabela não vista toda; continuar pesquisa B NEXTITEM TABLSEEN ... ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 96 96 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,AGAIN BXLE 7,9,AGAIN BXLE 7,9,8(4) R7 = R8 + R7; Se R7 <= R9 Desvia para AGAIN; Se R7 > R9 próxima instrução R7 = R9 + R7; Se R7 <= R9 Desvia para AGAIN; Se R7 > R9 próxima instrução R7 = R9 + R7; Se R7 <= R9 Desvia para a instrução Cujo endereço é [ (conteúdo R4) + x’008’ ] Se R7 > R9 próxima instrução Exemplo: Usar no fim de uma laço para pesquisa. R7 = começa com o endereço da tabela; somado com o tamanho dos itens da tabela R8 = tamanho dos itens da tabela R9 = endereço do último elemento NOTFOUND : toda tabela varrida; item desejado não achado L R7,=A(TABADRS) L R8,20 L R9,=A(TABADRS+(HOWMANY-1)*LENGTH) NEXTITEM compara item apontado vs desejado se achado, processa e desvia para TABLSEEN se não achado, aponta p/ próximo BXLE 7,8,NOTFOUND R7 = R8 + R7; * If R7 <= R9 toda tabela varrida; fim da pesquisa * If R7 > R9 tabela não vista toda; continuar pesquisa NOTFOUND ... TABLSEEN ... ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 97 97 4-6. Instruções de edição ED (Edit – Editar) Código de máquina Condition code Interrupções Possíveis DE (Instrução SS – L) 00 Último Campo = 0 01 Último Campo < 0 10 Último Campo > 0 11 O condition code nunca fica em 11 após o ED 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á 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). ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 98 98 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: MODELO MVC ED . . DC ARIMP+5(10),MODELO ARIMP+5(10),TOTAL X'4020204B202126B2020' Antes: TOTAL ARIMP+5(10) Depois: TOTAL ARIMP+5(10) b b Outros Exemplos do ED: ED ED ED 00.12.34.5C 40.20.20.4B.20.21.20.6B.20.20.20 00.12.34.5C 40.40.40.40.F1.F2.F3.6B.F4.F5 b b 1 2 3 , 4 5 0(5,7),CPO ARIMP+17(8),ISDRT 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 < 0 10 Último Campo > 0 11 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 99 99 4-7. Instruções de tradução e teste de bytes TR (Translate – Traduzir) Código de máquina Condition code Interrupções Possíveis DC (Instrução SS – L) Não é alterado 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 Depois ACSD TABELA I ACSD TABELA Outros exemplos: TR TR TR 02.00.08.FF.05 C1.48.B9.D7.A1.C3.D9.5C.4B ........1A .......... 256 bytes ................ B9.C1.4B.1A.C3 não é alterado 0(5,7),0(10) ARIMP+7(10),TABASTER 2(5,124),CAMP Mais exemplos : Traduzir letras maiúsculas EBCDIC em letras minúsculas EBCDIC; “letras” inválidas são convertidas em espaços EBCDIC CONVTB1 DC ORG DC ORG DC ORG DC ORG 256C´ ’ CONVTB1+C’A’ C’abcdefghi’ CONVTB1+C’J’ C’jklmnopqr’ CONVTB1+C’S’ C’stuvwxyz’ 256 espacos EBCDIC Volta para A maiusculo Substitui espacos originais pelas minusculas Volta para J maiusculo Substitui espacos originais pelas minusculas Volta para S maiusculo Substitui espacos originais pelas minusculas , Volta para CONVTB1 +256 Traduzir letras maiúsculas EBCDIC para letras maiúsculas ASCII; “letras” inválidas são convertidas para espaços ASCII CONVTB2 DC ORG DC ORG DC ORG DC ORG 256X’20’ 256 ASCII spaces CONVTB2+C’A’ Volta para A maiusculo X’414243444546474849’ Substitui letras EBCDIC pelas ASCII CONVTB1+C’J’ Volta para J maiusculo X’4A4B4C4D4E4F505152’ Substitui letras EBCDIC pelas ASCII CONVTB1+C’S’ Volta para S maiusculo X’535455565758595A’ Substitui letras EBCDIC pelas ASCII , Volta para CONVTB2+256 Traduzir letras ASCII maiúsculas para letras EBCDIC maiúsculas; “letras” inválidas são convertidas em espaços EBCDIC CONVTB3 DC 256X’40’ 256 espacos EBCDIC ORG CONVTB2+X’41’ “Return” to Uppercase ASCII A DC C’ABCDEFGHIJKLMNOPQRSTUVWXYZ’ Subst letras ASCII pelas EBCDIC ORG , Volta para CONVTB3+256 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 100 100 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 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: TABNUM TRT BZ ... DC CART+9(6),TABNUM NUMÉRICO 240X'FF',10X'00',6X'FF' b) Testar se um campo (1º operando) é alfabético (só tem letras e brancos) TABALFAB TRT BZ ... DC ORG DC ORG DC ORG DC ORG DC ORG CART+9(6),TABALFAB FABETICO CL256X'FF' TABALFAB+C' ' X'00' TABALFAB+C'A' 9X'00' TABALFAB+C'J' 9X'00' TABALFAB+C'S' 8X'00' c) Achar o 1º byte de um campo que tenha determinado caracter (* no exemplo). TABASTER TRT 0(80,7),TABASTER BZ NOTASTER aqui o registrador 1 tem o endereço do byte desejado ... DC 256X'00' ORG TABASTER+C'*' DC X'FF' ORG ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 101 101 4-8. Shift (deslocamento de bits) 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 Shift b) Duplos - dois registradores seguidos (conjunto par-ímpar; deve-se especificar o registrador par) participarão do Shift c) 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 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 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 8,4 102 102 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 103 103 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 < 0 10 Resultado > 0 11 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 < 0 10 Resultado > 0 11 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 Registrador 5 antes do Shift FF.80.0A.00 Registrador 5 após o Shift 8F.F0.01.40 5,3 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 104 104 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 < 0 10 Resultado > 0 11 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 < 0 10 Resultado > 0 11 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 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 8,3 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 105 105 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 Condition code Interrupções Possíveis 54 (Instrução RX) 00 Resultado = 0 01 Resultado <> 0 10 O condition code nunca fica em 10 após um N 11 O condition code nunca fica em 11 após um N 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 Reg. 13 CAMPOF 13,CAMPOF Antes Depois B4.EF.2F.A8 00.00.00.FF 00.00.00.A8 00.00.00.FF Outros exemplos: N N N N 11,=F'15' 3,0(4) 3,0(,4) 3,0(8,4) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI O (Or – Ou) Código de máquina Condition code Interrupções Possíveis 106 106 56 (Instrução RX) 00 Resultado = 0 01 Resultado <> 0 10 O condition code nunca fica em 10 após um O 11 O condition code nunca fica em 11 após um O 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 Depois B4.EF.2F.A8 00.00.00.FF B4.EF.2F.FF 00.00.00.FF Reg. 13 CAMPOF Antes X (Exclusive Or – Ou exclusivo) Código de máquina 57 (Instrução RX) Condition code 00 Resultado = 0 01 Resultado <> 0 10 O condition code nunca fica em 10 após um X 11 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 Reg. 13 CAMPOF 13,CAMPOF Antes Depois B4.EF.2F.A8 00.00.00.FF B4.EF.2F.57 00.00.00.FF 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 <> 0 10 O condition code nunca fica em 10 após um NR 11 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 Reg. 5 Reg. 8 5,8 Antes Depois B4.EF.2F.A8 00.00.00.FF 00.00.00.A8 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 <> 0 10 O condition code nunca fica em 10 após um OR 11 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 Reg. 5 Reg. 8 5,8 Antes Depois B4.EF.2F.A8 00.00.00.FF B4.EF.2F.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 <> 0 10 O condition code nunca fica em 10 após um XR 11 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 Reg. 5 Reg. 8 5,8 Antes Depois B4.EF.2F.A8 00.00.00.FF B4.EF.2F.57 00.00.00.FF 107 107 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 <> 0 10 O condition code nunca fica em 10 após um NI 11 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 Antes BYTE Op.Imed. B4 0F BYTE,X'0F' Depois 04 0F OI (Or Immediate – Ou [com operando] imediato) Código de máquina 96 (Instrução SI) Condition code 00 Resultado = 0 01 Resultado <> 0 10 O condition code nunca fica em 10 após um OI 11 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 Antes BYTE Op.Imed. B4 0F BYTE,X'0F' Depois BF 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 <> 0 10 O condition code nunca fica em 10 após um OI 11 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: BYTE Op.Imed. Antes Depois B4 0F BB 0F 108 108 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 <> 0 10 O condition code nunca fica em 10 após um NC 11 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 CPOA,CPOB Antes Depois EF.2F.A8 00.00.FF 00.00.A8 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 <> 0 10 O condition code nunca fica em 10 após um OC 11 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 CPOA,CPOB Antes Depois EF.2F.A8 00.00.FF EF.2F.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 <> 0 10 O condition code nunca fica em 10 após um XC 11 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 CPOA,CPOB Antes Depois EF.2F.A8 00.00.00 EF.2F.57 00.00.FF 109 109 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 110 110 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 BALR 3,0 14,15 LA carrega o endereço da instrução ROUTINE no registrador 15 ... LA 15,ROUTINE BALR 14,15 EQU * continuação RETINS ... ... ROUTINE ST .... .... L BR 14,SAVEREG 14,SAVEREG 14 BALR carrega o endereço da instrução RETINS no registrador 14 Salva o registrador 14 (endereço de retorno) em SAVEREG Restaura o endereço de retorno Retorna para RETINS ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 111 111 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) BAL carrega o endereço da instrução RETINS no registrador 9 ... ... Salva o registrador 9 (endereço de BAL 9,ROUTINE retorno) em SAVEREG9 RETINS EQU * continuation ... ... Restaura o endereço de retorno ROUTINE ST 9,SAVEREG9 .... .... L 9,SAVEREG9 Retorna para RETINS BR 9 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 112 112 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 BAS RETINS EQU ... ... ROUTINE ST .... .... L BR BAS carrega o endereço da instrução RETINS no registrador 9 (bytes 1, 2 e 3) e zera o byte 0 9,ROUTINE * continuation 9,SAVEREG9 9,SAVEREG9 9 Salva o registrador 9 (endereço de retorno) em SAVEREG9 Restaura o endereço de retorno Retorna para RETINS ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 113 113 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 LA 15,ROUTINE BASR 14,15 EQU * continuação RETINS ... ... ROUTINE ST .... .... L BR 14,SAVEREG 14,SAVEREG 14 LA carrega o endereço da instrução ROUTINE no registrador 15 BASR carrega o endereço da instrução RETINS nos bytes 1, 2 e 3 do registrador 14, e zera o byte 0 Salva o registrador 14 (endereço de retorno) em SAVEREG Restaura o endereço de retorno Retorna para RETINS ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 114 114 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 LA carrega o endereço da instrução ROUTINE no registrador 15 LA 15,ROUTINE ICM 15,8,AMODE BASSM 14,15 EQU * continuação RETINS ... ... ROUTINE ST .... .... L BR 14,SAVEREG 14,SAVEREG 14 Retorna para RETINS BASSM - Carrega no reg 14 o endereço da instrução RETINS (pega da PSW) - Carrega conteúdo do reg 15 nos bytes 4-7 da PSW - Posiciona addressing mode (pega do reg 15) - Desvia para ROUTINE Salva o registrador 14 (endereço de retorno) em SAVEREG Restaura o endereço de retorno ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 115 115 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 116 116 4-11. Instruções de movimento de dados de registrador para memória ST (Store – Armazenar) Código de máquina Condition code Interrupções Possíveis 50 (Instrução RX) Não é alterado 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: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 1o operando depois ST 7,FULL FE.DC.BA.98 FE.DC.BA.98 ST 14,SAVE 00.00.00.11 00.00.00.11 Outros exemplos: ST ST ST ST ST 2o operando antes 2o operando depois 00.01.00.00 FE.DC.BA.98 FF.FF.FF.FD 00.00.00.11 14,SALVA 14,FULL+4 14,0(2) 14,0(,8) 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: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 1o operando depois STH 5,FLD 00.00.00.0A 00.00.00.0A STH 8,HWORD FF.FF.FF.FF FF.FF.FF.FF Outros exemplos: STH STH STH STH STH STH 2o operando antes 2o operando depois 8A.B4 00.0A FF.FF FF.FF 14,SALVA+18 14,HALF 14,0(2) 14,0(,8) 14,0(2,8) 0,CPO ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 117 117 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: 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: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 1o operando depois STC 7,BYTE FE.DC.BA.98 FE.DC.BA.98 STC 14,0(5) 00.00.00.11 00.00.00.11 Outros exemplos: STC STC STC STC 2o operando antes 2o operando depois 00 98 FF 11 4,BYTE 8,0(5) 8,0(,9) 8,0(5,9) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 118 118 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: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 1o operando depois STCM 5,B’1010’,TWOBYTES 00.00.45.67 00.00.45.67 2o operando antes 2o operando depois 9A.BC 00.45 1o byte do registrador 5 é colocado no byte TWOBYTES e 3o byte do registrador 5 é colocado no byte TWOBYTES+1 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 D. Exemplos: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois CVD 8,DOUBLE 00.00.10.00 00.00.00.00.00.00.00.70 00.00.10.00 00.00.00.00.00.04.09.6C * 2o operando = DOUBLE CVD 8,0(5,9) FF.FF.FF.FF 00.00.FB.EC.44.CC.F0.F1 FF.FF.FF.FF 00.00.00.00.00.00.00.1D * Endereço 2o operando = indexador 5 + base 9 + X’0’ CVD 8,0(,9) 00.00.99.99 98.BA.76.FE.54.DC.32.B9 00.00.99.99 00.00.00.00.00.39.32.1C Endereço 2o operando = indexador 0 + base 9 + X’0’ CVD 8,0(5) 00.00.AA.AA 00.00.00.00.00.00.00.0C 00.00.AA.AA 00.00.00.00.00.43.69.0C * Endereço 2o operando = indexador 5 + base 0 + X’0’ Outros exemplos: CVD CVD CVD CVD 8,DOUBLE 8,0(5,9) 8,0(,9) 8,0(5) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 119 119 4-12. Instruções de movimento de dados de campo de memória para registrador L (Load – Carregar) Código de máquina Condition code Interrupções Possíveis 58 (Instrução RX) Não é alterado 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois L 7,FULL FE.DC.BA.98 00.01.00.00 00.01.00.00 00.01.00.00 L 14,SALVA 00.00.00.11 FF.FF.FF.FD FF.FF.FF.FD FF.FF.FF.FD L 11,=F’125’ 00.00.00.00 00.00.00.7D 00.00.00.7D 00.00.00.7D Outros exemplos: L L L L L L 7,FULL 14,SALVA 8,0(10) 8,0(,11) 8,0(10,11) 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois LH 5,FLD 00.00.00.00 8A.B4 FF.FF.8A.B4 8A.B4 LH 8,HWORD FF.FF.FF.FF 7A.B4 00.00.7A.B4 7A.B4 Outros exemplos: LH LH LH LH LH 7,HALF 8,0(10) 8,0(,11) 8,0(10,11) 8,=H'200' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 120 120 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois IC 4,BYTE 00.00.45.67.8C 6B 00.00.45.67.6B 6B IC 8,=C’K’ 00.00.00.11.1C D2 00.00.00.11.D2 D2 IC 11,=HL1’125’ 00.00.00.00.00.12.7C 7D 00.00.00.00.02.5C.2C 7D Outros exemplos: IC IC IC IC IC 4,BYTE 8,0(5) 8,0(,9) 8,0(5,9) 9,=C'A' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 121 121 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 é alterado Interrupçõ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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois CVB 8,DOUBLE 12.BC.4F.CA 00.00.00.00.00.01.02.4D FF.FF.FC.00 00.00.00.00.00.01.02.4D * 2o operando = DOUBLE CVB 8,0(5,9) FF.FF.FF.FF 00.00.00.00.00.01.02.5C 00.00.04.01 00.00.00.00.00.01.02.5C * Endereço 2o operando = indexador 5 + base 9 + X’0’ CVB 8,0(,9) FF.FF.FF.FF 00.00.00.00.00.01.02.3F 00.00.03.FF 00.00.00.00.00.01.02.3F Endereço 2o operando = indexador 0 + base 9 + X’0’ CVB 8,0(5) FF.FF.FF.FF 00.00.00.00.00.01.02.3C 00.00.03.FF 00.00.00.00.00.01.02.3C * Endereço 2o operando = indexador 5 + base 0 + X’0’ Outros exemplos: CVB CVB CVB CVB 8,DOUBLE 8,0(5,9) 8,0(,9) 8,0(5) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 122 122 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 é alterado Interrupções Possíveis Nenhuma O conteúdo do registrador especificado no 2º operando é colocado no registrador especificado no 1º operando. Ex: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois LR 4,5 00.00.00.00 FF.FF.FF.FC FF.FF.FF.FC FF.FF.FF.FC LR 4,5 00.00.12.34 00.00.00.02 00.00.00.02 00.00.00.02 LR 4,8 00.00.00.02 00.00.00.00 00.00.00.00 00.00.00.00 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 > 0 11 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois LPR 4,5 00.00.00.00 FF.FF.FF.FC 00.00.00.04 FF.FF.FF.FC LPR 4,5 00.00.00.02 00.00.00.02 00.00.00.02 00.00.00.02 LPR 4,8 00.00.00.FF 00.00.00.00 00.00.00.00 00.00.00.00 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LNR (Load Negative Register – Carregar registrador negativo) Código de máquina 11 (Instrução RR) Condition code 00 Resultado = 0 01 Resultado < 0 10 Nunca o condition code 11 Nunca o condition code Interrupções Possíveis Nenhuma 123 123 fica em 10 após um LNR fica em 10 após um LNR 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois LNR 4,5 00.00.00.00 FF.FF.FF.FC FF.FF.FF.FE FF.FF.FF.FC LNR 4,5 00.00.00.02 00.00.00.02 FF.FF.FF.FE 00.00.00.02 LNR 4,8 00.00.00.02 00.00.00.00 00.00.00.00 00.00.00.00 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 < 0 10 Resultado > 0 11 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois LCR 4,5 00.00.00.00 FF.FF.FF.FC 00.00.00.04 FF.FF.FF.FC LCR 4,4 00.00.00.02 00.00.00.02 FF.FF.FF.FE 00.00.00.02 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 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 < 0 10 Resultado > 0 11 Nunca o condition code Interrupções Possíveis Nenhuma 124 124 fica em 10 após um LTR O conteúdo do registrador especificado no 2º operando (o qual permanece inalterado) é colocado no registrador especificado no 1º operando. Ex: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois LTR 4,5 00.00.00.00 FF.FF.FF.FC FF.FF.FF.FC FF.FF.FF.FC LTR 4,5 00.00.12.34 00.00.00.02 00.00.00.02 00.00.00.02 LTR 4,8 00.00.00.02 00.00.00.00 00.00.00.00 00.00.00.00 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 125 125 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 < 0 10 Resultado > 0 11 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois AR 7,8 00.00.FF.FF 00.00.00.01 00.01.00.00 00.00.00.01 AR 2,2 00.00.FF.FF FF.FF.FF.FF 00.00.FF.FE FF.FF.FF.FE SR (Subtract Register – Subtrair registradores) Código de máquina 1B (Instrução RR) Condition code 00 Resultado = 0 01 Resultado < 0 10 Resultado > 0 11 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ºoperando Ex: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois SR 7,8 00.00.FF.FF 00.00.00.01 00.00.FF.FE 00.00.00.01 SR 2,2 00.00.FF.FF 00.00.FF.FF 00.00.00.00 00.00.00.00 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 126 126 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 6,9 MR 6,9 Registrador 6 antes Registrador 7 antes Registrador 9 antes Registrador 6 depois Registrador 7 depois Registrador 9 depois [ Multiplicando: Registrador 7; Multiplicador: reg 9; Resultado: Regs 6 e 7 juntos ] 00.00.00.00 00.00.00.0A 00.00.00.02 00.00.00.00 00.00.00.14 00.00.00.02 [ Multiplicando: Registrador 7; Multiplicador: reg 9; Resultado: Regs 6 e 7 juntos ] 00.00.00.00 99.AA.BB.CC 00.FF.FF.FF 00.99.AA.BB 32.55.44.34 00.FF.FF.FF DR (Divide Register – Dividir registradores) Código de máquina 1D (Instrução RR) Condition code Não é alterado Interrupçõ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. Resto ou quociente = 0 : sinal sempre positivo Sinal do resto = Sinal do dividendo 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. 9 Resto : Reg. 4 Quociente : Reg. 5 * L L L DR 12,=F’2’ 4,=F’0’ 5,=F’257’ 4,12 Divisor: Registrador 12 com número 2 Dividendo: Registradores 4-5 juntos; Eles tem o número 257 Quociente: Registrador 5 = 128; Resto: Registrador 4 = 1 L L L DR 9,=F’12’ 6,=F’0’ 7,=F’148’ 6,9 Divisor: Registrador 9 com número 12 Dividendo: Registradores 6-7 juntos; Eles tem o número 145 Quociente: Registrador 7 = 12; Resto: Registrador 6 = 4 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 127 127 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 sinal 10 Resultado = 0, perde sinal 11 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “Antes” registrador 1o operando antes registrador 1o operando depois ALR 7,12 00.B0.C4.E2 00.B0.C4.E3 ALR 8,8 7F.FF.FF.FF 80.00.00.00 ALR 10,10 FF.FF.FF.FF 00.00.00.00 ALR 10,10 80.00.00.00 00.00.00.00 2o operando antes 2o operando depois 00.00.00.01 00.00.00.01 00.00.00.01 00.00.00.01 00.00.00.01 00.00.00.01 80.00.00.00 80.00.00.00 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 sinal 10 Resultado = 0, perde sinal 11 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: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois SLR 7,12 00.B0.C4.E2 00.00.00.01 00.B0.C4.E1 00.00.00.01 SLR 10,11 80.00.00.00 00.00.00.01 7F.FF.FF.FF 00.00.00.01 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 128 128 4-15. Operações aritméticas entre registradores e campos de memória A (Add – Somar) Código de máquina Condition code Interrupções Possíveis 5A (Instrução RX) 00 Resultado = 0 01 Resultado < 0 10 Resultado > 0 11 Overflow 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “Antes” registrador 1o operando antes 2o operando antes registrador 1o operando depois 2o operando depois A 5,=F'259' 00.00.BF.D2 00.00.01.03 00.00.C0.D5 00.00.01.03 A 7,FULL 00.00.00.0D 00.00.01.10 00.00.01.03 00.00.01.03 A 7,4(2,8) 07.FF.FF.FE 07.FF.FF.FF 00.00.00.01 00.00.00.01 A 7,4(2) 07.FF.FF.FF 07.FF.FF.FE FF.FF.FF.FF FF.FF.FF.FF A 7,4(,8) 00.00.00.00 FF.FF.FF.FF FF.FF.FF.FF FF.FF.FF.FF S (Subtract – Subtrair) Código de máquina Condition code Interrupções Possíveis 5B (Instrução RX) 00 Resultado = 0 01 Resultado < 0 10 Resultado > 0 11 Overflow 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: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois S 5,=F'259' 00.00.BF.D2 00.00.01.03 00.00.BE.CF 00.00.01.03 S 7,FULL 00.00.00.0D FF.FF.FF.0A 00.00.01.03 00.00.01.03 S 7,4(2,8) 07.FF.FF.FE 07.FF.FF.FD 00.00.00.01 00.00.00.01 S 7,4(2) 07.FF.FF.FF 07.FF.FF.FD 00.00.00.02 00.00.00.02 S 7,4(,8) 00.00.00.00 00.00.00.01 FF.FF.FF.FF FF.FF.FF.FF ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI M (Multiply – Multiplicar) Código de máquina Condition code Interrupções Possíveis 129 129 5C (Instrução RX) Não é alterado 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: Registrador 6 antes Registrador 7 antes 2o operando antes Registrador 6 depois Registrador 7 depois 2o operando depois 6,FLDA [ Multiplicando: Reg 7; Multiplicador: FLDA; Resultado: Regs 6 e 7 juntos ] 00.00.00.00 00.00.00.0A 00.00.00.02 00.00.00.00 00.00.00.14 00.00.00.02 6,=F'256' Multiplicando: Reg 7; Multiplicador: 256; Resultado: Regs 6 e 7 juntos 00.00.00.00 00.00.04.00 00.00.00.FF 00.00.00.00 00.03.FC.00 00.00.00.FF 6,4(2,8) Multiplicando: Reg 7; Endereço multiplicador: Indexador 2 + Base 8 + X’4’; Resultado: Registradores 6 e 7 juntos 00.00.00.00 00.00.04.00 00.00.01.0A 00.00.00.00 00.04.28.00 00.00.01.0A Multiplicando: Reg 7; Endereço multiplicador: Indexador 2 [ + Base 0 ] + X’4’; 6,4(2) Resultado: Registradores 6 e 7 juntos 00.00.00.00 00.00.00.0C 00.00.00.02 00.00.00.00 00.00.00.18 00.00.00.02 6,FLD+4(1) Multiplicando: Reg 7; Endereço multiplicador: Indexador 1 + Base de FLD+4 + Deslocamento de FLD+4 + X’4’; Resultado: Registradores 6 e 7 juntos 00.00.00.00 00.00.AA.AA 00.11.22.33 00.00.00.0B 6C.16.93.DE 00.11.22.33 M M M M M D (Divide – Dividir) Código de máquina Condition code Interrupções Possíveis 5D (Instrução RX) Não é alterado 0005,0006,0008 Esta instrução efetua uma divisão entre dois números binários. O registrador 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 * L L D 6,=F’0’ 7,=F’257’ 6,=F’4’ Dividendo: Registradores 6-7 juntos; They have the number 257 Divisor: (literal) com número 4; Quociente: Registrador 7 = conteúdo 64; Resto: Registrador 6 = conteúdo 1 L L D 10,=F’0’ 11,=F’17’ 10,=F’3’ Dividendo: Registradores 10-11 juntos; They have the number 17 Divisor: (literal) com número 3; Quociente: Registrador 11 = conteúdo 5; Resto: Registrador 10 = conteúdo 2 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 130 130 AH (Add Halfword – Somar hafword) Código de máquina 4A (Instrução RX) Condition code 00 Resultado = 0 01 Resultado < 0 10 Resultado > 0 11 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “Antes” registrador 1o operando antes registrador 1o operando depois AH 5,=H'259' 00.00.2B.C4 00.00.2C.C7 AH 5,HALF 00.00.00.0D 00.00.01.1A AH 5,4(2,8) 11.11.11.11 (decimal 286331153) 11.10.99.99 (decimal 286300569) AH 5,4(2) 11.11.11.11 (decimal 286331153) 11.11.89.99 (decimal 286362009) 2o operando antes 2o operando depois 01.03 01.03 01.0D 01.0D 88.88 (decimal –30584) 88.88 78.88 (decimal +30856) 78.88 SH (Subtract Halfword – Subtrair hafword) Código de máquina 4B (Instrução RX) Condition code 00 Resultado = 0 01 Resultado < 0 10 Resultado > 0 11 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: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 1o operando depois SH 5,=H'259' 00.00.2B.C4 00.00.2A.C1 SH 5,HALF 00.00.00.0D FF.FF.FF.00 SH 5,4(2,8) 11.11.11.11 (decimal 286331153) 11.11.88.89 (decimal 286361737) SH 5,4(2) 11.11.11.11 (decimal 286331153) 11.10.98.89 (decimal 286300297) 2o operando antes 2o operando depois 01.03 01.03 01.0D 01.0D 88.88 (decimal –30584) 88.88 78.88 (decimal +30856) 78.88 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 131 131 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: M 5,=H’4’ M 5,=F'2' Registrador 1o operandoantes 2o operando antes Registrador 1o operando depois 2o operando depois Multiplicando: Registrador 5; Multiplicador: literal 4; Resultado: Registrador 5 00.00.00.0A 00.04 00.00.00.28 00.04 Multiplicando: Registrador 5; Multiplicador: 0 [ primeiros 2 bytes à esquerda da fullword são pegos como a halfword 2o operando; como a fullword tem X’00000002’, pega X’0000’ ]; Resultado: Registrador 5 00.00.04.00 00.00 [ metade da direita com 00.02 não é pega! ] 00.00.00.00 00.00 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 sinal 10 Resultado = 0, perde sinal 11 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: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “Antes” registrador 1o operando antes registrador 1o operando depois AL 5,=F'259' 00.00.00.00 00.00.01.03 2o operando antes 2o operando depois 00.00.01.03 00.00.01.03 AL 5,FULL 00.B0.C4.E2 00.B0.C4.E3 00.00.00.01 00.00.00.01 AL 5,4(2,8) 7F.FF.FF.FF 80.00.00.0 00.00.00.01 00.00.00.01 AL 5,4(2) FF.FF.FF.FF 00.00.00.0 00.00.00.01 00.00.00.01 AL 5,4(,8) 80.00.00.00 00.00.00.00 00.00.00.01 00.00.00.01 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 sinal 10 Resultado = 0, perde sinal 11 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: Supor os operandos com tamanho e conteúdo como exibidos na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois SL 5,=F'259' 00.00.BF.D2 00.00.01.03 00.00.BE.CF 00.00.01.03 SL 7,FULL 00.00.00.0D 00.00.00.0A 00.00.00.03 00.00.00.03 SL 7,4(2,8) 07.FF.FF.FE 07.FF.FF.FD 00.00.00.01 00.00.00.01 SL 7,4(2) 07.FF.FF.FF 07.FF.FF.FD 00.00.00.02 00.00.00.02 132 132 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 133 133 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 registrador 1o operando antes instrução máquina registrador 3 antes registrador 9 antes registrador 1o operando depois registrador 3 depois registrador 9 depois 5,TABLE 01.12.34.56 41.50.3A.C2 00.0B.88.40 nao usado 00.0B.93.02 00.0B.88.40 nao usado LA 5,FLD+17 01.12.34.56 00.A0.0F.03 41.50.3F.03 00.A0.00.00 00.A0.00.00 nao usado nao usado LA 5,FLD+17(9) 01.12.34.56 00.A0.0F.6A 41.59.3F.03 00.A0.00.00 00.A0.00.00 00.00.00.14 00.00.00.14 LA 5,2(9,3) 01.12.34.56 00.A0.00.16 41.59.30.02 00.A0.00.00 00.A0.00.00 00.00.00.14 00.00.00.14 LA 5,200 01.23.45.67 00.00.00.C8 41.50.00.C8 nao usado nao usado nao usado nao usado LA 5,4095 01.23.45.67 00.00.0F.FF 41.50.0F.FF not used not used not used not used LA 5,4095(3) 01.23.45.67 00.0A.8F.FF 41.53.0F.FF 00.0A.80.00 00.0A.80.00 not used not used LA 5,4095(3,9) 01.23.45.67 00.0A.90.00 41.53.9F.FF 00.0A.00.00 00.0A.80.00 00.00.00.01 00.00.00.01 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 é 0 01 Dos bits testados, alguns estão ligados e outros desligados 10 Nunca o condition code fica em 10 após um TM 11 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' Bits 0, 3, 4 e 5 of BYTE são testados Neste caso, os bits 0, 3, 4 e 5 de BYTE serão testados. Outros exemplos: TM TM TM CHAVE,B'10000001' Bits 0 e 7 of BYTE são testados 0(4),240 Bits 4,5,6 e 7 de [reg base 4 + deslocamento X’0’] são testados 2(8),X'80' Bit 0 [reg base 8 + deslocamento X’2’] é testado ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI EX (Execute) Código de máquina Condition code 134 134 44 (Instrução RX) o seu posicionamento (ou não) depende da instrução que for executada 0003,0005,0006 Interrupções Possíveis 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: L 5,=F’22’ EX 5,MVC . . . MVC MVC 0,(0,12),=CL256'b' O move será executado com tamanho 23 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 SVC 0 7 Exemplos de SVC's de MVS: X'00' X'01' X'02' X'04' X'05' X'0B' X'0D' (000) (001) (002) (004) (005) (011) (013) = = = = = = = EXCP/XDAP WAIT/WAITR/PRTOV POST GETMAIN FREEMAIN TIME ABEND X'13' X'14' X'23' X'24' X'5D' X'63' X'6B' (019) (020) (035) (036) (093) (099) (107) = = = = = = = OPEN CLOSE WTO/WTOR WTL TGET/TPUT DYNALLOC MODESET ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI MC (Monitor Call – Chamada Código de máquina Condition code Interrupções Possíveis 135 135 do monitor) AF (Instrução SI) Permanece inalterado 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º operando Interrupçõ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 é alterado Interrupçõ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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 136 136 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 set 10 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 Condition code 00 Bit mais à 01 Bit mais à 10 Nunca fica 11 Nunca fica Interrupções Possíveis 0004,0005 S) esquerda desligado esquerda ligado em 10 após um TS em 11 após um TS 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º operando 01 1º e 2º operandos são diferentes, o 2º operando foi colocado no 1º operando 10 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: 5,8,FW 7D.48.C0.00 7D.48.C0.00 FW FW 00.BF.C4.20 7D.48.C0.00 Outro exemplo: CS 5,8,FW Antes: R5 00.BF.C4.20 R8 7D.48.C0.00 Depois: R5 00.FF.EE.DD R8 7D.48.C0.00 FW FW 00.FF.EE.DD 00.FF.EE.DD Antes: R5 Depois: R5 00.BF.C4.20 00.BF.C4.20 CS R8 R8 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 137 137 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º operando 01 1º e 2º operandos são diferentes, o 2º operando foi colocado no 1º operando 10 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 Antes: 4,8,DW R4/R5 R8/R9 DW 00.BF.C4.20.50.CC.A0.00 7D.48.C0.00.00.00.00.02 00.BF.C4.20.50.CC.A0.00 Depois: R4/R5 R8/R9 DW 00.BF.C4.20.50.CC.A0.00 7D.48.C0.00.00.00.00.02 7D.48.C0.00.00.00.00.02 Outro exemplo: Antes: CDS 4,8,DW R4/R5 R8/R9 DW 00.CC.DD.EE.FF.FF.FF.FF 7D.48.C0.00.00.00.00.02 00.BF.C4.20.50.CC.A0.00 Depois: R4/R5 R8/R9 DW 00.BF.C4.20.50.CC.A0.00 7D.48.C0.00.00.00.00.02 00.BF.C4.20.50.CC.A0.00 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 138 138 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 AGO AIF LCLA LCLB LCLC GBLA GBLB GBLC SETA SETB SETC ANOP AREAD MHELP MNOTE 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 . MEND PROGRAMA CSECT . . programa . . . END ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 139 139 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 . ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI &SYSPARM 140 140 = 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 141 141 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 campo T'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 P S'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 campo K'simbolovariável = ATRIBUTO DE CONTAGEM = tem um número que indica quantos caracteres tem um operando de macro instrução ou quantos caracteres tem um campo do Assembler definido por SET N'simbolovariável = ATRIBUTO DE NÚMERO = contém o número de sub-operandos de um operando de uma macro instrução D'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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 142 142 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 143 143 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 LCLA &VL1 &VLA2,&VLA3 LCLB LCLB &VLB1 &VLB2,&VLB3 LCLC LCLC &VLC1 &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 &VLB1 &VLC1 &VLA2 &VLB2 &VLC2 &VLA3 &VLB3 &VLC3 SETA SETB SETC SETA SETB SETC SETA SETB SETC 2 101 'GENTE' 2+&VLA1 1001+11 'ABCDEF' 2+L'CAMPO 1+11+111 'MUDOU' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 144 144 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 GBLA &VGA1 &VGA2,&VGA3 GBLB GBLB &VGB1 &VGB2,&VGB3 GBGB GBLC &VGB1 &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 &VGB1 &VGC1 &VGA2 &VGB2 &VGC2 &VGA3 &VGB3 &VGC3 SETA SETB SETC SETA SETB SETC SETA SETB SETC 2 101 'GENTE' 2+&VLA1 1001+11 'ABCDEF' 2+L'CAMPO 1+11+111 'MUDOU' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 145 145 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: .TESTE MACRO YYY . . . 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 146 146 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 simbolovariavel simbolovariavel AREAD AREAD AREAD NOSTMT NOPRINT ou ou 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 + DC MEXAR + DC + DC END C'PRIMEIRA LEITURA VIA AREAD DA PRIMEIRA CHAMADA DA MEXAR' C'SEGUNDA LEITURA VIA AREAD DA PRIMEIRA CHAMADA DA MEXAR' C'PRIMEIRA LEITURA DA SEGUNDA CHAMADA DA MEXAR ' C'SEGUNDA LEITURA DA SEGUNDA CHAMADA DA MEXAR' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 147 147 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 MHELP 1 MHELP 256+1 limita a &SYSNDX a 256 trace macro calls limita &SYSNDX a 257 e faz trace dos macros calls ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 148 148 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: .LUP MACRO XXXXX LCLA &A ACTR 1000 . . . 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 sequência) AIF (expressão operador expressão)símbolodesequência Vejamos alguns exemplos: .TESTE AIF (&A LT &B).AMENOR AIF ('&PRM1' NE '').VEIOPR1 AIF (&VGA1+1 EQ 99).JAFEZ Os operadores podem ser: EQ NE LT GT LE GE (equal to - igual a) (not equal to - diferente de) (less than - menor que) (greater than - maior que) (less or equal to - menor ou igual) (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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 149 149 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: X Y Z MACRO MACPA1 DC DC DC MEND &P1,&P2,&P3 A(&P1) A(&P2) A(&P3) 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 então seria gerado: MACPA1 FLD,,CPO 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 X .NG1 Y .NG2 Z .NG3 MACRO MACPA1 AIF DC AIF DC AIF DC ANOP MEND OU ENTÃO &P1,&P2,&P3 ('&P1' EQ '').NG1 A(&P1) ('&P2' EQ '').NG2 A(&P2) ('&P3' EQ '').NG3 A(&P3) X .NG1 Y .NG2 Z .NG3 MACRO MACPA1 AIF DC AIF DC AIF DC ANOP MEND &P1,&P2,&P3 (T'&P1 EQ 'O').NG1 A(&P1) (T'&P2 EQ 'O').NG2 A(&P2) (T'&P3 EQ 'O').NG3 A(&P3) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 150 150 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: X Y Z MACRO MACPA1 DC DC DC MEND &P2=,&P1=,&P3= A(&P1) A(&P2) A(&P3) Neste caso, nenhum dos parâmetros tem valor default, de forma que se fosse feita uma chamada da macro com seria gerado: MACPA1 P3=FLD,P2=FFF,P1=TT DC DC DC A(TT) A(FFF) A(FLD) Mas, se a chamada fosse feita com DC DC DC MACPA1 P3=FLD,P1=TT seria gerado: A(TT) A() A(FLD) Caso a macro tivesse sido definida assim: X Y Z MACRO MACPA1 DC DC DC MEND e a sua chamada fosse DC DC DC &P2=KKK,&P1=WWW,&P3=YYY A(&P1) A(&P2) A(&P3) MACPA1 P3=FLD,P1=TT seria gerado: A(TT) A(KKK) 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 151 151 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. 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 MACTOK &VAL DC F'&VAL' MEND EXMAC004 START . . CIDA MACTOK 256 +CIDA DC F'256' . . DIANA MACTOK 100 +DIANA DC F'100' . . ELISA MACTOK +ELISA DC F'' . . END &JJJ &JJJ Esta chamada causaria erro de montagem 152 152 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 5-9-5 Macro com símbolo variável e com 2 parâmetros posicionais MACRO MACTIK &VALX,&VALY 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 +HEBE DC F'300,' . . IEDA MACTIK ,300 +IEDA DC F',300' . . END &KKK &KKK Esta chamada causaria erro de montagem Esta chamada causaria erro de montagem 5-9-6 Macro com símbolo variável e com 1 parâmetro keyword (sem default) MACRO MACTAK &VAL= DC F'&VAL' MEND EXMAC006 START . . JULIA MACTAK VAL=256 +JULIA DC F'256' . . . MACTAK . END &LL &LL Esta chamada causaria erro de montagem,, pois não foi especificado o parâmetro 153 153 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 5-9-7 Macro com símbolo variável e com 1 parâmetro keyword (com default) MACRO MACTEK &VAL=06 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 &MVVB &MVVB 5-9-8 Macro com símbolo variável e com 2 parâmetros keyword (sem default) MACRO MACTUK &VAL=,&NUM= 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 . . MACTUK VAL=99 . . MACTUK . . END &TA &TA Esta chamada causaria erro de montagem, pois VAL não foi especificado Esta chamada causaria erro de montagem, pois NUM não foi especificado Esta chamada causaria erro de montagem pois não foram especificados parâmetros 154 154 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 5-9-9 Macro com símbolo variável e com 2 parâmetros keyword (com default) MACRO MACTOO &VAL=19,&NUM=54 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 &TOO &TOO 155 155 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI A P E N D I C E S APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE APÊNDICE A B C D E F G H I J K L M N O P Q R - INSTRUÇÕES DE MÁQUINA TABELA DE POTÊNCIAS TABELA DE CARACTERES EBCDIC TABELA DE CARACTERES ASCII CARACTERES DE CONTROLE (Impressão) INTERRUPÇÕES POR ERRO DE PROGRAMA TRUQUES ÚTEIS A PROGRAMAS ASSEMBLER ALGUMAS MACROS MVS EXEMPLO DE PROGRAMA EM MVS ALGUMAS MACROS VSE EXEMPLO DE PROGRAMA EM VSE ALGUMAS MACROS VM EXEMPLO DE PROGRAMA EM VM MACROS XEGUEI E TCHAU EXEMPLO 1 DE SUBROTINA EXEMPLO 2 DE SUBROTINA MONTAGEM DE PROGRAMA DE DEMONSTRAÇÃO 1 MONTAGEM DE PROGRAMA DE DEMONSTRAÇÃO 2 156 156 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 157 157 APÊNDICE A - Instruções (ordem alfabética de mnemônico e ordem código de instrução) 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) b) c) d) e) código mnemônico Assembler. código de operação tipo de instrução posicionamento do Condition Code (se tiver S, a instrução o posiciona) 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 00 02 03 08 09 52 53 61 62 63 64 65 66 71 72 73 74 75 76 77 81 84 85 9C 9D 9E 9F Tipo CC PF/IPQ ------------------------------------------------------------------------------------------------------------- - ------------------------------------------------------- Mnemônico -----PR UPT ----------SPM BALR BCTR BCR ----------SVC BSM BASSM BASR MVCL CLCL LPR LNR LTR LCR NR CLR OR XR LR CR Cod.Instr 00 0101 0102 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 Tipo ----E E --------RR RR RR RR --------RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR CC PF/IPQ S S - --Q I ----- - ----- S S S S S S S S S S I I S ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 158 158 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO --------Mnemônico ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Cod.Instr A0 A1 A2 A3 A7 A8 A9 AA AB B0 B3 B4 B5 B8 B9 BC C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D8 E0 E1 E2 E3 E6 E7 E9 EA EB EC ED EE EF F4 Tipo CC PF/IPQ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ------------------------------------------------------------------------------------------------- Mnemônico AR SR MR DR ALR SLR LPDR LNDR LTDR LCDR HDR LRDR MXR MXDR LDR CDR ADR SDR MDR DDR AWR SWR LPER LNER LTER LCER HER LRER AXR SXR LER CER AER SER MER DER AUR SUR STH LA STC IC EX BAL BCT BC LH CH Cod.Instr 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 Tipo RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RR RX RX RX RX RX RX RX RX RX RX CC PF/IPQ S S S S S S S S S S S S S S S S S S S S S S S S S PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF PF ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 159 159 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO --------Mnemônico Cod.Instr -------------------------A AD ADR AE AER AH AL ALR AP AR AU AUR AW AWR AXR BAKR BAL BALR BAS BASR BASSM BC BCR BCT BCTR BSM BXH BXLE C CD CDR CDS CE CER CFC CH CL CLC CLCL CLI CLM CLR CP F5 F6 F7 FE FF 5A 6A 2A 7A 3A 4A 5E 1E FA 1A 7E 3E 6E 2E 36 B240 45 05 4D 0D 0C 47 07 46 06 0B 86 87 59 69 29 BB 79 39 B21A 49 55 D5 0F 95 BD 15 F9 Tipo --------------------RX RX RR RX RR RX RX RR SSt1t2 RR RX RR RX RR RR RRE RX RR RX RR RR RX RR RX RR RR RS RS RX RX RR RS RX RR S RX RX SS/L RR SI RS RR SSt1t2 CC PF/IPQ S S S S S S S S S S S S S S S ----------- S S S S S S S S S S S S S S S PF PF PF PF PF PF PF PF PF Q PF PF PF PF Mnemônico AH SH MH BAS CVD CVB ST LAE ----------N CL O X L C A S M D AL SL STD ------------------------------MXD LD CD AD SD MD DD AW SW STE ----------------------------------LE CE Cod.Instr 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 Tipo RX RX RX RX RX RX RX RX --------RX RX RX RX RX RX RX RX RX RX RX RX RX ------------------------RX RX RX RX RX RX RX RX RX RX ------------------------RX RX CC PF/IPQ S S S S S S S S S S S S S S S S S --- ----- ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 160 160 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO --------Mnemônico CPYA CR CS CSCH CVB CVD D DD DDR DE DER Diagnose DP DR DXR EAR ED EDMK EPAR EREG ESAR ESTA EX HDR HER HSCH IAC IC ICM IPK IPM IPTE ISKE IVSK L LA LAE LAM LASP LCDR LCER LCR LCTL LD LDR LE LER LH Cod.Instr B24D 19 BA B230 4F 4E 5D 6D 2D 7D 3D 83 FD 1D B22D B24F DE DF B226 B249 B227 B24A 44 24 34 B231 B224 43 BF B20B B222 B221 B229 B223 58 41 51 9A E500 23 33 13 B7 68 28 78 38 48 Tipo RRE RR RS S RX RX RX RX RR RX RR SSt1t2 RR RRE RRE SS/L SS/L RRE RRE RRE RRE RX RR RR S RRE RX RS S RRE RRE RRE RRE RX RX RX RS SSE RR RR RR RS RX RR RX RR RX CC S S S (2) PF/IPQ P PF PF PF PF PF S S S Q Q Q Q S S PF PF P Q S Q P P Q S S S S P PF PF P PF PF PF PF Mnemônico AE SE ME DE AU SU SSM -----LPSW Diagnose ----------BXH BXLE SRL SLL SRA SLA SRDL SLDL SRDA SLDA STM TM MVI TS NI CLI OI XI LM TRACE LAM STAM ----------------------------------------VAE VSE VME VDE VMAE VMSE Cod.Instr 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A400 A401 A402 A403 A404 A405 Tipo RX RX RX RX RX RX S ----S --------RS RS RS RS RS RS RS RS RS RS RS SI SI S SI SI SI SI RS RS RS RS --------------------------------VST VST VST VST VST VST CC S S S S (1) (2) - S S PF/IPQ PF PF PF PF PF PF P --P ----- P S S S S S S S S P - ----------------- ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 161 161 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO--------Mnemônico Cod.Instr LM LNDR LNER LNR LPDR LPER LPR LPSW LR LRA LRDR LRER LTDR LTER LTR LURA M MC MD MDR ME MER MH MP MR MSCH MSTA MVC MVCDK MVCIN MVCK MVCL MVCP MVCS MVCSK MVI MVN MVO MVZ MXD MXDR MXR N NC NI NR O OC 98 21 31 11 20 30 10 82 18 B1 25 35 22 32 12 B24B 5C AF 6C 2C 7C 3C 4C FC 1C B232 B247 D2 E50F E8 D9 0E DA DB E50E 92 D1 F1 D3 67 27 26 54 D4 94 14 56 D6 Tipo RS RR RR RR RR RR RR S RR RX RR RR RR RR RR RRE RX SI RX RR RX RR RX SSt1t2 RR S RRE SS/L SSE SS/L SSr1r2 RR SSr1r2 SSr1r2 SSE SI SS/L SSt1t2 SS/L RX RR RR RX SS/L SI RR RX SS/L CC PF/IPQ S S S S S S PF PF S P PF PF PF PF PF PF P (1) S S S P PF PF PF PF S P Q Q S S S S S S S S S S Q I Q Q Q PF PF PF Mnemônico Cod.Instr VMCE VACE VCE VL VLE VLM VLME VLY VLYE VST VSTE VSTM VSTME VSTK VSTKE VAD VSD VMD VDD VMAD VMSD VMCD VACD VCD VLD VLMD VLYD VSTD VSTMD VSTKD VA VS VM VN VO VX VC VLH VLINT VSTH VAES VSES VMES VDES VMAES VMSES VCES VADS A406 A407 A408 A409 A409 A40A A40A A40B A40B A40D A40D A40E A40E A40F A40F A410 A411 A412 A413 A414 A415 A416 A417 A418 A419 A41A A41B A41D A41E A41F A420 A421 A422 A424 A425 A426 A428 A429 A42A A42D A480 A481 A482 A483 A484 A485 A488 A490 Tipo VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST QST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST VST QST QST QST QST QST QST QST QST CC PF/IPQ ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 162 162 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO --------Mnemônico OI OR PACK PALB PC PR PT PTLB RCHP RRBE RSCH S SAC SAL SAR SCHM SCK SCKC SD SDR SE SER SH SIE SIGP SL SLA SLDA SLDL SLL SLR SP SPKA SPM SPT SPX SR SRA SRDA SRDL SRL SRP SSAR SSCH SSKE SSM ST STAM Cod.Instr 96 16 F2 B248 B218 0101 B228 B20D B23B B22A B238 5B B219 B237 B24E B23C B204 B206 6B 2B 7B 3B 4B B214 AE 5F 8B 8F 8D 89 1F FB B20A 04 B208 B210 1B 8A 8E 8C 88 F0 B225 B233 B22B 80 50 9B Tipo SI RR SSt1t2 RRE S E RRE S S RRE S RX S S RRE S S S RX RR RX RR RX S RS RX RS RS RS RS RR SSt1t2 S RR S S RR RS RS RS RS SSt1i3 RRE S RRE S RX RS CC PF/IPQ S S S S S S S S S S S S S S S S S S S S S S S S P Q Q Q P P P P Q P P P P PF PF PF PF IP P Q P P P Q P P P Mnemônico Cod.Instr VSDS VMDS VDDS VMADS VMSDS VCDS VAS VSS VMS VNS VOS VXS VCS VAER VSER VMER VDER VMCER VACER VCER VLER VLR VLMER VLMR VLZER VLZR VADR VSDR VMDR VDDR VMCDR VACDR VCDR VLDR VLMDR VLZDR VAR VSR VMR VNR VOR VXR VCR VLPER VLNER VLCER VLPDR VLNDR A491 A492 A493 A494 A495 A498 A4A0 A4A1 A4A2 A4A4 A4A5 A4A6 A4A8 A500 A501 A502 A503 A506 A507 A508 A509 A509 A50A A50A A50B A50B A510 A511 A512 A513 A516 A517 A518 A519 A51A A51B A520 A521 A522 A524 A525 A526 A528 A540 A541 A542 A550 A551 Tipo QST QST QST QST QST QST QST QST QST QST QST QST QST VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV CC VV PF/IPQ ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 163 163 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO --------Mnemônico Cod.Instr STAP STC STCK STCKC STCM STCPS STCRW STCTL STD STE STH STIDP STM STNSM STOSM STPT STPX STSCH STURA SU SUR SVC SW SWR SXR TAR TB TM TPI TPROT TR TRACE TRT TS TSCH UNPK UPT VA VACD VACDR VACE VACER VACRS VACSV VAD VADQ VADR VADS B212 42 B205 B207 BE B23A B239 B6 60 70 40 B202 90 AC AD B209 B211 B234 B246 7F 3F 0A 6F 2F 37 B24C B22C 91 B236 E501 DC 99 DD 93 B235 F3 0102 A420 A417 A517 A407 A507 A6CB A6CA A410 A590 A510 A490 Tipo S RX S S RS S S RS RX RX RX S RS S S S S S RRE RX RR RR RX RR RR RRE RRE SI S SSE SS/L RS SS/L S S SSt1t2 E VST VST VV VST VV S S VST QV VV QST CC S S PF/IPQ Mnemônico Cod.Instr P VLCDR VLPR VLNR VLCR VAEQ VSEQ VMEQ VDEQ VMAEQ VMSEQ VCEQ VLEQ VLMEQ VADQ VSSDQ VMDQ VDDQ VMADQ VMSDQ VCDQ VLDQ VLMDQ VAQ VSQ VMQ VNQ VOQ VXQ VCQ VLQ VLMQ VMXSE VMNSE VMXAE VLELE VXELE VMXSD VMNSD VMXAD VLELD VXELD VSPSD VZPSD VLEL VXEL VTVM VCVM VCZVM A552 A560 A561 A562 A580 A581 A582 A583 A584 A585 A588 A589 A58A A590 A591 A592 A593 A594 A595 A596 A599 A59A A5A0 A5A1 A5A2 A5A4 A5A5 A5A6 A5A8 A5A9 A5AA A600 A601 A602 A608 A609 A610 A611 A612 A618 A619 A61A A61B A628 A629 A640 A641 A642 P P P P PF PF P S S S S S S S S S S S S S S P P P P P P PF PF PF PF PF Q P P P P P S P P Tipo VV VV VV VV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV QV VR VR VR VR VR VR VR VR VR VR VR VR VR VR RRE RRE RRE CC S PF/IPQ ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 164 164 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO --------Mnemônico Cod.Instr VAE VAEQ VAER VAES VAQ VAR VAS VC VCD VCDQ VCDR VCDS VCE VCEQ VCER VCES VCOVM VCQ VCR VCS VCVM VCZVM VDD VDDQ VDDR VDDS VDE VDEQ VDER VDES VL VLBIX VLCDR VLCER VLCR VLCVM VLD VLDQ VLDR VLE VLEL VLELD VLELE VLEQ VLER VLH VLI VLID A400 A580 A500 A480 A5A0 A520 A4A0 A428 A418 A596 A518 A498 A408 A588 A508 A488 A643 A5A8 A528 A4A8 A641 A642 A413 A593 A513 A493 A403 A583 A503 A483 A409 E428 A552 A542 A562 A681 A419 A599 A519 A409 A628 A618 A608 A589 A509 A429 E400 E410 Tipo VST QV VV QST QV VV QST VST VST QV VV QST VST QV VV QST RRE QV VV QST RRE RRE VST QV VV QST VST QV VV QST VST RSE VV VV VV VS VST QV VV VST VR VR VR QV VV VST RSE RSE CC S S S PF/IPQ Mnemônico VCOVM VXVC VLVCU VXVMM VRRS VRSVC VRSV VLVM VLCVM VSTVM VNVM VOVM VXVM VSRSV VMRSV VSRRS VMRRS VLVCA VRCL VSVMM VSTVP VACSV VACRS -------------------------STNSM STOSM SIGP MC -----LRA STIDP SCK STCK SCKC STCKC SPT STPT SPKA PK PTLB SPX STPX STAP SIE Cod.Instr A643 A644 A645 A646 A648 A649 A64A A680 A681 A682 A684 A685 A686 A6C0 A6C1 A6C2 A6C3 A6C4 A6C5 A6C6 A6C8 A6CA A6CB A7 A8 A9 AA AB AC AD AE AF B0 B1 B202 B204 B205 B206 B207 B208 B209 B20A B20B B20D B210 B211 B212 B214 Tipo RRE RRE RRE RRE RRE RRE RRE VS VS VS VS VS VS S S S S S S S S S S --------------------SI SI RS SI ----RX S S S S S S S S S S S S S S CC PF/IPQ S S S S S S S P P ----------P P P --P P P P P P P Q Q P P P P IP ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 165 165 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO --------Mnemônico Cod.Instr VLIE VLINT VLM VLMD VLMDQ VLMDR VLME VLMEQ VLMER VLMQ VLMR VLNDR VLNER VLNR VLPDR VLPER VLPR VLQ VLR VLVCA VLVCU VLVM VLY VLYD VLYE VLZDR VLZER VLZR VM VMAD VMADQ VMADS VMAE VMAEQ VMAES VMCD VMCDR VMCE VMCER VMD VMDQ VMDR VMDS VME VMEQ VMER VMES VMNSD E400 A42A A40A A41A A59A A51A A40A A58A A50A A5AA A50A A551 A541 A561 A550 A540 A560 A5A9 A509 A6C4 A645 A680 A40B A41B A40B A51B A50B A50B A422 A414 A594 A494 A404 A584 A484 A416 A516 A406 A506 A412 A592 A512 A492 A402 A582 A502 A482 A611 Tipo RSE VST VST VST QV VV VST QV VV QV VV VV VV VV VV VV VV QV VV S RRE VS VST VST VST VV VV VV VST VST QV QST VST QV QST QST VV VST VV VST QV VV QST VST QV VV QST VR CC S S PF/IPQ Mnemônico PC SAC CFC IPTE IPM IVSK IAC SSAR EPAR ESAR PT ISKE RRBE SSKE TB DXR CSCH HSCH MSCH SSCH STSCH TSCH TPI SAL RSCH STCRW STCPS RCHP SCHM BAKR STURA MSTA PALB EREG ESTA LURA TAR CPYA SAR EAR ---------------STCTL LCTL ----------CS Cod.Instr B218 B219 B21A B221 B222 B223 B224 B225 B226 B227 B228 B229 B22A B22B B22C B22D B230 B231 B232 B233 B234 B235 B236 B237 B238 B239 B23A B23B B23C B240 B246 B247 B248 B249 B24A B24B B24C B24D B24E B24F B3 B4 B5 B6 B7 B8 B9 BA Tipo S S S RRE RRE RRE RRE RRE RRE RRE RRE RRE RRE RRE RRE RRE S S S S S S S S S S S S S RRE RRE RRE RRE RRE RRE RRE RRE RRE RRE RRE ------------RS RS --------RS CC S S S S S S S S S S S S S S S S S PF/IPQ Q Q I P Q Q Q Q Q Q P P P P PF P P P P P P P P P P P P P Q P Q P Q Q P Q ------P P ----- ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 166 166 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO --------Mnemônico Cod.Instr VMNSE VMQ VMR VMRRS VMRSV VMS VMSD VMSDQ VMSDS VMSE VMSEQ VMSES VMXAD VMXAE VMXSD VMXSE VN VNQ VNR VNS VNVM VO VOQ VOR VOS VOVM VRCL VRRS VRSV VRSVC VS VSD VSDQ VSDR VSDS VSE VSEQ VSER VSES VSLL VSPSD VSQ VSR VSRL VSRRS VSRSV VSS VST A601 A5A2 A522 A6C3 A6C1 A4A2 A415 A595 A495 A405 A585 A485 A612 A602 A610 A600 A424 A5A4 A524 A4A4 A684 A425 A5A5 A525 A4A5 A685 A6C5 A648 A64A A649 A421 A411 A591 A511 A491 A401 A581 A501 A481 E425 A61A A5A1 A521 E424 A6C2 A6C0 A4A1 A40D Tipo VR QV VV S S QST VST QV QST VST QV QST VR VR VR VR VST QV VV QST VS VST QV VV QST VS S RRE RRE RRE VST VST QV VV QST VST QV VV QST RSE VR QV VV RSE S S QST VST CC PF/IPQ Mnemônico CDS -----CLM STCM ICM -------------------------------------------------------------------------------------MVN MVC MVZ NC CLC OC XC -----MVCK MVCP MVCS TR TRT ED EDMK --------------------VLI VLIE VSTI VSTIE VLID VSTID VSRL Cod.Instr Tipo BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E400 E400 E401 E401 E410 E411 E424 RS ----RS RS RS --------------------------------------------------------------------SS/L SS/L SS/L SS/L SS/L SS/L SS/L ----SSr1r2 SSr1r2 SSr1r2 SS/L SS/L SS/L SS/L ----------------RSE RSE RSE RSE RSE RSE RSE CC PF/IPQ S S --- S - ----------------------------------- S S S S S S S --Q Q Q S S S - --------- ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 167 167 ----- ORDEM ALFABÉTICA MNEMÔNICO -----*----- ORDEM CÓDIGO INSTRUÇÃO --------Mnemônico Cod.Instr VSTD VSTE VSTH VSTI VSTID VSTIE VSTK VSTKD VSTKE VSTM VSTMD VSTME VSTVM VSTVP VSVMM VTVM VX VXEL VXELD VXELE VXQ VXR VXS VXVC VXVM VXVMM VZPSD X XC XI XR ZAP A41D A40D A42D E401 E411 E401 A40F A41F A40F A40E A41E A40E A682 A6C8 A6C6 A640 A426 A629 A619 A609 A5A6 A526 A4A6 A644 A686 A646 A61B 57 D7 97 17 F8 Tipo VST VST VST RSE RSE RSE VST VST VST VST VST VST VS S S RRE VST VR VR VR QV VV QST RRE VS RRE VR RX SS/L SI RR SSt1t2 CC S S S S S PF/IPQ Mnemônico VSLL VLBIX LASP TPROT MVCSK MVCDK ----------MVCIN -----------------------------------SRP MVO PACK UNPK --------------------ZAP CP AP SP MP DP ----------- Cod.Instr Tipo E425 E428 E500 E501 E50E E50F E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF RSE RSE SSE SSE SSE SSE --------SS/L ----------------------------SSt1I3 SSt1t2 SSt1t2 SSt1t2 ----------------SSt1t2 SSt1t2 SSt1t2 SSt1t2 SSt1t2 SSt1t2 --------- CC S S S - PF/IPQ P P Q Q ----- S --------------- S S S S --------- - ----- ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 168 168 APÊNDICE B - Tabelas de potências de 2 e 16 POTÊNCIAS DE 2 E DE 16 16**00 = 2**00 2**01 2**02 2**03 16**01 = 2**04 2**05 2**06 2**07 16**02 = 2**08 2**09 2**10 2**11 16**03 = 2**12 2**13 2**14 2**15 16**04 = 2**16 2**17 2**18 2**19 16**05 = 2**20 2**21 2**22 2**23 16**06 = 2**24 2**25 2**26 2**27 16**07 = 2**28 2**29 2**30 2**31 1K = 1024 = 1 = 2 = 4 = 8 = 16 = 32 = 64 = 128 = 256 = 512 = 1.024 = 2.048 = 4.096 = 8.192 = 16.384 = 32.768 = 65.536 = 131.072 = 262.144 = 524.288 = 1.048.576 = 2.097.152 = 4.194.304 = 8.388.608 = 16.777.216 = 33.554.432 = 67.108.864 = 134.217.728 = 268.435.456 = 536.870.912 = 1.073.741.824 = 2.147.483.648 1M = 1.048.576 16**08 = 2**32 2**33 2**34 2**35 16**09 = 2**36 2**37 2**38 2**39 16**10 = 2**40 2**41 2**42 2**43 16**11 = 2**44 2**45 2**46 2**47 16**12 = 2**48 2**49 2**50 2**51 16**13 = 2**52 2**53 2**54 2**55 16**14 = 2**56 2**57 2**58 2**59 16**15 = 2**60 2**61 2**62 16**00 = 2**63 1G = 1.073.741.824 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 4.294.967.296 8.589.934.592 17.179.869.184 34.359.738.368 68.719.476.736 137.438.953.472 274.877.906.944 549.755.813.888 1.099.511.627.776 2.199.023.255.552 4.398.046.511.104 8.796.093.022.208 17.592.186.044.416 35.184.372.088.832 70.368.744.177.664 140.737.488.355.328 281.474.976.710.656 562.949.953.421.312 1.125.899.906.842.624 2.251.799.813.685.248 4.503.599.627.370.496 9.007.199.254.740.992 18.014.398.509.481.984 36.028.797.018.963.968 72.057.594.037.927.936 144.115.188.075.855.872 288.230.376.151.711.744 576.460.752.303.423.488 1.152.921.504.606.846.976 2.305.843.009.213.693.952 4.611.686.018.427.387.904 9.223.372.036.854.775.808 1T = 1.099.511.627.776 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 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240 0 256 512 768 1.024 1.280 1.536 1.792 2.048 2.304 2.560 2.816 3.072 3.328 3.584 3.840 0 4.096 8.192 12.288 16.384 20.480 24.576 28.672 32.768 36.864 40.960 45.056 49.152 53.248 57.344 61.440 POTÊNCIA 4 POTÊNCIA 5 POTÊNCIA 6 POTÊNCIA 7 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 0 65.536 131.072 196.608 262.144 327.680 393.216 458.752 524.288 589.824 655.360 720.896 786.432 851.968 917.504 983.040 0 1.048.576 2.097.152 3.145.728 4.194.304 5.242.880 6.291.456 7.340.032 8.388.608 9.437.184 10.485.760 11.534.336 12.582.912 13.631.488 14.680.064 15.728.640 0 16.777.216 33.554.432 50.331.648 67.108.864 83.886.080 100.663.296 117.440.512 134.217.728 150.994.944 167.772.160 184.549.376 201.326.592 218.103.808 234.881.024 251.658.240 0 268.435.456 536.870.912 805.306.368 1.073.741.824 1.342.177.280 1.610.612.736 1.879.048.192 2.147.483.648 2.415.919.104 2.684.354.560 2.952.790.016 3.221.225.472 3.489.660.928 3.758.096.384 4.026.531.840 169 169 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 170 170 APÊNDICE C - Caracteres EBCDIC HEX CARAC- HEX CARATER HEX 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F Espaço 70 71 72 73 74 75 76 77 78 79 7A . ponto 7B < menor 7C ( abre arênteses 7D + mais 7E | barra vertical 7F & E comercial 80 81 82 83 84 85 86 87 88 89 ! exclamação 8A $ cifrão 8B * asterisco 8C ) fecha parênteses 8D ; ponto e vírgula 8E not 8F CARATER HEX CARATER HEX CARATER HEX C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF { abre chave A B C D E F G H I F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF TER 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F CARACTER - hífen / barra 90 91 92 93 94 95 96 97 98 99 9A , virgula 9B % percentual 9C _ underscore 9D > maior 9E ? interrogação 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 : 2 pontos AA # número AB @ arroba AC ' apostrofe AD = igual AE " aspas AF B0 a B1 b B2 c B3 d B4 e B5 f B6 g B7 h B8 B9 BA BB BC BD BE BF i j k l m n o p q r s t u v w x y z } fecha chave J K L M N O P Q R \ barra invertida S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 171 171 APÊNDICE D - Caracteres ASCII HEX CARAC-TER HEX 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F Espaço 50 ! exclamação 51 " aspas 52 # número 53 $ cifrão 54 % percentual 55 & E comercial 56 ' apostrofe 57 ( abre arênteses 58 ) fecha 59 parênteses * asterisco 5A + mais 5B , virgula 5C - hífen 5D . ponto 5E / barra 5F CARATER HEX CARATER HEX 0 1 2 3 4 5 6 7 8 9 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 9A 9B 9C _ underscore 9D > maior 9E ? interrogação 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 : 2 pontos AA AB @ arroba AC AD = igual AE AF B0 a B1 b B2 c B3 d B4 e B5 f B6 g B7 h B8 B9 8A 8B 8C 8D 8E 8F BA BB BC BD BE BF CARATER HEX CARATER HEX C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 { abre chave A B C D E F G H I F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF CARACTER 2A 2B 2C 2D 2E 2F < menor | barra vertical ; ponto e vírgula not i j k l m n o p q r s t u v w x y z EA EB EC ED EE EF } fecha chave J K L M N O P Q R \ barra invertida S T U V W X Y Z ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 172 172 APÊNDICE E – Caracteres de controle de impressão HEXA---SIGNIFICADO------------------------------CARACTERES DE MÁQUINA-------01 09 11 19 89 91 99 A1 A9 B1 B9 C1 C9 D1 D9 E1 0B 13 1B 8B 93 9B A3 AB B3 BB C3 CB D3 DB E3 Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Imprime na linha em que Salta 1 linha Salta 2 linhas Salta 3 linhas Salta para o canal 1 Salta para o canal 2 Salta para o canal 3 Salta para o canal 4 Salta para o canal 5 Salta para o canal 6 Salta para o canal 7 Salta para o canal 8 Salta para o canal 9 Salta para o canal 10 Salta para o canal 11 Salta para o canal 12 estiver estiver estiver estiver estiver estiver estiver estiver estiver estiver estiver estiver estiver estiver estiver estiver posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, posicionado, e fica depois depois depois depois depois depois depois depois depois depois depois depois depois depois depois posicionado nela salta 1 linha salta 2 linhas salta 3 linhas salta para o canal salta para o canal salta para o canal salta para o canal salta para o canal salta para o canal salta para o canal salta para o canal salta para o canal salta para o canal salta para o canal salta para o canal 1 2 3 4 5 6 7 8 9 10 11 12 ----HEXA----SIGNIFICADO-----------------------------CARACTERES ASA----------0 + 1 2 3 4 5 6 7 8 9 A B C 40 F0 60 4E F1 F2 F3 F4 F5 F6 F7 F8 F9 C1 C2 C3 Salta 1 linha, imprime, e fica posicionado na linha impressa Salta 2 linhas, imprime, e fica posicionado na linha impressa Salta 3 linhas, imprime, e fica posicionado na linha impressa Imprime na linha em que estiver posicionado e continua nela Salta para o canal 1, imprime, e fica posicionado na linha impressa Salta para o canal 2, imprime, e fica posicionado na linha impressa Salta para o canal 3, imprime, e fica posicionado na linha impressa Salta para o canal 4, imprime, e fica posicionado na linha impressa Salta para o canal 5, imprime, e fica posicionado na linha impressa Salta para o canal 6, imprime, e fica posicionado na linha impressa Salta para o canal 7, imprime, e fica posicionado na linha impressa Salta para o canal 8, imprime, e fica posicionado na linha impressa Salta para o canal 9, imprime, e fica posicionado na linha impressa Salta para o canal 10, imprime, e fica posicionado na linha impressa Salta para o canal 11, imprime, e fica posicionado na linha impressa Salta para o canal 12, imprime, e fica posicionado na linha impressa ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 173 173 APÊNDICE F - 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 174 174 APÊNDICE G - Truques úteis a programas Assembler a) Para zerar o primeiro byte à esquerda de um registrador: LA LA LA 5,0(5) ou 5,0(,5) ou 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 ZAP CPO,CPO ou CPO,=P'0' e) Para multiplicar o número contido num registrador : multiplicação por 2 : multiplicação por 4 : multiplicação por 8 : etc ... SLL SLL SLL 5,1 5,2 5,3 f) Para dividir o número contido num registrador : divisão por 2 : divisão por 4 : divisão por 8 : etc ... SRL SRL SRL 5,1 5,2 5,3 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 XC XC A,B B,A A,B ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 175 175 i) Para movimentar um caracter qualquer para todas as posições de um campo: MVI MVC CAMPO,C' ' CAMPO+1(L'CAMPO-1),CAMPO j) Para transformar um NOP em branch: ABC NOP OI DESV ABC+1,X'F0' k) Para transformar um branch em NOP : ABC B . . . NI DESV ABC+1,X'0F' l) Para subtrair 1 de um registrador : BCTR 5,0 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI APÊNDICE H – Exemplos de 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 DDNAME=xxxxxxx DSORG=PS EODAD=simbolo MACRF={PM/GM} RECFM=FB[A/M] DCB Exemplos: GET PUT OPEN OPEN OPEN CLOSE CLOSE OPEN CLOSE DISCO,ARLEIT DISKSAI,ARGRAV (DISCO,(INPUT)) (DISCO) (DISCO,,DISKSAI,(OUTPUT) (DISCO) (DISCO,,DISKSAI) (RELAT,(OUTPUT) (RELAT) DISCO DCB DDNAME=DDENTRA,DSORG=PS,EODAD=FIMFILE,MACRF=(GM),RECFM=FB DISKSAI DCB DDNAME=DDSAI,DSORG=PS,MACRF=(PM),RECFM=FB RELAT DCB DDNAME=DDREL,DSORG=PS,MACRF=(PM),RECFM=FBA 176 176 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI APÊNDICE I - 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 PGM MOVEPARM MVC PARMTXT(0),2(1) MOVE O PARM PARA AREA DO PGM SAVE DC 18F'0' SAVE AREA DO PROGRAMA PARMTXT DC CL100' ' AREA PARA O PARM PARMLEN 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 LER FIMINP 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 CL50 WSAI DS CL50 ENTRA DCB DDNAME=DDENTRA,DSORG=PS,EODAD=FIMINP,MACRF=(GM),RECFM=FB SAI DCB DDNAME=DDSAI,DSORG=PS,MACRF=(PM),RECFM=FB END 177 177 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 178 178 APÊNDICE J – Exemplos de 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 PUT OPEN OPEN CLOSE CLOSE OPEN CLOSE DISCO DISCO,ARLEIT DISKSAI,ARGRAV DISCO DISCO,DISKSAI DISCO DISCO,DISKSAI RELAT RELAT DTFSD EOFADDR=FIMFILE,TYPEFLE=INPUT,RECFORM=FIXBLK,RECSIZE=50, BLKSIZE=5000,IOAREA1=BUFIN,WORKA=YES DISKSAI DTFSD TYPEFLE=OUTPUT,RECFORM=FIXBLK,RECSIZE=50,BLKSIZE=5000, IOAREA1=BUFOUT,WORKA=YES RELAT DTFPR DEVADDR=SYSLST,RECFORM=FIXUNB,RECSIZE=133,BLKSIZE=133, CTLCHR=ASA,IOAREA1=BUFPR,WORKA=YES X X X ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 179 179 APÊNDICE K - 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,SAI LER GET ENTRA,WENTRA MVC WSAI,WENTRA PUT SAI,WSAI B LER FIMINP CLOSE ENTRA,SAI *-------------------------------------------------------TERMINAR EQU * EOJ *-------------------------------------------------------WENTRA DS CL50 WSAI DS CL50 ENTRA DTFSD EOFADDR=FIMINP,TYPEFLE=INPUT,RECFORM=FIXBLK,RECSIZE=50, BLKSIZE=5000,IOAREA1=BUFIN,WORKA=YES DISKSAI DTFSD TYPEFLE=OUTPUT,RECFORM=FIXBLK,RECSIZE=50,BLKSIZE=5000, IOAREA1=BUFOUT,WORKA=YES LTORG BUFIN DS CL5000 BUFOUT DS CL5008 END X X ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 180 180 APÊNDICE L – Exemplo de 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 181 181 APÊNDICE M - 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, BSIZE=50,FORM=E MVC WSAI,WENTRA FSWRITE 'SAIDA DADOS A',BUFFER=WSAI,BSIZE=50,RECFM=F B LE MAYBEFIM 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 2 FINAL 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 CL50 WSAI DS CL50 SAVE DC 18F'0' END X ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI APÊNDICE N - 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 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 182 182 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 183 183 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 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 SAVEAREA PARMTEXT DC CL100' ' MINHA AREA PARA O PARM PARMLEN@ 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 184 184 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 185 185 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI APÊNDICE O - 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 SAIROT4 ISZONADO 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),W SAIROT EQU * L 13,4(13) LM 14,12,12(13) SR 15,15 BR 14 SAIROT4 EQU * L 13,4(13) LM 14,12,12(13) LA 15,4 BR 14 TABNUM DC 240X'FF',10X'00'6X'FF' W DS CL2 SAVEROT DC 18F'0' END 186 186 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI APÊNDICE P - 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 187 187 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI * * * VOLTA SAIROT VOLTA4 VOLTA8 TABNUM TOTDW W L TM BO TRT BNZ PACK AP 11,12(9) 12(9),X'80' VOLTA 0(3,11),TABNUM VOLTA4 W,0(3,11) TOTDW,W R11 = ENDERECO PARM 4 L TM BZ TRT BNZ PACK AP 11,16(9) 16(9),X'80' VOLTA8 0(3,11),TABNUM VOLTA4 W,0(3,11) TOTDW,W R11 = ENDERECO PARM 5 EQU CVB ST MVC EQU L LM SR BR EQU L LM LA BR EQU L LM LA BR DC DS DS END * 8,TOTDW 8,TOTDW 0(4,11),TOTDW * 13,4(13) 14,12,12(13) 15,15 14 * 13,4(13) 14,12,12(13) 15,4 14 * 13,4(13) 14,12,12(13) 15,8 14 240X'FF',10X'00'6X'FF' D CL3 ESTE E' O ULTIMO PARAMETRO ESTE NAO E' O ULTIMO PARAMETRO 188 188 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI APÊNDICE Q - Montagem de programa de demonstração 1 SYMBOL TYPE ID ADDR LENGTH LD ID FLAGS PROGDEMO SD 0001 000000 000AF3 00 FORA ER 0002 Z LD 000844 0001 SUBROT ER 0003 EXTERNAL SYMBOL DICTIONARY 189 189 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE ADDR1 ADDR2 000000 IEV147 IEV167 *** ERROR *** *** ERROR *** 000000 C7C5D9C1C4D640D7 000011 C7C5D9C1C4D640D7 000022 C1D3C2C5D9E3D6 000029 C1D3C2C5D9E3D65C 000031 C1D3C2C5D9E3C9D5 190 190 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 *----------------------------------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 * SYMBOL TOO LONG, OR 1ST CHARACTER NOT A LETTER -REQUIRED NAME MISSING 00000 29 SIMBOLOPODESTER63CARACTERES EQU * 30 *----------------------------------31 * PRINT GEN/NOGEN 32 *----------------------------------33 * ESTA' COM O DEFAULT PRINT GEN 34 MYMAK 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 41+ DC C'GERADO PELA MYMAK' 42 *----------------------------------43 * PRINT DATA/NODATA 44 *----------------------------------45 * ESTA' COM O DEFAULT PRINT NODATA 46 DC CL7'ALBERTO' 47 DC CL8'ALBERTO*' 48 DC CL10'ALBERTINHO' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC 00003B 000042 00004A 000052 OBJECT CODE ADDR1 ADDR2 C1D3C2C5D9E3D6 C1D3C2C5D9E3D65C C1D3C2C5D9E3C9D5 C8D6 000054 C1D3C2C5D9E3D6 00005B C1D3C2C5D9E3D65C 000063 C1D3C2C5D9E3C9D5 000074 00001 00074 00074 00080 00004 000FF 000084 D203 A00B F007 0000B 00007 00084 00008A 5C5C5C5C5C5C5C5C 000092 00008C 00 00008D 000092 5C5C5C5C5C5C5C5C 00009A 000097 00 000098 0008C 00092 00097 0009A 191 191 STMT SOURCE STATEMENT 49 * VOU MUDAR PARA PRINT DATA 50 PRINT DATA 51 DC CL7'ALBERTO' 52 DC CL8'ALBERTO*' 53 DC CL10'ALBERTINHO' 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 * VOU RESTAURAR O DEFAULT PRINT NODATA DC CL7'ALBERTO' DC CL8'ALBERTO*' DC CL10'ALBERTINHO' *----------------------------------* PRINT ON/OFF *----------------------------------* ESTA' COM O DEFAULT PRINT ON *----------------------------------* ESTE STMT VAI SER IMPRESSO * DEPOIS DO STMT *++++++++++ * VAI TER * UM PRINT OFF * UM HIDE DS CL1 * UM DC A(HIDE) * E UM PRINT ON *++++++++++ PRINT OFF PRINT ON *----------------------------------* EQUATES *----------------------------------R1 EQU 1 LABEL EQU * DIVDENDO DS CL16 COCIENTE EQU DIVDENDO,12 RESTO EQU DIVDENDO+12,4,C'P' TAMRESTO EQU L'RESTO BYTEON EQU X'FF' MOVTRECO MVC 11(4,10),7(15) MOVCOISA EQU MOVTRECO *----------------------------------* ORG *----------------------------------CAMPO DC 8C'*' ORG CAMPO+2 DC X'00' ORG * . . OUTRORG DC 8C'*' ORG *-3 DC X'00' ORG ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE ADDR1 ADDR2 192 192 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',133 0001C0 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' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC 00034D 00044D 000450 OBJECT CODE ADDR1 ADDR2 0000000000000000 0000FF FFFFFF 000453 IEV068 *** ERROR *** 000453 0000000000000000 000553 000001 000556 010101 000559 IEV068 *** ERROR *** 000559 0000000000000001 000561 000000 000564 0000000000000001 00056C 0000000200000003 000574 0000000400000005 00057C 0000000600000007 000584 00000008 000588 000000090000000A 000590 0000000B0000000C 000598 0000000D0000000E 0005A0 IEV074 *** ERROR *** 0005A0 FFFFFFF9FFFFFFF8 0005A8 FFFFFFF7FFFFFFF6 0005B0 FFFFFFF5 0005B4 IEV068 *** ERROR *** 0005B4 000000000000000F 0005BC 0000000100020003 0005C4 0004000500060007 0005CC 0008 0005CE 0009000A000B000C 0005D6 000D000E 0005DA IEV074 *** ERROR *** 0005DA FFF9FFF8FFF7FFF6 0005E2 FFF5 STMT 143 144 145 146 147 148 149 LENGTH ERROR 150 151 152 153 154 155 156 LENGTH ERROR 157 158 193 193 SOURCE STATEMENT DC XL256'FF' DC XL3'FF' DC 3X'FF' *----------------------------------* DC TIPO B *----------------------------------DC BL257'1' -- L257'1' DC BL256'1' DC BL3'1' DC 3B'1' *----------------------------------* DC TIPO F *----------------------------------DC FL9'1' -- L9'1' DC FL8'1' PRINT DATA 159 DC F'0,1,2,3,4,5,6,7,8' 160 DC F'9,10,11,12,13,14' 161 DC F'-1,-2,-3,-4,-5,-6,' ILLEGAL SYNTAX IN EXPRESSION -- ' 162 DC F'-7,-8,-9,-10,-11' 163 164 165 166 167 LENGTH ERROR 168 169 170 171 PRINT NODATA *----------------------------------* DC TIPO H *----------------------------------DC HL9'15' -- L9'15' DC HL8'15' PRINT DATA DC H'0,1,2,3,4,5,6,7,8' DC H'9,10,11,12,13,14' 172 DC H'-1,-2,-3,-4,-5,-6,' ILLEGAL SYNTAX IN EXPRESSION -- ' 173 DC H'-7,-8,-9,-10,-11' 174 PRINT NODATA ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE ADDR1 ADDR2 0005E4 0000000041100000 0005EC 4120000041300000 0005F4 4140000041500000 0005FC 4160000041700000 000604 41800000 000608 4190000041A00000 000610 41B0000041C00000 000618 41D0000041E00000 000620 IEV074 *** ERROR *** 000620 C1700000C1800000 000628 C1900000C1A00000 000630 C1B00000 000634 00000000 000638 0000000000000000 000640 4110000000000000 000648 4120000000000000 000650 4130000000000000 000658 4140000000000000 000660 4150000000000000 000668 4160000000000000 000670 4170000000000000 000678 4180000000000000 000680 4190000000000000 000688 41A0000000000000 000690 41B0000000000000 000698 41C0000000000000 0006A0 41D0000000000000 0006A8 41E0000000000000 0006B0 IEV074 *** ERROR *** 0006B0 C170000000000000 0006B8 C180000000000000 0006C0 C190000000000000 0006C8 C1A0000000000000 0006D0 C1B0000000000000 194 194 STMT SOURCE STATEMENT 175 *----------------------------------176 * DC TIPO E 177 *----------------------------------178 PRINT DATA 179 DC E'0,1,2,3,4,5,6,7,8' 180 DC E'9,10,11,12,13,14' 181 DC E'-1,-2,-3,-4,-5,-6,' ILLEGAL SYNTAX IN EXPRESSION -- ' 182 DC E'-7,-8,-9,-10,-11' 183 PRINT NODATA 184 *----------------------------------185 * DC TIPO D 186 *----------------------------------187 PRINT DATA 188 DC D'0,1,2,3,4,5,6,7,8' 189 DC D'9,10,11,12,13,14' 190 DC D'-1,-2,-3,-4,-5,-6,' ILLEGAL SYNTAX IN EXPRESSION -- ' 191 DC D'-7,-8,-9,-10,-11' 192 PRINT NODATA 193 *----------------------------------194 * DC TIPO L 195 *----------------------------------196 PRINT DATA ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 195 195 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' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE 00082B 9C9C9C ADDR1 ADDR2 00082E IEV068 *** ERROR *** 00082E F0F0F0F0F0F0F0F0 00083E F0F0C9 000841 C9C9C9 000844 000848 00084C 000854 000858 00085C 000860 000864 000868 00086C 000870 000874 000878 000879 000881 000889 00088C 00000000 00000FFF00007D00 00001000 0000000F 00005C5C 0000085C 0000086C 0000084C 0000086C 00000004 8000084C 00 0001020304050607 FF00010203040506 000000 00000000 STMT 208 209 210 211 212 LENGTH ERROR 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 000890 00000000 000894 000894 000898 00089C 00089C 0008A0 47F0 389C 00000000 0089C 4110 38A4 47F0 38AC 008A4 008AC 008A4 0008A4 000008B2 0008A8 000008B5 0008AC 58F0 3898 0008B0 05EF 0008B2 00012C 0008B5 008AC 00898 196 196 SOURCE STATEMENT DC 3P'9' *----------------------------------* DC TIPO Z *----------------------------------DC ZL17'1' -- L17'1' DC ZL16'1' DC ZL3'9' DC 3Z'9' *----------------------------------* DC TIPO A / DC TIPO V / ENTRY/EXTR *----------------------------------Z DS CL4 A1 DC A(0) A2 DC A(4095,32000) A3 DC A(X'1000') A4 DC A(B'1111') A5 DC A(C'**') DC A(A5) DC A(A5+16) DC A(A5-16) DC A(*) DC A(L'A1) DC A(A2+X'80000000') A11 DC AL1(*-A11) A12 DC 8AL1(*-A12) A13 DC 8AL1(255+*-A13) 234 DC A(FORA) 235 EXTRN FORA 236 ENTRY Z 237 DC V(SUBROT) 238 CALL SUBROT,(ENTRA,SAI) 239+ CNOP 0,4 240+ B *+8 241+IHB0003B DC V(SUBROT) 242+ CNOP 0,4 243+ LA 1,IHB0004 244+ B IHB0004A 245+IHB0004 EQU * 246+ DC A(ENTRA) P 247+ DC A(SAI) 248+IHB0004A EQU * 249+ L 15,IHB0003B 250+ BALR 14,15 251 ENTRA DC PL3'12' 252 SAI DS CL400 253 *----------------------------------254 * DC TIPO Y 255 *----------------------------------- ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 197 197 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC 000A80 000A84 000A85 000A86 000A88 000A89 000A8C 000A90 000A91 000A98 000AA0 000AA1 000AA2 000AA4 000AA5 000AA6 000AA8 000AB0 000AB0 000AB1 000AB2 000AB8 000AC1 000AC2 000AC4 000AC9 000ACA 000ACA 000AD1 000AD2 000AD6 000AD9 000ADA 000ADC 000AE1 000AE2 OBJECT CODE FFFFFFFF ADDR1 ADDR2 00 FFFF 000000 00000000 00000000000000 0000000000000000 00 0000 00 3A68 00 070007000700 00 0700 00 00 07000700 00 0700 00 000AE2 000AE2 000AE4 000AE6 000AE8 IEV068 000AE8 IEV043 000AEE 000AF0 *** ERROR *** *** ERROR *** STMT 287 288 198 198 SOURCE STATEMENT DC 1F'-1' DS C 289 290 DC DS 1H'-1' C 291 292 DC DS 1A(0) C 293 294 DC DS 1D'0' C 295 296 DC DS 1Y(0) C 297 298 299 * CNOPS 300 301 DC DS 1S(AAALIN) C DS DS 0D C 302 303 CNOP DS 0,8 CL9 304 305 CNOP DS 4,8 CL5 306 307 CNOP DS 2,8 CL7 308 309 CNOP DS 6,8 CL3 310 311 CNOP DS 0,4 CL5 312 CNOP 2,4 313 *----------------------------------314 * DS 315 *----------------------------------316 DATA DS 0CL6 317 DIA DS CL2 318 MES DS CL2 319 ANO DS CL2 320 DS CL300000 LENGTH ERROR -- L300000 321 CAMPO DS 3CL2 PREVIOUSLY DEFINED SYMBOL -- CAMPO 322 DS C,P 323 DS X'0A0B0C' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 199 199 LOC OBJECT CODE ADDR1 ADDR2 STMT SOURCE STATEMENT 000AF3 324 DS CL300000 IEV068 *** ERROR *** LENGTH ERROR -- L300000 325 *----------------------------------326 END - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - POS.ID 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 REL.ID 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0002 0003 0003 FLAGS 0C 08 0C 0C 0C 0C 0C 0C 0C 04 04 04 04 04 04 04 04 04 0C 1C 1C ADDRESS 000070 0001B9 000860 000864 000868 00086C 000874 0008A4 0008A8 000A46 000A48 000A54 000A56 000A58 000A5A 000A5C 000A5E 000A60 00088C 000890 000898 RELOCATION DICTIONARY ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI SYMBOL LEN VALUE DEFN AAALIN 00001 000A68 0272 ANO 00002 000AE6 0319 ARIMP 00133 0001C0 0130 A1 00004 000848 0220 A11 00001 000878 0231 A12 00001 000879 0232 A13 00001 000881 0233 A2 00004 00084C 0221 A3 00004 000854 0222 A4 00004 000858 0223 A5 00004 00085C 0224 BYTE ****UNDEFINED**** BYTEON 00001 000000FF 0085 CAMPO 00001 00008A 0091 CAMPO 00001 00000000 0321 COCIENTE 00012 00000074 0082 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 ENTRA 00003 0008B2 0251 FORA 00001 00000000 0235 HIDE 00001 00006D 0073 IHB0003B 00004 000898 0241 IHB0004 00001 000008A4 0245 IHB0004A 00001 000008AC 0248 LABEL 00001 00000074 0080 MES 00002 000AE4 0318 MOVCOISA 00006 00000084 0087 MOVTRECO 00006 000084 0086 OUTRORG 00001 000092 0096 PGMCANAL 00008 0001B8 0129 PROGDEMO 00001 00000000 0013 RESTO 00004 00000080 0083 R1 00001 00000001 0079 SAI 00400 0008B5 0252 SIMBOLOPODESTER63CARACTERES 00001 00000000 0029 TABELA 00256 00009A 0101 TAMRESTO 00001 00000004 0084 Y2 00002 000A4A 0257 Y3 00002 000A4E 0258 Y4 00002 000A50 0259 Y5 00002 000A52 0260 Z 00004 000844 0219 REFERENCES 0297 CROSS REFERENCE 0129 0229 0231 0232 0233 0230 0225 0226 0227 0261 0262 0263 0285 0092 ****DUPLICATE**** 0256 0082 0083 0246 0234 0074 0249 0243 0244 0256 0087 0264 0265 0266 0267 0084 0247 0102 0104 0106 0108 0236 200 200 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 201 201 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI APÊNDICE R - Montagem de programa de demonstração 2 SYMBOL TYPE ID ADDR LENGTH REGSBASE SD 0001 000000 0050D5 LD ID FLAGS 00 EXTERNAL SYMBOL DICTIONARY 202 202 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE ADDR1 ADDR2 000000 00000 00000 00000 000000 001000 000000 000400 000410 00000 000420 000422 000424 00042C 3400 3410 400040165000502C 6000604270007058 000434 00043A 000440 000446 00044C D20F D215 D22B D241 D257 3400 4000 5000 6000 7000 3410 4016 502C 6042 7058 00400 01000 02000 03000 04000 00410 01016 0202C 03042 04058 STMT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 203 203 SOURCE STATEMENT *----------------------------------* 1 2 3 *23456789012345678901234567890123456 *----------------------------------*----------------------------------* ESTE PROGRAMA NAO PODE SER * EXECUTADO POIS NAO FUNCIONA. * SEU OBJETIVO E' DEMONSTRAR O FUN* CIONAMENTO DE REGISTRADORES BASE *----------------------------------REGSBASE START 0 USING *,3,4,5,6,7 * * AVISA QUE OS REGISTRADORES BASE * SERAO O 3, 4, 5, 6 E 7 * E QUE SEUS CONTEUDOS PRESUMIDOS * EM TEMPO DE EXECUCAO SERAO * R3 = 000000 * R4 = 001000 * R5 = 002000 * R6 = 003000 * R7 = 004000 *----------------------------------USING DSEQUIT,11 * * AVISA QUE OS CAMPOS DA DSECT TERAO * O REGISTRADOR 11 COMO BASE *----------------------------------*----------------------------------* ESTE PRIMEIRO BLOCO E SERVIDO PELO * REGISTRADOR BASE 3. ESTE BLOCO VAI * DO ENDERECO 000000 ATE O 000FFF *----------------------------------BLOCO1 EQU * DS CL4096 ORG BLOCO1 DS CL1024 A DS CL16 B DS CL16 * . . DC S(A) DC S(B) DC S(C,D,E,F) DC S(G,H,I,J) * . . MVC A,B MVC C,D MVC E,F MVC G,H MVC I,J ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE ADDR1 ADDR2 204 204 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE ADDR1 ADDR2 205 205 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 * . . ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE 0010F4 ADDR1 ADDR2 02000 02000 002000 003000 002000 00202C 002063 002064 00206A 002070 002076 00207C 02000 00 D20F D215 D22B D241 D257 3400 4000 5000 6000 7000 3410 4016 502C 6042 7058 00400 01000 02000 03000 04000 00410 01016 0202C 03042 04058 STMT 139 140 141 142 143 144 145 146 147 148 149 150 206 206 SOURCE STATEMENT ORG , *----------------------------------* ESTE TERCEIRO BLOCO E SERVIDO PELO * REGISTRADOR BASE 5. ESTE BLOCO VAI * DO ENDERECO 002000 ATE O 002FFF *----------------------------------BLOCO3 EQU * DS CL4096 ORG BLOCO3 E DS CL44 F DS CL55 * . . 151 MVC A,B 152 MVC C,D 153 MVC E,F 154 MVC G,H 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE ADDR1 ADDR2 03000 003000 004000 003000 003042 00308F 003090 003096 00309C 0030A2 0030A8 03000 00 D20F D215 D22B D241 D257 3400 4000 5000 6000 7000 3410 4016 502C 6042 7058 00400 01000 02000 03000 04000 00410 01016 0202C 03042 04058 STMT 184 185 186 187 188 189 190 191 192 207 207 SOURCE STATEMENT * REGISTRADOR BASE 6. ESTE BLOCO VAI * DO ENDERECO 003000 ATE O 003FFF *----------------------------------BLOCO4 EQU * DS CL4096 ORG BLOCO4 G DS CL66 H DS CL77 * . . 193 MVC A,B 194 MVC C,D 195 MVC E,F 196 MVC G,H 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 *----------------------------------- ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE 004000 005000 004000 004058 0040BB 0040BC 0040C2 0040C8 0040CE 0040D4 ADDR1 ADDR2 04000 04000 00 D20F D215 D22B D241 D257 3400 4000 5000 6000 7000 3410 4016 502C 6042 7058 00400 01000 02000 03000 04000 00410 01016 0202C 03042 04058 STMT 229 230 231 232 233 234 208 208 SOURCE STATEMENT BLOCO5 EQU * DS CL4096 ORG BLOCO5 I DS CL88 J DS CL99 * . . 235 MVC A,B 236 MVC C,D 237 MVC E,F 238 MVC G,H 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 *----------------------------------- ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE 005000 ADDR1 ADDR2 209 209 STMT SOURCE STATEMENT 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI LOC OBJECT CODE 000037 000042 ADDR1 ADDR2 0050CC 0050D0 00005000 0050D4 5C STMT 314 315 316 317 318 319 320 321 322 210 210 SOURCE STATEMENT DSEKCPO6 DS CL11 DSEKCPO7 DS CL11 *----------------------------------* VOLTO PARA A CSECT DO PROGRAMA *----------------------------------REGSBASE CSECT , END , =A(Z) =C'*' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - POS.ID 0001 0001 0001 0001 0001 0001 0001 REL.ID 0001 0001 0001 0001 0001 0001 0001 FLAGS 0C 0C 0C 0C 0C 0C 0C ADDRESS 0004A8 0010E0 0020D0 0030F8 004128 0050B8 0050D0 RELOCATION DICTIONARY ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI SYMBOL A LEN 00016 VALUE DEFN 000400 0038 B BLOCO1 BLOCO2 BLOCO3 BLOCO4 BLOCO5 C 00016 00001 00001 00001 00001 00001 00022 D DSEKCOP3 DSEKCPO1 DSEKCPO2 DSEKCPO3 DSEKCPO4 DSEKCPO5 DSEKCPO6 DSEKCPO7 DSEQUIT E F G 00033 001016 0088 ****UNDEFINED**** 00011 000000 0309 00011 00000B 0310 00011 000016 0311 00011 000021 0312 00011 00002C 0313 00011 000037 0314 00011 000042 0315 00001 00000000 0308 00044 002000 0148 00055 00202C 0149 00066 003000 0190 H I 00077 00088 000410 00000000 00001000 00002000 00003000 00004000 001000 0039 0034 0084 0145 0187 0229 0087 003042 0191 004000 0232 J 00099 004058 0233 REGSBASE 00001 00000000 0011 Z 00080 005000 0272 =A(Z) =A(Z) =A(Z) =A(Z) =A(Z) =A(Z) =A(Z) =C'*' =C'*' =C'*' =C'*' =C'*' =C'*' =C'*' 00004 00004 00004 00004 00004 00004 00004 00001 00001 00001 00001 00001 00001 00001 0004A8 0010E0 0020D0 0030F8 004128 0050B8 0050D0 0004AC 0010E4 0020D4 0030FC 00412C 0050BC 0050D4 0071 0132 0174 0216 0258 0297 0321 0072 0133 0175 0217 0259 0298 0322 REFERENCES 0041 0046 0052 0193 0199 0204 0042 0046 0053 0036 0086 0147 0189 0231 0043 0047 0054 0275 0282 0286 0043 0047 0055 0059 0122 0164 0057 0120 0162 0058 0121 0163 0060 0061 0062 0062 0024 0043 0043 0044 0277 0044 0044 0278 0044 0113 0064 0297 0067 0076 0137 0179 0221 0263 0302 0068 0074 0135 0177 0219 0261 0300 211 211 CROSS REFERENCE 0057 0068 0074 0090 0096 0104 0 0213 0219 0235 0241 0246 0255 0 0090 0097 0104 0114 0151 0158 0 0058 0091 0098 0105 0115 0121 0 0091 0206 0204 0205 0099 0248 0246 0247 0105 0115 0152 0160 0 0287 0285 0286 0249 0250 0251 0251 0288 0289 0290 0290 0123 0124 0125 0125 0165 0166 0167 0167 0207 0208 0209 0209 0048 0048 0049 0282 0049 0050 0281 0050 0319 0065 0301 0059 0092 0054 0288 0055 0053 0289 0052 0092 0106 0116 0122 0153 0164 0 0106 0116 0153 0195 0237 0276 0060 0093 0098 0107 0117 0123 0 0128 0170 0212 0254 0293 0129 0171 0213 0255 0294 0093 0099 0107 0117 0154 0160 0 0061 0094 0097 0108 0118 0124 0 0094 0096 0108 0118 0155 0157 0 0066 0071 0075 0127 0132 0136 0169 0 0321 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 212 212 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 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 213 213 EXERCíCIOS PROPOSTOS EP301 EP301 : 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 R01=00000100 R02=00000200 R03=00000300 R04=00000400 R05=00000500 R06=00000600 R07=00000700 R08=00000800 R09=00000900 R10=00000A00 R11=00000B00 R12=00000C00 R13=00000D00 R14=00000E00 R15=00000F00 Instruções a decodificar: 1ABB41278CF00A13980F334445E00CB490EC0D00FA82305448CCD28233445566 EP302 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (ZIG). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 6 16 31 Informação Informação Informação Informação 5 15 30 50 5 10 15 20 X X X X ALFA BETA GAMA DELTA Exemplo: 12345678901234567890123456789012345678901234567890 ("régua") AAAAABBBBBBBBBBCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDD 11111222222222233333333333333344444444444444444444 -----**********&&&&&&&&&&&&&&&==================== --------------------------------------------------------------------------SAIDA : Arquivo em disco sequencial (ZAG). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 16 21 41 Informação Informação Informação Informação 15 20 40 50 15 5 20 10 X X X X GAMA ALFA DELTA BETA Exemplo: 12345678901234567890123456789012345678901234567890 ("régua") ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 214 214 CCCCCCCCCCCCCCCAAAAADDDDDDDDDDDDDDDDDDDDBBBBBBBBBB 33333333333333311111444444444444444444442222222222 &&&&&&&&&&&&&&&-----====================********** --------------------------------------------------------------------------PROCESSAMENTO Para cada registro de ZIG lido, gravar um registro de ZAG. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 215 215 EP303 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (TIC). Tem no máximo 10 registros. Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 5 9 13 17 21 25 29 33 37 Informação Informação Informação Informação Informação Informação Informação Informação Informação Informação 4 8 12 16 20 24 28 32 36 40 4 4 4 4 4 4 4 4 4 4 X X X X X X X X X X a b c d e f g h i j Exemplo: 1234567890123456789012345678901234567890 ("régua") AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJ 1111222233334444555566667777888899990000 LLLLMMMMOOOOPPPPQQQQRRRRSSSSTTTTUUUUXXXX --------------------------------------------------------------------------SAIDA : Arquivo em disco sequencial (TAC). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 5 9 Número registro Informação n zeros binários 4 8 20 4 4 12 B X X 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") 00000001C1C1C1C1000000000000000000000000 00000002F2F2F2F2000000000000000000000000 00000003D6D6D6D6000000000000000000000000 --------------------------------------------------------------------------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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 216 216 EP304 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (ENTRA). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 Informação qualquer 50 50 X Exemplo: 1234567890123456789012345678901234567890 ("régua") TEXTO LIVRE PARA DAR ASAS A IMAGINACAO MOVE SPACES TO LINHA-DE-IMPRESSAO OKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOK --------------------------------------------------------------------------SAIDA : Arquivo em disco sequencial (SAI). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 5 9 13 Número registro quantos brancos quantos não brancos X'FF' em todos bytes 4 8 12 20 4 4 4 8 B B B X 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") 00000001000000080000002AFFFFFFFFFFFFFFFF 000000020000000A00000028FFFFFFFFFFFFFFFF 000000030000003200000000FFFFFFFFFFFFFFFF 000000040000000000000032FFFFFFFFFFFFFFFF --------------------------------------------------------------------------PROCESSAMENTO Para cada registro de ENTRA lido, considerá-lo como uma tabela de elementos de 1 byte cada; pesquisar cada byte para saber se ele está branco (X'40') ou não, e ir acumulando em dois acumuladores a quantidade bytes brancos e não-brancos detectada. Após "varrer" o registro inteiro suas 50 posições, gravar um registro de SAI. 50 em de em ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 217 217 EP305 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (TOP). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 5 9 13 Número a Número b Número c brancos 4 8 12 20 4 4 4 8 B B B X 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") 0000000100000002000000034040404040404040 0000000700000006000000054040404040404040 000000090000000A000000024040404040404040 --------------------------------------------------------------------------SAIDA : Arquivo em disco sequencial (DOWN). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 5 9 13 Número registro menor número maior número X'FF' em todos bytes 4 8 12 20 4 4 4 8 B B B X 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") 000000010000000100000003FFFFFFFFFFFFFFFF 000000020000000500000007FFFFFFFFFFFFFFFF 00000003000000020000000AFFFFFFFFFFFFFFFF --------------------------------------------------------------------------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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 218 218 EP306 --------------------------------------------------------------------------ENTRADA 1 : Arquivo em disco sequencial (EU) Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 5 9 13 Número a Número b Número c Filler 4 8 12 20 4 4 4 8 B P Z C Exemplo: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua") 000000010000123CF0F0F1F10000000000000000 000000020000124CF0F0F1F20000000000000000 000000030000125CF0F0F1F30000000000000000 --------------------------------------------------------------------------SAIDA : Arquivo sequencial em disco (ELA). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 5 15 Número do registro Média ponderada Filler 4 14 20 4 10 6 B Z C Exemplo: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ("régua") 00000001F0F0F0F0F0F0F0F0F4F5000000000000 00000002F0F0F0F0F0F0F0F0F4F6000000000000 00000003F0F0F0F0F0F0F0F0F4F7000000000000 --------------------------------------------------------------------------PROCESSAMENTO Para cada registro lido em EU calcular a média ponderada (MP): MP = ( (a.7) + (b.8) + (c.9) ) / 24 e gravar um registro de ELA. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 219 219 EP307 --------------------------------------------------------------------------ENTRADA 1 : Arquivo em disco sequencial (VEMTAB) Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 6 Código cidade Nome cidade 5 30 5 25 C C Exemplo: 123456789012345678901234567890 ("régua") 00003BOM JESUS DE PIRAPORA 00001SAO PAULO 00002SAO JOAO DO CAIUA --------------------------------------------------------------------------ENTRADA 2 : Arquivo em disco sequencial (VEMMAIS) Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 6 Código cidade Nome prefeito 5 30 5 25 C C Exemplo: 123456789012345678901234567890 ("régua") 00001PREFEITO DA CIDADE 00001 00002ALBERTO ROMANO SCHIESARI 00003QUITERIA SILVEIRA ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 220 220 --------------------------------------------------------------------------SAIDA : Relatório (VAI). Lay-out: 123456789012345678901234567890123456789012345678901234567890 ("régua") xxxxx xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxx cod nome cidade nome prefeito cid Exemplo: 123456789012345678901234567890123456789012345678901234567890 ("régua") 00001 SAO PAULO 00002 SAO JOAO DO CAIUA 00003 BOM JESUS DE PIRAPORA PREFEITO DA CIDADE 00001 ALBERTO ROMANO SCHIESARI 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 221 221 EP308 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (PAZ). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 5 Informação qualquer Brancos 4 20 4 16 B C 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") C1F200AA40404040404040404040404040404040 5C614EFF40404040404040404040404040404040 --------------------------------------------------------------------------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") 11000001111100100000000010101010 01011100011000010100111011111111 --------------------------------------------------------------------------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'. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 222 222 EP309 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (ROMEU). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 5 10 13 Número a Número b Número c Brancos 4 9 12 20 4 5 3 8 B Z P C 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") 0000000AF1F2F3F4D501234C4040404040404040 00000011F0F0F1F9F900002D4040404040404040 --------------------------------------------------------------------------SAIDA : Relatório (JULIETA). Lay-out: 123456789012345678901234567890123456789012345678901234567890 ("régua") RELATORIO DE CALCULOS xxxxxxxxxx NEGATIVO ou POSITIVO ou ZERO resultado result1 PAG xxx xxxxxxxxxx NEGATIVO ou POSITIVO ou ZERO resto Exemplo: 123456789012345678901234567890123456789012345678901234567890 ("régua") RELATORIO DE CALCULOS 0000062909 NEGATIVO 0000001082 POSITIVO PAG 001 0000000001 NEGATIVO 0000000000 ZERO --------------------------------------------------------------------------PROCESSAMENTO Para cada registro de ROMEU lido, efetuar o seguinte cálculo: RESULT1 = ((a+b)*5)-c Calcular, 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). ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 223 223 EP310 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (TRISTAO). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 1 3 5 7 Data na forma DDMMAA Dia Mes Ano Brancos 6 2 4 6 20 6 2 2 2 14 Z Z Z Z C Exemplo: 12345678901234567890 ("régua") 280288 311290 121091 --------------------------------------------------------------------------SAIDA : Relatório (ISOLDA). Lay-out: 123456789012345678901234567890123456789012345678901234567890 ("régua") ddmmaa data fornecida ddmmaa data calculada Exemplo: 123456789012345678901234567890123456789012345678901234567890 ("régua") 280288 311290 121091 010388 010191 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 224 224 EP311 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (JOHN). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 Informação qualquer 20 20 C 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") F1C34E000102030405060708090A0B0C0D0E0F1E 61506B1112131415161718191A1B1C1D1E1F2021 A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3 --------------------------------------------------------------------------SAIDA : Relatório (LENNON). Lay-out: 12345678901234567890123456789012345678901234567890123456789012 ("régua") xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ... dump em hexa do registro de john ... xxxxxxxxxxxxxxxxxxxx .... dump em carater Exemplo: 12345678901234567890123456789012345678901234567890123456789012 ("régua") F1C34E000102030405060708090A0B0C0D0E0F1E 61506B1112131415161718191A1B1C1D1E1F2021 A0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3 1C+................. /&,................. .................... --------------------------------------------------------------------------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, observandose 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 . , + - / ? & $ * ( ) ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 225 225 EP312 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (MICRO). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 Informação qualquer 20 20 C 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") 8182838485868788894040404040404040404040 9192939495969798994040404040404040404040 A2A3A4A5A6A7A8A9404040404040404040404040 --------------------------------------------------------------------------SAIDA : Relatório (MACRO). Lay-out: 12345678901234567890123456789012345678901234567890123456789012 ("régua") xxxxxxxxxxxxxxxxxxxx dump em carater do registro de micro Exemplo: 12345678901234567890123456789012345678901234567890123456789012 ("régua") ABCDEFGHI JKLMNOPQR STUVWXYZ --------------------------------------------------------------------------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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 226 226 EP313 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (HONEY). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 7 Data na forma DDMMAA Brancos 6 20 6 14 Z C Exemplo: 12345678901234567890 ("régua") 130190 150291 300392 --------------------------------------------------------------------------SAIDA : Relatório (MOON). Lay-out: 12345678901234567890123456789012345678901234567890123456789012 ("régua") ddmmaa data gregoriana yyddd data juliana Exemplo: 12345678901234567890123456789012345678901234567890123456789012 ("régua") 130190 90013 150291 91046 300392 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. ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 227 227 EP314 --------------------------------------------------------------------------ENTRADA : Arquivo em disco sequencial (FREE). Lay-out: Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 Texto livre 60 60 C Exemplo: 123456789012345678901234567890123456789012345678901234567890 ("régua") ESTOU APRENDENDO ASSEMBLER E JA SEI QUASE TUDO 123 $ &&& WORD LOTUS DOS MVS 123 ***** LASTLA A 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 nro registro qq quantidade de strings Exemplo: 12345678901234567890123456789012345678901234567890123456789012 ("régua") REGISTRO REGISTRO REGISTRO REGISTRO 1 2 3 4 11 7 30 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). ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 228 228 EXERCÍCIOS RESOLVIDOS Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício 1 : (987654)10 = (1111 0001 0010 0000 0110)2 2 : (4095)10 = (1111 1111 1111)2 3 : (7)10 = (111)2 4 : (1023)10 = (11 1111 1111)2 5 : (4096)10 = (1 0000 0000 0000)2 6 : (255)10 = (1111 1111)2 7 : (1024)10 = (100 0000 0000)2 8 : (10010001)10 = (1001 1000 1011 1101 1001 0001)2 9 : (256)10 = (1 0000 0000)2 10 : (1025)10 = (100 0000 0001)2 11 : (999888)10 = (1111 0100 0001 1101 0000)2 12 : (65432)10 = (1111 1111 1001 1000)2 13 : (987654)10 = (F1206)16 14 : (4095)10 = (FFF)16 15 : (7)10 = (7)16 16 : (1023)10 = (3FF)16 17 : (4096)10 = (1000)16 18 : (255)10 = (FF)16 19 : (1024)10 = (400)16 20 : (10010001)10 = (98BD91)16 21 : (256)10 = (100)16 22 : (1025)10 = (401)16 23 : (999888)10 = (F41D0)16 24 : (65432)10 = (FF98)16 25 : (11111000111010100100001 )2 = (7C7521)16 26 : (1000000111000111111110000011111110)2 = (2071FE0FE)16 27 : (1100)2 = (C)16 28 : (11111110001)2 = (7F1)16 29 : (1010101010101000110011000111)2 = (AAA8CC7)16 30 : (110011001100110011001)2 = (199999)16 31 : (1000000000000001)2 = (8001)16 32 : (1000000001)2 = (201)16 33 : (111111100000001111111)2 = (1FC07F)16 34 : (1)2 = (1)16 35 : (1100101011111110)2 = (CAFE)16 36 : (101011010111000111000000001111110001111)2 = (56B8E01F8F)16 37 : (CAFE)16 = (1100101011111110)2 38 : (CDF)16 = (110011011111)2 39 : (1AB4D)16 = (11010101101001101)2 40 : (15)16 = (10101)2 41 : (F)16 = (1111)2 42 : (87B54)16 = (10000111101101010100)2 43 : (1001)16 = (1000000000001)2 44 : (234)16 = (1000110100)2 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 229 229 (CAD)16 = (110010101101)2 (7F7)16 = (11111110111)2 (1990)16 = (1100110010000)2 (33)16 = (110011)2 (11)2 = (3)10 (100001111111)2 = (2175)10 (101010010101)2 = (2709)10 (110000001111111)2 = (24703)10 (11111110000011)2 = (16259)10 (11110000111000)2 = (15416)10 (11)2 = (3)10 (111111110)2 = (510)10 (1111100001111000111001101)2 = (32567757)10 (1000000000000)2 = (4096)10 (11111001)2 = (249)10 (1000000000000001)2 = (32769)10 (11)16 = (17)10 (AAF45)16 = (?)10 (1B567)16 = (111975)10 (100)16 = (256)10 (1000)16 = (4096)10 (FF)16 = (255)10 (FFF)16 = (4095)10 (CDF)16 = (3295)10 (CAFE)16 = (51966)10 (FACA)16 = (64202)10 (DAD0)16 = (56016)10 (F1E2D3C4)16 = (4058174404)10 (11001100)2 + (10101010)2 = (1 0111 0110)2 (1111001111)2 + (1001111001)2 = (110 0100 1000)2 (1111)2 + (1)2 = (10000)2 (1111)2 + (111)2 = (10110)2 (100001)2 + (11110)2 = (111111)2 (1011110011)2 + (111101111)2 = (100 1110 0010)2 (110011001100)2 + (101011110000)2 = (1 0111 1011 1100)2 (1111100001111000)2 + (101111)2 = (1111 1000 1010 0111)2 (111)2 + (1111)2 + (100)2 = (11010)2 (11)2 + (111)2 + (1111)2 + (11111)2 = (111000)2 (1111)2 + (1001)2 + (111)2 + (101)2 + (11)2 + (1)2 = (101000)2 (111)2 + (1000)2 + (1)2 + (1100)2 = (11100)2 (11001100)2 - (1010101)2 = (111 0111)2 (1111001111)2 - (1111001)2 = (11 0101 0110)2 (1111)2 - (1)2 = (1110)2 (1111)2 - (111)2 = (1000)2 (100001)2 - (11110)2 = (11)2 (1011110011)2 - (111101111)2 = (1 0000 0100)2 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício 91 : (11001100)2 - (111011110000)2 = (...1111 1111 1100 1101)2 92 : (1111000)2 - (101010111)2 = (... 1111 1111 0010 0001)2 93 : (111)2 - (1111)2 = (... 1111 1111 1111 1000)2 94 : (10001)2 - (111111)2 = (... 1111 1111 1101 0010)2 95 : (0)2 - (1)2 = (... 1111 1111 1111 1111)2 96 : (0)2 - (10)2 = (... 1111 1111 1111 1110)2 97 : (F12B)16 + (321)16 = (F44C)16 98 : (1100)16 + (111)2 = (1211)16 99 : (1000F)16 + (F0001)16 = (100010)16 100 : (A9B8C7)16 + (D6E5F4)16 = (1809EBB)16 101 : (CAFE)16 + (CDF)16 = (D7DD)16 102 : (B001)16 + (FD)16 = (B0FE)16 103 : (999)16 + (111)16 = (AAA)16 104 : (123456)16 + (789ABC)16 = (19BBF12)16 105 : (FFF)16 + (EEE)16 = (1EED)16 106 : (DDD)16 + (333)16 = (1110)16 107 : (987AED)16 + (CF01)16 = (9949EE)16 108 : (FACA)16 + (CAFE)16 = (1C5C8)16 109 : (F1C5)16 - (101)16 = (F0C4)16 110 : (1AD87C)16 - (FDE9)2 = (19DA93)16 111 : (112233)16 - (44556)16 = (CDCDD)16 112 : (AABBCC)16 - (DDEEF)16 = (9CDCDD)16 113 : (F1E2D3)16 - (C4B5A6)16 = (2D2D2D)16 114 : (FF00001)16 - (10000F)16 = (FDFFFF2)16 115 : (CAFE)16 - (FACA)16 = (...FFFFD034)16 116 : (CDF)16 - (FDC)16 = (...FFFFFD03)16 117 : (10001)16 - (20001)16 = (...FFFF0000)16 118 : (10000)16 - (FFFE)16 = (2)16 119 : (0)16 - (9)16 = (...FFFFFFF7)16 120 : (0)16 - (1A)16 = (...FFFFFFE6)16 121 : (1)10 = (0000 0000 0000 0001)2 = (0001)16 = (0000 0000 0000 0000 0000 0000 0000 0001)2 = (00000001)16 122 : (-1)10 = (1111 1111 1111 1111)2 = (FFFF)16 = (1111 1111 1111 1111 1111 1111 1111 1111)2 = (FFFFFFFF)16 123 : (10)10 = (0000 0000 0000 1010)2 = (000A)16 = (0000 0000 0000 0000 0000 0000 0000 1010)2 = (0000000A)16 124 : (-10)10 = (1111 1111 1111 0110)2 = (FFF6)16 = (1111 1111 1111 1111 1111 1111 1111 0110)2 = (FFFFFFF6)16 125 : (17)10 = (0000 0000 0001 0001)2 = (0011)16 = (0000 0000 0000 0000 0000 0000 0001 0001)2 = (00000011)16 126 : (-17)10 = (1111 1111 1110 1111)2 = (FFEF)16 230 230 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI Exercício 127 : Exercício 128 : Exercício 129 : Exercício 130 : Exercício 131 : Exercício 132 : Exercício 133 : Exercício 134 : Exercício 135 : Exercício 136 : Exercício 137 : Exercício 138 : = (1111 1111 1111 1111 1111 1111 1110 1111)2 = (FFFFFFEF)16 (254)10 = (0000 0000 1111 1110)2 = (00FE)16 = (0000 0000 0000 0000 0000 0000 1111 1110)2 = (000000FE)16 (-254)10 = (1111 1111 0000 0010)2 = (FF02)16 = (1111 1111 1111 1111 1111 1111 0000 0010)2 = (FFFFFF02)16 (100000)10 = (imposível representar em 2 bytes) = (0000 0000 0000 0001 1000 0110 1010 0000)2 = (000186A0)16 (-100000)10 = (imposível representar em 2 bytes) = (1111 1111 1111 1110 0111 1001 0110 0000)2 = (FFFE7960)16 (32000)10 = (0111 1101 0000 0000)2 = (7D00)16 = (0000 0000 0000 0000 0111 1101 0000 0000)2 = (00007D00)16 (-32000)10 = (1000 0011 0000 0000)2 = (8300)16 = (1111 1111 1111 1111 1000 0011 0000 0000)2 = (FFFF8300)16 (63000)10 = (imposível representar em 2 bytes) = (1111 1111 1111 1111 1111 0110 0001 1000 )2 = (FFFFF618)16 (-63000)10 = (imposível representar em 2 bytes) = (1111 1111 1111 1111 0000 1001 1110 1000)2 = (FFFF09E8)16 (1010)10 = (0000 0011 1111 0010)2 = (03F2)16 = (0000 0000 0000 0000 0000 0011 1111 0010)2 = (000003F2)16 (-1010)10 = (1111 1100 0000 1110)2 = (FC0E)16 = (1111 1111 1111 1111 1111 1100 0000 1110)2 = (FFFFFC0E)16 (4095)10 = (0000 1111 1111 1111)2 = (0FFF)16 = (0000 0000 0000 0000 0000 1111 1111 1111)2 = (00000FFF)16 (-4095)10 = (1111 0000 0000 0001)2 = (F001)16 = (1111 1111 1111 1111 1111 0000 0000 0001)2 = (FFFFF001)16 231 231 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 232 232 Exercício 139 : (4097)10 = (0001 0000 0000 0001)2 = (1001)16 = (0000 0000 0000 0000 0001 0000 0000 0001)2 = (00001001)16 Exercício 140 : (-4097)10 = (1110 1111 1111 1111)2 = (EFFF)16 = (1111 1111 1111 1111 1110 1111 1111 1111)2 = (FFFFEFFF)16 Exercício 141 : (1)10 = [ 0001 1100 ] = [ 1C ] Exercício 142 : (-1)10 = [ 0001 1101 } = [ 1D ] Exercício 143 : (10)10 = [ 0000 0001 0000 1100 ] = [ 010C ] Exercício 144 : (-10)10 = [ 0000 0001 0000 1101 ] = [ 10D ] Exercício 145 : (17)10 = [ 0000 0001 0111 1100 ] = [ 017C ] Exercício 146 : (-17)10 = [ 0000 0001 0111 1101 ] = [ 017D ] Exercício 147 : (254)10 = [ 0010 0101 0100 1100 ] = [ 254C ] Exercício 148 : (-254)10 = [0010 0101 0100 1101 ] = [ 254D ] Exercício 149 : (100000)10 = [ 0000 0001 0000 0000 0000 0000 0000 1100 ] = [ 0100000C ] Exercício 150 : (100000)10 = [ 0000 0001 0000 0000 0000 0000 0000 1101 ] = [ 0100000D ] Exercício 151 : (32000)10 = [ 0011 0010 0000 0000 0000 1100 ] = [ 32000C ] Exercício 152 : (-32000)10 = [ 0011 0010 0000 0000 0000 1101 ] = [ 32000D ] Exercício 153 : (63000)10 = [ 0110 0011 0000 0000 0000 1100 ] = [ 63000C ] Exercício 154 : (-63000)10 = [ 0110 0011 0000 0000 0000 1101 ] = [ 63000D ] Exercício 155 : (1010)10 = [ 0000 0001 0000 0001 0000 1100 ] = [ 01010C ] Exercício 156 : (-1010)10 = [ 0000 0001 0000 0001 0000 1100 ] = [ 01010D ] Exercício 157 : (4095)10 = [ 0000 0100 0000 1001 0101 1100 ] = [ 04095C ] Exercício 158 : (-4095)10 = [ 0000 0100 0000 1001 0101 1101 ] = [ 04095D ] Exercício 159 : (4097)10 = [ 0000 0100 0000 1001 0111 1100 ] = [ 04097C ] Exercício 160 : (-4097)10 = [ 0000 0100 0000 1001 0111 1101 ] = [ 04097D ] Exercício 161 : (1)10 = [ 1111 0001 ] = [ F1 ] Exercício 162 : (-1)10 = [ 1101 0001 } = [ D1 ] Exercício 163 : (10)10 = [ 1111 0001 1111 0000 ] = [ F1F0 ] Exercício 164 : (-10)10 = [ 1111 0001 1101 0000 ] = [ F1D0 ] Exercício 165 : (17)10 = [ 1111 0001 1111 0111 ] = [ F1F7 ] Exercício 166 : (-17)10 = [ 1111 0001 1101 0111 ] = [ F1D7 ] Exercício 167 : (254)10 = [ 1111 0010 1111 0101 1111 0100 ] = [ F2F5F4 ] Exercício 168 : (-254)10 = [ 1111 0010 1111 0101 1101 0100 ] = [ F2F5D4 ] Exercício 169 : (100000)10 = [ 1111 0001 1111 0000 1111 0000 1111 0000 1111 0000 1111 0000 ] = [ F1F0F0F0F0F0 ] Exercício 170 : (-100000)10 = [ 1111 0001 1111 0000 1111 0000 1111 0000 1111 0000 1101 0000 ] = [ F1F0F0F0F0D0 ] Exercício 171 : (32000)10 = [ 1111 0011 1111 0010 1111 0000 1111 0000 1111 0000 ] = [ F3F2F0F0F0 ] ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI Exercício 172 : (-32000)10 = [ 1111 0011 1111 0010 1111 0000 1111 0000 1111 0000 ] = [ F3F2F0F0D0 ] Exercício 173 : (63000)10 = [ 1111 0110 1111 0011 1111 0000 1111 0000 1111 0000 ] = [ F6F3F0F0F0 ] Exercício 174 : (-63000)10 = [ 1111 0110 1111 0011 1111 0000 1111 0000 1101 0000 ] = [ F6F3F0F0D0 ] Exercício 175 : (1010)10 = [ 1111 0001 1111 0000 1111 0001 1111 0000 ] = [ F1F0F1F0 ] Exercício 176 : (-1010)10 = [ 1111 0001 1111 0000 1111 0001 1101 0000 ] = [ F1F0F1D0 ] Exercício 177 : (4095)10 = [ 1111 0100 1111 0000 1111 1001 1111 0101 ] = [ F4F0F9F5 ] Exercício 178 : (-4095)10 = [ 1111 0100 1111 0000 1111 1001 1101 0101 ] = [ F4F0F9D5 ] Exercício 179 : (4097)10 = [ 1111 0100 1111 0000 1111 1001 1111 1111 ] = [ F4F0F9F7 ] Exercício 180 : (-4097)10 = [ 1111 0100 1111 0000 1111 1001 1101 0111 ] = [ F4F0F9D7 ] Exercício 181 : “17“ = [ F1F7 ] Exercício 182 : “-17“ = [ 60F1F7 ] Exercício 183 : “AF$BD“ = [ C1C66BC2C4 ] Exercício 184 : “-AF4BD“ = [ 60C1C6F4C2C4 ] Exercício 185 : “ALBERTO“ = [ C1D3C2C5D9E3D6 ] Exercício 186 : “15-9“ = [ F1F560F9 ] Exercício 187 : “-4095“ = [ 60F4F0F9F5 ] Exercício 188 : “4095“ = [ F4F0F9F5 ] Exercício 189 : “*&$//“ = [ 5C505B6161 ] Exercício 190 : “12+3“ = [ F1F24EF3 ] Exercício 191 : “I LOVE HER“ = [ C940D3D6E5C540C8C5D9 ] Exercício 192 : “US$ 2,584.73“ = [ E4E25B40F26BF5F8F44BF7F3 ] Exercício 193 : “US$ 1 MILLION“ = [ E4E25B40F140D4C9D3D3C9D6D5 ] Exercício 194 : “PANCHO’S BAR“ = [ D7C1C5C3C8D67DE240C2C1D9 ] 233 233 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 234 234 Os exercícios 195 a 300 devem ser considerados como um programa, cujo endereço inicial é zero (X’00000000’), ou seja, a primeira área (exercíco 195) começa no endereço zero. As áreas definas por DS devem ser computadas para determinar os endereços. Assumir que o 1o statement seja USING *,9. * EP195: EP196: EP197: EP198: EP199: EP200: EP201: EP202: EP203: EP204: EP205: EP206: EP207: EP208: EP209: EP210: EP211: EP212: EP213: EP214: EP215: EP216: EP217: EP218: EP219: EP220: EP221: EP222: EP223: EP224: EP225: EP226: EP227: DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC C'123' C'+123' C'-123' C'12.3' C'1AB8' C'01101' C'A+B=C' CL4'A' CL4'ABCDEF' 3CL2'A' 2CL3'A,B' C'ME&&YOU' C'''S MUSIC' C'@@OI' CL3'*' 3C'*' X'123' X'-123' X'1AB2C3' X'1AB2F4G3' XL3'12D' XL3'AABBCCDDEE' X'1,22,333,4444' XL2'1,22,333' 2X'1,22,333' 2XL2'1,22' B'01010101' B'1' BL2'1111' B'1,1111111111' BL2'1,1111111111' 2B'1000' 2BL2'1000' EP228: EP229: EP230: EP230: EP231: EP232: DC DC DC DC DC DC F'10' F'+10' F'-10' F'-15,+16' 2F'22' 2F'33,44' EP233: EP234: DC DC FL3'258' 2FL1'255' EP235: EP236: EP237: EP238: EP239: EP240: EP241: EP242: EP243: DC DC DC DC DC DC DC DC DC F'128000' H'10' H'+10' H'-10' H'-15,+16' 2H'22' 2H'33,44' HL3'258' 2HL1'255' EP244: EP245: EP246: EP247: EP248: EP249: DC DC DC DC DC DC H'128000' P'123' P'+123' P'-123' PL4'456' PL1'789' Endereço Conteúdo 0000 F1.F2.F3 0003 4E.F1.F2.F3 0007 60.F1.F2.F3 000B F1.F2.4B.F3 000F F1.C1.C2.F8 0013 F0.F1.F1.F0.F1 0018 C1.4E.C2.7E.C3 001D C1.40.40.40 0021 C1.C2.C3.C4 0025 C1.40.C1.40.C1.40 002B C1.6B.C2.C1.6B.C2 0031 D4.C5.50.E8.D6.E4 0037 7D.E2.40.D4.E4.E2.C9.C3 003F 7C.7C.D6.C9 0043 5C.40.40 0046 5C.5C.5C 0049 01.23 *** erro *** 004B 1A.B2.C3 *** erro *** 004E 00.01.2D 0051 CC.DD.EE 0054 01.22.03.33.44.44 005A 00.01.00.22.03.33 0060 01.22.03.33.01.22.03.33 0068 00.01.00.22.00.01.00.22 0070 55 0071 01 0072 00.0F 0074 01.03.FF 0077 00.01.03.FF 007B 08.08 007D 00.08.00.08 0081 00.00.00 (align) 0084 00.00.00.0A 0088 00.00.00.0A 008C FF.FF.FF.F6 0090 FF.FF.FF.F1.00.00.00.10 0098 00.00.00.16.00.00.00.16 00A0 00.00.00.21.00.00.00.2C 00.00.00.21.00.00.00.2C 00B0 00.01.02 00B3 FF.FF 00B5 00.00.00 (align) 00B8 00.01.F4.00 00BC 00.0A 00BE 00.0A 00C0 FF.F6 00C2 FF.F1.00.10 00C6 00.16.00.16 00CA 00.21.00.2C.00.21.00.2C 00D2 00.01.02 00D5 FF.FF 00D7 00 (align) 00D8 F4.00 00DA 12.3C 00DC 12.3C 00DE 12.3D 00E0 00.00.45.6C 00E4 9C ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI EP250: EP251: EP252: EP253: EP254: EP255: DC DC DC DC DC DC P'1,-22,333,-4444' PL2'1,-22,333,-4444' 3P'0' PL3'0' 2P'1,22,333' 2PL2'1,22,333' 00E5 00ED 00F5 00F8 00FB 0105 EP256: EP257: EP258: EP259: EP260: EP261: EP262: DC DC DC DC DC DC DC Z'123' Z'+123' Z'-123' ZL4'456' ZL1'789' Z'1,-22,333,-4444' ZL3'1,-22,333,-4444' 0111 0114 0117 011A 011E 011F 0129 EP263: EP264: EP265: DC DC DC 3Z'0' ZL3'0' 2Z'1,22,333' 0135 0138 013B EP266: DC 2ZL3'1,22,333' 0147 EP267: EP268: EP269: EP270: EP271: EP272: EP273: SIMBZZ SIMBAA SIMBBB SIMBCC SIMBDD SIMBEE SIMBFF DC DC DC DC DC DC DS A(0) A(127) A(X'8000') A(B'1111') A(C'*') A(*) CL17 015C 0160 0164 0168 016C 0170 0174 EP274: EP275: EP276: EP277: EP278: EP279: EP280: EP281: EP282: EP283: SIMBGG SIMBHH SIMBII SIMBJJ SIMBKK SIMBLL SIMBMM SIMBNN SIMBOO SIMBPP DC DC DC DC DC DC DC DC DC DC A(*) A(SIMBGG) A(SIMBAA+12) A(SIMBII-SIMBBB) AL1(*-SIMBKK) 5AL1(*-SIMBLL) AL2(3,5,7) A(SIMBII+5*2) A(SIMBNN+X'80000000') 4AL2(*-SIMBPP) 0185 0188 018C 0190 0194 0198 0199 019E 01A4 01A8 01AC EP284: SIMBQQ DC EP285: SIMBRR DC A(SIMBVV) A(SIMBKK,SIMBJJ) 01B4 01B8 EP286: SIMBSS DC EP287: SIMBTT DC A(SIMBTT+40) A(SIMBUU,*,80) 01C0 01C4 EP288: SIMBUU DC 2A(*-SIMBUU) 01D0 EP289: EP290: EP291: EP292: EP293: EP294: EP295: EP296: EP297: A(C'AMO') A(X'7FFFFFFF') Y(SIMBWW) Y(10) Y(L'YY2) S(SIMBAA) S(SS1) S(10) S(*) SIMBVV SIMBWW YY1 YY2 YY3 SS1 SS2 SS3 SS4 EP298: SS5 DC DC DC DC DC DC DC DC DC DC 01D8 01DC 01E0 01E2 01E4 01E6 01E8 01EA 01EC 01EE A(125),F'33',C'*',2H'6,18' 01F0 1C.02.2D.33.3C.04.44.4D 00.1C.02.2D.33.3C.44.4D 0C.0C.0C 00.00.0C 1C.02.2C.33.3C.1C.02.2C.33.3C 00.1C.02.2C.33.3C 00.1C.02.2C.33.3C F1.F2.C3 F1.F2.C3 F1.F2.D3 F0.F4.F5.C6 C9 F1.F2.D2.F3.F3.C3.F4.F4.F4.D4 F0.F0.C1.F0.F2.D2.F3.F3.C3 F4.F4.F4.D4 C0.C0.C0 F0.F0.F0 C1.F2.C2.F3.F3.C3 C1.F2.C2.F3.F3.C3 F0.F0.C1.F0.F2.C2.F3.F3.C3 F0.F0.C1.F0.F2.C2.F3.F3.C3 00.00.00.00 00.00.00.7F 00.00.80.00 00.00.00.0F 00.00.00.5C 00.00.01.70 ??.??.??.??.??.??.??.??.?? ??.??.??.??.??.??.??.?? 00.00.00 (align) 00.00.01.88 00.00.01.88 00.00.01.6C 00.00.00.2C 00 00.01.02.03.04 00.03.00.05.00.07 00.00.01.9A 80.00.01.A4 00.00.00.02.00.04 00.06 00.00.01.D8 00.00.01.98 00.00.01.94 00.00.01.EC 00.00.01.D0 00.00.01.C8 00.00.00.50 00.00.00.00 00.00.00.04 00.C1.D4.D6 7F.FF.FF.FF 01.DC 00.0A 00.02 91.60 91.E6 00.0A 91.EC 00.00 (align) 00.00.00.7D 00.00.00.21 5C 00 (align) 00.06.00.12 235 235 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI EP299: SS6 DC X'1,1',B'1,1',C'1,1' EP300: * Endereço LAST DC 256AL1(255+LAST-*) 0209 * 0219 * 0229 * 0239 * 0249 * 0259 * 0269 * 0279 * 0289 * 0299 * 02A9 * 02B9 * 02C9 * 02D9 * 02E9 * 02F9 00.06.00.12 0202 01.01.01.01 F1.6B.F1 Conteúdo FF.FE.FD.FC.FB.FA.F9.F8.F7.F6.F5.F4.F3.F2.F1.F0 EF.EE.ED.EC.EB.EA.E9.E8.E7.E6.E5.E4.E3.E2.E1.E0 DF.DE.DD.DC.DB.DA.D9.D8.D7.D6.D5.D4.D3.D2.D1.D0 CF.CE.CD.CC.CB.CA.C9.C8.C7.C6.C5.C4.C3.C2.C1.C0 BF.BE.BD.BC.BB.BA.B9.B8.B7.B6.B5.B4.B3.B2.B1.B0 AF.AE.AD.AC.AB.AA.A9.A8.A7.A6.A5.A4.A3.A2.A1.A0 9F.9E.9D.9C.9B.9A.99.98.97.96.95.94.93.92.91.90 8F.8E.8D.8C.8B.8A.89.88.87.86.85.84.83.82.81.80 7F.7E.7D.7C.7B.7A.79.78.77.76.75.74.73.72.71.70 6F.6E.6D.6C.6B.6A.69.68.67.66.65.64.63.62.61.60 5F.5E.5D.5C.5B.5A.59.58.57.56.55.54.53.52.51.50 4F.4E.4D.4C.4B.4A.49.48.47.46.45.44.43.42.41.40 3F.3E.3D.3C.3B.3A.39.38.37.36.35.34.33.32.31.30 2F.2E.2D.2C.2B.2A.29.28.27.26.25.24.23.22.21.20 1F.1E.1D.1C.1B.1A.19.18.17.16.15.14.13.12.11.10 0F.0E.0D.0C.0B.0A.09.08.07.06.05.04.03.02.01.00 Exercício 301 : Decodificar o seguinte conjunto de instruções: 1ABB41278CF00A13980F334445E00CB490EC0D00FA82305448CCD28233445566 ----////////----////////--------////////------------//////////// Supor os registradores gerais com os seguintes conteúdos: R00=00112233 R04=00000400 R08=00000800 R12=00000C00 R01=00000100 R05=00000500 R09=00000900 R13=00000D00 R02=00000200 R06=00000600 R10=00000A00 R14=00000E00 R03=00000300 R07=00000700 R11=00000B00 R15=00000F00 1ABB - Código de operação (máquina) = 1A - Mnemônico Assembler = AR (add register) - Endereço da instrução = X’00000000’ - Operandos = 1o operando = registrador 11; 2o operando = registrador 11 41278CF0 - Código de operação (máquina) = 41 - Mnemônico Assembler = LA (load address) - Endereço da instrução = X’00000002’ -Operandos = 1st operand = register 2; 2o operando : indexador = registrador 7 2o operando : base register = registrador 8 2o operando : deslocamento = X’CF0’ Endereço 2o operando = X’ 00000700’+X’00000800’+X’CF0’= X’00001BF0’ 0A13 - Código de operação (máquina) = 0A - Mnemônico Assembler = SVC (supervisor call) - Endereço da instrução = X’00000006’ - Operandos = códifo de chamada ao supervisor = X’13’ = (19)10 = open 236 236 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 237 237 980F3344 - Código de operação (máquina) = 98 - Mnemônico Assembler = LM (load multiple) - Endereço da instrução = X’00000008’ -Operandos = 1o operando = registrador 0; 3o operando : registrador 15 (X’F’) 2o operando : base = registrador 3 2o operando : deslocamento = X’344’ Endereço 2o operando = X’00000300’+X’344’= X’00000644’ 45E00CB4 - Código de operação (máquina) = 45 - Mnemônico Assembler = BAL (branch and link) - Endereço da instrução = X’0000000C’ -Operandos = 1o operando = registrador 14 (X’E’); 2o operando : indexador = registrador 0 ; 2o operando : base = registrador 0; 2o operando : deslocamento = X’CB4’; Endereço 2o operando = X’CB4’= X’00000CB4’ 90EC0D00 - Código de operação (máquina) = 90 - Mnemônico Assembler = STM (store multiple) - Endereço da instrução = X’00000010’ -Operandos = 1o operando = registrador 14 (X’E’); 3o operando : registrador 12 (X’C’) 2o operando : base = registrador 0; 2o operando : deslocamento = X’D00’ Endereço 2o operando = X’D00’= X’00000D00’ FA82305448CC - Código de operação (máquina) = FA - Mnemônico Assembler = AP (add packed) - Endereço da instrução = X’00000014’ - Tamanho 1o operando = 9 bytes; 1o operando : base = registrador 3; 1o operando : deslocamento = X’054’; Endereço 1o operando= X’00000300’+X’054’ = X’00000354’ - Tamanho 2o operando = 3 bytes; 2o operando : base = registrador 4; 2o operando : deslocamento = X’8CC’; Endereço 2o operando = X’00000400’+X’8CC’ = X’00000CCC’ D28233445566 - Código de operação (máquina) = D2 - Mnemônico Assembler = MVC (move character) - Endereço da instrução = X’0000001A’ - Tamanho 1o operando = 131 bytes; 1o operando : base = registrador 3; 1o operando : deslocamento = X’344’; Endereço 1o operando = X’00000300’+X’344’ = X’00000644’ - Tamanho 2o operando = 131 bytes; 2o operando : base = registrador 5; 2o operando : deslocamento = X566’; Endereço 2o operando = X’00000500’+X’566’ = X’00000A66’ ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 238 238 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: FULL AREA TAB ST UNPK TR MVI 12,FULL AREA+10(9),FULL(5) AREA+10(8),TAB AREA+18,C' ' DS DC DC ORG DC ORG F CL80' ' 256X'00' TAB+C'0' C'0123456789ABCDEF' ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 239 239 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 VOLTA ACHOU FIM ARG RESULT TABELA XEGUEI . . ...montagem da TABELA e de ARG... . LA 6,=A(TABELA)+1000*8 LA 5,=A(TABELA) CLC 0(5,5),ARG BE ACHOU LA 5,8(5) CR 5,6 BH FIM B VOLTA LA 5,5(5) MVC RESULT,0(3,5) TCHAU DC CL5'0' DC CL3'0' LTORG LTORG DS 1000CL8 END PRG3 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 240 240 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-1 sendo 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,VINIC VOLTO 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 VOLTO FASE2 S 6,=F'5' C 6,=A(TABELA) BL FIM AP VTOT,0(5,6) B FASE2 FIM TCHAU *------------------------------ DEFINICAO DAS AREAS AUXILIARES VTOT DC PL8'0' VATUAL DC PL8'0' VINIC DC PL8'0' VINCR DC PL8'0' VMAX DC PL8'0' LTORG LTORG TABELA DS 5000PL5 END PRG6 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 241 241 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 ForInicial Final (bytes) mato Dado 1 51 71 121 201 221 Informação Informação Informação Informação Informação Informação 50 70 120 200 220 256 50 20 50 80 20 36 C C C C C C ALFA BETA GAMA DELTA PI OMEGA Lay-out de AL Posição Posição Tamanho ForInicial Final (bytes) mato Dado 1 21 71 107 157 177 Informação Informação Informação Informação Informação Informação 20 70 106 156 176 256 20 50 36 50 20 80 C C C C C C PI GAMA OMEGA ALFA BETA DELTA SOLUÇÃO: TR AG,AL *----------------------------------------------------------* DEFINICAO DAS AREAS AL E AG * *----------------------------------------------------------AL AG AG1 AG2 AG3 AG4 AG5 AG6 DS DS DC DC DC DC DC DC CL256 0CL256 20AL1(*-AG1+200) 50AL1(*-AG2+70) 36AL1(*-AG3+220) 50AL1(*-AG4+0) 20AL1(*-AG5+50) 80AL1(*-AG6+120) 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....+....0 REGISTRO 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 STM 14,12,12(13) LR LA LA LA ST 3,15 3,0(3) 4,1 4,4095(3,4) 13,MYSAVE+4 LA ST 15,MYSAVE 15,8(13) LR EQU OPEN OPEN LEDENOVO BAL CLI ABRIR 13,15 * (ENTRA,INPUT) (RELAT,OUTPUT) 14,LERENTRA FIMENTRA,C'S' ESTABELECE REGISTRADORES 3 E 4 COMO BASE SALVA REGISTRADORES NA SAVEAREA DO CHAMADOR (SIST OPERACIONAL) SALVA ENDERECO PONTO DE CARGA ZERA PRIM BYTE A ESQUERDA CARREGA NRO 1 DEIXA O 4 COM 4096 A + QUE O 3 SALVA O 13 (ENDER SAVEAREA DO CHAMADOR) NA SAVEAREA+4 CARREGA ENDER SAVEAREA DO PROG SALVA END SAVEAREA DO PROG NA SAVEAREA+8 DO CHAMADOR ENDER SAVEAREA DO PROG NO 13 ABRE ARQUIVO ENTRADA ABRE ARQUIVO RELATORIO EXECUTA ROTINA LEITURA VERIFICA SE EOF 242 242 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 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 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 243 243 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI 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' ' * *--------------------------------------------------------------------* 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 : 244 244 ASSEMBLER - PROF. ALBERTO ROMANO SCHIESARI PAG. 1 REG.# --------------------* CONTEUDO DO REG LIDO *------------------------ -------------------------------------------------------------------------------00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 REGISTRO 1 ....................................................................* REGISTRO 2 ...+....2....+....3....+....4....+....5....+....6....+....7....+....0 REGISTRO 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 PAG. 2 REG.# --------------------* CONTEUDO DO REG LIDO *------------------------ -------------------------------------------------------------------------------00022 00023 00024 00025 00026 00027 00028 00029 00030 00031 00032 00033 00034 00035 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 !!! *** 245 245