Assembler para Mainframes IBM Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 1 Apresentação Obrigado por usar esta apresentação. Você está livre para fazer isso. Eu agradeço se fizer referência ao autor ao utilizá-la. Agradeço se você me enviar qualquer correção que ache necessária para otimizar a compreensão do leitor. O mesmo se aplica a erros técnicos que você encontrar; por favor me ajude a deixar este material sem erros. Alberto Romano Schiesari – São Paulo - Brasil www.profars.com [email protected] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 2 Sumário Arquitetura / alguns componentes Arquitetura mainframes IBM Representação de dados Representação de instruções Linguagem Assembler Fluxo Jeitão de um programa Assembler Statement Elementos do montador assembler Tipos de statements Comandos ao Montador Assembler Instruções de máquina Dicas Instruções por grupo Instruções Macro-Instruções Apêndice - Links Apêndice – Sumário de instruções (por cod op) (por mnemônico) Apêndice - Alguns caracteres EBCDIC Alguns caracteres ASCII Apêndice - Questões Respostas Apêndice – Dicas de programação Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 3 Sumário Comandos Assembler (ordem alfabética) AMODE DROP ISEQ RMODE CCW DS LOCTR SPACE CCW0 DSECT LTORG START CCW1 DXD OPSYN TITLE CNOP EJECT ORG USING COM END POP WXTRN COPY ENTRY PRINT CSECT EQU PUNCH CXD EXTRN PUSH DC ICTL REPRO Não estão no escopo deste curso: AREAD, MACRO, MEXIT, MEND ACTR, AGO, AIF, ANOP, GBLA, GBLB, GBLC, LCLA, LCLB, LCLC, MHELP, MNOTE, SETA, SETB, SETC Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 4 Sumário Instruções de máquina (ordem alfabética) A BCR CLI EDMK LR MVO SH SRDL TRT AH BCT CLM EX LTR MVZ SL SRL TS AL BCTR CLR IC M N SLA SRP UNPK ALR BSM CP ICM MC NC SLDA ST X AP BXH CR IPM MH NI SLDL STC XC AR BXLE CS L MP NR SLL STCK XI BAL C CVB LA MR O SLR STCM XR BALR CDS CVD LCR MVC OC SP STH ZAP BAS CH D LH MVCIN OI SPM STM BASR CL DP LM MVCL OR SR SVC BASSM CLC DR LNR MVI PACK SRA TM BC CLCL ED LPR MVN S SRDA TR Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 5 Arquitetura ARQUITETURA DE SISTEMAS Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 6 Arquitetura – Alguns componentes CPU do sistema (CISC, RISC, híbrido) CISC = Complex Instruction Set Computer Instruções com tamanho variável. Nelas, explicita ou implicitamente, deve estar especificado: - Qual operação a ser feita - Quais operandos serão usados (locais com dados a processar e locais com dados resultantes): o endereço deles! - Tamanho dos operandos - Formato dos dados nos operandos RISC = Reduced Instruction Set Computer Instruções com tamanho fixo: por ex. 4 bytes; execução, na média, mais rápida Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 7 Arquitetura – Alguns componentes Observar que... Mainframes e PC’s = CISC Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 8 Arquitetura – Alguns componentes Endereçamento (acesso) dos bytes de memória Memória real? Memória virtual? Se tiver memória virtual, o HW precisa conversar com o SW Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 9 Arquitetura – Alguns componentes Em linguagem simbólica a referência a um campo é feita: Usando seu nome (variáveis ou constantes) ou Usando seu conteúdo (literais) MOVE 1 TO NPAGIN. NPAGIN = 1 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 10 Arquitetura – Alguns componentes Em linguagem de máquina, a referência a um campo é feita indicando seu endereço, ou seja, a localização de um campo deve ser especificada por meio de um número (hexadecimal / binário) que seja o seu endereço. Não há referência aos nomes. A referência ao endereço é denominada ENDEREÇAMENTO. O número hexadecimal que expressa o endereço pode ter 6 algarismos ou 8 algarismos. Se for com 6 algarismos são necessários 3 bytes para especificá-lo. Se for com 8 algarismos são necessários 4 bytes para especificá-lo. (em muitos de nossos exemplos usamos números menores, com 2 ou 3 algarismos, apenas para simplificação visual e de cálculos). Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 11 Arquitetura – Alguns componentes Endereçamento (acesso) dos bytes de memória Programa Instruções F830B004C82F Áreas 1C Instrução MOVE em linguagem de máquina, que indica : (a) é MOVE (F8); (b) Tamanho campo emissor [literal 1] = 0 (significa 1 byte) (c) Tamanho campo receptor [variável NPAGIN] = 3 (significa 4 bytes) (c) Endereço do campo emissor (d) Endereço do campo receptor Acredite em mim: x’B004’ é o endereço de NPAGIN e x’C82F’ é o endereço da literal com 1 Sumário Pag.Ant. 00 00 Campo emissor [literal com conteúdo 1] E que tem endereço ! 00 1C Campo receptor [variável NPAGIN] E que tem endereço ! Alberto Romano Schiesari – www.profars.com 12 Arquitetura – Alguns componentes Endereçamento (acesso) dos bytes de memória Memória real X Memória virtual Somar 1 no campo de endereço x’2B40’ Se o conteúdo do campo de endereço x’2B40’ não estiver na memória real: De-Para para achar onde está na memória virtual Trazer da memória virtual para a memória real Executar a instrução (Lembrar que isso pode acontecer também com a instrução, e com qualquer operando...) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 13 Arquitetura – Alguns componentes Endereçamento (acesso) dos bytes de memória Endereçamento Direto? Indireto? Ex. endereçamento Direto Somar 1 no campo de endereço x’00002B40’ Ex. endereçamento Indireto Somar 1 no campo de endereço x’2000’ + x’0B40’ Obs.: (a) o campo a cujo conteúdo será somado 1 é, na verdade, o de endereço x’2B40’; o endereço foi dito de forma indireta: X’2000’ + x’0B40’ (b) observar que x’2000’ pode estar num lugar (num registrador, por exemplo), e o x’0B40’ em outro (outro registrador ou na memória)... Ex. endereçamento Indireto Somar 1 no campo de endereço x’2000’ + x’0B00’ + x’0040’ Obs.: (a) o campo a cujo conteúdo será somado 1 é, na verdade, o de endereço x’2B40’; o endereço foi dito de forma indireta: X’2000’ + x’0B00’ + x’0040’ (b) observar que x’2000’ pode estar num lugar (num registrador, por exemplo), e o x’0B00’ em outro (outro registrador, por exemplo) e x’0040’ em outro (na memória por exemplo)... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 14 Arquitetura – Alguns componentes Capacidade de endereçamento dos bytes de memória Tamanho de memória; quantos “bits” tem a CPU do Mainframe? Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 15 Arquitetura – Alguns componentes Capacidade de endereçamento dos bytes de memória Bus de Endereços = fazer referência aos endereços Para endereçar memória de até 64K, precisa de um bus de endereços de 16 bits. Para endereçar 16MB precisa de 24 bits, etc... Bus de dados = fazer transferência de dados entre componentes Para transferir de modo paralelo uma halfword, precisa de um bus de dados de 16 bits, para transferir uma fullword precisa 32 bits, etc... Transferência de dados Bus de dados CPU Memória Bus de endereços Referência a endereços de memória Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 16 Arquitetura – Alguns componentes “Set” de instruções da CPU – tipos e características Quantas e quais instruções a CPU tem em seu Instruction Set? Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 17 Arquitetura – Alguns componentes Execução de instruções pela CPU Qual o processo de execução das instruções? Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 18 Arquitetura – Alguns componentes Execução de instruções pela CPU – Processo genérico FETCH (CPU carrega a instrução da memória RAM para área interna da CPU; “problema”: instruções com tamanho variável) Decode = Análise (decodificação): qual o tamanho da instrução (se RISC não precisa), operação (errada? 0c1!), operandos, etc Erro? Passar o controle para o sistema operacional resolver Se OK, FETCH dos dados dos operandos Se estiverem na memória real, “tá” ótimo.; Senão... Validação do conteúdo dos operandos. Erro? Pode ser um 0C7, por exemplo Execução : em alguns casos (operações matemáticas, principalmente), colocar resultados em áreas temporárias da CPU OK? Se preciso, STORE do resultado na memória RAM Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 19 Arquitetura – Alguns componentes OUTROS componentes de arquitetura Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 20 Arquitetura – Alguns componentes OUTROS componentes de arquitetura Sistema de interrupções Quais podem ocorrer? Ex. Por tempo, por erro de programa (0Cx) Sub-sistemas de entrada e saída Como é a comunicação entre controladoras, devices, memória, CPU e tudo isso e o software? Sistema de proteção de memória Como um programa está protegido da invasão de outro? Sistema de memória virtual Qual o processo? Quais algoritmos de page-in e page-out? Interface/acesso com outros componentes do sistema Quais são os outros componentes? Controladoras, Clocks, etc Como eles se comunicam com a CPU? (por exemplo, CCW) Quais informações após um I/O o software recebe? Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 21 Arquitetura Mainframes IBM Arquitetura Mainframes IBM Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 22 Arquitetura Mainframes IBM Tributo A quem os mainframeiros devem os empregos ! Gene Myron Amdahl (1922-) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 23 Arquitetura Mainframes IBM Mainframes IBM : principais componentes da arquitetura CPU UAL GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7 GR8 GR9 GR10 GR11 GR12 GR13 GR14 GR15 16 Registradores Gerais (de ponto fixo) FPR0 FPR2 FPR4 FPR6 4 Registradores de ponto flutuante – 8 bytes cada PSW 1 Registrador especial de 8 bytes denominado PSW atual (Program Status Word) etc... (cache...) 4 bytes cada Memória (RAM) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 24 Arquitetura Mainframes IBM Mainframes IBM : principais componentes da arquitetura CPU UAL PSW cc epi PSW atual etc PSW atual : registrador especial com 8 bytes. 2 "campos" importantes: CONDITION CODE (*) : com 2 BITS, que indicam, 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 (*) Lembrar que isto NÃO É o RETURN CODE do sistema operacional / JCL, e nem o erroneamente chamado COND CODE do JCL (que é o teste do RETURN CODE) endereço da próxima instrução a ser executada (com 3 ou 4 bytes) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 25 Arquitetura Mainframes IBM Lay-out da PSW atual BC mode BYTE 0 BITS 0-5 = máscaras de canal BIT 6 = máscara para canais 6 e acima BIT 7 = máscara 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 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 26 Arquitetura Mainframes IBM Lay-out da PSW atual EC mode BYTE 0 BIT 0 = 0 BIT 1 = máscara de program-event recording BIT 2 = 0 BIT 3 = 0 BIT 4 = 0 BIT 5 = translation mode BIT 6 = máscara de I/O BIT 7 = máscara 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 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 27 Arquitetura Mainframes IBM Lay-out da PSW atual XA mode BYTE 0 BIT 0 = 0 BIT 1 = máscara de program-event recording BIT 2-4 = 000 BIT 5 = translation mode BIT 6 = máscara de I/O BIT 7 = máscara 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 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 28 Arquitetura Mainframes IBM Lay-out da PSW atual ESA mode BYTE 0 BIT BIT BIT BIT BIT BIT BYTE 1 BITS BIT BIT BIT BIT BYTE 2 BIT = 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 Sumário Pag.Ant. 0 1 2-4 5 6 7 8-11 12 13 14 15 16-17 Alberto Romano Schiesari – www.profars.com 29 Arquitetura Mainframes IBM Mainframes IBM : áreas “especiais” HALFWORD = área com 2 bytes e endereço múltiplo de 2 WORD ou FULLWORD = área com 4 bytes e endereço múltiplo de 4 DOUBLEWORD = área com 8 bytes e endereço múltiplo de 8 QUADWORD = área com 16 bytes e endereço múltiplo de 16 • • • • QW QW DW • • • DW FW HW • • • • • • FW • HW Sumário HW Pag.Ant. DW FW • HW HW • • FW • HW HW etc. FW • HW HW Alberto Romano Schiesari – www.profars.com 30 Arquitetura Mainframes IBM Mainframes IBM : interrupções por erro de programa (0Cx) Cod Razão 0001 0002 0003 0004 0005 0006 0007 OPERAÇÃO = O código de operação da instrução é inválido, isto é, não corresponde a nenhuma instrução executável. OPERAÇÃO PRIVILEGIADA = O programa tentou executar uma instrução privilegiada, isto é, que só pode ser executada em estado de supervisor. EXECUTE = Foi dada uma instrução Execute para outra instrução Execute. PROTEÇÃO = Uma instrução do programa tentou estragar uma área fora da sua partição. ENDEREÇAMENTO = Uma instrução do programa fez referência a endereço não existente. ESPECIFICAÇÃO = A instrução especificou algo errado, como, por exemplo, uma instrução que trabalhe com registradores de ponto flutuante, e especifique registrador 3, que não existe. DADOS = Os campos que uma instrução utiliza não estão no formato que deveriam estar. Sumário Pag.Ant. Cod 0008 0009 000A 000B 000C 000D 000E 000F Razão OVERFLOW DE PONTO FIXO = A instrução faz alguma operação com um registrador geral e nele não cabe o resultado. DIVISÃO DE PONTO FIXO = Divisão em binário, divisor 0. OVERFLOW DECIMAL = Numa operação entre campos em compactado, o campo de resultado não é suficientemente grande para conter o resultado. DIVISÃO DECIMAL = Divisão em compactado com divisor 0. OVERFLOW DE EXPOENTE = Para operações com números em ponto flutuante. UNDERFLOW DE EXPOENTE = Para operações com números em ponto flutuante. SIGNIFICÂNCIA = Para operações com números em ponto flutuante. DIVISÃO EM PONTO FLUTUANTE = Para operações em ponto flutuante. Alberto Romano Schiesari – www.profars.com 31 Arquitetura Mainframes IBM Mainframes IBM : endereçamento 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 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 32 Arquitetura Mainframes IBM Mainframes IBM : endereçamento Observar que, na realidade, TODOS os endereços aqui especificados são em “memória real”, como se estivessem num espelho refletindo o address space. Mas lembre-se que na vida real as coisas não são tão belas... Tente imaginar: era uma vez um reino onde para cada address space havia uma memória real exatamente igual... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 33 Arquitetura Mainframes IBM Base + Deslocamento Instruções para o Sr. Carteiro da Av. Marginal: Ir até o Restaurante Água Na Boca Andar mais 850 metros; então você chegou na casa onde o envelope deve ser entregue! Esta é a BASE, uma referência a partir da qual fica possível identificar o destino Andar mais = Deslocamento Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 34 Arquitetura Mainframes IBM Base + Deslocamento Número binário contido num Registrador Geral (nesta hora “apelidado” de registrador base) = + Número hexa de x’000’ até x’FFF’ (na instrução) “apelidado” de deslocamento Número hexadecimal que é o Endereço (na memória Real) Obs.: a caixinha tracejada indica que o número (endereço) NÃO ESTÁ num registrador geral e sim numa área interna da CPU !!! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 35 Arquitetura Mainframes IBM Base + Deslocamento : especificação (usa-se 2 bytes) x x x 3 y Registrador base x 5 D 0 Sumário 8 Pag.Ant. y Deslocamento x A x y C x D Registrador Base = 3 Deslocamento = 5AC Endereço = conteúdo do reg 3 + x’5AC’ Registrador Base = 13 (D) Deslocamento = 08D Endereço = conteúdo do reg D + x’08D’ Alberto Romano Schiesari – www.profars.com 36 Arquitetura Mainframes IBM Base + Deslocamento x x Registrador base y y x y Deslocamento Portanto: Deslocamento máximo = x’FFF’ = 4095 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 37 Arquitetura Mainframes IBM Base + Deslocamento – Exemplos Registrador Base : QUAL é Registrador Base : Conteúdo Deslocamento Endereço “direto” (seriam necessários 4 bytes para representar) Endereço indireto (Base e deslocamento : com 2 bytes pode ser representado) 4 4 00002000 00B2F02C B40 1A2 00002B40 00B2F1CE 4B40 41A2 15 00000000 DB4 00000DB4 FDB4 0 0046B28C 114 00000114 0114 O conteúdo do registrador zero NÃO É levado em consideração para cálculo de endereço !!! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 38 Arquitetura Mainframes IBM Base + Deslocamento : Dicas de utilização Usa-se para endereçar “endereços normais” O que são endereços “normais”? Cada pergunta! (aqueles que podem ser expressos por meio de uma expressão) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 39 Arquitetura Mainframes IBM Base + Deslocamento – Dicas de utilização O que é expressão? De novo! Cada pergunta! (veja mais adiante nas “cositas” do montador Assembler) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 40 Arquitetura Mainframes IBM Indexador + Base + Deslocamento Instruções para o Sr. Carteiro da Av. Marginal: Ir até o Restaurante Água Na Boca Andar mais 850 metros; então você chegou na vila Dentro da vila, andar mais 50 metros então você terá chegado à casa onde o envelope deve ser entregue! Andar mais 850 = Deslocamento Sumário Pag.Ant. Esta é a BASE, uma referência a partir da qual fica possível identificar o destino Andar mais 50 = Indexador Alberto Romano Schiesari – www.profars.com 41 Arquitetura Mainframes IBM Indexador + Base + Deslocamento Número binário contido num Registrador Geral (nesta hora “apelidado” de registrador indexador) = + Número binário contido num Registrador Geral (nesta hora “apelidado” de registrador base) + Número hexadecimal de x’000’ até x’FFF’ (na instrução) “apelidado” de deslocamento Número hexadecimal que é o Endereço (na memória Real) Obs.: a caixinha tracejada indica que o número (endereço) NÃO ESTÁ num registrador geral e sim numa área interna da CPU !!! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 42 Arquitetura Mainframes IBM Indexador + Base + Deslocamento : especificação (usa-se 21/2 bytes) x x x z x y Registrador Registrador Indexador base x x 7 x B 3 5 Sumário x 5 x A C x F Pag.Ant. A C y y Deslocamento Registrador Indexador = 7 Registrador Base = 3 Deslocamento = 5AC Endereço = conteúdo do reg 7 + conteúdo do reg 3 + x’5AC’ Registrador Indexador = 11 (B) Registrador Base = 5 Deslocamento = FAC Endereço = conteúdo do reg B + conteúdo do reg 5 + x’FAC’ Alberto Romano Schiesari – www.profars.com 43 Arquitetura Mainframes IBM Indexador + Base + Deslocamento : especificação (usa-se 21/2 bytes) x z x x Registrador Registrador Indexador base y y x y Deslocamento Portanto: Deslocamento máximo = x’FFF’ = 4095 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 44 Arquitetura Mainframes IBM Indexador + Base + Deslocamento – Exemplos Reg Index : QUAL é Reg Index : Conteúdo Reg Base : QUAL é Reg Base : Conteúdo Desloc Endereço “direto” (seriam necessários 4 bytes para representar) Endereço indireto (com 2 bytes e meio pode ser representado) 12 00100000 4 00002000 B40 00102B40 C4B40 0 00F4CAFE 10 000C8B00 1F0 000C8CF0 0A1F0 4 00007000 4 00007000 1A2 0000E1A2 441A2 15 00000000 12 00C42B06 002 00C42B08 FC002 O conteúdo do registrador zero NÃO É levado em consideração para cálculo de endereço !!! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 45 Arquitetura Mainframes IBM Indexador + Base + Deslocamento – Dicas de utilização Usa-se em geral para endereçar “endereços Anormais” O que são endereços “Anormais”? Segundo Gabriel o Pensador: por exemplo, Itens de tabela Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 46 Arquitetura Mainframes IBM Indexador + Base + Deslocamento – Dicas de utilização Um exemplo de endereçamento de itens de tabela AC AM BA Endereço inicial da tabela : Símbolo = TABUFS (transformado pelo montador em base + deslocamento) Sumário SC SP TO MT MS PB RS CE RN PA DF GO Endereço do item desejado (8o) = Endereço inicial da tabela + [ tamanho de 1 item * ( qtdd 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’ Endereço de TABUFS Indexador+base+deslocamento = X’17C0A’ Pag.Ant. Alberto Romano Schiesari – www.profars.com 47 Arquitetura Mainframes IBM Mainframes IBM : endereçamento X’00000000’ Memória de 256 bytes X’00000010’ X’00000020’ X’00000030’ X’00000040’ X’00000050’ X’00000060’ X’00000070’ X’00000080’ X’00000090’ X’000000A0’ X’000000B0’ X’000000C0’ X’000000D0’ X’000000E0’ X’000000F0’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 48 Arquitetura Mainframes IBM Mainframes IBM : endereçamento X’00000000’ X’00000010’ * X’00000020’ X’00000030’ X’00000040’ X’00000050’ X’00000060’ NúmeroX’00000070’ contido no registrador base indica o byte *. X’00000080’ Se o endereço que se deseja referenciar é x’00000048’: X’00000090’ X’000000A0’ 12 for usado como base e tiver, por exemplo x’00000000’, Se o registrador quanto X’000000B0’ deve-se “andar” (deslocar) para, a partir do byte indicado no registrador base, chegar ao byte desejado? X’000000C0’ X’000000D0’ R: x’048’ = deslocamento (linha azul tracejada) X’000000E0’ X’000000F0’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 49 Arquitetura Mainframes IBM Mainframes IBM : endereçamento X’00000000’ X’00000010’ Número contido no registrador base indica o byte X’00000020’ *. X’00000030’ Se o endereço que se deseja referenciar é x’000000E8’: X’00000040’ Se o registrador 12 for usado como base e tiver, por exemplo x’000000A0’, X’00000050’ quanto deve-se “andar” (deslocar) para, a partir do byte indicado no X’00000060’ registrador base, chegar ao byte desejado? X’00000070’ R: x’048’ = deslocamento (linha azul tracejada) X’00000080’ X’00000090’ X’000000A0’ X’000000B0’ * X’000000C0’ X’000000D0’ X’000000E0’ X’000000F0’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 50 Arquitetura Mainframes IBM Mainframes IBM : endereçamento Byte de endereço x’00000048’ : Base C (conteúdo x’00000000’) + Deslocamento x’048’ Lembrar que DESLOCAMENTO MÁXIMO = x’FFF’ Ou seja O registrador C, enquanto tiver x’00000000’ como conteúdo, só consegue ser usado como base para fazer referência aos endereços desde x’00000000’ até x’00000FFF’. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 51 Arquitetura Mainframes IBM Mainframes IBM : endereçamento DESLOCAMENTO MÁXIMO = x’FFF’ Se uma instrução precisar endereçar 2 campos: O de endereço x’00000048’ e o de endereço x’00001CB0’, na hora em que ela for executada, precisa de MAIS DO QUE UM REGISTRADOR BASE preparado convenientemente. Pode-se, por exemplo, Ter o registrador C com o conteúdo x’00000000’, e Ter outro registrador (o D, por exemplo) com o conteúdo x’00001000’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 52 Arquitetura Mainframes IBM Mainframes IBM : endereçamento DESLOCAMENTO MÁXIMO = x’FFF’ O registrador base C (12) endereça o primeiro campo C048 Base C (com conteúdo x’00000000’ + Deslocamento x’048’ O registrador base D (13) endereça o segundo campo DCB0 Base D (com conteúdo x’00001000’ + Deslocamento x’CB0’ NÃO TEM JEITO DE numa única instrução, neste caso, usar só um registrador base. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 53 Arquitetura Mainframes IBM Mainframes IBM : endereçamento Então, “ao mesmo tempo”, dá para usar no máximo 15 registradores base (lembrar que o zero, mesmo se especificado, tem o conteúdo desprezado para o cálculo de endereços). Isso significa no máximo (4K * 15) = 60K endereçáveis Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 54 Arquitetura Mainframes IBM Mainframes IBM : endereçamento Usando (quase) todos os registradores como registradores base, NÃO SOBRA NENHUM (além do zero) ! Cuidado ! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 55 Arquitetura Mainframes IBM Mainframes IBM : endereçamento Só isso? E se o programa for maior? Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 56 Arquitetura Mainframes IBM Mainframes IBM : endereçamento Uma alternativa: Pensar em quais serão os bases do programa inteiro. Por exemplo: R3, R4, R5, R6 e R7 São 5 registradores, o que permite endereçar (5 x 4K) = 20K no máximo Num trecho de 20K, carregar os bases com um conteúdo e usar coisas só desse trecho. Em outro trecho de 20K, carregar os bases com outro conteúdo e usar coisas só desse novo trecho e assim por diante. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 57 Arquitetura Mainframes IBM Mainframes IBM : endereçamento Memória de 60K bytes Programa 0K Sumário 4K 8K 12K 16K 20K 24K 28K 32K 36K 40K 44K 48K 52K 56K R3 com x’00000000’ R3 com x’00005000’ R3 com x’0000A000’ R4 com x’00001000’ R4 com x’00006000’ R4 com x’0000B000’ R5 com x’00002000’ R5 com x’00007000’ R5 com x’0000C000’ R6 com x’00003000’ R6 com x’00008000’ R6 com x’0000D000’ R7 com x’00004000’ R7 com x’00009000’ R7 com x’0000E000’ Pag.Ant. Alberto Romano Schiesari – www.profars.com 58 Arquitetura Mainframes IBM Uso de registradores : idéia / sugestão / dica Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 59 Arquitetura Mainframes IBM Uso de registradores : idéia / sugestão / dica Reg Uso 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 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 60 Arquitetura Mainframes IBM Registradores : idéia / sugestão / dica Reg Uso 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 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 61 Representação de dados Representação de dados Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 62 Representação de dados Representação de dados Dados alfanuméricos Representação em formato caracter, padrão EBCDIC Dados numéricos Representação em formato binário ponto fixo (operações aritméticas em registradores ou memória) Representação em formato binário ponto flutuante (operações aritméticas em registradores ou memória) Representação em formato decimal compactado (operações aritméticas em memória) Representação em formato decimal zonado (não permite operações aritméticas) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 63 Representação de dados alfanuméricos Dados alfanuméricos Representação em formato caracter, padrão EBCDIC Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 64 Representação de dados alfanuméricos Representação em formato caracter, padrão EBCDIC 1 byte por caracter Ex.: representar palavra “ALBERTO” A L B E R T O C1 D3 C2 C5 D9 E4 D6 1100 0001 1101 0011 1100 0010 1100 0101 1101 1001 1110 0100 1101 0110 Para efeito de comparação, em ASCII é A L B E R T O 41 4C 42 45 52 54 4F 0100 0001 0100 1100 0100 0010 0100 0101 0101 0010 0101 0100 0100 1111 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 65 Representação de dados alfanuméricos Representação em formato caracter, padrão EBCDIC 1 byte por caracter Ex.: representar palavra “Alberto” A l b e r t o C1 93 82 85 99 A4 96 1100 0001 1001 0011 1000 0010 1000 0101 1001 1001 1010 0100 1001 0110 Para efeito de comparação, em ASCII é A 1 b e r t o 41 6C 62 65 72 74 6F 0100 0001 0110 1100 0110 0010 0110 0101 0111 0010 0111 0100 0110 1111 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 66 Representação de dados numéricos Dados numéricos Formatos: - Decimal zonado ou - Decimal compactado ou - Binário de ponto fixo ou - Binário de ponto flutuante Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 67 Representação de dados numéricos Representação em formato DECIMAL ZONADO 1 byte por algarismo, máximo 16 bytes = máximo 16 algarismos Cada byte : à esquerda (parte de zona) = x’F’ à direita (parte numérica) = algarismo Último byte à direita : à esquerda (parte de zona) = sinal número positivo ou zero : x’F’ ou x’C’ número negativo : x’D’ IMPORTANTE !!! 1 Este formato não permite efetuar operações aritméticas, é somente para receber dados (entrada de terminal ou outros meios) ou para formatar saída (terminal, impressão ou outros meios). 2 A máquina só trabalha esses números como números INTEIROS. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 68 Representação de dados numéricos Representação em formato DECIMAL ZONADO F1 F2 F3 Representação do número 123 1111 0001 1111 0010 F1 1111 0011 F2 D3 Representação do número -123 1111 0001 1111 0010 1101 0011 Atenção !!! : se for impresso (ou visualizado em caracter) esta configuração aparece como a letra “L” Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 69 Representação de dados numéricos Representação em formato DECIMAL ZONADO Representação do número 123 em um campo de 5 bytes F0 F0 F1 F2 F3 1111 0000 1111 0000 1111 0001 1111 0010 1111 0011 Representação do número -123 em um campo de 5 bytes F0 F0 F1 F2 D3 1111 0000 1111 0000 1111 0001 1111 0010 1101 0011 Atenção !!! : se for impresso (ou visualizado em caracter) esta configuração aparece como a letra “L” Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 70 Representação de dados numéricos Representação em formato DECIMAL COMPACTADO ½ byte por algarismo, ½ byte para o sinal (ver adiante) Máximo 8 bytes = máximo 15 algarismos Último byte à direita : à direita (parte numérica) = sinal número positivo ou zero : x’F’ ou x’C’ número negativo : x’D’ IMPORTANTE !!! 1 Este formato faz operações aritméticas somente em campos de memória (não faz em registradores, nos quais operações aritméticas somente são feitas em binário) 2 A máquina só trabalha esses números como números INTEIROS. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 71 Representação de dados numéricos Representação em formato DECIMAL COMPACTADO 02 0000 0010 3F 0011 1111 Número 23 : precisa 2 bytes 02 0000 0010 Número - 23 : precisa 2 bytes 02 0000 0010 3C 0011 1100 3D 0011 1101 Atenção !!! : se for impresso (ou visualizado em caracter) estas configurações poder aparecer como “outros” caracteres Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 72 Representação de dados numéricos Representação em formato DECIMAL COMPACTADO 12 0001 0010 3F 0011 1111 Representação do número 123 12 0001 0010 Representação do número -123 12 0001 0010 3C 0011 1100 3D 0011 1101 Atenção !!! : se for impresso (ou visualizado em caracter) estas configurações poder aparecer como “outros” caracteres Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 73 Representação de dados numéricos Representação em formato DECIMAL COMPACTADO Número 123 num campo de 5 bytes 00 00 00 12 3C 0000 0000 0000 0000 0000 0000 0001 0010 0011 1100 Número - 123 num campo de 5 bytes 00 00 00 12 3D 0000 0000 0000 0000 0000 0000 0001 0010 0011 1101 Atenção !!! : se for impresso (ou visualizado em caracter) estas configurações poder aparecer como “outros” caracteres Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 74 Representação de dados numéricos Representação em formato BINÁRIO PONTO FIXO Só usa campos com tamanho fixo : ou 2 bytes (1 bit para sinal + 15 bits para número) ou 4 bytes (1 bit para sinal + 31 bits para número) ou 8 bytes (1 bit para sinal + 63 bits para número) A quantidade de algarismos (nos números decimais equivalentes) depende do número representado (VER TABELA NO PRÓXIMO SLIDE) Primeiro BIT à esquerda = sinal número positivo ou zero : 0 ; número negativo : 1 MAS... Se positivo, é o próprio número binário representado Se negativo, o número binário representado é o complemento dele para a próxima potência de 2 (ver adiante) IMPORTANTE !!! 1 Este formato faz operações aritméticas entre registradores ou entre registrador e campo de memória (NÃO FAZ SÓ EM CAMPOS DE MEMÓRIA, precisa ter registrador envolvido) 2 A máquina só trabalha esses números como números INTEIROS. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 75 Representação de dados numéricos Representação em formato BINÁRIO PONTO FIXO Qtdd de bytes Ordem de grandeza Exemplo de uso 2 Milhares (32K) Idade pessoa, contador de linhas -32.768 a 32.767 4 Bilhões (2G) Salário, Código de peça, Código de cliente -2.147.483.648 a 2.147.483.647 8 Quintilhões (9Exa) Receitas de empresas, População mundial, distâncias astronômicas Sumário Pag.Ant. Faixa de números inteiros decimais que podem ser representados, se for “quantidade” -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Alberto Romano Schiesari – www.profars.com 76 Representação de dados numéricos Representação em formato BINÁRIO PONTO FIXO Exemplo de números e complementos: Número +123 em binário = 1111011 Número –123 em binário = ...1111111111111111111111110000101 Por quê? 000000100 - 000000001 ----------000000011 4 - 1 ----3 000000011 - 000000001 ----------000000010 3 -1 ----2 000000010 - 000000001 --------000000001 2 1 ----1 000000001 - 000000001 ----------000000000 1 - 1 ----0 000000000 - 000000001 ----------111111111 0 - 1 -----1 111111111 - 000000001 ----------111111110 -1 - 1 -----2 111111110 - 000000001 ----------111111101 -2 - 1 -----3 110000110 - 000000001 ----------110000101 -122 - 1 -----123 Sumário Pag.Ant. Etc... Etc... Alberto Romano Schiesari – www.profars.com 77 Representação de dados numéricos Binário Ponto Fixo Como converter um número decimal negativo para binário? Converter o número positivo correspondente para binário (considerar somente os dígitos significativos) Inverter os dígitos: 1 torna-se 0 e 0 torna-se 1 Somar 1 Preencher à esquerda com 1’s até completar uma halfword, fullword ou doubleword Exemplo: supor o número decimal –123; +123 é 1111011 Converter o número positivo correspondente para binário 1111011 Inverter: 1 torna-se 0 e 0 torna-se 1 0000100 Somar 1 0000100 + 1 ------0000101 preencher à esquerda com 1’s para completar uma halfword, fullword ou doubleword 1111111110000101 F F 8 1111.1111.1111.1111 1111.1111.1000.0101 F F 8 5 1111.1111.1111.1111.1111.1111.1111.1111.1111.1111 1111.1111.1000.0101 F F F F F F F F F F F F 8 5 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 78 Representação de dados numéricos Binário Ponto Fixo Como converter um número binário negativo para decimal? Subtrair de X’....FFFFFF’ (o número X’...F’ maior que o número a converter) Somar 1; o resultado é o número desejado , mas POSITIVO. Converta-o para negativo. Exemplo: supor X’FFE8’ Subtrair FFFF - FF85 ---007A Somar 1 007A 1 ---007B X’7B’ é o hexadecimal equivalente ao decimal 123. Portanto, o número desejado é o decimal -123 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 79 Representação de dados numéricos Representação em formato BINÁRIO PONTO FIXO Representação Em (halfword) 00000000 01111011 X’007B’ do número 123 Em (fullword) 00000000 00000000 00000000 01111011 X’0000007B’ Em (doubleword) 00000000 00000000 00000000 00000000 00000000 00000000 00000000 01111011 X’000000000000007B’ Atenção !!! : as configurações dos bytes, se visualizado em caracter, podem aparecer como “outros” caracteres Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 80 Representação de dados numéricos Representação em formato BINÁRIO PONTO FIXO Representação Em (halfword) 11111111 10000101 X’FF85’ do número -123 Em (fullword) 11111111 11111111 11111111 10000101 X’FFFFFF85’ Em (doubleword) 11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000101 X’FFFFFFFFFFFFFF85’ Atenção !!! : as configurações dos bytes, se visualizado em caracter, podem aparecer como “outros” caracteres Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 81 Representação de dados numéricos Representação em formato BINÁRIO PONTO FLUTUANTE Sorry... Não é escopo deste curso... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 82 Representação de instruções Representação de INSTRUÇÕES Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 83 Representação de instruções Principais formatos de instruções RR = 2 bytes RX = 4 bytes RS = 4 bytes SI = 4 bytes SS = 6 bytes 2 bytes : códigos de operação entre x’00’ e x’3F’ (b’0000 0000’ a b‘0011 1111’) 4 bytes : códigos de operação entre x’40’ e x’BF’ (b’0100 0000’ a b‘1011 1111’’) 6 bytes : códigos de operação entre x’C0’ e x’FF’ (b’1100 0000’ a Sumário Pag.Ant. b‘1111 1111’) Alberto Romano Schiesari – www.profars.com 84 Representação de instruções Principais formatos de instruções RR – (em princípio) 2 operandos, ambos em registradores RX – 2 operandos: 1 em registrador 1 em memória : especificação de endereço indicando Indexador + [ Base + Deslocamento ] RS – 3 operandos, 2 em registradores e 1 em memória 2 registradores (pode ser um “range”/faixa) 1 em memória : especificação de endereço indicando [ Base + Deslocamento ] SI – 2 operandos, ambos em memória 1 em memória imediata = 1 único byte que é parte da própria instrução (ou seja, não precisa especificar endereço) 1 em memória : especificação de endereço indicando [ Base + Deslocamento ] SS – 2 operandos, ambos em memória Ambos com especificação de endereço indicando [ Base + Deslocamento ] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 85 Representação de instruções Principais formatos de instruções RR – (em princípio) 2 operandos, ambos em registradores código operação CO 0 5 Sumário E Pag.Ant. x Registrador 1o. operandox R1 Registrador 2o. operandox x R2 Código de operação = X’05’ F Registrador 1o operando = X’E’ (registrador 14) Registrador 2o operando = X’F’ (registrador 15) Alberto Romano Schiesari – www.profars.com 86 Representação de instruções Principais formatos de instruções RX – 2 operandos: 1 em registrador e 1 em memória : especificação de endereço indicando Indexador + [ Base + Deslocamento ] código operação CO 4 Registrador 1o. operandox R1 5 E Registrador Indexador do 2o. operandox x x X2 0 Base + Deslocamento do 2o. operando B2 3 D2 C D2 2 x x D2 8 Código de operação = X’45’ ; Registrador 1o operando = X’E’ (registrador 14) ; Registrador Indexador do 2o operando = registrador X’0’ (registrador 0); Registrador base do 2o operando = registrador X’3’ (registrador 3); Deslocamento do 2o operando = X’C28’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 87 Representação de instruções Principais formatos de instruções RS – 3 operandos, 2 em registradores e 1 em memória 2 registradores (pode ser um “range”/faixa) 1 em memória : especificação de endereço indicando [ Base + Deslocamento ] código operação CO 9 Registrador 1o. operandox R1 8 E Registrador 3o. operandox x x R3 C Base + Deslocamento do 2o. operando B2 D D2 0 D2 0 x x D2 0 Código de operaçao = X’98’ ; Registrador 1o operando = registrador X’E’ (registrador 14) ; Registrador 3o operando = registrador X’C’ (registrador 12); Registrador base do 2o operando = registrador X’D’ (registrador 13); Deslocamento do 2o operando = X’000’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 88 Representação de instruções Principais formatos de instruções SI – 2 operandos, ambos em memória 1 em memória imediata = 1 único byte que é parte da própria instrução 1 em memória : especificação de endereço indicando [ Base + Deslocamento ] código operação Operando Imediato Base + Deslocamento do 1o. operando (2o. Operando) x CO 9 B1 I2 2 5 x C 5 D1 6 D1 D x x D1 2 Código de operação = X’92’ ; 2o operando (operando imediato) = X’5C’ ; Registrador base do 1o operando = registrador X’5’ (registrador 5); Deslocamento do 1o operando = X’6D2’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 89 Representação de instruções Principais formatos de instruções SS – 2 operandos, ambos em memória; 1 único tamanho especificado (vale para os 2 operandos). Endereços especificados na forma [ Base + Deslocamento ] código operação Tamanho dos 2 operandos Base + Deslocamento Base + Deslocamento do 1o. operando do 2o. operando -1 CO L x x B1 D1 D1 D1 x B2 D2 D2 D2 x D 2 4 F 3 B 9 4 6 F 2 A Código de operação = X’D2’ ; Tamanho para os 2 operandos = X’4F’ (80 bytes); Registrador base do 1o operando = X’3’ (registrador 3); Deslocamento do 1o operando = X’B94’; Registrador base do 2o operando = X’6’ (registrador 6); Deslocamento do 2o operando = X’F2A’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 90 Representação de instruções Principais formatos de instruções SS – 2 operandos, ambos em memória; 2 tamanhos especificados, 1 para cada operando. Endereços especificados na forma [ Base + Deslocamento ] código operação Tamanho 1o. Operando - 1 CO L1 Tamanho 2o. Operando - 1 L2 x x Base + Deslocamento Base + Deslocamento do 1o. operando B1 D1 do 2o. operando D1 D1 x B2 D2 D2 D2 x F 8 4 0 3 7 7 E 4 D 6 2 Código de operação = X’F8’ ; Tamanho do 1o operando = X’4’ (5 bytes) ; Tamanho do 2o operando = X’0’ (1 byte); Registrador base do 1o operando = X’3’ (registrador 3); Deslocamento do 1o operando = X’77E’; Registrador base do 2o operando = X’4’ (registrador 4); Deslocamento do 2o operando = X’D62’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 91 Representação de instruções Exercício EP301 Somente veja o resultado aqui depois de tentar resolver Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 92 Linguagem Assembler LINGUAGEM ASSEMBLER Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 93 Fluxo do montador SYSLIB SYSIN Macros/Copys Fonte SYSUT1 LOADER IEV90 Work SYSPUNCH SYSGO SYSPRINT Objeto Objeto List SYSIN SYSLIN SYSLIB Control stmts Objeto Outras entradas SYSUT1 IEWL Work SYSPRINT List Sumário Storage Pag.Ant. LINKLIB SYSLMOD Executável Alberto Romano Schiesari – www.profars.com 94 Jeitão de um programa Assembler Jeitão de um programa Assembler Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 95 Jeitão de um programa Assembler Pode ser assim... Programa Instruções Áreas LOAD POINT = ENTRY POINT Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 96 Jeitão de um programa Assembler Ou assim... Programa Áreas Instruções LOAD POINT Sumário ENTRY POINT Pag.Ant. Alberto Romano Schiesari – www.profars.com 97 Jeitão de um programa Assembler Assim também... Programa I A I A I A I LOAD POINT = ENTRY POINT Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 98 Jeitão de um programa Assembler Até com o estilo da casa da sogra... Programa I A I A I A I A I A I A I A I LOAD POINT = ENTRY POINT Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 99 Jeitão de um programa Assembler Ou da sogra da casa... Programa A I A I A I A I A I A I A I A ENTRY POINT LOAD POINT Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 100 Jeitão de um programa Assembler Lembrar que um programa reentrante pode ser assim... Programa P1 Instruções de P1 ( manipulando A1, e, concorrentemente ou paralelamente, manipulando A2, manipulando A3, etc... manipulando An) + A1 A2 A3 .... An O programa P1 na verdade é : Instruções de P1 Sumário Pag.Ant. Áreas de P1 (ou A1 ou A2 ou etc) Alberto Romano Schiesari – www.profars.com 101 Jeitão de um programa Assembler O que deu para perceber a respeito da estrutura de um programa em Assembler? Pode ser de qualquer jeito ! Se não mandar desviar, ele vai tentar executar uma área como se fosse instrução... É a arquitetura de von Newman... Veja... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 102 Statement STATEMENT Assembler Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 103 Statement Posição Posições Posições Posições Posição Posições 1 : Se tiver *, statement inteiro é comentário 1 a 8: Símbolo 10 a 14: Código da Instrução 16 a 71: Operandos e Comentários 72: Indicador de Continuação 73 a 80: Identificação e Sequência 123456789012345678901234567890123456789012345678901234567890123456789012 Continuação * ESTE STATEMENT TODINHO EH UM COMENTARIO COMPLETA MVC ARIMP,=CL133'b' COMENTARIO = LIMPAR ARIMP OI *+5,X’F0’ COMENTARIO = FORCE BRANCH AQUI EQU * WMENSAGE DC C’AJK001A – OPEN PARA ARQUIVO SEM O DEVIDO STATEMENT DD – NO JCL. ACORDE E PROVIDENCIE!.’ ISTO TAMBEM EH COMENTARI Símbolo Instrução Sumário Operandos e Comentários Pag.Ant. Alberto Romano Schiesari – www.profars.com 104 Statement Começando a sentir o cheirinho do jeitão do Assembler... INIT TITLE 'ROTINA DE INICIALIZACAO' SEGINIT DFHEIENT CODEREG=7,DATAREG=(10,11),EIBREG=9 BEGIN B BEGIN SALTA CONSTANTES DC C'5785-XAW COPYRIGHT IBM BRASIL 1985' DC CL17'***SEGINIT,1.0***' DC CL24'***ULT.MANUT.23/10/90***' EXEC CICS ADDRESS CWA(R13) L R12,DFHEICAP ENDERECA INICIO DA COMMAREA ST R13,TWSVCWA SALVA ENDERECO DA CWA LA R2,TWAREA ENDERECO DO INICIO DA COMMAREA LA R3,JREND ENDERECO DO FIM DA COMMAREA SR R3,R2 TAMANHO DA COMMAREA STH R3,TWLENGTH EM TWLENGTH SPACE 2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 105 Statement + Cheirinho (amarelo = Instr, azul = áreas, branco = comandos ao montador) ... COPY COVER CWA DSECT USING *,R13 COPY CWAREA COPY TADSECT COMMAREA DSECT USING *,R12 COPY TWAREA DFHEISTG DSECT DFHEISTG DFHEIEND EJECT T131 TITLE 'TABELA DE TRANSACOES DE SERAG - NUMERO 131' SPACE 2 SEG131 DFHEIENT CODEREG=(7,9),DATAREG=(10,11),EIBREG=5 B BEGIN SALTA CONSTANTES DC C'5785-XAW COPYRIGHT IBM BRASIL 1985' DC CL16'***SEG131,3.2***' DC CL24'***ULT.MANUT.19/07/2001*' BEGIN L R12,DFHEICAP ENDERECO DA COMMAREA L R8,TWSVTERM ENDERECO DA AREA DE TERMINAIS L R13,TWSVCWA ENDERECO DA CWA 00000130 00000140 00000150 00000160 00000170 00000180 00000190 00000200 00000210 00000220 00000230 00000240 00000250 00000260 00000270 00000280 00000290 00000300 00000320 00000330 00000340 volta pro jeitão ... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 106 Statement + Cheirinho (amarelo = Instr, azul = áreas, branco = comandos ao montador) ... * ================================================================== * * LOGICA COMUM PARA LOCALIZAR UMA ENTRADA NA TABELA DE TRANSACOES * * ================================================================== * LA R2,TRLT TRLTLOOK CLI 0(R2),X'FF' FIM DA TABELA ? BE ERRO TRLT NAO ESTA NA TABELA CLC TWDBL(6),0(R2) CODIGO TRANSACAO ESTA NA TABELA ? BE TRL0100 SIM SR R15,R15 LIMPA REGISTRADOR 15 IC R15,40(R2) BYTE DE COMPRIMENTO DA ENTRADA N R15,=F'127' ELIMINA BIT DE MAIS ALTA ORDEM-X'7F' AR R2,R15 INCREMENTA POINTER DA TABELA B TRLTLOOK E PESQUISA NOVAMENTE TRL0100 MVC TWTRLT,0(R2) MOVE TRLT PARA TWA EXIT EXEC CICS RETURN ERRO LA R2,25 -CODIGO ERRADOOI TWSW,X'01' LIGA SWITCH DE CANCELAMENTO LA R3,7 TAMANHO DA WORKAREA DE MENSAGENS LA R1,TWMSG ENDERECO WORKAREA DE MENSAGENS STC R2,0(R1) MOVE NUM.MENSAGEM PARA WORKAREA B EXIT RETORNA LTORG Sumário Pag.Ant. 00000360 00000370 00000410 00000420 00000430 00000440 00000450 00000460 00000470 00000480 00000490 00000500 00000510 00000520 00000530 00000540 00000550 00000560 00000570 00000580 00000590 00000600 Alberto Romano Schiesari – www.profars.com 107 Statement + Cheirinho (amarelo = Instr, azul = áreas, branco = comandos ao montador) ... * ================================================================== * 00000620 * TRANSACOES VALIDAS * 00000630 * ================================================================== * 00000640 TRLT TRLT CODE=000301, X00001540 TIT='CHEQUE SACADO ', X00001550 MAPN='NAO', X00001560 PTCM=01, X00001570 SPEC=14, X00001580 MNEM='CHS' 00001590 TRLT CODE=000302, X00001600 TIT='SAQUE AVULSO ', X00001610 MAPN='NAO', X00001620 PTCM=02, X00001630 SPEC=14, X00001640 MNEM='SAV' 00001650 END SEG131 00009330 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 108 Montador Assembler Umas “cositas” do montador Assembler Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 109 Montador Assembler “Cosita” 1 = Location Counter Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 110 Montador Assembler Location Counter : há 1 para cada Section (Control e Dummy) É um contador que começa com x’00000000’ e vai sendo - Incrementado cada vez que se aloca memória (por declaração de variável ou de instrução, por exemplo) - Alterado quando é pedido explicitamente por meio de um comando ao montador Assembler que o afete (ex.: ORG) 00000 000000 001000 000000 000400 000410 000420 000422 000424 00042C 000434 00043A 000440 000446 00044C Sumário 00000 3400 3410 400040165000502C 6000604270007058 D20F D215 D22B D241 D257 Pag.Ant. 3400 4000 5000 6000 7000 3410 4016 502C 6042 7058 00400 01000 02000 03000 04000 00410 01016 0202C 03042 04058 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 BLOCO1 A B * * EQU DS ORG DS DS DS . DC DC DC DC . MVC MVC MVC MVC MVC * CL4096 BLOCO1 CL1024 CL16 CL16 . S(A) S(B) S(C,D,E,F) S(G,H,I,J) . A,B C,D E,F G,H I,J Alberto Romano Schiesari – www.profars.com 111 Montador Assembler “Cosita” 2 = “Listagem gerada (algumas das coisas listadas também fazem parte do programa-objeto) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 112 Montador Assembler External Symbol Dictionary : Lista de elementos que devem ser tratados pelo Linkage Editor e Loader EXTERNAL SYMBOL DICTIONARY SYMBOL TYPE ID ADDR LENGTH LD ID FLAGS PROGDEMO SD 0001 000000 000AF3 00 FORA ER 0002 Z LD 000844 0001 SUBROT ER 0003 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 113 Montador Assembler Listagem do programa LOC 00003B 000042 00004A 000052 OBJECT CODE ADDR1 ADDR2 C1D3C2C5D9E3D6 C1D3C2C5D9E3D65C C1D3C2C5D9E3C9D5 C8D6 000054 C1D3C2C5D9E3D6 00005B C1D3C2C5D9E3D65C 000063 C1D3C2C5D9E3C9D5 Sumário Pag.Ant. 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 * VOU RESTAURAR O DEFAULT 55 PRINT NODATA 56 DC CL7'ALBERTO' 57 DC CL8'ALBERTO*' 58 DC CL10'ALBERTINHO' 59 *----------------------------------60 * PRINT ON/OFF Alberto Romano Schiesari – www.profars.com 114 Montador Assembler Relocation Dictionary : mais trabalho para o Linkage Editor e o Loader RELOCATION DICTIONARY POS.ID REL.ID FLAGS 0001 0001 0C 0001 0001 08 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 04 Sumário Pag.Ant. ADDRESS 000070 0001B9 000860 000864 000868 00086C 000874 0008A4 0008A8 000A46 Alberto Romano Schiesari – www.profars.com 115 Montador Assembler Cross Reference / Symbol Table : vai sendo montada a cada passo de montagem, a cada vez que surge um statement com um label (símbolo). CROSS REFERENCE Símbolos (labels) Sumário SYMBOL AAALIN ANO ARIMP A1 A11 A12 A13 A2 A3 A4 A5 BYTE BYTEON CAMPO CAMPO COCIENTE DATA . . LEN VALUE DEFN 00001 000A68 0272 00002 000AE6 0319 00133 0001C0 0130 00004 000848 0220 00001 000878 0231 00001 000879 0232 00001 000881 0233 00004 00084C 0221 00004 000854 0222 00004 000858 0223 00004 00085C 0224 ****UNDEFINED**** 00001 000000FF 0085 00001 00008A 0091 00001 00000000 0321 00012 00000074 0082 00006 000AE2 0316 REFERENCES 0297 0129 0229 0231 0232 0233 0230 0225 0226 0227 0261 0262 0263 0285 0092 ****DUPLICATE**** 0256 Endereços Atributo de tamanho Pag.Ant. Alberto Romano Schiesari – www.profars.com 116 Montador Assembler Se você usa um símbolo que vai ser convertido para endereço BASE + DESLOCAMENTO e a conversão não for possível (o montador não conseguir fazer): ADDRESSABILITY ERROR = Falta de registrador Base para esse endereço. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 117 Montador Assembler Diagnósticos 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 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 118 Montador Assembler “Cosita” 3 = Expressões Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 119 Montador Assembler EXPRESSÕES Conjunto de termos que tem um valor e que eventualmente pode ser convertido em um endereço. Se for convertido o formato será base + deslocamento. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 120 Montador Assembler EXPRESSÕES Podem ser compostas por: - Símbolos - Termos auto-definidos (decimal, binário, caracter ou hexadecimal) - Atributos de tamanho - Referência ao Location Counter - Operadores aritméticos ( + - * / ) - Parênteses pareados Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 121 Montador Assembler EXPRESSÕES Exemplos Expressão O valor resultante corresponde a LPOUP primeiro byte à esquerda de LPOUP (Supor endereço de LPOUP = x’000A000C’; o valor da expressão LPOUP é x’000A000C’) Esta expressão : somente 1 termo: 1 símbolo [LPOUP] LPOUP+0 primeiro byte à esquerda de LPOUP (Supor endereço de LPOUP = x’000A000C’; o valor da expressão LPOUP+0 é x’000A000C’) Esta expressão : 2 termos: 1 símbolo [LPOUP] e 1 termo auto-definido (decimal) [0] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 122 Montador Assembler EXPRESSÕES Expressão O valor resultante corresponde a LPOUP+3 quarto byte de LPOUP (Supor endereço de LPOUP = x’000A000C’; o valor da expressão LPOUP+3 é x’000A000F’) Esta expressão : 2 termos: 1 símbolo [LPOUP] e 1 termo auto-definido (decimal) [3] LPOUP+15 16o. byte de LPOUP (Supor endereço de LPOUP = x’000A000C’; o valor da expressão LPOUP+15’ é x’000A001B’) Esta expressão : 2 termos: 1 símbolo [LPOUP] e 1 termo auto-definido (decimal) [15] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 123 Montador Assembler EXPRESSÕES Expressão O valor resultante corresponde a LPOUP+B’1111’ 16o. byte de LPOUP (Supor endereço de LPOUP = x’000A000C’; o valor da expressão LPOUP+B’1111’’ é x’000A001B’) Esta expressão : 2 termos: 1 símbolo [LPOUP] e 1 termo auto-definido (binário) [B’1111’] LPOUP+C’F’ 199o. byte de LPOUP (Supor endereço de LPOUP = x’000A000C’; o valor da expressão LPOUP+C’F’’ é x’000A00D2’) Esta expressão : 2 termos: 1 símbolo [LPOUP] e 1 termo auto-definido (caracter) [C’F’] Lembre que C’F’ = X’C6’ X’000A000C’ + X’C6’ = X’000A00D2’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 124 Montador Assembler EXPRESSÕES Expressão O valor resultante corresponde a WAREA+50+X’100’+B’1100’+C’ ’ 383o. byte de WAREA (Supor endereço de WAREA = x’000A000C’; o valor da expressão WAREA+50+X’100’+B’1100’+C’ ‘ é x’000A018A’) Esta expressão : 5 termos: 1 símbolo [WAREA] 1 termo auto-definido (decimal) [50] 1 termo auto-definido (hexadecimal) [X’100’] 1 termo auto-definido (binário) [B’1100’] 1 termo auto-definido (caracter) [C’ ‘] Obs.: Decimal 50 = X’32’; B’1100’ = X’C’ ; C’ ‘ (espaço) = X’40’ X’32’ + X’100’ + X’C’ + X’40‘ = X’17E’ = decimal 382 X’000A000C’ X’32’ + X’100’ + X’C’ + X’40’ = X’000A018A’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 125 Montador Assembler EXPRESSÕES Expressão O valor resultante corresponde a WAREA+L’WAREA 1o. byte depois de (toda) WAREA Esta expressão : 2 termos: 1 símbolo (WAREA) e 1 atributo de tamanho [L’WAREA] WAREA+1 1o. byte depois do inicio de WAREA (2o. byte de WAREA) Esta expressão : 2 termos: 1 símbolo (WAREA) e 1 termo decimal auto-definido [1] WAREA+L’WAREA-1 último byte de WAREA Esta expressão : 3 termos: 1 símbolo (WAREA) e 1 atributo de tamanho [L’WAREA] 1 termo decimal auto-definido [1] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 126 Montador Assembler EXPRESSÕES Expressão O valor resultante corresponde a WAREA+L’FIXDLEN+1000 Esta expressão : 3 termos: 1 símbolo (WAREA) + 1 atributo de tamanho [L’FIXDLEN] + 1 termo auto-definido (decimal) [1000] Supor que WAREA é composta por uma área denominada FIXDLEN + uma área de tamanho 1000 bytes. O valor da expressão WAREA+L’FIXDLEN +1000 corresponde ao primeiro byte após toda a área WAREA ( WAREA + tamanho de FIXDLEN + 1000) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 127 Montador Assembler EXPRESSÕES Expressão O valor resultante corresponde a L’WATERM1+L’WATERM2+L’WATERM3 Esta expressão : 3 termos: 3 atributos de tamanho [L’WATERM1, L’WATERM2, L’WATERM3] tamanho da area WATERM1 + tamanho da area WATERM2 + tamanho da area WATERM3 Supondo que o tamanho de WATERM1 seja de 1000 bytes, o tamanho de WATERM2 seja de 2000 bytes, e o tamanho de WATERM3 seja 3000 bytes (tamanho total = 6000 bytes [decimal] ou X’1770’ em hexadecimal) O valor da expressão L’WATERM1+ L’WATERM2+ L’WATERM3 é X’1770’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 128 Montador Assembler EXPRESSÕES Expressão O valor resultante corresponde a *+1 byte seguinte onde está o loc. Counter Esta expressão : 2 termos: 1 referência ao Location Counter (*) + 1 termo auto-definido (decimal) [1] *+L’WAREA endereço que está no location counter + x bytes (x = tamanho WAREA) Esta expressão : 2 termos: 1 referência ao Location Counter (*) + 1 atributo de tamanho [L’WAREA] L’COMUM+L’REGTIP1 Tamanho de comum + tamanho de REGTIP1 Esta expressão : 2 termos: 2 atributos de tamanho [L’COMUM, L’REGTIP1] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 129 Montador Assembler “Cosita” 4 = Referências explícitas e implícitas Nos operandos Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 130 Montador Assembler Referências explícitas e implícitas Registradores: sempre referenciados explicitamente AR LR LR LR LR Sumário 1,6 R5,R14 5,14 R5,14 5,R14 Pag.Ant. Sacanagem... Sacanagem... Alberto Romano Schiesari – www.profars.com 131 Montador Assembler Referências explícitas e implícitas Memória: referenciada explicitamente ou implicitamente Instruções RX : Referência explícita: op reg1,d2(x2,b2) L 14,12(13) L R14,12(R13) SE TIVER EQUATES ST 7,96(8) ST 7,96(R8) SE TIVER O EQU DO R8 Referência implícita: or op op L L ST ST Sumário Pag.Ant. reg1,expressão2 (assume indexador = 0) reg1,expressão2(index2) 14,SAVE14 14,SAVEAREA+12 7,WSALVA(7) 7,WSAVAREA+(7*4) Alberto Romano Schiesari – www.profars.com 132 Montador Assembler Referências explícitas e implícitas Memória: referenciada explicitamente ou implicitamente Instruções RS : Referência explícita: op reg1,reg3,desloc2(base2) LM 14,12,12(13) STM 7,11,0(R12) Referência implícita: op reg1,reg3,expressão2 LM 14,12,SAVEAREA+12 STM 14,12,SARVA Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 133 Montador Assembler Referências explícitas e implícitas Memória: referenciada explicitamente ou implicitamente Instruções SI : Referência explícita: op desloc1(base1),imediato2 MVI 10(R12),C’*’ XI 0(15),X’FF’ OI 15(R8),X’80’ Referência implícita: op expressão1,imediato2 MVI FLAGS+77,C’*’ XI TOGGLE,X’FF’ OI PRINTED,X’80’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 134 Montador Assembler Referências explícitas e implícitas Memória: referenciada explicitamente ou implicitamente Instruções SS/L : Referência implícita: op expressão1, expressão2 (assume tamanho do 1o operando) * * * MVC ARIMP+77,C’*’ T-A-K-E C-A-R-E!!! ACHO QUE NÃO EH ISSO !!! MVC ARIMP+77,=C’*’ NEM ISSO !!! MVC ARIMP+77(1),=C’*’ AH! ACHO QUE EH ISSO !!! CLC AGENTCOD,CODWANT (tamanho implícito = tamanho de AGENTCOD) CLC IVSAM(3),CODWANT (tamanho = 3 = explicitamente indicado) CLC IVSAM+68(3),CODWANT (tamanho = 3 = explicitamente indicado) CLC IVSAM+68,CODWANT (tamanho implícito = tamanho de IVSAM) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 135 Montador Assembler Referências explícitas e implícitas Memória: referenciada explicitamente ou implicitamente Instruções SS/L : Referência explícita: op desloc1(tamanhoambos,base1),desloc2(base2) MVC CLC CLC CLC CLC Sumário 0(18,7),=C’ERROR’ AGENTCOD,25(14) AGENTCOD+33,25(14) AGENTCOD+33(2),25(14) 3(22,8),7(15) Pag.Ant. (tamanho = 18 = explicitamente indicado) (tamanho assumido = tamanho de AGENTCOD) (tamanho assumido = tamanho de AGENTCOD) (tamanho = 2= explicitamente indicado) (tamanho = 22 = explicitamente indicado) Alberto Romano Schiesari – www.profars.com 136 Montador Assembler Referências explícitas e implícitas Memória: referenciada explicitamente ou implicitamente Instruções SS/L1-L2 : Referência implícita: op expressão1, expressão2 (Tamanho assumido para o 1o operando = tamanho do 1o operando; Tamanho assumido para o 2o operando = tamanho do 2o operando) AP ZAP AP MP MP Sumário Pag.Ant. COUNTLIN,=P’1’ TOTVAL,=P’0’ BIGTOT,SUBTOT WNUM,=P’12’ WNUM+44(3),=P’12’ Alberto Romano Schiesari – www.profars.com 137 Montador Assembler Referências explícitas e implícitas Memória: referenciada explicitamente ou implicitamente Instruções SS/L1-L2 : Referência explícita: op desloc1(tamanho1,base1),desloc2(tamanho2,base2) AP ZAP AP MP Sumário Pag.Ant. 0(4,3),=P’1’ 17(16,12),=P’0’ BIGTOT,127(2,5) WNUM+44(8),222(3,R6) Alberto Romano Schiesari – www.profars.com 138 Montador Assembler Instruções: - Instruções ou comandos ao montador - Instruções de máquina - Macro-instruções Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 139 Montador Assembler Instruções ou comandos ao montador - Definição de áreas: DC, DS, CCW, CCW0, CCW1 - Seccionamento de um Programa e Ligação: START, CSECT, DSECT, DXD, CXD, COM, ENTRY, EXTRN, WXTRN - Controle de Registradores Base: USING, DROP -Controle da listagem: TITLE, EJECT, SPACE, PRINT - Controle de programa: ICTL, ISEQ, PUNCH, REPRO, ORG, EQU, OPSYN, PUSH, POP, LTORG, CNOP, COPY, END, LOCTR, AMODE, RMODE - Definição de macro-instrução: AREAD, MACRO, MEXIT, MEND - Montagem condicional (normalmente usadas para elaborar macro-instruções): ACTR, AGO, AIF, ANOP, GBLA, GBLB, GBLC, LCLA, LCLB, LCLC, MHELP, MNOTE, SETA, SETB, SETC Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 140 Montador Assembler Instruções de máquina (algumas) - Movimento memória-memória : MVC, MVZ, MVN, MVI, MVO, ZAP, MVCL, PACK, UNPK, MVCI - Movimento de dados de registrador para memória : ST, STH, STM, STC, STCM, CVD - Movimento de dados de memória para registrador : L, LH, LM, IC, ICM, CVB - Movimento de dados de registrador para registrador : LR, LPR, LNR, LCR, LTR - Aritméticas em memória com campos compactados : AP, SP, MP, DP, SRP - Aritméticas com registradores : AR, SR, MR, DR, ALR, SLR - Aritméticas com registradores e memória : A, S, M, D, AH, SH, MH, AL, SL - Comparação : CP, CLC, CLI, CLCL, C, CH, CL, CLM, CR, CLR - Desvio : BC, BCR - Controle de loop : BCT, BCTR, BXH, BXLE - Edição : ED, EDMK - Tradução e teste de bytes : TR, TRT - Shift em registradores : SLL, SRL, SLDL, SRDL, SLA, SRA, SLDA, SRDA - Álgebra booleana : N, O, X, NR, OR, XR, NI, OI, XI, NC, OC, XC - Carga e desvio : BALR, BAL, BAS, BASR, BASSM, BSM - Outras instruções : LA, TM, EX, SVC, MC, SPM, IPM, STCK, TS, CS, CDS Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 141 Montador Assembler Macro-instruções Da instalação (por ex.) EXTENSO, etc... Da IBM (do sistema operacional, métodos de acesso) DCB (para declaração datasets – arquivos) OPEN, CLOSE, GET, PUT, READ, WRITE GETMAIN, FREEMAIN, ATTACH, DETACH etc... Da IBM (específicas CICS, DB2, etc...) DFHMSD, DFHMDF, etc... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 142 Comandos ao Montador Comandos ao montador Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 143 Comandos ao montador Comandos Assembler (ordem alfabética) AMODE DROP ISEQ RMODE CCW DS LOCTR SPACE CCW0 DSECT LTORG START CCW1 DXD OPSYN TITLE CNOP EJECT ORG USING COM END POP WXTRN COPY ENTRY PRINT CSECT EQU PUNCH CXD EXTRN PUSH DC ICTL REPRO Estes não estão no escopo deste curso): AREAD, MACRO, MEXIT, MEND ACTR, AGO, AIF, ANOP, GBLA, GBLB, GBLC, LCLA, LCLB, LCLC, MHELP, MNOTE, SETA, SETB, SETC Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 144 Comandos ao montador Comandos ao montador (por grupo) -Controle de entrada e de listagem: TITLE, EJECT, SPACE, PRINT, PUNCH, REPRO, ICTL, ISEQ - Seccionamento e ligação de programa: START, END, CSECT, DSECT, COM, - Controle de registrador(es) base: USING, DROP, POP, PUSH - Manipulação direta do Location Counter : ORG, EQU, CNOP, LOCTR - Uso de objetos externos ou uso externo de objetos internos: ENTRY, EXTRN, WXTRN, DXD, CXD - Diversos: AMODE, RMODE, COPY, OPSYN - Declaração de literais: LTORG - Definição de áreas: DC, DS, CCW, CCW0, CCW1 - Definição de macro instruções: AREAD, MACRO, MEXIT, MEND - Montagem condicional (normalmente usado para elaborar macro-instruções): ACTR, AGO, AIF, ANOP, GBLA, GBLB, GBLC, LCLA, LCLB, LCLC, MHELP, MNOTE, SETA, SETB, SETC Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 145 Comandos ao montador - AMODE AMODE (Adressing Mode - Modo de endereçamento) Este comando é utilizado para especificar ao montador Assembler o modo de endereçamento a ser associado a uma Control Section. O seu formato é: [símbolo] AMODE n n podendo ser 24 ou 31 ou ANY. O símbolo é opcional. Se omitido, o modo de endereçamento será associado à Control Section sem nome que deve existir no programa. Se especificado, 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. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 146 Comandos ao montador - AMODE AMODE (Adressing Mode - Modo de endereçamento) Os defaults para AMODE e RMODE quando só um deles (ou nenhum) é especificado são os seguintes: Especificado Assumido nenhum AMODE 24 AMODE 31 AMODE ANY RMODE 24 RMODE ANY AMODE RMODE RMODE RMODE AMODE AMODE Sumário 24 24 24 24 24 31 Pag.Ant. e RMODE 24 Comandos Alberto Romano Schiesari – www.profars.com 147 Comandos ao montador – CCW’s CCW / CCW0 / CCW1 (Channel Command Word) Sorry. Não faz parte do escopo deste curso. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 148 Comandos ao montador -CNOP CNOP (Conditional Nop - Nop Condicional) O comando CNOP alinha o Location Counter para uma halfword. 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 fullword ou da doubleword deve ser posicionado o Location Counter. b - Pode ser 4 ou 8. Indica se o campo deve ser uma fullword ou doubleword. Ex: CNOP • • 0,8 0,4 Sumário 2,4 • • Pag.Ant. 2,8 2,4 Comandos • • 4,8 0,4 • • 6,8 2,4 Alberto Romano Schiesari – www.profars.com 149 Comandos ao montador - COM COM (Blank Common Control Section) Este comando identifica e aloca uma CSECT que seja uma área de memória comum a mais de uma CSECT (CSECT compartilhada). Ela pode ser referenciada por módulos independentes e carregada como um único programa, Não admite símbolo nem operandos. Somente uma COM é permitida em cada programa, embora possa haver diversos comandos COM, o primeiro deles indicando o início (primeiro “pedaço”) da COM, e os demais indicando sua(s) continuação(ões). Sintaxe: COM Exemplo: CSPRG START . . COM DS DS . . END A B Sumário Pag.Ant. 0 CL3 CL4 Comandos Alberto Romano Schiesari – www.profars.com 150 Comandos ao montador - COPY 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 Sumário Pag.Ant. EQUREG Comandos Alberto Romano Schiesari – www.profars.com 151 Comandos ao montador - CSECT CSECT (Control Section - Seção de Controle) O comando CSECT identifica o início ou a continuação de uma Control Section. [símbolo] CSECT O comando CSECT não admite operandos. Se o símbolo for colocado, ele dará nome à CSECT. Os comandos e instruções que forem colocados após o comando CSECT farão parte dela, até que seja colocado um outro comado CSECT ou DSECT. Diversos comandos CSECT com o mesmo símbolo podem aparecer num programa. O primeiro dará o nome à CSECT e os outros identificarão sua continuação. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 152 Comandos ao montador - CSECT CSECT (Control Section - Seção de Controle) PROG1 CSECT . . . END É o mesmo que PROG1 START . . . END (Em ambos os casos) há um Location Counter (para a section PROG1). Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 153 Comandos ao montador - CSECT CSECT (Control Section - Seção de Controle) PROG1A PROG1B PROG1B START . . CSECT . . CSECT . . END Há um Location Counter para a seção PROG1A, outro para a PROG1B, e um terceiro para a PROG1C. É o mesmo que PROG1A PROG1B PROG1B CSECT . . CSECT . . CSECT . . END Há um Location Counter para a seção PROG1A, outro para a PROG1B, e um terceiro para a PROG1C. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 154 Comandos ao montador - CSECT CSECT (Control Section - Seção de Controle) A B C A C CSECT . . CSECT . . CSECT . . CSECT . . CSECT . CSECT CSECT CSECT 1 A B C = = = 1 2 3 + 4 + 5 2 3 4 5 END Há um Location Counter para a seção PROG1A, outro para a PROG1B, e um terceiro para a PROG1C. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 155 Comandos ao montador - CSECT CSECT (Control Section - Seção de Controle) O slide anterior mostra situação semelhante a esta: A B C A C START . . CSECT . . CSECT . . CSECT . . CSECT . CSECT CSECT CSECT 1 A B C = = = 1 2 3 + 4 + 5 2 3 4 5 END Há um Location Counter para a seção PROG1A, outro para a PROG1B, e um terceiro para a PROG1C. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 156 Comandos ao montador - CXD CXD (Control Section) O comando CXD define uma fullword. O Linkage Editor (ou o Loader) colocará nesta full-eord o tamanho de todas as DSECTS externas especificadas nos programas-fonte (sendo linkeditados ou carregados) e que usam as DSECTs. Sintaxe: simbolo CXD Operandos não são permitidos. Exemplo: TOTALLEN Sumário CXD Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 157 Comandos ao montador - DC DC (Define Constant) Veja descrição detalhada Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 158 Comandos ao montador - DROP 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. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 159 Comandos ao montador - DS DS (Define Storage) Veja descrição detalhada Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 160 Comandos ao montador - DSECT DSECT (Dummy Section - Seção Simulada) O comando DSECT define uma Control Section que é montada, mas que não fará parte do programa-objeto. Uma DSECT serve, por exemplo, para se descrever o lay-out de uma área, sem que para isso seja preciso definí-la. O seu formato é: símbolo DSECT O comando DSECT não admite operandos. O símbolo dará nome à DSECT. Pode haver diversos comandos DSECT com o mesmo símbolo num programa. O primeiro dará nome à DSECT e os seguintes identificarão a sua continuação. A interrupção de uma DSECT é feita através de outro comando DSECT com símbolo diferente, ou de comando CSECT. Exemplo: Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 161 Comandos ao montador - DSECT DSECT (Dummy Section - Seção Simulada) CSN1 START . . DSECT DS DS DS DS CSECT . . END DSN1 A B C D CSN1 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. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 162 Comandos ao montador - DXD DXD (Define Dummy External – Definir Seção Dummy externa) O comando DXD define uma DSECT externa. Sintaxe: símbolo DXD operando O símbolo deve ser referenciado como operando numa constante tipo Q. Corresponde ao endereço do primeiro byte da DSECT externa, e seu atributo de tamanho é 1. O operando tem a mesma sintaxe que um comando DS. O Assembler calcula a quantidade de memória e o alinhamento necessário para a DSECT externa, baseado na área especificada como operando. Exemplo: CONST DISPLAC Sumário DXD . . DC 5F Q(CONST) Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 163 Comandos ao montador - EJECT 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. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 164 Comandos ao montador - END END (Fim) O comando END deve ser o último statement de um programa fonte. O seu formato é: END [Símbolo] Símbolo é o símbolo dado à primeira instrução do programa a ser executado. Ex: END Sumário Pag.Ant. INICIO Comandos Alberto Romano Schiesari – www.profars.com 165 Comandos ao montador - ENTRY 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. PROG1 ROTINA Sumário START . . EQU . . ENTRY END Pag.Ant. 0 PROG2 * CONST ROTINA Comandos START . . DC . . EXTRN END 0 A(ROTINA) ROTINA Alberto Romano Schiesari – www.profars.com 166 Comandos ao montador - EQU 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. Se B for omitido, assume tamanho do primeiro termo (ou único) da esquerda da expressão: --- Se for uma referência ao Location Counter (*), um termo auto-definido ou uma referência a um atributo de tamanho (L'x), assume 1. --- Se for um símbolo usado como símbolo num DC ou DS, assume o atributo de tamanho do símbolo --- Se for um símbolo usado numa instrução de máquina, assume o tamanho da instrução (2,4 ou 6 Bytes) --- Se for um símbolo usado num comando ao montador (exceto DC, DS e CCW) assume 1. 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. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 167 Comandos ao montador - EQU EQU (Equate - Igualar) Ex: R5 ... EQU LA 5 R5,TABLE Normalmente usa-se colocar EQU dos números (endereços) dos registradores com símbolos (por ex. R0 a R15 para os registradores gerais e FP0 etc para os de ponto flutuante para “forçar” com que as referências a eles sejam listadas na cross-reference produzida pelo montador. INST EQU * LA R13,SAVEAREA É frequentemente usado ao invés de INST LA R13,SAVEAREA Observe que o endereço provavelmente é o mesmo: o conteúdo do location counter tem o mesmo valor em ambos os casos, a menos que no primeiro caso haja uma definição de área com quantidade ímpar de bytes. A escolha do uso do EQU é apenas por questões de “elegância”. Veja que no EQU o atributo de tamanho do símbolo INST é 1, e usando o símbolo na instrução LA o atributo é 4 (tamanho da instrução LA). Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 168 Comandos ao montador - EQU EQU (Equate - Igualar) Ex: OFF ON PAGOU EQU EQU EQU X'00' X'FF' X'80' Este tipo de uso do EQU é comum devido ao fato de os símbolos aparecerem na listagem da cross-reference. Se usarmos os símbolos ao invés de valores nas instruções que manipulam máscaras, por exemplo, é fácil achar (via cross-reference) quais as instruções que manipulam as máscaras; se usarmos os termos auto-definidos, a cross-reference não lista as referências. NI OI TM FLAGUSOU,OFF FLAGERR,ON FLAGPAG,PAGOU RESTAURA INDICADOR DE USO MARCA COMO ERRADO TESTA SE PAGOU NI OI TM FLAGUSOU,X’00’ FLAGERR,X’FF’ FLAGPAG,X’80’ RESTAURA INDICADOR DE USO MARCA COMO ERRADO TESTA SE PAGOU Ao invés de Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 169 Comandos ao montador - 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. * ROTINA EH DEFINIDA AQUI EM PROG1 PROG1 START 0 . . ROUTINE EQU * . . ENTRY ROUTINE END Sumário Pag.Ant. Comandos * ROTINA EH REFERENCIADA AQUI EM PROG2 PROG2 START 0 . . CONST DC A(ROUTINE) . . EXTRN ROUTINE END Alberto Romano Schiesari – www.profars.com 170 Comandos ao montador - ICTL ICTL (Input Control - Controle de Entrada) Pelo que foi visto na sintaxe dos statements assembler: --- 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 ICTL ICTL a a,b a,b,c ou ou 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. ICTL Sumário Pag.Ant. 4,70,71 Comandos Alberto Romano Schiesari – www.profars.com 171 Comandos ao montador - ISEQ 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. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 172 Comandos ao montador - LOCTR LOCTR (Multiple Location Counters) 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: 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. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 173 Comandos ao montador - LOCTR LOCTR (Multiple Location Counters) PROGRAMA PGM1 X AREA1 AREA2 PGM1 Y TAB1 TAB2 PGM1 X AREA11 AREA12 PGM1 Loc.Counter Ativo CSECT . . . LOCTR DS DS LOCTR . . . LOCTR DS DS LOCTR . . . LOCTR DC DC LOCTR LTORG END Sumário CL80 CL4 CL10000 CL20000 C'*' F'0' Pag.Ant. PGM1 PGM1 PGM1 PGM1 X X X PGM1 PGM1 PGM1 PGM1 Y Y Y PGM1 PGM1 PGM1 PGM1 X X X PGM1 PGM1 Comandos pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço pedaço 1 1 1 1 1 1 1 2 2 2 2 1 1 1 3 3 3 3 2 2 2 4 4 OBJETO GERADO CSECT PGM1 (com “7 pedaços”) PGM1 = (pedaço (pedaço (pedaço (pedaço (pedaço (pedaço (pedaço 1 2 3 4 1 2 1 do do do do do do do loc loc loc loc loc loc loc counter counter counter counter counter counter counter PGM1) PGM1) PGM1) PGM1) X) X) Y) Alberto Romano Schiesari – www.profars.com + + + + + + 174 Comandos ao montador - LTORG 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. Devido a isso, você pode encontrar em alguns programas 2 LTORGS, um após o outro: o primeiro para alinhar e descarregar (declarar) as literais, e o segundo apenas para efetuar o alinhamento (neste caso poderia ser substituído por um CNOP 0,8 ou um DS 0D. Este comando não tem símbolo nem operandos. Ex: LTORG LTORG , DECLARING LITERALS LTORG , ALIGNMENT Observe que nestes dois últimos exemplos, para inserir os comentários, é obrigatório colocar as vírgulas para indicar a ausência de operandos. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 175 Comandos ao montador - LTORG LTORG 000476 0000 0000 0000 00000 00000 59 IEV044 *** ERROR *** UNDEFINED SYMBOL 00047C D241 6000 B021 03000 00021 60 000482 D257 7000 B02C 04000 0002C 61 000488 D20A B037 B042 00037 00042 62 63 * 00048E 41C0 7FFF 04FFF 64 000492 0000 0000 00000 65 IEV034 *** ERROR *** ADDRESSABILITY ERROR 000496 0000 0000 00000 66 IEV034 *** ERROR *** ADDRESSABILITY ERROR 00049A 58C0 34A8 004A8 67 00049E D20F 3400 34AC 00400 004AC 68 69 * 0004A8 70 0004A8 00005000 71 0004AC 5C 72 73 * 0004AD 00 0004AE D20F 3400 40E4 00400 010E4 74 0004B4 0000 0000 00000 75 IEV034 *** ERROR *** ADDRESSABILITY ERROR 0004B8 58C0 40E0 010E0 76 Sumário Pag.Ant. Comandos MVC E,DSEKCOP3 MVC MVC MVC . LA LA G,DSEKCPO4 I,DSEKCPO5 DSEKCPO6,DSEKCPO7 . 12,Z-1 12,Z+1 LA 12,Z L MVC . LTORG . 12,=A(Z) A,=C'*' . , =A(Z) =C'*' . MVC LA A,=C'*' 12,Z L 12,=A(Z) Alberto Romano Schiesari – www.profars.com 176 Comandos ao montador - OPSYN OPSYN (Operation Synonim) 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 Sumário Pag.Ant. MVC Comandos Alberto Romano Schiesari – www.profars.com 177 Comandos ao montador - ORG ORG O comando ORG tem por função alterar o conteúdo do Location Counter, colocando nele o valor da expressão especificada como operando do ORG. O seu formato é o seguinte: símbolo ORG [expressão] Se não for colocado o seu operando, será colocado no Location Counter o maior conteúdo que ele já teve. Ex: OBS:- os símbolos usados como operandos do ORG devem ter sido definidos antes do ORG. Loc.Counter ANTES . . . 0AB84C 0AB94C 0AB93C 0AB946 . Loc.Counter DEPOIS . . . 0AB94C TABNUM 0AB93C 0AB946 0AB94C . Sumário Pag.Ant. . . . DC ORG DC ORG . Comandos 256X'FF' TABNUM+240 10X'00' Alberto Romano Schiesari – www.profars.com 178 Comandos ao montador - POP POP O comando POP restaura o estado de PRINT e USING salvos pelo comando PUSH. Pode-se especificar num dos 4 formatos: Sumário POP PRINT POP USING POP PRINT,USING POP USING,PRINT Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 179 Comandos ao montador - PRINT PRINT (Imprimir) 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 OFF GEN NOGEN DATA NODATA - A listagem é fornecida A listagem não é fornecida As instruções geradas por macro-instruções devem ser listadas. As instruções geradas por macro-instruções não devem ser listadas. As áreas definidas terão todo o seu conteúdo listado. As áreas definidas terão somente os 8 primeiros Bytes seus listados. PRINT OFF,DATA Enquanto não for colocado um comando PRINT no programa, será assumido PRINT ON,GEN,NODATA Pode haver tantos comandos PRINT no programa quantos se desejar. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 180 Comandos ao montador - PUNCH PUNCH 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 1 pos 3 pos 9 pos 11 pos 14 Sumário Pag.Ant. ' a a a a a CATALR 2 8 10 13 80 Comandos : : : : : MOD' brancos CATALR brancos MOD brancos Alberto Romano Schiesari – www.profars.com 181 Comandos ao montador - PUSH PUSH O comando PUSH salva o estado atual de PRINT e USING. Pode-se especificar num dos 4 formatos: PUSH PUSH PUSH PUSH Sumário Pag.Ant. PRINT USING PRINT,USING USING,PRINT Comandos Alberto Romano Schiesari – www.profars.com 182 Comandos ao montador - REPRO REPRO 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 Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 183 Comandos ao montador - RMODE RMODE (Residence Mode - Modo de residência) Este comando é utilizado para especificar ao montador Assembler o modo de residência a ser associado a uma Control Section. O seu formato é: [símbolo] RMODE n n podendo ser 24 ou ANY. O símbolo é opcional. Se ele estiver ausente, o modo de residência será associado à Control Section sem nome que deve existir no programa. Se o símbolo estiver presente, o modo de residência será associado à Control Section que tiver nome igual ao especificado no símbolo. O operando indica qual modo de residência deve ser associado à Control Section; pode ser 24 (residência de 24 bits, isto é, a CSECT deve ficar abaixo dos 16 MB) ou ANY (residência de 24 ou de 31 bits, isto é, a CSECT pode ficar tanto abaixo quanto acima dos 16 MB). Não pode haver dois ou mais RMODE para uma mesma Control Section. O comando RMODE pode estar em qualquer lugar do programa. RMODE ANY é incompatível com AMODE 24. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 184 Comandos ao montador - RMODE RMODE (Residence Mode - Modo de residência) Os defaults para AMODE e RMODE quando só um deles (ou nenhum) é especificado são os seguintes: Especificado Assumido nenhum AMODE 24 AMODE 31 AMODE ANY RMODE 24 RMODE ANY AMODE RMODE RMODE RMODE AMODE AMODE Sumário 24 24 24 24 24 31 e Pag.Ant. RMODE 24 Comandos Alberto Romano Schiesari – www.profars.com 185 Comandos ao montador - SPACE 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 Sumário Pag.Ant. 3 Comandos Alberto Romano Schiesari – www.profars.com 186 Comandos ao montador - START 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. Exemplos: PROG1 START X'308' START 10240 OBS: - Se o comando START não for colocado, é assumido Sumário Pag.Ant. Comandos START 0. Alberto Romano Schiesari – www.profars.com 187 Comandos ao montador - TITLE TITLE (Cabeçalho) 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. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 188 Comandos ao montador - USING 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. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 189 Comandos ao montador - WXTRN 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 Sumário Pag.Ant. MOD Comandos Alberto Romano Schiesari – www.profars.com 190 Declaração de áreas Declaração de áreas Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 191 Declaração de áreas DC = define área COM conteúdo (aloca memória, coloca o conteúdo, atribui nome, tamanho e tipo) DS = define área SEM conteúdo (aloca memória, atribui nome, tamanho e tipo a ela) Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 192 Declaração de áreas O que significa alocar área sem conteúdo em um programa? (pode ser o DS em Assembler, ou um campo declarado sem VALUE em Cobol. Executável Memória LOADER ??????????? ??????????? Instruções Áreas com conteúdo (DC) Áreas sem conteúdo (DS) Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 193 Declaração de áreas Sintaxe geral: Ad = atributo de duplicação: quantas áreas definir Tipo = tipo de conteúdo (só para atribuição de tamanho e conteúdo inicial; nunca é feita nenhuma validação ou processamento específico em função dessa especificação) At = atributo de tamanho Ci = conteúdo inicial [nome] DC [ad]tipo[at]ci [nome] DS [ad]tipo[at][ci] Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 194 Declaração de áreas Exemplos: [nome] DC [ad]tipo[at]ci SEPARAT1 * DC 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 Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 195 Declaração de áreas Exemplos: [nome] DS [ad]tipo[at][ci] 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 Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 196 Declaração de áreas DC - Define Constant Área COM conteúdo inicial Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 197 Declaração de áreas Tipos de conteúdo TIP O Tamanho assumido Alinhamento Tamanhos Válidos Constantes p/operando Sentido preench Completa com Trunca à Caracteres Válidos Cada caractere C suficiente byte 1 a 256 uma E->D brancos D qualquer 1 byte X suficiente byte 1 a 256 várias D->E X’0’ E 0aF ½ byte B suficiente byte 1 a 256 várias D->E B’0’ E 0e1 1 bit F 4 bytes FullWord 1a8 várias D->E (1) E +-0a9 (2) (4) H 2 bytes HalfWord 1a8 várias D->E (1) E +-0a9 (3) (4) P suficiente Byte 1 a 16 várias D->E X’0’ E +-0a9 ½ byte (5) Z suficiente Byte 1 a 16 várias D->E C’0’ E +-0a9 1 byte D 8 bytes DoubleWord 1a8 várias -x- -x- -x- +-0a9 -x- A 4 bytes FullWord 1a4 várias E->D B’0’ E expressão -x- Y 2 bytes HalfWord 1a2 várias E->D B’0’ E expressão -x- S 2 bytes HalfWord 2 várias -x- -x- -x- expressão -x- OBS:- (1) 0's se o número for positivo; 1's se o numero for negativo (2) O 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 Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 198 Declaração de áreas – DC tipo C DC tipo C (caracter) [nome] Sumário DC Pag.Ant. [ad]C[at]ci Comandos Alberto Romano Schiesari – www.profars.com 199 Declaração de áreas – DC tipo C Cada caracter especificado no conteúdo inicial ocupa um byte (em 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 (e será indicado erro). 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. DC DC DC DC DC DC DC DC DC DC Sumário Pag.Ant. Comandos 1CL1'*' 2CL1'*' CL1'*' CL2'*' 2CL2'*' C'ABC' CL1'ABC' C'A&&B' C'ZE''S' C'''' 5C 5C5C 5C 5C40 5C405C40 C1C2C3 C1 C150C2 E9C57DE2 7D Alberto Romano Schiesari – www.profars.com 200 Declaração de áreas – DC tipo X DC tipo X (hexadecimal) [nome] Sumário DC Pag.Ant. [ad]X[at]ci Comandos Alberto Romano Schiesari – www.profars.com 201 Declaração de áreas - 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. DC DC DC DC DC DC Sumário Pag.Ant. Comandos 1XL1'0B' 3X'5C' XL3'5C' XL2'AB0C14' X'1A2' X'00A,B,5A8' 0B 5C5C5C 00005C 0C14 01A2 000A0B05A8 Alberto Romano Schiesari – www.profars.com 202 Declaração de áreas - DC tipo B DC tipo B (binário) [nome] Sumário DC Pag.Ant. [ad]B[at]ci Comandos Alberto Romano Schiesari – www.profars.com 203 Declaração de áreas - 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. DC DC DC DC DC DC Sumário Pag.Ant. Comandos BL1'0' BL2'010001001' B'0101' BL2'1' 2B'1' B'1,00101,001' 00 0089 05 0001 0101 010501 Alberto Romano Schiesari – www.profars.com 204 Declaração de áreas - DC tipo F DC tipo F (fullword) [nome] Sumário DC Pag.Ant. [ad]F[at]ci Comandos Alberto Romano Schiesari – www.profars.com 205 Declaração de áreas - 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 não for colocado atributo de tamanho, será feito alinhamento para o próximo endereço múltiplo de 4, antes da alocação da área. Se for colocado o atributo de tamanho, não será feito o alinhamento. Aceita múltiplas definições por constante. DC DC DC DC Sumário Pag.Ant. F'138' F'+138' F'-138' F'4,392' Comandos 0000008A 0000008A FFFFFF76 0000000400000188 Alberto Romano Schiesari – www.profars.com 206 Declaração de áreas - DC tipo H DC tipo H (halfword) [nome] Sumário DC Pag.Ant. [ad]H[at]ci Comandos Alberto Romano Schiesari – www.profars.com 207 Declaração de áreas - DC tipo H O número desejado deve ser colocado em decimal. O montador irá converte-lo para binário e colocá-lo na halfword. 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 não for colocado atributo de tamanho, será feito alinhamento para o próximo endereço múltiplo de 2, antes da alocação da área. Se for colocado o atributo de tamanho, não será feito o alinhamento. Aceita múltiplas definições por constante. DC DC DC DC Sumário Pag.Ant. H'138' H'+138' H'-138' H'4,392' Comandos 008A 008A FF76 00040188 Alberto Romano Schiesari – www.profars.com 208 Declaração de áreas - DC tipo P DC tipo P (Packed - compactado) [nome] Sumário DC Pag.Ant. [ad]P[at]ci Comandos Alberto Romano Schiesari – www.profars.com 209 Declaração de áreas - 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. DC DC DC DC DC DC DC DC Sumário Pag.Ant. P'122' P'10' P'-345,45,21.6,7' P'0' P'+66' PL3'1' PL2'43556' 3P'1' Comandos 122C 010C 345D045C216C7C 0C 066C 00001C 556C 1C1C1C Alberto Romano Schiesari – www.profars.com 210 Declaração de áreas - DC tipo Z DC tipo Z (zonado) [nome] Sumário DC Pag.Ant. [ad]Z[at]ci Comandos Alberto Romano Schiesari – www.profars.com 211 Declaração de áreas - 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. 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. DC DC DC DC DC DC Sumário Z'122' Z'-345,45' Z'+66' ZL3'1' ZL2'43556' 3Z'1' Pag.Ant. Comandos F1F2C2 F3F4D5F4C5 F6C6 F0F0C1 F5C6 C1C1C1 Alberto Romano Schiesari – www.profars.com 212 Declaração de áreas - DC tipo A DC tipo A (address - endereço) [nome] Sumário DC Pag.Ant. [ad]A[at]ci Comandos Alberto Romano Schiesari – www.profars.com 213 Declaração de áreas - DC tipo A Se o tamanho for especificado, não será efetuado o alinhamento. O conteúdo é o endereço real correspondente à expressão colocada como conteúdo inicial da constante. Se não for especificado tamanho, será feito alinhamento para o próximo endereço múltiplo de 4. Se for especificado tamanho, NÃO será feito alinhamento. Aceita múltiplas definições por constante. CAMPO DC DC DC DC DC DC DC DC Sumário A(TABELA) A(TABELA-50) A(*) A(259) 3A(*-CAMPO) A(TCABC+28*52) A(FIM-COMECO) A(1,2,3) Pag.Ant. Comandos 00000103 00000000.00000004.00000008 00000001.00000002.00000003 Alberto Romano Schiesari – www.profars.com 214 Declaração de áreas - DC tipo A IMPORTANTE: Endereços com valores relocáveis (verde) são atualizados pelo Linkage Editor e pelo Loader; os endereços absolutos (vermelho) não são alterados. CAMPO DC DC DC DC DC DC DC DC Sumário A(TABELA) A(TABELA-50) A(*) A(259) 3A(*-CAMPO) A(TCABC+28*52) A(FIM-COMECO) A(1,2,3) Pag.Ant. Comandos 00000103 00000000.00000004.00000008 00000001.00000002.00000003 Alberto Romano Schiesari – www.profars.com 215 Declaração de áreas - DC tipo A Exemplo: (parte de um programa) 0008A0 47F0 38AC 008AC 008A4 0008A4 000008B2 0008A8 000008B5 008AC 244+ 245+IHB0004 246+ 247+ 248+IHB0004A B EQU DC DC EQU IHB0004A * A(ENTRA) A(SAI) * (parte do RELOCATION DICTIONARY do programa) RELOCATION DICTIONARY POS.ID REL.ID FLAGS 0001 0001 0C 0001 0001 08 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 0C 0001 0001 04 0001 0001 04 0001 0001 04 0001 0001 04 Sumário Pag.Ant. ADDRESS 000070 0001B9 000860 000864 000868 00086C 000874 0008A4 0008A8 000A46 000A48 000A54 000A56 Comandos Alberto Romano Schiesari – www.profars.com 216 Declaração de áreas - DC tipo A Exemplo: Programa fonte (rotina VALIDAR; supor que endereço de VALIDS seja X’00001BC0’) ... VVV ... ... ... VALIDS ... DC Montador Programa objeto a ser chamado (supor tamanho = 4K = X’1000’) ASM A(VALIDS) DC C’AEIOUaeiou’ ... 00001BC0 ... ... ... C1C5C9D6E481858996A4 ... Programa chamador : vai de X’0000’ até X’9FFF’) Programa objeto chamador (supor tamanho = 40K = X’A000’) ... ... ... CALL VALIDAR ... ... ... Programa chamador : vai de X’0000’ até X’9FFF’) Lked Agrega a rotina chamada ao programa chamador e AJUSTA as constantes de endereço relocáveis. Rotina chamada : ficou no endereço X’A000’ (o seu zero é o endereço X’A000’): vai de X’A000’ a X’AFFF’ O conteúdo de VVV é ajustado para X’0000BBC0’ ... 0000BBC0 ... Executável Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 217 Declaração de áreas - DC tipo A Exemplo: Memória Programa executável ... 0000BBC0 ... Loader Carrega o programa executável na memória (por exemplo no endereço X’0BC40000’) e AJUSTA as constantes de endereço relacáveis. Programa executável carregado (LOAD POINT) no endereço X’0BC40000’ ... 0BC4BBC0 ... O conteúdo de VVV é ajustado para X’0BC40000’ + X’0000BBC0’ = X’0BC4BBC0’ Load Point = X’0BC40000’ Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 218 Declaração de áreas - DC tipo Y DC tipo Y (endereço com 2 bytes) [nome] Sumário DC Pag.Ant. [ad]Y[at]ci Comandos Alberto Romano Schiesari – www.profars.com 219 Declaração de áreas - DC tipo Y Se o tamanho for especificado, não será efetuado o alinhamento. Os dois Bytes da halfword 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‘. Aceita múltiplas definições por constante. DC DC DC DC DC DC DC Y(TABELA) Y(TABELA-50) Y(*) Y(259) Y(TCABC+28*52) Y(FIM-COMECO) S(*,*+2,*+4) 0103 0001.0002.0003 IMPORTANTE: Endereços com valores relocáveis são atualizados pelo Linkage Editor e pelo Loader; os endereços absolutos não são alterados. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 220 Declaração de áreas - DC tipo S DC tipo S (endereço base + deslocamento) [nome] Sumário DC Pag.Ant. [ad]S[at]ci Comandos Alberto Romano Schiesari – www.profars.com 221 Declaração de áreas - DC tipo S Se o tamanho for especificado, não será efetuado o alinhamento. Os dois Bytes da halfword terão o endereço na forma BASE+DESLOCAMENTO correspondente à expressão colocada como conteúdo inicial da constante. DC DC DC DC Sumário S(TABELA) S(TABELA-50) S(*) S(TCABC+28*52) Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 222 Declaração de áreas - DC tipo V DC tipo V (endereço externo) [nome] Sumário DC Pag.Ant. [ad]V[at]ci Comandos Alberto Romano Schiesari – www.profars.com 223 Declaração de áreas - 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 fullword será reservada com zeros binários, sendo que o endereço será colocado quando da linkedição do programa. DC Sumário V(ROTINA) Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 224 Declaração de áreas - DC tipo Q DC tipo Q (deslocamento [nome] Sumário DC Pag.Ant. em DSECT externa) [ad]Q[at]ci Comandos Alberto Romano Schiesari – www.profars.com 225 Declaração de áreas - 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. DC Sumário Q(DUMMYEXT) Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 226 Declaração de áreas - DS DS - Define Storage Área SEM conteúdo inicial Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 227 Declaração de áreas - DS 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. Sumário DS CL3 DS XL4 DS PL4'0' DS 3CL8 Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 228 Declaração de áreas - DS O comando DS admite atributo de duplicação zero (0). Ex: ARLEIT DS 0CL80 CODIGO DS CL10 DTEM DS CL8 NOME DS CL50 CIDADE DS CL12 Neste caso, o atributo de duplicação 0 não define a área, mas avisa que as próximas 80 posições definidas formarão uma área de nome ARLEIT, ou seja, ARLEIT terá atributo de tamanho 80. Em outras palavras, os 80 bytes desde aquele indicado pelo endereço que está no Location Counter formam um campo com atributo de tamanho 80. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 229 Declaração de áreas - DS O atributo de duplicação zero é bastante usado para efetuar alinhamento: CPOCOM4 DS 0F BYTE1 DS CL1 BYTE2 DS CL1 BYTE3 DS CL1 BYTE4 DS CL1 Neste caso, o montador primeiramente efetua o alinhamento para endereço múltiplo de 4 (devido ao tipo F indicado), e em seguida faz a alocação dos campos BYTE1, BYTE2, BYTE3 e BYTE4. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 230 Declaração de áreas - DS Outro exemplo de uso para alinhamento: ALFA DC F’0’ BETA DC C’XYZ’ DS 0H GAMA DS CL1 DELTA DS CL1 Alfa Beta Gama Delta (no name) ALFA é alinhado pois a constante tipo F alinha para múltiplo de 4. BETA está alinhado devido ao alinhamento e tamanho de ALFA. GAMA, se fosse declarado logo em seguida a BETA, não estaria alinhado pois BETA tem 3 bytes. Para deixar GAMA alinhado (para endereço múltiplo de 2) foi incluída a declaração DS com tipo H e atributo de duplicação zero. Sumário Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 231 Declaração de áreas - DS 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 ORG DS DS DS DS DS ORG DS DS DS DS DS DS DS DS Sumário 0CL80 CL10 CL10 CL10 CL10 CL10 CL10 CL10 CL10 , VOLTA PARA MESMO ENDEREÇO DE AREA1 0CL80 CL20 CL20 CL20 CL20 , VOLTA PARA MESMO ENDEREÇO DE AREA1 0CL80 CL5 CL5 CL20 CL30 CL3 CL4 CL13 Pag.Ant. Comandos Alberto Romano Schiesari – www.profars.com 232 Instruções de máquina INSTRUÇÕES DE MÁQUINA Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 233 Instruções de máquina - Dicas DICAS Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 234 Instruções de máquina – Dicas 1 1 - STORE = DE registrador PARA memória 2 - LOAD = DE memória PARA registrador 3 - xxxxR = instrução RR, com 2 operandos são registradores Ex. AR,SR, LR, MR, DR, LTR etc 4 - xxxxI = instrução SI, 1 operando é operando imediato; é o 2o. byte da instrução, e é especificado via um termo autodefinido (com tamanho de 1 byte) Ex. MVI, SI, NI, OI, XI, etc 5 - xxxxP = instrução SS, operandos em decimal compactado, trabalha com 2 tamanhos Ex. AP, SP, MP, DP, ZAP 6 - xxxxH = instruction RX, usa registrador e um campo de memória (halfword) Ex. LH, SH, AH Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 235 Instruções de máquina – Dicas 2 7 - Nxxxx = instrução booleana AND Ex. NI, NC, N, NR 8 - Oxxxx = instrução booleana OR Ex. OI, OC, O, OR 9 - Xxxxx = instrução booleana Exclusive OR Ex. XI, XC, X, XR 10 - A maioria das instruções (exceto CVD e as de STORE: CVD, STC, ST, STH, STCM, STM) : símbolo instrução operando_receptor,operando_emissor 11 - Instruções de STORE e CVD: símbolo instrução operando_emissor,operando_receptor Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 236 Instruções de máquina – Dicas 3 12 - 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 O tamanho máximo manipulado por elas é de 256 bytes (vale para os 2 operandos). 13 - As instruções SS-L1/L2, que tem, portanto, dois tamanhos, são : MVO, PACK, UNPK, ZAP, CP, AP, SP, MP, DP O tamanho máximo manipulado por elas para cada operando é 16 bytes. 14 - 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). Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 237 Instruções de máquina – Dicas 4 15 – Uso de instruções Booleanas: OR (ou) = Para forçar bits em 1 (ligar bits) Isto permite, por exemplo : (a) Ligar flags (chaves) de programa (b) Transformar letras minúsculas em maiúsculas (máscara 0100 0000 : observe numa tabela EBCDIC que a diferença entre as letras minúsculas e maiúsculas é sempre x’40’, ou seja b’0100 0000’; ligando o 2o. bit transforma-se uma letra minúscula em maiúscula. (c) Transformar um número binário no ímpar maior mais próximo ligando o último bit à direita Por exemplo: 1111 1110 é o decimal 254. Ligando o último bit: 1111 1111 ele se transforma no decimal 255 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 238 Instruções de máquina – Dicas 4 15 – Uso de instruções Booleanas: AND (e) = Para forçar bits em 0 (desligar bits) Isto permite, por exemplo : (a) Desligar flags (chaves) de programa (b) Transformar letras maiúsculas em minúsculas (máscara 1011 1111 : observe numa tabela EBCDIC que a diferença entre as letras minúsculas e maiúsculas é sempre x’40’, ou seja b’0100 0000’; desligando o 2o. bit transforma-se uma letra maiúscula em minúscula. (c) Transformar um número binário no par menor mais próximo zerando o último bit à direita Por exemplo: 1111 1111 é o decimal 255. Zerando o último bit: 1111 1110 ele se transforma no decimal 254 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 239 Instruções de máquina – Dicas 4 15 – Uso de instruções Booleanas: XOR (ou exclusivo) = Para inverter bits (desligar se ligado, ligar se desligado) Isto permite, por exemplo : (a) Inverter flags (chaves) de programa (toggle) (b) Transformar letras minuscmaiusc e maiuscminusc (máscara 0100 0000) : letra x1xx xxxx é transformada em x0xx xxxx letra x0xx xxxx é transformada em x1xx xxxx (c) Transformar números binário pares em ímpares e vice-versa (máscara 0000 0001) : o último bit à direita é invertido (d) Trocar conteúdo de áreas : XOR A,B + XOR B,A + XOR A,B (e) “Limpar” (colocar zeros binários) uma área : XOR A,A Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 240 Instruções de máquina – Dicas 4 16 – Operações aritméticas e de deslocamento de bits (operações algébricas / lógicas): A menos que afirmado de forma diferente, essas operações são feitas algebricamente. Isso é verdade para campos no formato decimal compactado. Para números em no formato binário de ponto fixo (em memória ou em registrador) algumas operações são feitas algebricamente e outras logicamente. Operações algébricas usam: Números binários de 15 bits + 1 bit para sinal para números com 2 bytes Números binários de 31 bits + 1 bit para sinal para números com 4 bytes Números binários de 63 bits + 1 bit para sinal para números com 8 bytes Operações lógicas assumem sempre o número como positivo e usam: Números binários de 16 bits para números com 2 bytes Números binários de 32 bits para números com 4 bytes Números binários de 64 bits para números com 8 bytes Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 241 Instruções de máquina Instruções de máquina (ordem alfabética) A BCR CLI EDMK LR MVO SH SRDL TRT AH BCT CLM EX LTR MVZ SL SRL TS AL BCTR CLR IC M N SLA SRP UNPK ALR BSM CP ICM MC NC SLDA ST X AP BXH CR IPM MH NI SLDL STC XC AR BXLE CS L MP NR SLL STCK XI BAL C CVB LA MR O SLR STCM XR BALR CDS CVD LCR MVC OC SP STH ZAP BAS CH D LH MVCIN OI SPM STM BASR CL DP LM MVCL OR SR SVC BASSM CLC DR LNR MVI PACK SRA TM BC CLCL ED LPR MVN S SRDA TR Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 242 Instruções de máquina (Algumas) Instruções de máquina (por grupo) - Movto memória-memória : MVC, MVZ, MVN, MVI, MVO, ZAP, MVCL, PACK, UNPK, MVCIN - Movimento de dados de registrador para memoria : ST, STH, STM, STC, STCM, CVD - Movimento de dados de memória para registrador : L, LH, LM, IC, ICM, CVB - Movimento de dados de registrador para registrador : LR, LPR, LNR, LCR, LTR - Aritméticas em memória com campos compactados : AP, SP, MP, DP, SRP - Aritméticas com registradores : AR, SR, MR, DR, ALR, SLR - Aritméticas com registradores e memória : A, S, M, D, AH, SH, MH, AL, SL - Comparação : CP, CLC, CLI, CLCL, C, CH, CL, CLM, CR, CLR - Desvio : BC, BCR - Controle de loop : BCT, BCTR, BXH, BXLE - Edição : ED, EDMK - Tradução e teste de bytes : TR, TRT - Shift em registradores : SLL, SRL, SLDL, SRDL, SLA, SRA, SLDA, SRDA - Algebra booleana : N, O, X, NR, OR, XR, NI, OI, XI, NC, OC, XC - Carga e desvio : BALR, BAL, BAS, BASR, BASSM, BSM - Outras instruções : LA, TM, EX, SVC, MC, SPM, IPM, STCK, TS, CS, CDS Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 243 Instruções de máquina Dicas para saber qual instrução usar para mover um dado de um lugar para outro Origem Destino Instrução Memória Memória MVC Registrador Registrador LR Memória (zonado) Memória (compactado) PACK Memória (compactado) Memória (zonado) UNPK (eventualmente +MVZ ou OI) Registrador Memória ST Memória (binário) Registrador L Memória (compactado) Registrador (binário) CVB Registrador (binário) Memória (compactado) CVD (endereço) Registrador LA [ ou L (endereço) Memória (com endereço) LA + ST [ ou L Sumário Pag.Ant. reg,=A(endereço) ] + ST ] Alberto Romano Schiesari – www.profars.com 244 Instruções de máquina - A A (Add - Somar) Código de máquina 5A (Instrução RX) Condition code 00 Resultado = 0 01 Resultado < 0 10 Resultado > 0 11 Overflow 0005,0008 Interrupções Possíveis 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 fullword). O resultado é colocado no registrador 1º operando. Ex: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “Antes” A 5,=F'259' A 7,FULL A 7,4(2,8) A 7,4(2) A 7,4(,8) Sumário registrador 1o operando antes registrador 1o operando depois 00.00.BF.D2 00.00.C0.D5 00.00.00.0D 00.00.01.10 07.FF.FF.FE 07.FF.FF.FF 07.FF.FF.FF 07.FF.FF.FE 00.00.00.00 FF.FF.FF.FF Pag.Ant. Sumario Instr.Máq. 2o operando antes 2o operando depois 00.00.01.03 00.00.01.03 00.00.01.03 00.00.01.03 00.00.00.01 00.00.00.01 FF.FF.FF.FF FF.FF.FF.FF FF.FF.FF.FF FF.FF.FF.FF Alberto Romano Schiesari – www.profars.com 245 Instruções de máquina - AH AH (Add Halfword – Somar Halfword) Código de máquina 4A (Instrução RX) Condition code 00 Resultado = 0 01 Resultado < 0 10 Resultado > 0 11 Overflow 0005,0008 Interrupções Possíveis 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 halfword). 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” AH 5,=H'259' AH 5,HALF AH 5,4(2,8) AH 5,4(2) Sumário Pag.Ant. registrador 1o operando antes registrador 1o operando depois 00.00.2B.C4 00.00.2C.C7 00.00.00.0D 00.00.01.1A 11.11.11.11 (decimal 286331153) 11.10.99.99 (decimal 286300569) 11.11.11.11 (decimal 286331153) 11.11.89.99 (decimal 286362009) Sumario Instr.Máq. 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 Alberto Romano Schiesari – www.profars.com 246 Instruções de máquina - AL AL (Add Logical – Somar Lógico) Código de máquina 5E (Instrução RX) Condition code 00 01 10 11 Interrupções Possíveis 0005 Resultado Resultado Resultado Resultado = 0, não perde sinal <> 0, não perde sinal = 0, perde sinal <> 0, perde sinal 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 fullword). O resultado é colocado no registrador 1º operando. Ex: Supor os operandos com tamanho e conteúdo conforme mostrado na linha “Antes” AL 5,=F'259' AL 5,FULL AL 5,4(2,8) AL 5,4(2) AL 5,4(,8) Sumário Pag.Ant. registrador 1o operando antes registrador 1o operando depois 00.00.00.00 00.00.01.03 00.B0.C4.E2 00.B0.C4.E3 7F.FF.FF.FF 80.00.00.00 FF.FF.FF.FF 00.00.00.00 80.00.00.00 80.00.00.01 Sumario Instr.Máq. 2o operando antes 2o operando depois 00.00.01.03 00.00.01.03 00.00.00.01 00.00.00.01 00.00.00.01 00.00.00.01 00.00.00.01 00.00.00.01 00.00.00.01 00.00.00.01 Alberto Romano Schiesari – www.profars.com 247 Instruções de máquina - ALR ALR (Add Logical Register – Somar Lógico Registradores) Código de máquina 1E (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis Nenhuma Resultado Resultado Resultado Resultado = 0, não perde sinal <> 0, não perde sinal = 0, perde sinal <> 0, perde sinal É 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” ALR 7,12 ALR 8,8 ALR 10,10 ALR 10,10 Sumário registrador 1o operando antes registrador 1o operando depois 00.B0.C4.E2 00.B0.C4.E3 7F.FF.FF.FF 80.00.00.00 FF.FF.FF.FF 00.00.00.00 80.00.00.00 00.00.00.00 Pag.Ant. Sumario Instr.Máq. 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 Alberto Romano Schiesari – www.profars.com 248 Instruções de máquina - AP AP (Add Packed – Somar Compactado) Código de máquina FA (Instrução SS – L1 e L2) Condition code 00 01 10 11 Interrupções Possíveis 0001,0004,0005,0007,000A Resultado = 0 Resultado < 0 Resultado > 0 Overflow 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. CPOB CPOA AP antes 12.3C 12.34.5C CPOA,CPOB depois 12.3C 12.46.8C CPOA AP antes 45.2C CPOA,CPOA depois 90.4C Ex: Veja mais exemplos a seguir: Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 249 Instruções de máquina - AP AP (Add Packed – Somar Compactado) Código de máquina FA (Instrução SS – L1 e L2) Condition code 00 01 10 11 Interrupções Possíveis 0001,0004,0005,0007,000A Resultado = 0 Resultado < 0 Resultado > 0 Overflow 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 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 250 Instruções de máquina - AR AR (Add register – Somar registradores) Código de máquina 1A (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis 0008 Resultado = 0 Resultado < 0 Resultado > 0 Overflow O conteúdo do registrador especificado no 2º operando é 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 AR 2,2 Sumário 00.00.FF.FF 00.01.00.00 00.00.FF.FF 00.01.FF.FE Pag.Ant. Sumario Instr.Máq. 00.00.00.01 00.00.00.01 00.00.FF.FF 00.01.FF.FE Alberto Romano Schiesari – www.profars.com 251 Instruções de máquina - BAL 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. A instrução BAL carrega no registrador especificado no 1º operando o endereço da instrução (do byte) seguinte ao BAL e, em seguida, desvia para a instrução cujo endereço indicado no 2º operando. OBS:- Para carregar o endereço no registrador 1º operando, o BAL nele coloca os 4 últimos bytes à direita da PSW atual (BC mode). Ex: BAL BAL BAL BAL BAL 9,ROUTINE 14,WRTHDR 7,2(5) 7.2(,8) 7,2(5,8) Sumário Pag.Ant. ... ... BAL EQU RETINS ... ... ROUTINE ST .... .... L BR Sumario Instr.Máq. 9,ROUTINE * continuação 9,SAVEREG9 9,SAVEREG9 9 BAL carrega o endereço da instrução RETINS no registrador 9 Salva o registrador 9 (endereço de retorno) em SAVEREG9 Restaura endereço de retorno Retorna para RETINS Alberto Romano Schiesari – www.profars.com 252 Instruções de máquina - BALR BALR (Branch And Link Register – Desviar e ligar 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 15,ROUTINE BALR 14,15 EQU * continuacao LA carrega o endereço da instrução ROUTINE no registrador 15 Sumário Pag.Ant. RETINS ... ... ROUTINE ST .... .... L BR Sumario Instr.Máq. 14,SAVEREG 14,SAVEREG 14 BALR carrega o endereço da instrução RETINS no registrador 14 Salva registrador 14 (endereço de retorno) em SAVEREG Restaura endereço de retorno Retorna para RETINS Alberto Romano Schiesari – www.profars.com 253 Instruções de máquina - BAS 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 EQU RETINS ... ... ROUTINE ST .... .... L BR Sumário Pag.Ant. 9,ROUTINE * continuation 9,SAVEREG BAS carrega o endereço da instrução RETINS no registrador 9 (bytes 1,2,3) e coloca zeros no byte 0 dele Salva registrador 9 (endereço de retorno) em SAVEREG Restaura endereço de retorno 9,SAVEREG 9 Sumario Instr.Máq. Retorna para RETINS Alberto Romano Schiesari – www.profars.com 254 Instruções de máquina - BASR BASR (Branch And Save Register – Desviar e salvar registrador) 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 carrega o endereço da instrução ROUTINE no registrador 15 Restaura endereço de retorno Retorna para RETINS Sumário Pag.Ant. ... LA 15,ROUTINE BASR 14,15 EQU * continuação RETINS ... ... ROUTINE ST .... .... L BR Sumario Instr.Máq. 14,SAVEREG 14,SAVEREG 14 BASR zera byte 0 do registrador 14 e carrega o endereço da instrução RETINS nos bytes 1,2,3 do registrador 14 Salva registrador 14 (endereço de retorno) em SAVEREG Alberto Romano Schiesari – www.profars.com 255 Instruções de máquina - BASSM BASSM (Branch And Save and Set Mode – Desviar e 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 regiostrador 15 ICM coloca addressability mode nos bits do registrador 15 Restaura endereço de retorno Retorna para RETINS Sumário Pag.Ant. LA ICM BASSM EQU RETINS ... ... ROUTINE ST .... .... L BR Sumario Instr.Máq. 15,ROUTINE 15,8,AMODE 14,15 * continuation 14,SAVEREG 14,SAVEREG 14 BASSM : - Coloca 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) e - (Desvia para ROUTINE) Salva registrador 14 (endereço de retorno) em SAVEREG Alberto Romano Schiesari – www.profars.com 256 Instruções de máquina - BC BC (Branch on condition – Desviar condicionalmente) As instruções de desvio são duas: BC (instrução RX) e BCR (instrução RR). No entanto, elas possuem uma série de códigos mnemônicos auxiliares, denominados estendidos, para facilitar o seu uso. O funcionamento das instruções de desvio é baseado no estado do Condition Code e de uma máscara de 4 bits existente na instrução, na metade à esquerda de seu segundo byte. Os 4 estados em que o Condition Code pode se encontrar são: 00, 01, 10 e 11. A cada um desses estados atribui-se um código que o representa: ESTADO CÓDIGO 00 8 01 4 10 2 11 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'. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 257 Instruções de máquina - BC BC (Branch on condition – Desviar condicionalmente) 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. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 258 Instruções de máquina - BC BC (Branch on condition – Desviar condicionalmente) -------------------------------------------------------------------------USO MNEMÔNICO SIGNIFICADO BC/BCR EQUIVALENTE -------------------------------------------------------------------------Geral B ou BR Desvia sempre BC 15 ou BCR 15 NOP ou NOPR Nao Desvia BC 0 ou BCR 0 -------------------------------------------------------------------------Apos BH ou BHR Desvia se A > B BC 2 ou BCR 2 Comparações BL ou BLR Desvia se A < B BC 4 ou BCR 4 BE ou BER Desvia se A = B BC 8 ou BCR 8 BNH ou BNHR Desvia se A < ou = B BC 13 ou BCR 13 BNL ou BNLR Desvia se A > ou = B BC 11 ou BCR 11 BNE ou BNER Desvia se A não = B BC 7 ou BCR 7 -------------------------------------------------------------------------Apos BO ou BOR Desvia se overflow BC 1 ou BCR 1 Instruções BP ou BPR Desvia se R > 0 BC 2 ou BCR 2 Aritmeticas BM ou BMR Desvia se R < 0 BC 4 ou BCR 4 BZ ou BZR Desvia se R = 0 BC 8 ou BCR 8 BNP ou BNPR Desvia se R < ou = 0 BC 13 ou BCR 13 BNM ou BNMR Desvia se R > ou = 0 BC 11 ou BCR 11 BNZ ou BNZR Desvia se R não = 0 BC 7 ou BCR 7 -------------------------------------------------------------------------Apos um TM BO ou BOR Desvia se todos 1 BC 1 ou BCR 1 BM ou BMR Desvia se misturados BC 4 ou BCR 4 BZ ou BZR Desvia se todos 0 BC 8 ou BCR 8 BNO ou BNOR Desvia se nem todos 1 BC 14 ou BCR 14 -------------------------------------------------------------------------OBS: - A = 1º operando ; B = 2º operando ; R = 1º operando após a conta Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 259 Instruções de máquina - BC BC (Branch on condition – Desviar condicionalmente) 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 Sumário Pag.Ant. (Desvie) (Sem operação - não desvie) (Desvie se Maior) (Desvie se Menor) (Desvie se Igual) (Desvie se Nao Maior) (Desvie se Nao Menor) (Desvie se Nao Igual) (Desvie se Overflow) (Desvie se Mais) (Desvie se Menos) (Desvie se Zero) (Desvie se Nao Mais) (Desvie se Nao Menos) (Desvie se Nao Zero) (Desvie se Um's) (Desvie se Misturados) (Desvie se Zeros) (Desvie se Nao UM's) Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 260 Instruções de máquina - BC BC (Branch on condition – Desviar condicionalmente) 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. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 261 Instruções de máquina - BC BC (Branch on condition – Desviar condicionalmente) 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 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 É o mesmo que BE VOLTA Neste caso, será efetuado o desvio para VOLTA se o condition code tiver 00. Outros exemplos: B LER mesmo que BC 15,LER BH AGAIN mesmo que BC 2,AGAIN BL COMPARA mesmo que BC 4,COMPARA BE 0(2) mesmo que BC 8,0(2) BE Sumario Instr.Máq. 0(,4) mesmo 8,0(,4) Alberto Romanoque SchiesariBC – www.profars.com 262 Sumário Pag.Ant. Instruções de máquina - BC BC (Branch on condition – Desviar condicionalmente) 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 Outros exemplos: B BNH BNL BNE BZ BNZ BM Sumário READ LOOP1 LOOP2 0(2) 0(,4) 0(2,4) BTAB(15) Pag.Ant. Mesmo Mesmo Mesmo Mesmo Mesmo Mesmo Mesmo Sumario Instr.Máq. que que que que que que que BC BC BC BC BC BC BC 15,READ 13,AGAIN 11,COMPARE 7,0(2) 8,0(,4) 7,0(2,4) 4,BTAB(15) Alberto Romano Schiesari – www.profars.com 263 Instruções de máquina - BCR BCR (Branch on Condition Register – Desviar condicionalmente [para] registrador) 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. VEJA A INSTRUÇÃO BC. A BCR 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 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). Exemplo: Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 264 Instruções de máquina - BCR BCR (Branch on Condition Register – Desviar condicionalmente [para] registrador) 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 BCR 8,15 É o mesmo que BER 15 Neste caso, será efetuado o desvio se o condition code tiver 00. Veja os exemplos a seguir: BCR BR BNER BLR Sumário Pag.Ant. 2,10 7 10 15 Sumario Instr.Máq. mesmo mesmo mesmo mesmo que que que que BHR BCR BCR BCR R10 15,R7 7,R10 4,R15 Alberto Romano Schiesari – www.profars.com 265 Instruções de máquina - BCT BCT (Branch on CounT – Desviar se contador [zero]) 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: ... L carrega no registrador L 11,=F’200’ BCT 5,AGAIN 11 o número de vezes que AGAIN CLC 0(3,5),CODE BCT 2,0(4,7) o loop deve ser repetido BE FOUND BCT 2,0(4) ... No final do conjunto de BCT 2,0(,7) ... NOTFND .... .... FOUND ... Sumário Pag.Ant. Sumario Instr.Máq. BCT EQU 11,AGAIN * EQU * instruções do loop, o BCT subtrai 1 do registrador 11. Se não chegou no zero, desvia para AGAIN. Se chegou no zero, continua a execução em NOTFND Alberto Romano Schiesari – www.profars.com 266 Instruções de máquina - BCTR BCTR (Branch on CounT Register – Desviar se contador [zero] [para] 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 resultado < > 0, será desviado para a instrução cujo endereço estiver no registrador 2º operando. Se o resultado = 0, não será efetuado o desvio; continuando na 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 LA carrega no registrador 15 o endereço da instrução AGAIN Sumário Pag.Ant. AGAIN LA L CLC BE 15,AGAIN 11,=F’200’ 0(3,5),CODE FOUND ... ... NOTFND .... .... FOUND ... Sumario Instr.Máq. BCTR 11,15 EQU * EQU * L carrega no registrador 11 o número de vezes que o loop deve ser repetido No final do conjunto de instruções do loop, o BCTR subtrai 1 do registrador 11. Se não chegou no zero, desvia para AGAIN. Se chegou no zero, continua a execução em NOTFND Alberto Romano Schiesari – www.profars.com 267 Instruções de máquina - BSM 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 (a) (b) O bit 32 da PSW é carregado no bit 0 do registrador primeiro operando (os bits 1 a 31 permanecem inalterados), e depois o registrador segundo operando é carregado nos bytes 4-7 da PSW (incluindo o bit de addressing mode e o instruction address), de forma que o addressing mode é posicionado e o desvio executado. Se o registrador segundo operando é o zero, a PSW não é carregada. Exemplo: BSM 14,15 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 268 Instruções de máquina - BXH BXH (Branch on indeX High – Desviar se indexador 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 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. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 269 Instruções de máquina - BXH BXH (Branch on indeX High – Desviar se indexador maior) Código de máquina 86 (Instrução RX) Condition code Não é alterado Interrupções Possíveis Nenhuma Exemplos: BXH 7,8,AGAIN R7 = R8 + R7; Se R7 > R9 Desvia para AGAIN; Se R7 <= R9 próxima instrução BXH 7,9,AGAIN R7 = R9 + R7; Se R7 > R9 Desvia para AGAIN; Se R7 <= R9 próxima instrução BXH 7,9,8(4) R7 = R9 + R7; Se R7 > R9 Desvia para instrução Com endereço = [ (conteúdo R4) + x’008’ ] Se R7 <= R9 próxima instrução * * * * Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 270 Instruções de máquina - BXH BXH (Branch on indeX High – Desviar se indexador maior) Código de máquina 86 (Instrução RX) Condition code Não é alterado Interrupções Possíveis Nenhuma 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,=A(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 R7,R8,NOTFOUND B NEXTITEM TABLSEEN ... BXH 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 271 Instruções de máquina - BXLE BXLE (Branch on indeX Less or Equal – Desviar se indexador 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: O 1º e o 2º operandos especificados são registradores. O 3º operando é o endereço de uma instrução. 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: Menor ou igual, será efetuado um desvio para a instrução cujo endereço estiver especificado no 3. operando. Maior, não será efetuado o desvio, continuando o processamento através da instrução seguinte ao BXLE. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 272 Instruções de máquina - BXLE BXLE (Branch on indeX Less or Equal – Desviar se indexador menor ou igual) Código de máquina 87 (Instrução RS) Condition code Não é alterado Interrupções Possíveis Nenhuma Exemplos: BXLE 7,8,AGAIN R7 = R8 + R7; Se R7 <= R9 Desvia para AGAIN; Se R7 > R9 próxima instrução BXLE 7,9,AGAIN R7 = R9 + R7; Se R7 <= R9 Desvia para AGAIN; Se R7 > R9 próxima instrução BXLE 7,9,8(4) 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 * * * * Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 273 Instruções de máquina - BXLE BXLE (Branch on indeX Less or Equal – Desviar se indexador menor ou igual) Código de máquina 87 (Instrução RS) Condition code Não é alterado Interrupções Possíveis Nenhuma 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,=A(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 R7,R8,NEXTITEM NOTFOUND ... TABLSEEN ... BXLE 7,8,NOTFOUND R7 = R8 + R7; If R7 <= R9 tabela não vista toda; continuar pesquisa If R7 > R9 toda tabela varrida; fim da pesquisa Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 274 Instruções de máquina - C C (Compare) Código de máquina 59 (Instrução RX) Condition code 00 01 10 11 Interrupções Possíveis 0005 1ºoperando = 2ºoperando 1ºoperando < 2ºoperando 1ºoperando > 2ºoperando O condition code nunca fica em 11 após um C 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 fullword). Ex: C C C C C C Sumário 9,CPO 8,=F'0' 13,=A(TABELA+430) 1,2(4) 1,2(,4) 1,2(7,4) Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 275 Instruções de máquina - CDS 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 (doubleword). 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 doubleword (store). Se eles forem diferentes, o conteúdo da doubleword é colocado nos registradores R1 e R1+1 (load). Ver exemplos a seguir: Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 276 Instruções de máquina - CDS 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 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 CDS 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 Antes: 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 Antes: Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 277 Instruções de máquina - CH CH (Compare Halfword) Código de máquina 49 (Instrução RX) Condition code 00 01 10 11 Interrupções Possíveis 0005 1ºoperando = 2ºoperando 1ºoperando < 2ºoperando 1ºoperando > 2ºoperando O condition code nunca fica em 11 após um CH A instrução CH efetua a comparação algébrica entre um número binário contido num registrador (1º operando) e um número binário contido num campo de memória de 2 bytes (2º operando - em geral uma halfword). Para isso o campo de 2 bytes é expandido (internamente, na UCP) para 4 bytes; a expansão é feita colocando-se os seus 2 bytes nos 2 bytes à direita do campo de 4 bytes, e repetindo à esquerda o bit de sinal(bit mais à esquerda da halfword). Ex: CH 9,CPO 1o. operando = R9; 2o. operando = campo CPO CH 8,=H'0' 1o. operando = R8; 2o. operando = halfword com zeros CH 13,=Y(TAB+430) 1o. operando = R13; 2o. operando = halfword com endereço de TAB+430 CH 1,2(4) 1o. operando = R1; 2o. operando = halfword com endereço = * Valor do registrador indexador R4 + 0[registrador base omitido] + x’2’ CH 1,2(,4) 1o. operando = R1; 2o. operando = halfword com endereço = * Valor do registrador base R4 + 0[reg. indexador omitido] + x’2’ CH 1,2(7,4) 1o. operando = R1; 2o. operando = halfword com endereço = * Valor do registrador base R4 + valor do reg. indexador R7 + x’2’ Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 278 Instruções de máquina - CL CL (Compare Logical – Comparar logicamente) Código de máquina 55 (Instrução RX) Condition code 00 01 10 11 Interrupções Possíveis 0005 1ºoperando = 2ºoperando 1ºoperando < 2ºoperando 1ºoperando > 2ºoperando O condition code nunca fica em 11 após um CL 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 fullword). A comparação lógica é feita da esquerda para a direita, bit a bit. O primeiro par de bits diferentes detectado termina a comparação. Ex: CL 9,CPO 32 bits do registrador 9 comparados com 32 bits do campo de 4 bytes CPO CL 8,=F'0' 32 bits do registrador 8 comparados com 32 bits do campo de 4 bytes com 0 CL 1,2(4) 32 bits do registrador 1 comparados com o campo de 4 bytes * ( endereço 2o operando = conteúdo indexador 4 + deslocamento X’2’ [reg. base omitido = zero = não considerado] ) CL 1,2(,4) 32 bits do registrador 1 comparados com o campo de 4 bytes * ( endereço do 2o operando = [ indexador omitido = zero = não considerado] + deslocamento X’2’ + reg base 4 ) CL 1,2(7,4) 32 bits do registrador 1 comparados com o campo de 4 bytes * ( endereço do 2o operando = conteúdo do reg. indexador 7 + deslocamento X’2’ + conteúdo do reg. base 4 ) Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 279 Instruções de máquina - CLC CLC (Compare Logical Character – Comparar caracteres logicamente) Código de máquina D5 (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0005 1ºoperando = 2ºoperando 1ºoperando < 2ºoperando 1ºoperando > 2ºoperando O condition code nunca fica em 11 após um CLC A interrupção CLC faz a comparação lógica (bit a bit, da esquerda para a direita) entre dois campos de memória. O primeiro par de bits diferentes detectado termina a comparação. Ex: CLC CPOA,CPOB Tamanho único usado = tamanho de CPOA (100 bytes) CLC AE+78(2),=C'*1' Campo de 2 bytes (AE+78 e AE+79) é comparado com campo de 2 * bytes referenciado por literal (conteúdo = X’5CF1’) CLC 4(2,7),2(9) Campo de 2 bytes (endereço = base 7 + deslocamento X’4’) * é comparado com campo com endereço = base 9 + deslocamento X’’2’ CLC ID,2(7) Campo com n bytes chamado ID comparado com campo de n bytes * com endereço = base 7 + deslocamento X’2’ CLC 194(5,11),AE+3 Campo de 5 bytes (endereço = base 11 + deslocamento X’C2’) * é comparado com campo de 5 bytes ( endereço = AE+3 ) Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 280 Instruções de máquina - CLCL CLCL (Compare Logical Character Long – Comparar caracteres logicamente - longo) Código de máquina 0F (Instrução RR) Condition code 00 Interrupções Possíveis 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 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. Ex: CLCL 2,8 R1=registrador primeiro operando= registrador 2 R1+1= registrador 3 R2=registrador segundo operando= registrador 8 R2+1= registrador 9 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 281 Instruções de máquina - CLCL CLCL (Compare Logical Character Long – Comparar caracteres logicamente - longo) 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 0005,0006 Interrupções Possíveis 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. Nos 2 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. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 282 Instruções de máquina - CLCL CLCL (Compare Logical Character Long – Comparar caracteres logicamente - longo) 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 0005,0006 Interrupções Possíveis Exemplo: LA carrega no registrador 8 o endereço de BUFERIN LA carrega no registrador 9 o tamanho de BUFERIN CLCL executes the compare between a 12000-byte field (BUFEROUT) and a 20000byte field (BUFERIN) Sumário Pag.Ant. AGAIN DIFFS ... ... ... ... EQUALS ... Sumario Instr.Máq. LA LA LA LA ICM CLCL BE EQU 2,BUFEROUT 3,12000 8,BUFERIN 9,20000 9,B'1000',C' ' 8,9 EQUALS * EQU * LA carrega no registrador 2 o endereço de BUFEROUT LA carrega no registrador 3 o tamanho de BUFEROUT ICM insere o caracter de preenchimento no byte mais à esquerda do registrador 9 Alberto Romano Schiesari – www.profars.com 283 Instruções de máquina - CLI CLI (Compare Logical Immediate – Comparar logicamente [operando] imediato) Código de máquina 95 (Instrução SI) Condition code 00 01 10 11 Interrupções Possíveis 0005 1ºoperando = 2ºoperando 1ºoperando < 2ºoperando 1ºoperando > 2ºoperando O condition code nunca fica em 11 após um CLI 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. Exemplos (observe que b1d1d1d1 é o endereço do 1o. operando na forma base+deslocamento): CLI AE+79,C'*' Instrução de máquina = 95.5C.b1d1.d1d1 Compara com asterisco CLI 2(5),X'00' Instrução de máquina = 95.00.50.02 CLI BYTE,B'11110000' Instrução de máquina = 95.F0.b1d1.d1d1 Compara com caracter zero CLI NOP+1,240 Sumário Pag.Ant. Instrução de máquina = 95.F0.b1d1.d1d1 Sumario Instr.Máq. Compara com zeros binários Compara com caracter zero Alberto Romano Schiesari – www.profars.com 284 Instruções de máquina - CLM CLM (Compare Logical under Mask – Comparar logicamente sob máscara) Código de máquina BD (Instrução RS) Condition code 00 Os bytes selecionados são iguais, máscara é zero. 01 Campo selecionado do 1ºoperando é 10 Campo selecionado do 1ºoperando é 11 0005 Nunca o condition code fica em 11 Interrupções Possíveis ou a menor maior após um CLM 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 (código de operação) = 1 byte R1 (registrador primeiro operando) = 1/2 byte M3 (máscara) = 1/2 byte E2 (endereço base+deslocamento do segundo operando) = 2 bytes 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. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 285 Instruções de máquina - CLR CLR (Compare Logical Register – Comparar logicamente registradores) Código de máquina 15 (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis Nenhuma 1ºoperando = 2ºoperando 1ºoperando < 2ºoperando 1ºoperando > 2ºoperando O condition code nunca fica em 11 após um CLR 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 “string” de 32 bits do registrador 4 comparado com o “string’ de 32 bits do registrador 5 CLR 8,13 “string” de 32 bits do registrador 8 comparado com o “string’ de 32 bits do registrador 13 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 286 Instruções de máquina - CP CP (Compare Packed – Comparar 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 0005,0007 Interrupções Possíveis 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 FLDA,FLDB Se FLDA = X’00000009999C’ e FLDB = X’10000C’ Resultado é : 1o operando menor que 2o operando CP COUNTLIN,=P'1' Se COUNTLIN = X’999999D’ comparado com X’1C’ O resultado é : 1o operando menor que 2o operando CP 0(5,9),=P'0' Compara conteúdo do campo de 5 bytes no endereço (registrador base 9 + deslocamento X’0’) com zero CP TOTAL,2(7,9) Compara conteúdo de TOTAL com campo de 7 bytes no endereço (registrador base 9 + X’2’) * * * Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 287 Instruções de máquina - CR CR (Compare Register – Comparar registradores) Código de máquina 19 (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis nenhuma 1ºoperando = 2ºoperando 1ºoperando < 2ºoperando 1ºoperando > 2ºoperando O condition code nunca fica em 11 após um CR 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 Compara número binário de 31 bits no registrador 4 c/ número binário de 31 bits no registrador 5 CR 8,13 Compara número binário de 31 bits no registrador 8 c/ número binário de 31 bits no registrador 13 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 288 Instruções de máquina - CS 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 no 2º operando 01 1º e 2º operandos são colocado no 1º operando 10 Nunca fica em 10 após 11 Nunca fica em 11 após 0004,0005,0006 Interrupções Possíveis iguais, o 3. Operando foi colocado diferentes, o 2º operando foi um CS um CS O primeiro e o terceiro operandos são registradores. O segundo operando é um campo de memória (fullword). O conteúdo do registrador 1º operando é comparado com o conteúdo da fullword. Se eles forem iguais, o conteúdo do registrador 3º operando é colocado na fullword (store). Se eles forem diferentes, o conteúdo da fullword é colocado no registrador 1º operando (load). Exemplos: CS 5,8,FW Antes: R5 00.BF.C4.20 R8 7D.48.C0.00 FW 00.BF.C4.20 Depois: R5 00.BF.C4.20 R8 7D.48.C0.00 FW 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 Sumário Pag.Ant. Sumario Instr.Máq. FW FW 00.FF.EE.DD 00.FF.EE.DD Alberto Romano Schiesari – www.profars.com 289 Instruções de máquina - CVB CVB (ConVert to Binary – Converter 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 doubleword), 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 CVB 8,0(5,9) CVB 8,0(,9) CVB 8,0(5) * * * * Sumário Pag.Ant. 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 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’ 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’ 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’ Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 290 Instruções de máquina - CVD CVD (ConVert to Decimal – Converter 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 doubleword) 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 CVD 8,0(5,9) CVD 8,0(,9) CVD 8,0(5) * * * * Sumário 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 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’ 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’ 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’ Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 291 Instruções de máquina - D D (Divide) Código de máquina 5D (Instrução RX) Condition code Não é alterado Interrupções Possíveis 0005,0006,0008 Esta instrução efetua uma divisão entre dois números binários. O registrador especificado no 1º operando deve ser par. O dividendo é um número binário de 64 bits contido no conjunto de registradores par-ímpar indicado no 1º operando. O divisor é um número contido num campo de memória de 4 bytes (especificado no 2º operando - em geral uma fullword). Após efetuada a divisão, o resto será colocado no registrador par do conjunto par-ímpar; o quociente será colocado no registrador ímpar do conjunto par-ímpar. Exemplo: D 6,CPOA Neste caso, temos: Dividendo : Regs. 6 e 7 juntos ; Divisor : CPOA ; Quociente : Reg. 7 ; Resto : Reg. 6 Outros exemplos: L L D 6,=F'0' 7,=F'257' 6,=F'4' Dividendo: Registradores 6-7 juntos; Eles juntos tem o número 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; Eles juntos tem o número 17 Divisor: (literal) com número 3; Quociente: Registrador 11 = conteúdo 5; Resto: Registrador 10 = conteúdo 2 * * Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 292 Instruções de máquina - DP DP (Divide Packed – Dividir 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 instruçã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. Veja os exemplos a seguir: Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 293 Instruções de máquina - DP DP (Divide Packed – Dividir 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 Supor que os operandos e seus tamanhos e conteúdos sejam os indicados na linha “antes” DP FLDA,FLDB DP FLDA,FLDB DP VALUE,=P'5' Sumário Pag.Ant. 1o operando antes 1o operando depois 00.00.45.67.8C 22.83.9C.00.0C 00.00.00.11.1C 00.05.5C.00.1C 00.00.00.00.00.12.7C 00.00.00.00.02.5C.2C Sumario Instr.Máq. 2o operando antes 2o operando depois 00.2C 00.2C 00.2C 00.2C 5C 5C Alberto Romano Schiesari – www.profars.com 294 Instruções de máquina - DR 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: 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 148 Quociente: Registrador 7 = 12; Resto: Registrador 6 = 4 * Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 295 Instruções de máquina - ED ED (Edit - Editar) Código de máquina DE (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0004,0005,0007 Último Campo = 0 Último Campo < 0 Último Campo > 0 O condition code nunca fica em 11 após o ED 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. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 296 Instruções de máquina - ED ED (Edit - Editar) Código de máquina DE (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0004,0005,0007 Último Campo = 0 Último Campo < 0 Último Campo > 0 O condition code nunca fica em 11 após o ED 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. Veja a seguir como é formado o modelo de edição. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 297 Instruções de máquina - ED ED (Edit - Editar) Código de máquina DE (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0004,0005,0007 Último Campo = 0 Último Campo < 0 Último Campo > 0 O condition code nunca fica em 11 após o ED 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') ou Início de significância (X'21') ou Separador de campos (X'22') ou 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 significância (é um indicador da UCP que pode estar ligado [ON] ou desligado [OFF]), denominado S-TRIGGER. - O algarismo correspondente no 2º operando. Como resultado dessa verificação, o caracter do modelo será substituído pelo algarismo do 2º operando transformado para zonado (se no byte do 1o operando tiver X'20' ou X'21'), ou pelo caracter de preenchimento (se não tiver nem X'20' nem X'21'). Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 298 Instruções de máquina - ED ED (Edit - Editar) Código de máquina DE (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0004,0005,0007 Último Campo = 0 Último Campo < 0 Último Campo > 0 O condition code nunca fica em 11 após o ED Quanto ao S-TRIGGER: Ele é colocado OFF no início da edição, após ser encontrado um X'22', ou após ser encontrado na parte numérica de um byte do 2º operando uma configuração A, C, E ou F (número positivo). Ele é colocado ON após ser encontrado um X'21' ou quando é encontrado um X'20' cujo algarismo correspondente no 2º operando não seja 0; ainda nestes dois casos, o S-TRIGGER só é colocado ON se o byte do 2º operando não tiver nem A, nem C, nem E, e nem F, na sua parte numérica. Quanto ao separador de campos (X'22'): identifica campos numa edição de vários campos. Ele é sempre substituído pelo caracter de preenchimento. Exemplos: Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 299 Instruções de máquina - ED ED (Edit - Editar) Código de máquina DE (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0004,0005,0007 Último Campo = 0 Último Campo < 0 Último Campo > 0 O condition code nunca fica em 11 após o ED Observe que o b minúsculo indica espaço em branco. MVC ARIMP+5(10),MODELO ED ARIMP+5(10),TOTAL ... MODELO DC X'4020204B2021206B2020' Antes: TOTAL ARIMP+5(10) 00.12.34.5C 40.20.20.4B.20.21.20.6B.20.20 b b b b 1 2 3 , 4 5 Depois: TOTAL ARIMP+5(10) 00.12.34.5C 40.40.40.40.F1.F2.F3.6B.F4.F5 b b b b 1 2 3 , 4 5 Outros Exemplos do ED: ED ED ED Sumário Pag.Ant. 0(5,7),CPO ARIMP+17(8),ISDRT 4(12,9),2(10) Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 300 Instruções de máquina - EDMK EDMK (Edit and Mark – Editar e marcar) Código de máquina DF (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0004,0005,0007 Último Campo = 0 Último Campo < 0 Último Campo > 0 O condition code nunca fica em 11 após o EDMK 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 301 Instruções de máquina - EX EX (Execute) Código de máquina 44 (Instrução RX) Condition code o seu posicionamento (ou não) depende da instrução que for 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' ' O move será executado com tamanho 23 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 302 Instruções de máquina - IC IC (Insert Character – Inserir caracter) 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. 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 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 303 Instruções de máquina - ICM ICM (Insert Character under Mask – Inserir caracter 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 0005 Nunca o condition code fica em 11 após um ICM. Interrupções Possíveis O seu formato de máquina é o seguinte: CO (código de operação) = 1 byte; R1 (registrador 1.o operando) = 1/2 byte; E2 (endereço base+deslocamento do 2o. operando) = 2 bytes; M3 (máscara terceiro operando) = 1/2 byte Os 4 bits da máscara, da esquerda para a direita, correspondem aos 4 bytes do registrador 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: 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 ICM 5,B'1010',TWOBYTES 00.00.45.67 9A.BC 9A.00.BC.67 9A.BC Neste caso, o 1º byte de TWOBYTES será movido para o 1º byte do registrador 5, e o 2º byte de TWOBYTES será movido para o 3º byte do registrador 5. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 304 Instruções de máquina - IPM 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: Supor a PSW com condition code ’01’ e program mask ‘1100’ registrador 8 antes registrador 8 depois IPM 8 C4.56.78.9A 1C.56.78.9A Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 305 Instruções de máquina - L L (Load - Carregar) Código de máquina 58 (Instrução RX) Condition code Não é alterado Interrupções Possíveis 0005 O conteúdo do campo de memória de 4 bytes especificado no 2º operando (em geral uma fullword) 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 8,0(10) L 8,0(,11) L 8,0(10,11) L 5,=F'200' Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 306 Instruções de máquina - LA 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: Supor os registradores com os valores mostrados abaixo (para referências a símbolos supõe-se o registrador 3 como registrador base,e os deslocamentos são apenas para efeito de exemplo) registrador 1o operando antes instrução máquina registrador 3 antes registrador 9 antes registrador 1o operando depois registrador 3 depois registrador 9 depois LA 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 41.50.3F.03 00.A0.00.00 nao usado 00.A0.0F.03 00.A0.00.00 nao usado LA 5,FLD+17(9) 01.12.34.56 41.59.3F.03 00.A0.00.00 00.00.00.14 00.A0.0F.17 00.A0.00.00 00.00.00.14 LA 5,2(9,3) 01.12.34.56 41.59.30.02 00.A0.00.00 00.00.00.14 00.A0.00.16 00.A0.00.00 00.00.00.14 LA 5,200 01.23.45.67 41.50.00.C8 nao usado nao usado 00.00.00.C8 nao usado nao usado Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 307 Instruções de máquina - LA 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 do 2º operando e o carrega nos últimos 3 bytes à direita do registrador 1º operando. O byte mais à esquerda do registrador 1º operando é zerado. Exemplo: Supor os registradores com os valores mostrados abaixo (para referências a símbolos supõe-se o registrador 3 como registrador base,e os deslocamentos são apenas para efeito de exemplo) registrador 1o operando antes instrução máquina registrador 3 antes registrador 9 antes registrador 1o operando depois registrador 3 depois registrador 9 depois LA 5,4095 01.23.45.67 41.50.0F.FF não usado não usado 00.00.0F.FF não usado não usado LA 5,4095(3) 01.23.45.67 41.53.0F.FF 00.0A.80.00 não usado 00.0A.8F.FF 00.0A.80.00 não usado LA 5,4095(3,9) 01.23.45.67 41.53.9F.FF 00.0A.00.00 00.00.00.01 00.0A.10.00 00.0A.80.00 00.00.00.01 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 308 Instruções de máquina - LCR LCR (Load Complement Register – Carregar complemento de registrador) Código de máquina 13 (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis 0008 Resultado = 0 Resultado < 0 Resultado > 0 Overflow O número binário contido no registrador especificado no 2º operando é complementado e colocado no 1o operando. Se for positivo fica negativo e se for negativo fica positivo. 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 309 Instruções de máquina - LH LH (Load 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 halfword) 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 LH LH LH LH LH Mais exemplos: Sumário Pag.Ant. Sumario Instr.Máq. 7,HALF 8,0(10) 8,0(,11) 8,0(10,11) 8,=H'200' Alberto Romano Schiesari – www.profars.com 310 Instruções de máquina - LM LM (Load Multiple – Carregar múltiplos [registradores]) 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 é um endereço de memória. A instrução LM coloca o conteúdo do campo de memória de (n.4) bytes especificado no último operando no conjunto de n registradores (indicados pela faixa indicada pelos registradores especificados 1o. e 2o. operandos). Ex: LM 14,1,SALVA Reg. 14 Reg.15 Reg.0 Reg.1 <----------><---------><----------><----------> |------- SALVA --------------------------------| SALVA = 16 bytes (bytes 0 a 3 = conteúdo vai para reg 14; bytes 4 a 7 = conteúdo vai para reg 15; bytes 8 a 11 = conteúdo vai para reg 0; bytes 12 a 15 = conteúdo vai para reg 1) Outro Exemplo: LM Sumário Pag.Ant. Sumario Instr.Máq. 1,7,2(10) Alberto Romano Schiesari – www.profars.com 311 Instruções de máquina - LNR LNR (Load Negative Register – Carregar registrador [com] negativo) Código de máquina 11 (Instrução RR) Condition code 00 Resultado = 0 01 Resultado < 0 10 Nunca o condition code LNR 11 Nunca o condition code Nenhuma LNR Interrupções Possíveis fica em 10 após um fica em 10 após um O número binário contido no registrador especificado no 2º operando é 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 312 Instruções de máquina - LPR LPR (Load Positive Register – Carregar registrador [com] positivo) Código de máquina 10 (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis 0008 Resultado = 0 Nunca o condition code fica em 1 após um LPR. Resultado > 0 Overflow O número binário contido no registrador especificado no 2º operando é 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 313 Instruções de máquina - LR 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 314 Instruções de máquina - LTR 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 LTR Nenhuma Interrupções Possíveis fica em 10 após um 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 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 315 Instruções de máquina - M M (Multiply - Multiplicar) Código de máquina 5C (Instrução RX) Condition code Não é alterado Interrupções Possíveis 0005,0006 Esta instrução efetua uma multiplicação entre dois números binários. O registrador especificado no 1º operando deve ser par. O registrador ímpar seguinte deve conter o Multiplicando. O campo de memória de 4 bytes especificado no 2º operando (em geral uma fullword) 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 M 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 M 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 M 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 316 Instruções de máquina - M M (Multiply - Multiplicar) Código de máquina 5C (Instrução RX) Condition code Não é alterado Interrupções Possíveis 0005,0006 Mais exemplos: M M Registrador 6 antes Registrador 7 antes 2o operando antes Registrador 6 depois Registrador 7 depois 2o operando depois 6,4(2) Multiplicando: Reg 7; Endereço multiplicador: Indexador 2 [ + Base 0 ] + X’4’; 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 317 Instruções de máquina - MC MC (Monitor Call – Chamada ao monitor) Código de máquina AF (Instrução SI) Condition code Permanece inalterado Interrupções Possíveis 0006,0040 Esta instrução causa uma interrupção de programa, se o bit que mascara esta situação no registrador de controle 8 estiver ligado. Os bits de máscara no registrador de controle 8 são os bits 16 a 31, e que correspondem às classes 0 a 15, respectivamente. No operando imediato, os 4 primeiros bits à esquerda (bits 8 a 11 da instrução) devem estar em zero. Os bits 12 a 15 (a metade da direita do segundo byte da instrução) especificam um número binário que indica qual a classe de interrupção desejada; se o bit a ela referente no registrador de controle 8 estiver ligado, será causada a interrupção. O endereço do segundo operando não faz referência a um campo de memória, e sim indicam um código que deve ser colocado na fullword de endereço X'000156' de memória. Se a máscara referente à interrupção desejada estiver desligada no registrador de controle 8, a instrução funciona como um NOP. Exemplo: MC MONITCOD,7 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 318 Instruções de máquina - MH MH (Multiply Halfword – Multiplicar halfword) 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 halfword). 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. Exemplos: Registrador 1o operando antes 2o operando antes Registrador 1o operando depois 2o operando depois MH 5,=H'4' Multiplicando: Registrador 5; Multiplicador: literal 4; Resultado: Registrador 5 00.00.00.0A 00.04 00.00.00.28 00.04 MH 5,=F'2' 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 [CUIDADO! metade da direita com 00.02 não é pega! ] 00.00.00.00 00.00 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 319 Instruções de máquina - MP MP (Multiply Packed – Multiplicar compactado) Código de máquina FC (Instrução SS – L1 e L2) Condition code Não é alterado Interrupções Possíveis 0001,0004,0005,0006,0007 A instrução MP efetua a multiplicação entre dois campos de memória que estejam no formato compactado. O resultado da multiplicação é colocado no campo especificado no 1º operando. O 2º operando pode ter tamanho máximo de 8 bytes. O tamanho do 2º operando deve obrigatoriamente ser menor que o tamanho do 1º operando. Se o tamanho do 2º operando for maior que 8 ou for menor ou igual ao tamanho do 1º operando, haverá interrupções de programa (código 0006). O 1º operando deve ter tantos algarismos em zero (à esquerda) quantos forem os algarismos do 2º operando; se isto não acontecer, haverá interrupção de programa (código 0007). Ex: MP CPOA,CPOB 1o operando antes 2o operando antes 1o operando depois 2o operando depois 00.09.99.9C 99.9C 99.89.00.1C 99.9C 00.19.99.9C 99.9C 00.19.99.9C 99.9C (erro! Precisaria ter 3 dígitos em zero à esquerda em CPOA) Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 320 Instruções de máquina – MR 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: Registrador 6 antes Registrador 7 antes Registrador 9 antes Registrador 6 depois Registrador 7 depois Registrador 9 depois MR 6,9 [ 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 MR 6,9 [ 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 321 Instruções de máquina - MVC MVC (MoVe Character) 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 e permanece inalterado (a não ser que parte dele seja ao mesmo tempo o campo receptor – ovelapping = sobreposição). O campo receptor é o primeiro operando. Ambos devem ter o mesmo tamanho. Exemplos: 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 322 Instruções de máquina - MVC MVC (MoVe Character) Código de máquina D2 (Instrução SS - L) Condition code Não é alterado Interrupções Possíveis 0004,0005 Mais exemplos: Mover espaços usando área auxiliar de 5 bytes (literal com 5 bytes): 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 MVC WA(5),=CL5' ' 5C.5C.5C.5C.5C 40.40.40.40.40 40.40.40.40.40 40.40.40.40.40 Alternativamente, pode-se propagando espaços usando área auxiliar de somente 1 byte (a literal) ! - O primeiro MVC move espaço para a primeira posição à esquerda do campo WA. - O outro MVC move 4 bytes; lembrar que o MVC opera byte a byte. - Acompanhe os 4 bytes sendo movidos, um a um: O primeiro byte é movido para o segundo; O segundo byte é movido para o terceiro; O terceiro é movido para o quarto ; O quarto byte é movido para o quinto MVC inicial para o primeiro byte à esquerda: MVC WA(1),=C' ' Sumário Pag.Ant. 5C.??.??.??.?? 40.??.??.??.?? Sumario Instr.Máq. 40 40 antes depois Alberto Romano Schiesari – www.profars.com 323 Instruções de máquina - MVC MVC (MoVe Character) Código de máquina D2 (Instrução SS - L) Condition code Não é alterado Interrupções Possíveis 0004,0005 Propagação do 1o para o 2o, do 2o para o 3o, do 3o para o 4o e do 4o para o 5o MVC WA+1(4),WA Ou, melhor ainda: Acompanhe o MVC byte a byte : 40.??.??.??.?? 40.40.??.??.?? 40.??.??.??.?? 40.40.??.??.?? 1o byte: 40.40.??.??.?? 40.40.40.??.?? 40.40.??.??.?? 40.40.40.??.?? 2o byte: 3o byte: 40.40.40.??.?? 40.40.40.40.?? 40.40.40.??.?? 40.40.40.40.?? 3o byte: 4o byte: 40.40.40.40.?? 40.40.40.40.40 40.40.40.40.?? 40.40.40.40.40 1o byte: 2o byte: 40.??.??.??.?? Antes 40.40.??.??.?? Depois 40.40.??.??.?? Antes 40.40.40.??.?? Depois 40.40.40.??.?? Antes 40.40.40.40.?? Depois 4o byte: 40.40.40.40.?? Antes 40.40.40.40.40 Depois Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 324 Instruções de máquina - MVCIN MVCIN (MoVe Character Inverted – Mover [invertido] caracter) 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: Supor os operandos com tamanho e conteúdo como mostrados na linha “antes” 1o operando antes 2o operando antes 1o operando depois 2o operando depois MVCIN A(3),B+2 C4.C5.C6 C1.C2.C3 C3.C2.C1 C1.C2.C3 MVCIN A(5),BETA C4.C5.C6.C7.C8 C1.C2.C3.C4.C5 C5.C4.C3.C2.C1 C1.C2.C3.C4.C5 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 325 Instruções de máquina - MVCL MVCL (MoVe Character Long – Mover [longo] caracter) Código de máquina 0E (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis 0004,0005,0006 Tamanhos do 1. e 2º operandos são iguais Tamanho do 1º operando é menor Tamanho do 1º operando é maior Movimento não efetuado Tanto o 1º como o 2º operandos especificados devem ser registradores pares, os quais indicam (cada um deles) conjuntos de registradores par-ímpar, os quais chamaremos de R1 e R1+1 e R2 e R2+1. Esta instrução movimenta um campo de memória para outro campo de memória, byte a byte, da esquerda para a direita. O endereço do campo receptor deve estar nos 3 últimos bytes à direita de R1. O endereço do campo emissor deve estar nos 3 últimos bytes à direita de R2. O tamanho (número de bytes) do campo receptor deve estar nos 3 últimos bytes à direita de R1+1. O tamanho (número de bytes) do campo emissor deve estar nos 3 últimos bytes à direita de R2+1. O 1. byte à esquerda de R2+1 deve conter o caracter de preenchimento. O conteúdo do 1. byte à esquerda de R1, R2 e R1+1 é desprezado. Ex: MVCL 2,8 Ver detalhes no próximo slide. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 326 Instruções de máquina - MVCL MVCL (MoVe Character Long – Mover [longo] caracter) 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 0004,0005,0006 Interrupções Possíveis L L L L ICM MVCL 2,=A(RECEIVE) 3,=A(L’RECEIVE) 8,=A(SENDING) 9,=A(L’SENDING) 9,B'1000',=C'*' 2,8 Se o campo emissor ultrapassar ou não do byte 16.777.215 para o byte 0, o movimento é efetuado da seguinte forma: · 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. O endereço do byte mais à direita do campo receptor é calculado usando o tamanho do campo receptor ou do emissor (o menor). Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 327 Instruções de máquina - MVCL MVCL (MoVe Character Long – Mover [longo] caracter) Código de máquina 0E (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis 0004,0005,0006 Tamanhos do 1. e 2º operandos são iguais Tamanho do 1º operando é menor Tamanho do 1º operando é maior Movimento não efetuado 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. - O byte mais à esquerda, tanto de R1 quanto de R2, fica com 0, mesmo quando o movimento não é efetuado. - O byte mais à esquerda, tanto de R1+1 quanto de R2+1, não é alterado. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 328 Instruções de máquina - MVI MVI (MoVe Immediate – Mover [operando] 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 CPOA,C'*' CPOA,X'5C' CPOA,B'01011100' CPOA,92 CPOA antes CPOA depois 12 5C ou ou ou Operando imediato antes Operando imediato depois 5C 5C Outros exemplos: MVI MVI Sumário Pag.Ant. WAREA+72,C'/' 0(4),X'80' Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 329 Instruções de máquina - MVN MVN (MoVe Numerics – Mover [partes] numéricas) 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: 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 330 Instruções de máquina - MVO MVO (MoVe with Offset Mover 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 RECFLD,SENFLD SENFLD Antes 00.00.12.00 SENFLD Depois 00.00.12.00 RECFLD Antes 00.00.00.0C RECFLD Depois 00.01.20.0C Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 331 Instruções de máquina - MVO MVO (MoVe with Offset Mover 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 MVO CPOA,CPOB Antes Depois 1º Caso CPOB CPOA 12.34.56 78.9A 12.34.56 45.6A CPOB CPOA AB.72 4A.5C.B9.FC AB.72 00.0A.B7.2C 2º Caso Outros exemplos: MVO MVO MVO MVO Sumário Pag.Ant. ARCALC(5),ARCALC(4) 0(4,7),ARCALC AREA,2(5,8) 2(7,13),19(5,15) Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 332 Instruções de máquina - MVZ MVZ (MoVe Zones – Mover [partes] de zona) 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: 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 333 Instruções de máquina - N N (aNd – E booleano) Código de máquina 54 (Instrução RX) Condition code 00 01 10 11 Interrupções Possíveis 0005 Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um N O condition code nunca fica em 11 após um N 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 fullword). Bit da máscara = 0 então bit resultante = 0; Bit da máscara = 1 então bit resultante não é alterado Ex: N 13,CAMPOF Antes Depois Reg. 13 B4.EF.2F.A8 00.00.00.A8 CAMPOF 00.00.00.FF 00.00.00.FF Outros exemplos: N 11,=F'15' N 3,0(4) N 3,0(,4) N 3,0(8,4) Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 334 Instruções de máquina - NC NC (aNd Character – E [booleano] em caracter) Código de máquina D4 (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0004, 0005 Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um NC O condition code nunca fica em 11 após um NC A instrução NC executa um AND entre 2 campos de memória. Ex: Bit da máscara = 0 então bit resultante = 0; Bit da máscara = 1 então bit resultante não é alterado Exemplo: NC CPOA,CPOB antes EF.2F.A8 00.00.FF CPOA CPOB Sumário Pag.Ant. depois 00.00.A8 00.00.FF Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 335 Instruções de máquina - NI NI (aNd Immediate – E [booleano] com operando imediato) Código de máquina 94 (Instrução SI) Condition code 00 01 10 11 Interrupções Possíveis 0004, 0005 Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um NI O condition code nunca fica em 11 após um NI A instrução NI executa um AND entre 2 campos de memória (um byte cada). Ex: Bit da máscara = 0 então bit resultante = 0; Bit da máscara = 1 então bit resultante não é alterado Exemplo: NI BYTE,X'0F' antes depois BYTE B4 04 Op.Imed. 0F 0F Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 336 Instruções de máquina - NR NR (aNd Register – E [booleano] com registradores) Código de máquina 14 (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis Nenhuma Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um NR O condition code nunca fica em 11 após um NR A instrução NR executa um AND entre 2 registradores. Bit da máscara = 0 então bit resultante = 0; Bit da máscara = 1 então bit resultante não é alterado Ex: NR 5,8 Antes Depois Reg. 5 Reg. 8 B4.EF.2F.A8 00.00.00.FF Sumário Pag.Ant. 00.00.00.A8 00.00.00.FF Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 337 Instruções de máquina - O O ([boolean] Or – OU booleano) Código de máquina 56 (Instrução RX) Condition code 00 01 10 11 Interrupções Possíveis 0005 Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um O O condition code nunca fica em 11 após um O 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 fullword). Bit da máscara = 0 então bit resultante não é alterado ; Bit da máscara = 1 então bit resultante = 1 Ex: O 13,CAMPOF Reg. 13 CAMPOF Sumário Antes Depois B4.EF.2F.A8 00.00.00.FF B4.EF.2F.FF 00.00.00.FF Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 338 Instruções de máquina - OC OC (Or Character – OU booleano em caracter) Código de máquina D6 (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0004, 0005 Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um OC O condition code nunca fica em 11 após um OC A instrução OC executa um OR entre 2 campos de memória. Bit da máscara = 0 então bit resultante não é alterado ; Bit da máscara = 1 então bit resultante = 1 Ex: OC CPOA,CPOB CPOA CPOB Antes Depois EF.2F.A8 00.00.FF EF.2F.FF 00.00.FF Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 339 Instruções de máquina - OI OI (Or Immediate – OU [booleano] com operando imediato) Código de máquina 96 (Instrução SI) Condition code 00 01 10 11 Interrupções Possíveis 0004, 0005 Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um OI O condition code nunca fica em 11 após um OI A instrução OI executa um OR (operação booleana) entre 2 campos de memória (um byte cada). Bit da máscara = 0 então bit resultante não é alterado ; Bit da máscara = 1 então bit resultante = 1 Ex: OI BYTE,X'0F' antes depois B4 0F BF 0F BYTE Op.Imed. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 340 Instruções de máquina - OR OR (Or Register – OU [booleano] com registradores) Código de máquina 16 (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis Nenhuma Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um OR O condition code nunca fica em 11 após um OR A instrução OR executa um OR entre 2 registradores. Bit da máscara = 0 então bit resultante não é alterado ; Bit da máscara = 1 então bit resultante = 1 Ex: OR 5,8 Reg. 5 Reg. 8 Antes Depois B4.EF.2F.A8 00.00.00.FF B4.EF.2F.FF 00.00.00.FF Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 341 Instruções de máquina - PACK PACK (Compactar) Código de máquina F2 (Instrução SS – L1 e L2) Condition code não é alterado Interrupções Possíveis 0004,0005 A instrução PACK movimenta um campo de memória para outro campo de memória, transformando-o de zonado para compactado. A movimentação é feita da direita para a esquerda, da seguinte forma (o 2º operando é o campo emissor e o 1º operando é o campo receptor): O byte mais à direita do campo emissor é invertido e colocado no byte mais à direita do campo receptor (Inverter = a sua parte de zona vira parte numérica, e a sua parte numérica vira parte de zona). Em seguida, cada parte numérica de cada byte do campo emissor é colocada num meio byte do campo receptor, desprezando-se as partes de zona do campo emissor. Se o receptor for maior que o necessário, ele será preenchido com zeros à esquerda. Se ele for menor que o necessário, os algarismos em excesso serão truncados. O 2º operando permanece inalterado. Exemplo: PACK CPOA,CPOB antes depois CPOB F1.F2.F3.F4 F1.F2.F3.F4 CPOA 00.B7.2A 01.23.4F Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 342 Instruções de máquina - PACK PACK (Compactar) Código de máquina F2 (Instrução SS – L1 e L2) Condition code não é alterado Interrupções Possíveis 0004,0005 PACK CPOA,CPOB 2ºcaso CPOB CPOA F1.F2.F3.F4 C9.4A F1.F2.F3.F4 23.4F 3ºcaso CPOB 9A.48.F9.DB 9A.48.F9.DB CPOA 19.B7.DF 0A.89.BD Observar, pelo 3º Caso, que o campo emissor não é testado quando ao fato de ele estar em zonado e, consequentemente, o campo receptor pode não ficar em compactado. Outros exemplos: PACK VALOR,ARLEIT+5(9) PACK QUANTO+2(7),2(8,5) PACK 0(10,2),AREA PACK 2(5,7),2(3,8) PACK DOUBLE,DOUBLE PACK BYTE,BYTE Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 343 Instruções de máquina - S S (Subtract – subtrair [conteúdo de fullword]) Código de máquina 5B (Instrução RX) Condition code 00 Resultado = 0 01 Resultado < 0 10 Resultado > 0 11 Overflow 0005,0008 Interrupções Possíveis 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 fullword - é o Subtraendo). 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 S 5,=F'259' S 7,FULL S 7,4(2,8) S 7,4(2) S 7,4(,8) Sumário 00.00.BF.D2 00.00.BE.CF 00.00.00.0D FF.FF.FF.0A 07.FF.FF.FE 07.FF.FF.FD 07.FF.FF.FF 07.FF.FF.FD 00.00.00.00 00.00.00.01 Pag.Ant. Sumario Instr.Máq. 00.00.01.03 00.00.01.03 00.00.01.03 00.00.01.03 00.00.00.01 00.00.00.01 00.00.00.02 00.00.00.02 FF.FF.FF.FF FF.FF.FF.FF Alberto Romano Schiesari – www.profars.com 344 Instruções de máquina - SH SH (Subtract Halfword – Subtrair [conteúdo de] halfword) Código de máquina 4B (Instrução RX) Condition code 00 Resultado = 0 01 Resultado < 0 10 Resultado > 0 11 Overflow 0005,0008 Interrupções Possíveis 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 halfword). 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 SH 5,=H'259' 00.00.2B.C4 01.03 00.00.2A.C1 01.03 SH 5,HALF 00.00.00.0D 01.0D FF.FF.FF.00 01.0D SH 5,4(2,8) 11.11.11.11 (decimal 286331153) 88.88 (decimal –30584) 11.11.88.89 (decimal 286361737) 88.88 SH 5,4(2) 11.11.11.11 (decimal 286331153) 78.88 (decimal +30856) 11.10.98.89 (decimal 286300297) 78.88 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 345 Instruções de máquina - SL 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 0005 Interrupções Possíveis 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 fullword). 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.03 00.00.00.0A 00.00.00.03 SL 7,4(2,8) 07.FF.FF.FE 00.00.00.01 07.FF.FF.FD 00.00.00.01 SL 7,4(2) 07.FF.FF.FF 00.00.00.02 07.FF.FF.FD 00.00.00.02 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 346 Instruções de máquina - SLA SLA (Shift Left Algebraic – Deslocamento algébrico à esquerda) Código de máquina 8B (Instrução RS) Condition code 00 01 10 11 Interrupções Possíveis Nenhuma Resultado = 0 Resultado < 0 Resultado > 0 Overflow É feito deslocamento de bits para a esquerda no conteúdo do registrador primeiro operando. São deslocados os bits 1 a 31 do registrador: todos menos o bit de sinal (o bit de sinal não é deslocado/alterado). Os bits à direita são criados com zero. É uma instrução RS, e os bits 12 a 15 dela 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. 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.04.D0.00 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 347 Instruções de máquina - SLDA SLDA (Shift Left Double Algebraic – Deslocamento algébrico duplo à esquerda) Código de máquina 8F (Instrução RS) Condition code 00 01 10 11 Interrupções Possíveis 0004, 0008 Resultado = 0 Resultado < 0 Resultado > 0 Overflow É feito deslocamento de bits para a esquerda no conteúdo do par de registradores indicado registrador primeiro operando e pelo registrador seguinte a ele. São deslocados os 63 bits formados por: bits 1 a 31 do registrador primeiro operando juntamente com os bits 0 a 31 do registrador segundo operando (considera que o par de registradores tenha um número com 1 bit de sinal + 63 bits para o número). Os bits à direita são criados com zero. É uma instrução RS, e os bits 12 a 15 dela 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. Pode-se deslocar 63 "casas" no máximo. Ex: SLA 8,3 Registradores 8 e 9 antes do Shift 00.00.00.00 FF.80.9A.00 Registradores 8 e 9 após o Shift 00.00.00.07 FC.04.D0.00 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 348 Instruções de máquina - SLDL SLDL (Shift Left Double Logical – Deslocamento lógico duplo à esquerda) Código de máquina 8D (Instrução RS) Condition code Não é alterado Interrupções Possíveis 0006 É feito deslocamento de bits para a esquerda no conteúdo do par de registradores indicado pelo primeiro operando e pelo registrador seguinte ao primeiro operando. Todos os bits são deslocados para a esquerda (incluindo o bit de sinal). Os bits à direita são criados com zero. É uma instrução RS, e os bits 12 a 15 dela 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. 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 349 Instruções de máquina - SLL SLL (Shift Left Logical – Deslocamento lógico à esquerda) Código de máquina 89 (Instrução RS) Condition code Não é alterado Interrupções Possíveis Nenhuma É feito deslocamento de bits para a esquerda no conteúdo do registrador primeiro operando. Todos os bits são deslocados para a esquerda (incluindo o bit de sinal). Os bits à direita são criados com zero. É uma instrução RS, e os bits 12 a 15 dela 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. 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 350 Instruções de máquina - SLR SLR (Subtract Logical Register – Subtrair logicamente em registrador) Código de máquina 1F (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis Nenhuma Nunca o condition code fica em 00 após um SLR Resultado <> 0, não perde sinal Resultado = 0, perde sinal Resultado <> 0, perde sinal É 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 SLR 10,11 Sumário 00.B0.C4.E2 00.B0.C4.E1 80.00.00.00 7F.FF.FF.FF Pag.Ant. Sumario Instr.Máq. 00.00.00.01 00.00.00.01 00.00.00.01 00.00.00.01 Alberto Romano Schiesari – www.profars.com 351 Instruções de máquina - SP SP (Subtract Packed – Subtrair em compactado) Código de máquina FB (Instrução SS – L1 e L2) Condition code 00 01 10 11 Interrupções Possíveis 0001,0004,0005,0007,000A Resultado = 0 Resultado < 0 Resultado > 0 Overflow Esta instrução subtrai o conteúdo do 2o operando do conteúdo do 1o operando. Ambos devem ser campos de memória no formato decimal compactado. O resultado é colocado no 1o operando. Exemplos: SP FLDA,FLDB Antes Depois FLDB 98.7C 98.7C FLDA 12.34.5C 11.35.8C Mais exemplos: SP VALOR,VALOR SP TOTAL,=P'1' SP AE+5(8),AE+15(3) SP 0(2,7),4(1,8) Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 352 Instruções de máquina - SPM SPM (Set Program Mask – Posicionar 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 nenhuma Interrupções Possíveis 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 353 Instruções de máquina - SR SR (Subtract Register – Subtrair registrador) Código de máquina 1B (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis 0008 Resultado = 0 Resultado < 0 Resultado > 0 Overflow 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 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 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 354 Instruções de máquina - SRA SRA (Shift Right Algebraic – Deslocamento algebrico à direita) Código de máquina 8A (Instrução RS) Condition code 00 01 10 11 Interrupções Possíveis Nenhuma Resultado = Resultado < Resultado > O copdition 0 0 0 code nunca fica em 11 após um SRA É feito deslocamento de bits para a direita no conteúdo do registrador primeiro operando. São deslocados os bits 1 a 31 do registrador: todos menos o bit de sinal (o bit de sinal não é deslocado/alterado). Os bits à esquerda são criados com zero. É uma instrução RS, e os bits 12 a 15 dela 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. Pode-se deslocar 15 "casas" no máximo. Ex: SRA 5,3 Registrador 5 antes do Shift FF.80.0A.00 Registrador 5 após o Shift 8F.F0.01.40 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 355 Instruções de máquina - SRDA SRDA (Shift Right Double Algebraic – Deslocamento algébrico duplo à direita) Código de máquina 8E (Instrução RS) Condition code 00 01 10 11 SRDA 0006 Interrupções Possíveis Resultado = Resultado < Resultado > O condition 0 0 0 code nunca fica em 11 após em É feito deslocamento de bits para a direita no conteúdo do par de registradores indicado registrador primeiro operando e pelo registrador seguinte a ele. São deslocados os 63 bits formados por: bits 1 a 31 do registrador primeiro operando juntamente com os bits 0 a 31 do registrador segundo operando (considera que o par de registradores tenha um número com 1 bit de sinal + 63 bits para o número). Os bits à esquerda são criados com zero. É uma instrução RS, e os bits 12 a 15 dela 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. Pode-se deslocar 63 "casas" no máximo. Ex: SRDA 8,4 Registradores 8 e 9 antes do Shift 04.20.08.91 C4.00.02.FF Registradores 8 e 9 após o Shift 00.42.00.89 1C.40.00.2F Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 356 Instruções de máquina - SRDL SRDL (Shift Right Double Logical – Deslocamento lógico duplo à direita) Código de máquina Condition code 8C (Instrução RS) Não é alterado Interrupções Possíveis 0006 É feito deslocamento de bits para a direita no conteúdo do par de registradores indicado pelo primeiro operando e pelo registrador seguinte ao primeiro operando. Todos os bits são deslocados para a direita (incluindo o bit de sinal). Os bits à esquerda são criados com zero. É uma instrução RS, e os bits 12 a 15 dela 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. Pode-se deslocar 63 "casas" no máximo. Ex: SRDL 8,4 Registradores 8 e 9 antes do Shift 12.FE.3D.4C 5B.6A.78.90 8 9 Registradores 8 e 9 após o Shift 01.2F.E3.D4 C5.B6.A7.89 8 9 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 357 Instruções de máquina - SRL SRL (Shift Right Logical – Deslocamento lógico à direita) Código de máquina 88 (Instrução RS) Condition code Não é alterado Interrupções Possíveis Nenhuma É feito deslocamento de bits para a direita no conteúdo do registrador primeiro operando. Todos os bits são deslocados para a direita (incluindo o bit de sinal). Os bits à esquerda são criados com zero. É uma instrução RS, e os bits 12 a 15 dela 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. 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 358 Instruções de máquina - SRP SRP (Shift and Round Packed – Deslocar e arredondar em compactado) Código de máquina F0 (Instrução SS) Condition code 00 01 10 11 Interrupções Possíveis 0001,0004,0005,0007,000A Resultado = 0 Resultado < 0 Resultado > 0 Overflow 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. Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 359 Instruções de máquina - SRP SRP (Shift and Round Packed – Deslocar e arredondar em compactado) Código de máquina F0 (Instrução SS) Condition code 00 01 10 11 Interrupções Possíveis 0001,0004,0005,0007,000A Resultado = 0 Resultado < 0 Resultado > 0 Overflow 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: O 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: Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 360 Instruções de máquina - SRP SRP (Shift and Round Packed – Deslocar e arredondar em compactado) Código de máquina F0 (Instrução SS) Condition code 00 01 10 11 Interrupções Possíveis 0001,0004,0005,0007,000A SRP SRP Resultado = 0 Resultado < 0 Resultado > 0 Overflow TOTAL,61,5 TOTAL Antes 12.34.56.78.9C TOTAL Depois 00.01.23.45.7C (desloca 3 dígitos para a direita) TOTAL,3,0 TOTAL Antes 12.34.56.78.9C TOTAL Depois 45.67.89.00.0C (desloca 3 dígitos para a esquerda) Estas regras facilitam a especificação do sentido de deslocamento e quantidade de dígitos a deslocar: Deslocamento para a esquerda = especificar diretamente a quantidade de dígitos SRP TOTAL,3,5 Especificar quantidade de dígitos no 2o operando = desloca para a esquerda (no exemplo = 3) Deslocamento para a direita = especificar (64 – quantidade de dígitos) SRP TOTAL,64-3,5 Especificar [64-qtdade] no 2o operando = desloca para a direita (no exemplo = 3) Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 361 Instruções de máquina - ST ST (Store – armazenar [registrador em memória]) Código de máquina 50 (Instrução RX) Condition code Não é alterado Interrupções Possíveis 0004,0005 O conteúdo do registrador especificado no 1º operando é colocado no campo de memória de 4 bytes especificado no 2º operando (em geral uma fullword). O registrador 1º operando permanece inalterado. 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 ST 7,FULL FE.DC.BA.98 00.01.00.00 FE.DC.BA.98 FE.DC.BA.98 ST 14,SAVE 00.00.00.11 FF.FF.FF.FD 00.00.00.11 00.00.00.11 Outros exemplos: ST 14,FULL+4 ST 14,0(2) ST 14,0(,8) Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 362 Instruções de máquina - STC STC (STore Character – armazenar 1 byte de registrador) 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 2o operando antes 1o operando depois 2o operando depois STC 7,BYTE FE.DC.BA.98 00 FE.DC.BA.98 98 STC 14,0(5) 00.00.00.11 FF 00.00.00.11 11 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 363 Instruções de máquina - STCK STCK (Store ClocK – armazenar relógio) 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 0004 Interrupções Possíveis 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 364 Instruções de máquina - STCM STCM (STore Character under Mask – Armazenar caracter com 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 (código de operação) = 1 byte; R1 (registrador primeiro operando) = 1/2 byte E2 = 2 bytes (base+deslocamento do 2o. operando); M3 (máscara 3o. operando) = 1/2 byte 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. Exemplo: 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 STCM 5,B'1010',TWOBYTES 00.00.45.67 9A.BC 00.00.45.67 00.45 1o byte do registrador 5 é colocado no byte TWOBYTES e 3o byte do registrador 5 é colocado no byte TWOBYTES+1 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 365 Instruções de máquina - STH 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 halfword). O registrador 1º operando permanece inalterado. 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 STH 5,FLD 00.00.00.0A 8A.B4 00.00.00.0A 00.0A STH 8,HWORD FF.FF.FF.FF FF.FF FF.FF.FF.FF FF.FF Mais exemplos: STH 14,SAVE+18 STH 14,0(2) STH 14,0(,8) STH 14,0(2,8) STH 0,FLD Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 366 Instruções de máquina - STM STM (STore Multiple – Armazenar múltiplos [registradores]) Código de máquina Condition code Interrupções Possíveis 90 (Instrução RX) Não é alterado 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 = 16 bytes (bytes 0 a 3 = conteúdo reg 14; bytes 4 a 7 = conteúdo reg 15; bytes 8 a 11 = conteúdo reg 0; bytes 12 a 15 = conteúdo reg 1) |------- SALVA --------------------------------| <----------><---------><----------><----------> Reg. 14 Reg.15 Reg.0 Reg.1 Outro Exemplo: STM Sumário Pag.Ant. Sumario Instr.Máq. 1,7,2(10) Alberto Romano Schiesari – www.profars.com 367 Instruções de máquina - SVC 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 (código de operação) = 1 byte ; Número do SVC = 1 byte Esta instrução causa interrupção de programa, através de uma chamada ao programa supervisor, chamada essa que pede a ele que execute alguma função. O código especificado no único operando (entre 0 e 255) indica qual a função desejada. Ex: SVC 0 SVC 7 Exemplos de SVC's de MVS: X'00' (000) = EXCP/XDAP X'13' (019) = OPEN X'01' (001) = WAIT/WAITR/PRTOV X'14' (020) = CLOSE X'02' (002) = POST X'23' (035) = WTO/WTOR X'04' (004) = GETMAIN X'24' (036) = WTL X'05' (005) = FREEMAIN X'5D' (093) = TGET/TPUT X'0B' (011) = TIME X'63' (099) = DYNALLOC X'0D' (013) = ABEND X'6B' (107) = MODESET Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 368 Instruções de máquina - TM 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 0005 Nunca o condition code fica em 10 após um TM 11 Todos os bits testados estão ligados Interrupções Possíveis 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 Sumário CHAVE,B'10000001' Bits 0 e 7 de KEYAB 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 Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 369 Instruções de máquina - TR TR (TRanslate - Traduzir) Código de máquina DC (Instrução SS – L) Condition code Não é alterado Interrupções Possíveis 0004,0005 A instrução TR movimenta o conteúdo do 2º operando para o 1º operando, de acordo com o conteúdo do 1º operando. Para tanto, ela processa da esquerda para a direita, byte a byte, da seguinte forma: ela soma o conteúdo de um byte do 1º operando ao endereço do 2º operando; o byte cujo endereço foi encontrado, será movido para o byte do 1º operando. Ex: TR ACSD,TABELA Antes ACSD 02.00.08.FF.05 TABELA I C1.48.B9.D7.A1.C3.D9.5C.4B ........1A Tem 256 bytes Depois ACSD B9.C1.4B.1A.C3 TABELA não é alterado Outros exemplos: TR 0(5,7),0(10) TR ARIMP+7(10),TABASTER TR 2(5,124),CAMP Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 370 Instruções de máquina - TR TR (TRanslate - Traduzir) Código de máquina DC (Instrução SS – L) Condition code Não é alterado Interrupções Possíveis 0004,0005 Mais exemplos : Para traduzir letras maiúsculas EBCDIC em letras minúsculas EBCDIC; “letras” inválidas são convertidas em espaços EBCDIC CONVTB1 DC 256C' ' 256 espacos EBCDIC ORG CONVTB1+C'A' Volta para A maiusculo DC C'abcdefghi' Substitui espacos originais pelas minusculas ORG CONVTB1+C'J' Volta para J maiusculo DC C'jklmnopqr' Substitui espacos originais pelas minusculas ORG CONVTB1+C'S' Volta para S maiusculo DC C'stuvwxyz’ Substitui espacos originais pelas minusculas ORG , Volta para CONVTB1 +256 Para traduzir letras maiúsculas EBCDIC para letras maiúsculas ASCII; “letras” inválidas são convertidas para espaços ASCII CONVTB2 DC 256X'20' 256 ASCII spaces ORG CONVTB2+C'A' Volta para A maiusculo DC X'414243444546474849' Substitui letras EBCDIC pelas ASCII ORG CONVTB1+C'J' Volta para J maiusculo DC X'4A4B4C4D4E4F505152' Substitui letras EBCDIC pelas ASCII ORG CONVTB1+C'S' Volta para S maiusculo DC X'535455565758595A' Substitui letras EBCDIC pelas ASCII ORG , Volta para CONVTB2+256 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 371 Instruções de máquina - TR TR (TRanslate - Traduzir) Código de máquina DC (Instrução SS – L) Condition code Não é alterado Interrupções Possíveis 0004,0005 Mais exemplos : Para 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 372 Instruções de máquina - TRT 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 0005estava em X'00' 11 O condition code nunca fica em 11 após um TRT Interrupções Possíveis 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 a seguir: Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 373 Instruções de máquina - TRT 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' 0005 11 O condition code nunca fica em 11 após um TRT Interrupções Possíveis a) Testar se um campo (1º operando) está no formato decimal zonado - campo numérico: TRT CART+9(6),TABNUM BZ NUMÉRICO . . . TABNUM DC 240X'FF',10X'00',6X'FF' b) Testar se um campo (1º operando) é alfabético (só tem letras e brancos) TRT CART+9(6),TABALFAB BZ FABETICO . . TABALFAB DC CL256X'FF' ORG TABALFAB+C' ' DC X'00' ORG TABALFAB+C'A' DC 9X'00' ORG TABALFAB+C'J' DC 9X'00' ORG TABALFAB+C'S' DC 8X'00' ORG Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 374 Instruções de máquina - TRT 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' 0005 11 O condition code nunca fica em 11 após um TRT Interrupções Possíveis c) Achar o 1º byte de um campo que tenha determinado caracter (* no exemplo). TABASTER Sumário TRT 0(80,7),TABASTER BZ NOTASTER aqui o registrador 1 tem o endereço do byte com * desejado . . . DC 256X'00' ORG TABASTER+C'*' DC X'FF' ORG Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 375 Instruções de máquina - TS TS (Test ans Set – Testar e posicionar) Código de máquina 93 (Instrução S) Condition code 00 01 10 11 Interrupções Possíveis 0004,0005 Bit mais à Bit mais à Nunca fica Nunca fica 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 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 376 Instruções de máquina - UNPK UNPK (UNPacK - Descompactar) Código de máquina F3 (Instrução SS – L1 e L2) Condition code não é alterado Interrupções Possíveis 0004,0005 A instrução UNPK movimenta um campo de memória para outro campo de memória, transformando-o de compactado para zonado. Não é feito nenhum teste quanto à validade dos campos. O 1º operando é o campo receptor e o 2º operando é o campo emissor. A movimentação é feita da direita para a esquerda, da seguinte forma: O byte mais à direita do campo emissor é invertido e colocado no byte mais à direita do campo receptor (inverter = a sua parte de zona vira parte numérica, e a sua parte numérica vira parte de zona). Em seguida, cada meio byte do campo emissor é colocado na parte numérica de um byte do campo receptor, sendo que na parte de zona do byte do campo receptor é colocado X'F'. O 2º operando permanece inalterado. Se o campo receptor for menor que o necessário, os algarismos em excesso serão truncados. Se o campo receptor for maior que o necessário, os bytes em excesso serão preenchidos com X'F0'. Ex: UNPK CPOA,CPOB antes depois CPOB 12.34.5C 12.34.5C CPOA 92.B8.4C.D0 F2.F3.F4.C5 Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 377 Instruções de máquina - UNPK 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 Outros exemplos: UNPK CPOB CPOA CPOA,CPOB antes 12.3C 92.B8.4C.D0 UNPK UNPK UNPK UNPK Sumário Pag.Ant. depois 12.3C F0.F1.F2.C3 ARGRAV+5(12),TOTLIQ AX2,2(3,7) 17(10,8),T4B2F+3(5) 2(13,10),0(5,3) Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 378 Instruções de máquina - X X ([boolean] eXclusive or - OU exlusivo booleano) Código de máquina 57 (Instrução RX) Condition code 00 01 10 11 Interrupções Possíveis 0005 Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um X O condition code nunca fica em 11 após um X 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 fullword). Bit da máscara = 0 então bit resultante não é alterado; Bit da máscara = 1 então bit resultante é o inverso Ex: X 13,CAMPOF Reg. 13 CAMPOF antes B4.EF.2F.A8 00.00.00.FF Sumário Pag.Ant. depois B4.EF.2F.57 00.00.00.FF Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 379 Instruções de máquina - XC XC (eXclusive or Character – OU exclusivo [booleano] em caracter) Código de máquina D7 (Instrução SS – L) Condition code 00 01 10 11 Interrupções Possíveis 0004, 0005 Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um XC O condition code nunca fica em 11 após um XC A instrução XC executa um EXCLUSIVE OR entre 2 campos de memória. Bit da máscara = 0 então bit resultante não é alterado; Bit da máscara = 1 então bit resultante é o inverso Ex: XC CPOA,CPOB CPOA CPOB antes EF.2F.A8 00.00.00 Sumário Pag.Ant. depois EF.2F.57 00.00.FF Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 380 Instruções de máquina - XI XI (eXclusive or Immediate – OU exclusivo [booleano] com operando imediato) Código de máquina 97 (Instrução SI) Condition code 00 01 10 11 Interrupções Possíveis 0004, 0005 Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um OI O condition code nunca fica em 11 após um OI A instrução XI executa um EXCLUSIVE OR entre 2 campos de memória (um byte cada). Bit da máscara = 0 então bit resultante não é alterado; Bit da máscara = 1 então bit resultante é o inverso Ex: NI BYE,X'0F' BYTE Op.Imed. Sumário Antes B4 0F Pag.Ant. Depois BB 0F Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 381 Instruções de máquina - XR XR (eXclusive Or Register – OU exclusivo [booleano] com registradores) Código de máquina 17 (Instrução RR) Condition code 00 01 10 11 Interrupções Possíveis Nenhuma Resultado = 0 Resultado <> 0 O condition code nunca fica em 10 após um XR O condition code nunca fica em 11 após um XR A instrução XR executa um EXCLUSIVE OR entre 2 registradores. Bit da máscara = 0 então bit resultante não é alterado; Bit da máscara = 1 então bit resultante é o inverso Ex: XR 5,8 Reg. 5 Reg. 8 Antes B4.EF.2F.A8 00.00.00.FF Sumário Pag.Ant. Depois B4.EF.2F.57 00.00.00.FF Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 382 Instruções de máquina - ZAP 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 01 10 11 Interrupções Possíveis 0001,0004,0005,0007,000A Se o campo movido = 0 Se o campo movido < 0 Se o campo movido > 0 Overflow 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: Sumário Pag.Ant. Sumario Instr.Máq. Alberto Romano Schiesari – www.profars.com 383 Instruções de máquina - ZAP 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 01 10 11 Interrupções Possíveis 0001,0004,0005,0007,000A ZAP Se o campo movido = 0 Se o campo movido < 0 Se o campo movido > 0 Overflow CPOA,CPOB Antes Depois 1º Caso CPOB CPOA 12.34.5C B4.F8 12.34.5C 34.5C CPOB CPOA 12.3C 07.B8.92 12.3C 00.12.3C 2º Caso Outros exemplos: ZAP ZAP ZAP Sumário TOTAL,=P'0' TOTAL,TOTAL CONTLIN,=P'2' Pag.Ant. Alberto Romano Schiesari – www.profars.com 384 Macro-instruções MACRO-INSTRUÇÕES Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 385 Macro-instruções MACRO-INSTRUÇÕES Sorry... Não é escopo deste curso... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 386 Apêndice - Links LINKS z/Architecture http://publibz.boulder.ibm.com/epubs/pdf/dz9zr006.pdf ESA Enterprise Systems Architecture / XC Extended Configuration (para z/VM) http://publib.boulder.ibm.com/infocenter/zvm/v5r3/index.jsp?topic=/com.ibm.zvm.v53.hcpb6/abstract.htm High Level Assembler http://publib.boulder.ibm.com/infocenter/ratdevz/v7r5/topic/com.ibm.ent.asm.zos.doc/topics/fn1lrmst02.htm#wq2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 387 Apêndice – Resumo instruções por cod. operação Algumas instruções (ordem código de operação) Mnemônico Cod.Instr Tipo BALR 05 RR BCTR 06 RR BCR 07 RR SVC 0A RR BSM 0B RR BASSM 0C RR BASR 0D RR MVCL 0E RR CLCL 0F RR LPR 10 RR LNR 11 RR LTR 12 RR LCR 13 RR NR 14 RR CLR 15 RR OR 16 RR XR 17 RR LR 18 RR CR 19 RR AR 1A RR Sumário Pag.Ant. Mnemônico Cod.Instr Tipo SR 1B RR MR 1C RR DR 1D RR ALR 1E RR SLR 1F RR STH 40 RX LA 41 RX STC 42 RX IC 43 RX EX 44 RX BAL 45 RX BCT 46 RX BC 47 RX LH 48 RX CH 49 RX AH 4A RX SH 4B RX MH 4C RX BAS 4D RX CVD 4E RX Mnemônico Cod.Instr Tipo CVB 4F RX ST 50 RX LAE 51 RX N 54 RX CL 55 RX O 56 RX X 57 RX L 58 RX C 59 RX A 5A RX S 5B RX M 5C RX D 5D RX AL 5E RX SL 5F RX STD 60 RX MXD 67 RX LD 68 RX CD 69 RX AD 6A RX Alberto Romano Schiesari – www.profars.com 388 Apêndice – Resumo instruções por cod. operação Algumas instruções (ordem código de operação) Mnemônico Cod.Instr Tipo SD 6B RX MD 6C RX DD 6D RX AW 6E RX SW 6F RX STE 70 RX LE 78 RX CE 79 RX BXH 86 RS BXLE 87 RS SRL 88 RS SLL 89 RS SRA 8A RS SLA 8B RS SRDL 8C RS SLDL 8D RS SRDA 8E RS SLDA 8F RS STM 90 RS TM 91 SI Sumário Pag.Ant. Mnemônico Cod.Instr Tipo MVI 92 SI TS 93 S NI 94 SI CLI 95 SI OI 96 SI XI 97 SI LM 98 RS MC AF SI LRA B1 RX STCK B205 S CS BA RS CDS BB RS CLM BD RS STCM BE RS ICM BF RS MVN D1 SS/L MVC D2 SS/L MVZ D3 SS/L NC D4 SS/L CLC D5 SS/L Mnemônico Cod.Instr Tipo OC D6 SS/L XC D7 SS/L TR DC SS/L TRT DD SS/L ED DE SS/L EDMK DF SS/L MVCIN E8 SS/L SRP F0 SS/L1I3 MVO F1 SS/L1L2 PACK F2 SS/L1L2 UNPK F3 SS/L1L2 ZAP F8 SS/L1L2 CP F9 SS/L1L2 AP FA SS/L1L2 SP FB SS/L1L2 MP FC SS/L1L2 DP FD SS/L1L2 Alberto Romano Schiesari – www.profars.com 389 Apêndice – Resumo instruções por mnemônico Algumas instruções (ordem mnemônico) Mnemônico A AD AH AL ALR AP AR AW BAL BALR BAS BASR BASSM BC BCR BCT BCTR BSM BXH BXLE Cod.Instr Tipo 5A RX 6A RX 4A RX 5E RX 1E RR FA SS/L1L2 1A RR 6E RX 45 RX 05 RR 4D RX 0D RR 0C RR 47 RX 07 RR 46 RX 06 RR 0B RR 86 RS 87 RS Sumário Pag.Ant. Mnemônico C CD CDS CE CH CL CLC CLCL CLI CLM CLR CP CR CS CVB CVD D DD DP DR Cod.Instr Tipo 59 RX 69 RX BB RS 79 RX 49 RX 55 RX D5 SS/L 0F RR 95 SI BD RS 15 RR F9 SS/L1L2 19 RR BA RS 4F RX 4E RX 5D RX 6D RX FD SS/L1L2 1D RR Mnemônico ED EDMK EX IC ICM L LA LAE LCR LD LE LH LM LNR LPR LR LRA LTR M MC Cod.Instr Tipo DE SS/L DF SS/L 44 RX 43 RX BF RS 58 RX 41 RX 51 RX 13 RR 68 RX 78 RX 48 RX 98 RS 11 RR 10 RR 18 RR B1 RX 12 RR 5C RX AF SI Alberto Romano Schiesari – www.profars.com 390 Apêndice – Resumo instruções por mnemônico Algumas instruções (ordem mnemônico) Mnemônico MD MH MP MR MVC MVCIN MVCL MVI MVN MVO MVZ MXD N NC NI NR O OC OI OR Cod.Instr Tipo 6C RX 4C RX FC SS/L1L2 1C RR D2 SS/L E8 SS/L 0E RR 92 SI D1 SS/L F1 SS/L1L2 D3 SS/L 67 RX 54 RX D4 SS/L 94 SI 14 RR 56 RX D6 SS/L 96 SI 16 RR Sumário Pag.Ant. Mnemônico PACK S SD SH SL SLA SLDA SLDL SLL SLR SP SR SRA SRDA SRDL SRL SRP ST STC STCK Cod.Instr Tipo F2 SS/L1L2 5B RX 6B RX 4B RX 5F RX 8B RS 8F RS 8D RS 89 RS 1F RR FB SS/L1L2 1B RR 8A RS 8E RS 8C RS 88 RS F0 SS/L1I3 50 RX 42 RX B205 S Mnemônico STCM STD STE STH STM SVC SW TM TR TRT TS UNPK X XC XI XR ZAP Cod.Instr Tipo BE RS 60 RX 70 RX 40 RX 90 RS 0A RR 6F RX 91 SI DC SS/L DD SS/L 93 S F3 SS/L1L2 57 RX D7 SS/L 97 SI 17 RR F8 SS/L1L2 Alberto Romano Schiesari – www.profars.com 391 Apêndice – EBCDIC – Alguns caracteres Algumas configurações EBCDIC HEX CARATER 40 Espaço 60 - hífen 81 a A2 s D0 } fecha chave F0 0 4B . ponto 61 / barra 82 b A3 t D1 J F1 1 4C < menor 6B , virgula 83 c A4 u D2 K F2 2 4D ( abre parênt. 6C % percentual 84 d A5 v D3 L F3 3 4E + mais 6D _ underscore 85 e A6 w D4 M F4 4 4F | barra vertical 6E > maior 86 f A7 x D5 N F5 5 50 & E comercial 6F 87 g A8 y D6 O F6 6 5A ! exclamação 7A ? interrogação : 2 pontos 88 h A9 z D7 P F7 7 5B $ cifrão 7B # número 91 i C0 { abre chave D8 Q F8 8 5C * asterisco 7C @ arroba 92 j C1 A D9 R F9 9 5D ) fecha parênt. 7D ' apostrofe 93 k C2 B E0 \ barra invertida 5E ; ponto e vírgula 7E = igual 94 l C3 C E2 S 5F 7F " aspas 95 m C4 D E3 T 96 n C5 E E4 U 97 o C6 F E5 V 98 p C7 G E6 W 99 q C8 H E7 X 9A r C9 I E8 Y E9 Z not Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 392 Apêndice – ASCII – Alguns caracteres Algumas configurações ASCII HEX CARATER 20 Espaço 30 0 zero 40 21 ! Exclamação 31 1 um 22 “ Aspas 32 23 # Número 24 50 P 60 ` Acento grave 70 p 41 @ at A 51 Q 61 a 71 q 2 dois 42 B 52 R 62 b 72 r 33 3 tres 43 C 53 S 63 c 73 s $ Cifrão 34 4 quatro 44 D 54 T 64 d 74 t 25 % Percentual 35 5 cinco 45 E 55 U 65 e 75 u 26 & E comercial 36 6 seis 46 F 56 V 66 f 76 v 27 ‘ Apóstrofe 37 7 sete 47 G 57 W 67 g 77 w 28 ( Abre parentheses 38 8 oito 48 H 58 X 68 h 78 x 29 ) Fecha parentheses 39 9 nove 49 I 59 Y 69 i 79 y 2A * Asterisco 3A : dois pontos 4A J 5A Z 6A j 7A z 2B + Soma 3B ; ponto e vírgula 4B K 5B [ Abre colchete 6B k 7B { Abre chave 2C , Virgula 3C < menor que 4C L 5C \ Barra invertida 6C l 7C | Barra vertical 2D - Hífen 3D = igual a 4D M 5D ] Fecha colchete 6D m 7D } Fecha chave 2E . Ponto 3E > maior que 4E N 5E ^ Circumflexo 6E n 7E ~ Til 2F / Barra 3F ? Interrogação 4F O 5F _ (Sublinhado) 6F o Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 393 Questões Questões Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 394 (Q) Exercícios 1-12 (Converter de decimal para binário) Exercício 1 : (987654)10 = (?)2 Exercício 2 : (4095)10 = (?)2 Exercício 3 : (7)10 = (?)2 Exercício 4 : (1023)10 = (?)2 Exercício 5 : (4096)10 = (?)2 Exercício 6 : (255)10 = (?)2 Exercício 7 : (1024)10 = (?)2 Exercício 8 : (10010001)10 = (?)2 Exercício 9 : (256)10 = (?)2 Exercício 10 : (1025)10 = (?)2 Exercício 11 : (999888)10 = (?)2 Exercício 12 : (65432)10 = (?)2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 395 (Q) Exercícios 13-24 (Converter de decimal para hexadecimal) Exercício 13 : (987654)10 = (?)16 Exercício 14 : (4095)10 = (?)16 Exercício 15 : (7)10 = (?)16 Exercício 16 : (1023)10 = (?)16 Exercício 17 : (4096)10 = (?)16 Exercício 18 : (255)10 = (?)16 Exercício 19 : (1024)10 = (?)16 Exercício 20 : (10010001)10 = (?)16 Exercício 21 : (256)10 = (?)16 Exercício 22 : (1025)10 = (?)16 Exercício 23 : (999888)10 = (?)16 Exercício 24 : (65432)10 = (?)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 396 (Q) Exercícios 25-36 (Converter de binário para hexadecimal) Exercício 25 : (11111000111010100100001 )2 = (?)16 Exercício 26 : (1000000111000111111110000011111110)2 = (?)16 Exercício 27 : (1100)2 = (?)16 Exercício 28 : (11111110001)2 = (?)16 Exercício 29 : (1010101010101000110011000111)2 = (?)16 Exercício 30 : (110011001100110011001)2 = (?)16 Exercício 31 : (1000000000000001)2 = (?)16 Exercício 32 : (1000000001)2 = (?)16 Exercício 33 : (111111100000001111111)2 = (?)16 Exercício 34 : (1)2 = (?)16 Exercício 35 : (1100101011111110)2 = (?)16 Exercício 36 : (101011010111000111000000001111110001111)2 = (?)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 397 (Q) Exercícios 37-48 (Converter de hexadecimal para binário) Exercício 37 : (CAFE)16 = (?)2 Exercício 38 : (CDF)16 = (?)2 Exercício 39 : (1AB4D)16 = (?)2 Exercício 40 : (15)16 = (?)2 Exercício 41 : (F)16 = (?)2 Exercício 42 : (87B54)16 = (?)2 Exercício 43 : (1001)16 = (?)2 Exercício 44 : (234)16 = (?)2 Exercício 45 : (CAD)16 = (?)2 Exercício 46 : (7F7)16 = (?)2 Exercício 47 : (1990)16 = (?)2 Exercício 48 : (33)16 = (?)2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 398 (Q) Exercícios 49-60 (Converter de binário para decimal) Exercício 49 : (11)2 = (?)10 Exercício 50 : (100001111111)2 = (?)10 Exercício 51 : (101010010101)2 = (?)10 Exercício 52 : (110000001111111)2 = (?)10 Exercício 53 : (11111110000011)2 = (?)10 Exercício 54 : (11110000111000)2 = (?)10 Exercício 55 : (11)2 = (?)10 Exercício 56 : (111111110)2 = (?)10 Exercício 57 : (1111100001111000111001101)2 = (?)10 Exercício 58 : (1000000000000)2 = (?)10 Exercício 59 : (11111001)2 = (?)10 Exercício 60 : (1000000000000001)2 = (?)10 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 399 (Q) Exercícios 61-72 (Converter de hexadecimal para decimal) Exercício 61 : (11)16 = (?)10 Exercício 62 : (AAF45)16 = (?)10 Exercício 63 : (1B567)16 = (?)10 Exercício 64 : (100)16 = (?)10 Exercício 65 : (1000)16 = (?)10 Exercício 66 : (FF)16 = (?)10 Exercício 67 : (FFF)16 = (?)10 Exercício 68 : (CDF)16 = (?)10 Exercício 69 : (CAFE)16 = (?)10 Exercício 70 : (FACA)16 = (?)10 Exercício 71 : (DAD0)16 = (?)10 Exercício 72 : (F1E2D3C4)16 = (?)10 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 400 (Q) Exercícios 73-84 (Somar números binários) Exercício 73 : (11001100)2 + (10101010)2 = (?)2 Exercício 74 : (1111001111)2 + (1001111001)2 = (?)2 Exercício 75 : (1111)2 + (1)2 = (?)2 Exercício 76 : (1111)2 + (111)2 = (?)2 Exercício 77 : (100001)2 + (11110)2 = (?)2 Exercício 78 : (1011110011)2 + (111101111)2 = (?)2 Exercício 79 : (110011001100)2 + (101011110000)2 = (?)2 Exercício 80 : (1111100001111000)2 + (101111)2 = (?)2 Exercício 81 : (111)2 + (1111)2 + (100)2 = (?)2 Exercício 82 : (11)2 + (111)2 + (1111)2 + (11111)2 = (?)2 Exercício 83 : (1111)2 + (1001)2 + (111)2 + (101)2 + (11)2 + (1)2 = (?)2 Exercício 84 : (111)2 + (1000)2 + (1)2 + (1100)2 = (?)2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 401 (Q) Exercícios 85-96 (Subtrair números binários) Exercício 85 : (11001100)2 - (1010101)2 = (?)2 Exercício 86 : (1111001111)2 - (1111001)2 = (?)2 Exercício 87 : (1111)2 - (1)2 = (?)2 Exercício 88 : (1111)2 - (111)2 = (?)2 Exercício 89 : (100001)2 - (11110)2 = (?)2 Exercício 90 : (1011110011)2 - (111101111)2 = (?)2 Exercício 91 : (11001100)2 - (111011110000)2 = (?)2 Exercício 92 : (1111000)2 - (101010111)2 = (?)2 Exercício 93 : (111)2 - (1111)2 = (?)2 Exercício 94 : (10001)2 - (111111)2 = (?)2 Exercício 95 : (0)2 - (1)2 = (?)2 Exercício 96 : (0)2 - (10)2 = (?)2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 402 (Q) Exercícios 97-108 (Somar números em hexadecimal) Exercício 97 : (F12B)16 + (321)16 = (?)16 Exercício 98 : (1100)16 + (111)2 = (?)16 Exercício 99 : (1000F)16 + (F0001)16 = (?)16 Exercício 100 : (A9B8C7)16 + (D6E5F4)16 = (?)16 Exercício 101 : (CAFE)16 + (CDF)16 = (?)16 Exercício 102 : (B001)16 + (FD)16 = (?)16 Exercício 103 : (999)16 + (111)16 = (?)16 Exercício 104 : (123456)16 + (789ABC)16 = (?)16 Exercício 105 : (FFF)16 + (EEE)16 = (?)16 Exercício 106 : (DDD)16 + (333)16 = (?)16 Exercício 107 : (987AED)16 + (CF01)16 = (?)16 Exercício 108 : (FACA)16 + (CAFE)16 = (?)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 403 (Q) Exercícios 109-120 (Subtrair números em hexadecimal) Exercício 109 : (F1C5)16 - (101)16 = (?)16 Exercício 110 : (1AD87C)16 - (FDE9)2 = (?)16 Exercício 111 : (112233)16 - (44556)16 = (?)16 Exercício 112 : (AABBCC)16 - (DDEEF)16 = (?)16 Exercício 113 : (F1E2D3)16 - (C4B5A6)16 = (?)16 Exercício 114 : (FF00001)16 - (10000F)16 = (?)16 Exercício 115 : (CAFE)16 - (FACA)16 = (?)16 Exercício 116 : (CDF)16 - (FDC)16 = (?)16 Exercício 117 : (10001)16 - (20001)16 = (?)16 Exercício 118 : (10000)16 - (FFFE)16 = (?)16 Exercício 119 : (0)16 - (9)16 = (?)16 Exercício 120 : (0)16 - (1A)16 = (?)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 404 (Q) Exercícios 121-126 (Representar números binários em halfword e fullword) Exercício 121 : (1)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 122 : (-1)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 123 : (10)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 124 : (-10)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 125 : (17)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 126 : (-17)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 405 (Q) Exercícios 127-132 (Representar números binários em halfword e fullword) Exercício 127 : (254)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 128 : (-254)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 129 : (100000)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 130 : (-100000)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 131 : (32000)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 132 : (-32000)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 406 (Q) Exercícios 133-138 (Representar números binários em halfword e fullword) Exercício 133 : (63000)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 134 : (-63000)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 135 : (1010)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 136 : (-1010)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 137 : (4095)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 138 : (-4095)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 407 (Q) Exercícios 139-140 (Representar números binários em halfword e fullword) Exercício 139 : (4097)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Exercício 140 : (-4097)10 = (bbbb bbbb bbbb bbbb)2 = (xxxx)16 = (bbbb bbbb bbbb bbbb bbbb bbbb bbbb bbbb)2 = (xxxxxxxx)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 408 (Q) Exercícios 141-152 (Representar números compactados em bytes) Exercício 141 : (1)10 = (no formato decimal compactado) Exercício 142 : (-1)10 = (no formato decimal compactado) Exercício 143 : (10)10 = (no formato decimal compactado) Exercício 144 : (-10)10 = (no formato decimal compactado) Exercício 145 : (17)10 = (no formato decimal compactado) Exercício 146 : (-17)10 = (no formato decimal compactado) Exercício 147 : (254)10 = (no formato decimal compactado) Exercício 148 : (-254)10 = (no formato decimal compactado) Exercício 149 : (100000)10 = (no formato decimal compactado) Exercício 150 : (-100000)10 = (no formato decimal compactado) Exercício 151 : (32000)10 = (no formato decimal compactado) Exercício 152 : (-32000)10 = (no formato decimal compactado) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 409 (Q) Exercícios 153-160 (Representar números compactados em bytes) Exercício 153 : (63000)10 = (no formato decimal compactado) Exercício 154 : (-63000)10 = (no formato decimal compactado) Exercício 155 : (1010)10 = (no formato decimal compactado) Exercício 156 : (-1010)10 = (no formato decimal compactado) Exercício 157 : (4095)10 = (no formato decimal compactado) Exercício 158 : (-4095)10 = (no formato decimal compactado) Exercício 159 : (4097)10 = (no formato decimal compactado) Exercício 160 : (-4097)10 = (no formato decimal compactado) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 410 (Q) Exercícios 161-172 (Representar números zonados em bytes) Exercício 161 : (1)10 = (no formato decimal zonado) Exercício 162 : (-1)10 = (no formato decimal zonado) Exercício 163 : (10)10 = (no formato decimal zonado) Exercício 164 : (-10)10 = (no formato decimal zonado) Exercício 165 : (17)10 = (no formato decimal zonado) Exercício 166 : (-17)10 = (no formato decimal zonado) Exercício 167 : (254)10 = (no formato decimal zonado) Exercício 168 : (-254)10 = (no formato decimal zonado) Exercício 169 : (100000)10 = (no formato decimal zonado) Exercício 170 : (-100000)10 = (no formato decimal zonado) Exercício 171 : (32000)10 = (no formato decimal zonado) Exercício 172 : (-32000)10 = (no formato decimal zonado) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 411 (Q) Exercícios 173-180 (Representar números zonados em bytes) Exercício 173 : (63000)10 = (no formato decimal zonado) Exercício 174 : (-63000)10 = (no formato decimal zonado) Exercício 175 : (1010)10 = (no formato decimal zonado) Exercício 176 : (-1010)10 = (no formato decimal zonado) Exercício 177 : (4095)10 = (no formato decimal zonado) Exercício 178 : (-4095)10 = (no formato decimal zonado) Exercício 179 : (4097)10 = (no formato decimal zonado) Exercício 180 : (-4097)10 = (no formato decimal zonado) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 412 (Q) Exercícios 181-194 (Representar strings de caracteres em bytes) Exercício 181 : “17“ = (em EBCDIC alfanumérico) Exercício 182 : “-17“ = (em EBCDIC alfanumérico) Exercício 183 : “AF$BD“ = (em EBCDIC alfanumérico) Exercício 184 : “-AF4BD“ = (em EBCDIC alfanumérico) Exercício 185 : “ALBERTO“ = (em EBCDIC alfanumérico) Exercício 186 : “15-9“ = (em EBCDIC alfanumérico) Exercício 187 : “-4095“ = (em EBCDIC alfanumérico) Exercício 188 : “4095“ = (em EBCDIC alfanumérico) Exercício 189 : “*&$//“ = (em EBCDIC alfanumérico) Exercício 190 : “12+3“ = (em EBCDIC alfanumérico) Exercício 191 : “I LOVE HER“ = (em EBCDIC alfanumérico) Exercício 192 : “US$ 2,584.73“ = (em EBCDIC alfanumérico) Exercício 193 : “US$ 1 MILLION“ = (em EBCDIC alfanumérico) Exercício 194 : “PANCHO’S BAR“ = (em EBCDIC alfanumérico) Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 413 (Q) Exercícios 195-209 (Representar campos em bytes) 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ício 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. 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 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: Sumário DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC Pag.Ant. 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'*' Alberto Romano Schiesari – www.profars.com 414 (Q) Exercícios 210-225 (Representar campos em bytes) 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 Sumário 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: Pag.Ant. DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC 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' Alberto Romano Schiesari – www.profars.com 415 (Q) Exercícios 226-239 (Representar campos em bytes) 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 Sumário 226: 227: 228: 229: 230: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: Pag.Ant. DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC 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' H'-10' H'-15,+16' Alberto Romano Schiesari – www.profars.com 416 (Q) Exercícios 240-254 (Representar campos em bytes) 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 Sumário 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: Pag.Ant. DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC 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' Alberto Romano Schiesari – www.profars.com 417 (Q) Exercícios 255-266 (Representar campos em bytes) Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Sumário 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: Pag.Ant. DC DC DC DC DC DC DC DC DC DC DC DC 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' Alberto Romano Schiesari – www.profars.com 418 (Q) Exercícios 267-279 (Representar campos em bytes) 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 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: Sumário SIMBZZ SIMBAA SIMBBB SIMBCC SIMBDD SIMBEE SIMBFF SIMBGG SIMBHH SIMBII SIMBJJ SIMBKK SIMBLL Pag.Ant. DC DC DC DC DC DC DS DC DC DC DC DC DC 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) Alberto Romano Schiesari – www.profars.com 419 (Q) Exercícios 280-290 (Representar campos em bytes) Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Sumário 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: SIMBMM SIMBNN SIMBOO SIMBPP SIMBQQ SIMBRR SIMBSS SIMBTT SIMBUU SIMBVV SIMBWW Pag.Ant. DC DC DC DC DC DC DC DC DC DC DC 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') Alberto Romano Schiesari – www.profars.com 420 (Q) Exercícios 291-299 (Representar campos em bytes) Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Sumário 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: YY1 YY2 YY3 SS1 SS2 SS3 SS4 SS5 SS6 LAST Pag.Ant. 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-*) Alberto Romano Schiesari – www.profars.com 421 (Q) Exercício 301 (Decodificar instruções) Exercício 301 : Decodificar o seguinte conjunto de instruções: 1ABB41278CF00A13980F334445E00CB490EC0D00FA82305448CCD28233445566 Para cada uma delas, informar: - Código de operação (código de máquina) - Menmônico Assembler - Endereço da instrução (supor que a primeira instrução esteja no endereço X’00000000’) - Operandos (registrador, registrador base, registrador indexador, deslocamento; se o operando é na memória, calcular o seu endereço; para isso, supor os registradores gerais com o seguinte conteúdo: R00=00112233 R01=00000100 R02=00000200 R03=00000300 Sumário R04=00000400 R05=00000500 R06=00000600 R07=00000700 Pag.Ant. R08=00000800 R09=00000900 R10=00000A00 R11=00000B00 R12=00000C00 R13=00000D00 R14=00000E00 R15=00000F00 Alberto Romano Schiesari – www.profars.com 422 Respostas Respostas Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 423 (A) Exercícios 1-12 (Converter de decimal para binário) Exercício 1 : (987654)10 = (1111 0001 0010 0000 0110)2 Exercício 2 : (4095)10 = (1111 1111 1111)2 Exercício 3 : (7)10 = (111)2 Exercício 4 : (1023)10 = (11 1111 1111)2 Exercício 5 : (4096)10 = (1 0000 0000 0000)2 Exercício 6 : (255)10 = (1111 1111)2 Exercício 7 : (1024)10 = (100 0000 0000)2 Exercício 8 : (10010001)10 = (1001 1000 1011 1101 1001 0001)2 Exercício 9 : (256)10 = (1 0000 0000)2 Exercício 10 : (1025)10 = (100 0000 0001)2 Exercício 11 : (999888)10 = (1111 0100 0001 1101 0000)2 Exercício 12 : (65432)10 = (1111 1111 1001 1000)2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 424 (A) Exercícios 13-24 (Converter de decimal para hexadecimal) Exercício 13 : (987654)10 = (F1206)16 Exercício 14 : (4095)10 = (FFF)16 Exercício 15 : (7)10 = (7)16 Exercício 16 : (1023)10 = (3FF)16 Exercício 17 : (4096)10 = (1000)16 Exercício 18 : (255)10 = (FF)16 Exercício 19 : (1024)10 = (400)16 Exercício 20 : (10010001)10 = (98BD91)16 Exercício 21 : (256)10 = (100)16 Exercício 22 : (1025)10 = (401)16 Exercício 23 : (999888)10 = (F41D0)16 Exercício 24 : (65432)10 = (FF98)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 425 (A) Exercícios 25-36 (Converter de binário para hexadecimal) Exercício 25 : (11111000111010100100001 )2 = (7C7521)16 Exercício 26 : (1000000111000111111110000011111110)2 = (2071FE0FE)16 Exercício 27 : (1100)2 = (C)16 Exercício 28 : (11111110001)2 = (7F1)16 Exercício 29 : (1010101010101000110011000111)2 = (AAA8CC7)16 Exercício 30 : (110011001100110011001)2 = (199999)16 Exercício 31 : (1000000000000001)2 = (8001)16 Exercício 32 : (1000000001)2 = (201)16 Exercício 33 : (111111100000001111111)2 = (1FC07F)16 Exercício 34 : (1)2 = (1)16 Exercício 35 : (1100101011111110)2 = (CAFE)16 Exercício 36 : (101011010111000111000000001111110001111)2 = (56B8E01F8F)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 426 (A) Exercícios 37-48 (Converter de hexadecimal para binário) Exercício 37 : (CAFE)16 = (1100101011111110)2 Exercício 38 : (CDF)16 = (110011011111)2 Exercício 39 : (1AB4D)16 = (11010101101001101)2 Exercício 40 : (15)16 = (10101)2 Exercício 41 : (F)16 = (1111)2 Exercício 42 : (87B54)16 = (10000111101101010100)2 Exercício 43 : (1001)16 = (1000000000001)2 Exercício 44 : (234)16 = (1000110100)2 Exercício 45 : (CAD)16 = (110010101101)2 Exercício 46 : (7F7)16 = (11111110111)2 Exercício 47 : (1990)16 = (1100110010000)2 Exercício 48 : (33)16 = (110011)2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 427 (A) Exercícios 49-60 (Converter de binário para decimal) Exercício 49 : (11)2 = (3)10 Exercício 50 : (100001111111)2 = (2175)10 Exercício 51 : (101010010101)2 = (2709)10 Exercício 52 : (110000001111111)2 = (24703)10 Exercício 53 : (11111110000011)2 = (16259)10 Exercício 54 : (11110000111000)2 = (15416)10 Exercício 55 : (11)2 = (3)10 Exercício 56 : (111111110)2 = (510)10 Exercício 57 : (1111100001111000111001101)2 = (32567757)10 Exercício 58 : (1000000000000)2 = (4096)10 Exercício 59 : (11111001)2 = (249)10 Exercício 60 : (1000000000000001)2 = (32769)10 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 428 (A) Exercícios 61-72 (Converter de hexadecimal para decimal) Exercício 61 : (11)16 = (17)10 Exercício 62 : (AAF45)16 = (?)10 Exercício 63 : (1B567)16 = (111975)10 Exercício 64 : (100)16 = (256)10 Exercício 65 : (1000)16 = (4096)10 Exercício 66 : (FF)16 = (255)10 Exercício 67 : (FFF)16 = (4095)10 Exercício 68 : (CDF)16 = (3295)10 Exercício 69 : (CAFE)16 = (51966)10 Exercício 70 : (FACA)16 = (64202)10 Exercício 71 : (DAD0)16 = (56016)10 Exercício 72 : (F1E2D3C4)16 = (4058174404)10 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 429 (A) Exercícios 73-84 (Somar números em binário) Exercício 73 : (11001100)2 + (10101010)2 = (1 0111 0110)2 Exercício 74 : (1111001111)2 + (1001111001)2 = (110 0100 1000)2 Exercício 75 : (1111)2 + (1)2 = (10000)2 Exercício 76 : (1111)2 + (111)2 = (10110)2 Exercício 77 : (100001)2 + (11110)2 = (111111)2 Exercício 78 : (1011110011)2 + (111101111)2 = (100 1110 0010)2 Exercício 79 : (110011001100)2 + (101011110000)2 = (1 0111 1011 1100)2 Exercício 80 : (1111100001111000)2 + (101111)2 = (1111 1000 1010 0111)2 Exercício 81 : (111)2 + (1111)2 + (100)2 = (11010)2 Exercício 82 : (11)2 + (111)2 + (1111)2 + (11111)2 = (111000)2 Exercício 83 : (1111)2 + (1001)2 + (111)2 + (101)2 + (11)2 + (1)2 = (101000)2 Exercício 84 : (111)2 + (1000)2 + (1)2 + (1100)2 = (11100)2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 430 (A) Exercícios 85-96 (Subtrair números em binário) Exercício 85 : (11001100)2 - (1010101)2 = (111 0111)2 Exercício 86 : (1111001111)2 - (1111001)2 = (11 0101 0110)2 Exercício 87 : (1111)2 - (1)2 = (1110)2 Exercício 88 : (1111)2 - (111)2 = (1000)2 Exercício 89 : (100001)2 - (11110)2 = (11)2 Exercício 90 : (1011110011)2 - (111101111)2 = (1 0000 0100)2 Exercício 91 : (11001100)2 - (111011110000)2 = (...1111 1111 1100 1101)2 Exercício 92 : (1111000)2 - (101010111)2 = (... 1111 1111 0010 0001)2 Exercício 93 : (111)2 - (1111)2 = (... 1111 1111 1111 1000)2 Exercício 94 : (10001)2 - (111111)2 = (... 1111 1111 1101 0010)2 Exercício 95 : (0)2 - (1)2 = (... 1111 1111 1111 1111)2 Exercício 96 : (0)2 - (10)2 = (... 1111 1111 1111 1110)2 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 431 (A) Exercícios 97-108 (Somar números em hexadecimal) Exercício 97 : (F12B)16 + (321)16 = (F44C)16 Exercício 98 : (1100)16 + (111)2 = (1211)16 Exercício 99 : (1000F)16 + (F0001)16 = (100010)16 Exercício 100 : (A9B8C7)16 + (D6E5F4)16 = (1809EBB)16 Exercício 101 : (CAFE)16 + (CDF)16 = (D7DD)16 Exercício 102 : (B001)16 + (FD)16 = (B0FE)16 Exercício 103 : (999)16 + (111)16 = (AAA)16 Exercício 104 : (123456)16 + (789ABC)16 = (19BBF12)16 Exercício 105 : (FFF)16 + (EEE)16 = (1EED)16 Exercício 106 : (DDD)16 + (333)16 = (1110)16 Exercício 107 : (987AED)16 + (CF01)16 = (9949EE)16 Exercício 108 : (FACA)16 + (CAFE)16 = (1C5C8)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 432 (A) Exercícios 109-120 (Subtrair números em hexadecimal) Exercício 109 : (F1C5)16 - (101)16 = (F0C4)16 Exercício 110 : (1AD87C)16 - (FDE9)2 = (19DA93)16 Exercício 111 : (112233)16 - (44556)16 = (CDCDD)16 Exercício 112 : (AABBCC)16 - (DDEEF)16 = (9CDCDD)16 Exercício 113 : (F1E2D3)16 - (C4B5A6)16 = (2D2D2D)16 Exercício 114 : (FF00001)16 - (10000F)16 = (FDFFFF2)16 Exercício 115 : (CAFE)16 - (FACA)16 = (...FFFFD034)16 Exercício 116 : (CDF)16 - (FDC)16 = (...FFFFFD03)16 Exercício 117 : (10001)16 - (20001)16 = (...FFFF0000)16 Exercício 118 : (10000)16 - (FFFE)16 = (2)16 Exercício 119 : (0)16 - (9)16 = (...FFFFFFF7)16 Exercício 120 : (0)16 - (1A)16 = (...FFFFFFE6)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 433 (A) Exercícios 121-126 (Representar números binários em bytes) Exercício 121 : (1)10 = (0000 0000 0000 0001)2 = (0001)16 = (0000 0000 0000 0000 0000 0000 0000 0001)2 = (00000001)16 Exercício 122 : (-1)10 = (1111 1111 1111 1111)2 = (FFFF)16 = (1111 1111 1111 1111 1111 1111 1111 1111)2 = (FFFFFFFF)16 Exercício 123 : (10)10 = (0000 0000 0000 1010)2 = (000A)16 = (0000 0000 0000 0000 0000 0000 0000 1010)2 = (0000000A)16 Exercício 124 : (-10)10 = (1111 1111 1111 0110)2 = (FFF6)16 = (1111 1111 1111 1111 1111 1111 1111 0110)2 = (FFFFFFF6)16 Exercício 125 : (17)10 = (0000 0000 0001 0001)2 = (0011)16 = (0000 0000 0000 0000 0000 0000 0001 0001)2 = (00000011)16 Exercício 126 : (-17)10 = (1111 1111 1110 1111)2 = (FFEF)16 = (1111 1111 1111 1111 1111 1111 1110 1111)2 = (FFFFFFEF)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 434 (A) Exercícios 127-132 (Representar números binários em bytes) Exercício 127 : (254)10 = (0000 0000 1111 1110)2 = (00FE)16 = (0000 0000 0000 0000 0000 0000 1111 1110)2 = (000000FE)16 Exercício 128 : (-254)10 = (1111 1111 0000 0010)2 = (FF02)16 = (1111 1111 1111 1111 1111 1111 0000 0010)2 = (FFFFFF02)16 Exercício 129 : (100000)10 = (imposível representar em 2 bytes) = (0000 0000 0000 0001 1000 0110 1010 0000)2 = (000186A0)16 Exercício 130 : (-100000)10 = (imposível representar em 2 bytes) = (1111 1111 1111 1110 0111 1001 0110 0000)2 = (FFFE7960)16 Exercício 131 : (32000)10 = (0111 1101 0000 0000)2 = (7D00)16 = (0000 0000 0000 0000 0111 1101 0000 0000)2 = (00007D00)16 Exercício 132 : (-32000)10 = (1000 0011 0000 0000)2 = (8300)16 = (1111 1111 1111 1111 1000 0011 0000 0000)2 = (FFFF8300)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 435 (A) Exercícios 133-138 (Representar números binários em bytes) Exercício 133 : (63000)10 = (imposível representar em 2 bytes) = (1111 1111 1111 1111 1111 0110 0001 1000 )2 = (FFFFF618)16 Exercício 134 : (-63000)10 = (imposível representar em 2 bytes) = (1111 1111 1111 1111 0000 1001 1110 1000)2 = (FFFF09E8)16 Exercício 135 : (1010)10 = (0000 0011 1111 0010)2 = (03F2)16 = (0000 0000 0000 0000 0000 0011 1111 0010)2 = (000003F2)16 Exercício 136 : (-1010)10 = (1111 1100 0000 1110)2 = (FC0E)16 = (1111 1111 1111 1111 1111 1100 0000 1110)2 = (FFFFFC0E)16 Exercício 137 : (4095)10 = (0000 1111 1111 1111)2 = (0FFF)16 = (0000 0000 0000 0000 0000 1111 1111 1111)2 = (00000FFF)16 Exercício 138 : (-4095)10 = (1111 0000 0000 0001)2 = (F001)16 = (1111 1111 1111 1111 1111 0000 0000 0001)2 = (FFFFF001)16 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 436 (A) Exercícios 139-140 (Representar números binários em bytes) 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 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 437 (A) Exercícios 141-152 (Representar números compactados em bytes) 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 ] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 438 (A) Exercícios 153-160 (Representar números compactados em bytes) 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 ] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 439 (A) Exercícios 161-172 (Representar números zonados em bytes) 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 ] Exercício 172 : (-32000)10 = [ 1111 0011 1111 0010 1111 0000 1111 0000 1111 0000 ] = [ F3F2F0F0D0 ] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 440 (A) Exercícios 173-180 (Representar números zonados em bytes) 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 ] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 441 (A) Exercícios 181-194 (Representar strings de caracteres em bytes) 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 ] Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 442 (A) Exercícios 195-209 (Representar campos em bytes) 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. * Endereço Conteúdo 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 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: Sumário DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC Pag.Ant. 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'*' 0000 0003 0007 000B 000F 0013 0018 001D 0021 0025 002B 0031 0037 003F 0043 F1.F2.F3 4E.F1.F2.F3 60.F1.F2.F3 F1.F2.4B.F3 F1.C1.C2.F8 F0.F1.F1.F0.F1 C1.4E.C2.7E.C3 C1.40.40.40 C1.C2.C3.C4 C1.40.C1.40.C1.40 C1.6B.C2.C1.6B.C2 D4.C5.50.E8.D6.E4 7D.E2.40.D4.E4.E2.C9.C3 7C.7C.D6.C9 5C.40.40 Alberto Romano Schiesari – www.profars.com 443 (A) Exercícios 210-225 (Representar campos em bytes) * Endereço Conteúdo 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 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: Sumário DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC DC Pag.Ant. 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' 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 Alberto Romano Schiesari – www.profars.com 444 (A) Exercícios 226-239 (Representar campos em bytes) * Endereço Conteúdo Exercício 226: Exercício 227: DC DC 2B'1000' 2BL2'1000' Exercício Exercício Exercício Exercício Exercício Exercício 228: 229: 230: 230: 231: 232: DC DC DC DC DC DC F'10' F'+10' F'-10' F'-15,+16' 2F'22' 2F'33,44' Exercício 233: Exercício 234: DC DC FL3'258' 2FL1'255' Exercício Exercício Exercício Exercício Exercício DC DC DC DC DC F'128000' H'10' H'+10' H'-10' H'-15,+16' 235: 236: 237: 238: 239: Sumário Pag.Ant. 007B 007D 0081 0084 0088 008C 0090 0098 00A0 00B0 00B3 00B5 00B8 00BC 00BE 00C0 00C2 08.08 00.08.00.08 00.00.00 (align) 00.00.00.0A 00.00.00.0A FF.FF.FF.F6 FF.FF.FF.F1.00.00.00.10 00.00.00.16.00.00.00.16 00.00.00.21.00.00.00.2C 00.00.00.21.00.00.00.2C 00.01.02 FF.FF 00.00.00 (align) 00.01.F4.00 00.0A 00.0A FF.F6 FF.F1.00.10 Alberto Romano Schiesari – www.profars.com 445 (A) Exercícios 240-254 (Representar campos em bytes) * Endereço Conteúdo Exercício Exercício Exercício Exercício 240: 241: 242: 243: DC DC DC DC Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício Exercício 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: DC DC DC DC DC DC DC DC DC DC DC Sumário Pag.Ant. 2H'22' 2H'33,44' HL3'258' 2HL1'255' 00C6 00.16.00.16 00CA 00.21.00.2C.00.21.00.2C 00D2 00.01.02 00D5 FF.FF 00D7 00 (align) H'128000' 00D8 F4.00 P'123' 00DA 12.3C P'+123' 00DC 12.3C P'-123' 00DE 12.3D PL4'456' 00E0 00.00.45.6C PL1'789' 00E4 9C P'1,-22,333,-4444' 00E5 1C.02.2D.33.3C.04.44.4D PL2'1,-22,333,-4444' 00ED 00.1C.02.2D.33.3C.44.4D 3P'0' 00F5 0C.0C.0C PL3'0' 00F8 00.00.0C 2P'1,22,333' 00FB 1C.02.2C.33.3C.1C.02.2C.33.3C Alberto Romano Schiesari – www.profars.com 446 (A) Exercícios 255-266 (Representar campos em bytes) * Endereço Conteúdo Exercício 255: DC Exercício Exercício Exercício Exercício Exercício Exercício Exercício DC DC DC DC DC DC DC 256: 257: 258: 259: 260: 261: 262: 2PL2'1,22,333' 0105 00.1C.02.2C.33.3C 00.1C.02.2C.33.3C Z'123' 0111 F1.F2.C3 Z'+123' 0114 F1.F2.C3 Z'-123' 0117 F1.F2.D3 ZL4'456' 011A F0.F4.F5.C6 ZL1'789' 011E C9 Z'1,-22,333,-4444' 011F F1.F2.D2.F3.F3.C3.F4.F4.F4.D4 ZL3'1,-22,333,-4444' 0129 F0.F0.C1.F0.F2.D2.F3.F3.C3 F4.F4.F4.D4 Exercício 263: Exercício 264: Exercício 265: DC DC DC 3Z'0' ZL3'0' 2Z'1,22,333' Exercício 266: DC 2ZL3'1,22,333' 0135 C0.C0.C0 0138 F0.F0.F0 013B C1.F2.C2.F3.F3.C3 C1.F2.C2.F3.F3.C3 0147 F0.F0.C1.F0.F2.C2.F3.F3.C3 F0.F0.C1.F0.F2.C2.F3.F3.C3 Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 447 (A) Exercícios 267-279 (Representar campos em bytes) * Exercício Exercício Exercício Exercício Exercício Exercício Exercício 267: 268: 269: 270: 271: 272: 273: 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 Endereço Conteúdo 0159 00.00.00 (align) 015C 00.00.00.00 0160 00.00.00.7F 0164 00.00.80.00 0168 00.00.00.0F 016C 00.00.00.5C 0170 00.00.01.70 0174 ??.??.??.??.??.??.??.??.?? ??.??.??.??.??.??.??.?? Exercício Exercício Exercício Exercício Exercício Exercício 274: 275: 276: 277: 278: 279: Sumário SIMBGG SIMBHH SIMBII SIMBJJ SIMBKK SIMBLL Pag.Ant. DC DC DC DC DC DC 0185 A(*) 0188 A(SIMBGG) 018C A(SIMBAA+12) 0190 A(SIMBII-SIMBBB) 0194 AL1(*-SIMBKK) 0198 5AL1(*-SIMBLL) 0199 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 Alberto Romano Schiesari – www.profars.com 448 (A) Exercícios 280-290 (Representar campos em bytes) * Endereço Conteúdo Exercício Exercício Exercício Exercício 280: 281: 282: 283: SIMBMM SIMBNN SIMBOO SIMBPP DC DC DC DC AL2(3,5,7) A(SIMBII+5*2) A(SIMBNN+X'80000000') 4AL2(*-SIMBPP) 019E 01A4 01A8 01AC Exercício 284: SIMBQQ Exercício 285: SIMBRR DC DC A(SIMBVV) A(SIMBKK,SIMBJJ) 01B4 01B8 Exercício 286: SIMBSS Exercício 287: SIMBTT DC DC A(SIMBTT+40) A(SIMBUU,*,80) 01C0 01C4 Exercício 288: SIMBUU DC 2A(*-SIMBUU) 01D0 Exercício 289: SIMBVV Exercício 290: SIMBWW DC DC A(C'AMO') A(X'7FFFFFFF') 01D8 01DC Sumário Pag.Ant. 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 Alberto Romano Schiesari – www.profars.com 449 (A) Exercícios 291-299 (Representar campos em bytes) * Endereço Conteúdo Exercício Exercício Exercício Exercício Exercício Exercício Exercício 291: 292: 293: 294: 295: 296: 297: YY1 YY2 YY3 SS1 SS2 SS3 SS4 DC DC DC DC DC DC DC Exercício 298: SS5 DC 01E0 01E2 01E4 01E6 01E8 01EA 01EC 01EE A(125),F'33',C'*',2H'6,18' 01F0 Exercício 299: SS6 DC X'1,1',B'1,1',C'1,1' Sumário Pag.Ant. Y(SIMBWW) Y(10) Y(L'YY2) S(SIMBAA) S(SS1) S(10) S(*) 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 00.06.00.12 0202 01.01.01.01 F1.6B.F1 Alberto Romano Schiesari – www.profars.com 450 (A) Exercício 300 (Representar campos em bytes) * Endereço Conteúdo Exercício 300: LAST DC 256AL1(255+LAST-*) * * * * * * * * * * * * * * * Sumário Pag.Ant. 0209 0219 0229 0239 0249 0259 0269 0279 0289 0299 02A9 02B9 02C9 02D9 02E9 02F9 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 Alberto Romano Schiesari – www.profars.com 451 (A) Exercício 301 (Decodificar instruções) Exercício 301 : Decodificar o seguinte conjunto de instruções: 1ABB41278CF00A13980F334445E00CB490EC0D00FA82305448CCD28233445566 ----////////----////////--------////////------------//////////// Supor os registradores gerais com o seguinte conteúdo: R00=00112233 R01=00000100 R02=00000200 R03=00000300 Sumário R04=00000400 R05=00000500 R06=00000600 R07=00000700 Pag.Ant. R08=00000800 R09=00000900 R10=00000A00 R11=00000B00 R12=00000C00 R13=00000D00 R14=00000E00 R15=00000F00 Alberto Romano Schiesari – www.profars.com 452 (A) Exercício 301 (Decodificar instruções) Exercício 301 : Decodificar o seguinte conjunto de instruções: 1ABB41278CF00A13980F334445E00CB490EC0D00FA82305448CCD28233445566 ----////////----////////--------////////------------//////////// 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’ Continua... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 453 (A) Exercício 301 (Decodificar instruções) Exercício 301 : Decodificar o seguinte conjunto de instruções: 1ABB41278CF00A13980F334445E00CB490EC0D00FA82305448CCD28233445566 ----////////----////////--------////////------------//////////// 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 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’ Continua... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 454 (A) Exercício 301 (Decodificar instruções) Exercício 301 : Decodificar o seguinte conjunto de instruções: 1ABB41278CF00A13980F334445E00CB490EC0D00FA82305448CCD28233445566 ----////////----////////--------////////------------//////////// 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’ Continua... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 455 (A) Exercício 301 (Decodificar instruções) Exercício 301 : Decodificar o seguinte conjunto de instruções: 1ABB41278CF00A13980F334445E00CB490EC0D00FA82305448CCD28233445566 ----////////----////////--------////////------------//////////// 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’ Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 456 Dicas de programação Dicas de programação Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 457 Dicas de programação Interessantes, úteis, feias mas usadas, etc... Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 458 Dicas de programação Supondo um programa com 11K e 1 registrador base PROG START USING LR ... 0 *,3 3,15 Using quando o location counter tem zero CARREGA PRIMEIRO E UNICO REG BASE 4K Trecho do programa servido pelo registrador base R3; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento terá o registrador R3 como base Sumário Pag.Ant. 4K 3K Trecho do programa sem registrador base; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento : ERRO Alberto Romano Schiesari – www.profars.com 459 Dicas de programação Supondo um programa com 11K e 2 registradores base PROG START USING LR LA LA ... 0 *,3,7 3,15 CARREGA PRIMEIRO REG BASE 7,1 “INICIO” CARGA SEGUNDO BASE 4,4095(3,7) “FIM” CARGA SEGUNDO BASE 4K Trecho do programa servido pelo registrador base R3; qualquer símbolo definido neste trecho e qye precise ser convertido em Base+Deslocamento terá o registrador R3 como base Sumário Pag.Ant. 4K 3K Trecho do programa servido pelo registrador base R7; qualquer símbolo definido neste trecho e qye precise ser convertido em Base+Deslocamento terá o registrador R7 como base Trecho do programa sem registrador base; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento : ERRO Alberto Romano Schiesari – www.profars.com 460 Dicas de programação Supondo um programa com 11K e 3 registradores base PROG START USING LR LA LA LA LA ... 0 *,3,7 3,15 7,1 7,4095(3,7) 6,1 6,4095(7,6) 4K 4K Trecho do programa servido pelo registrador base R3 Sumário CARREGA PRIMEIRO REG BASE “INICIO” CARGA SEGUNDO BASE “FIM” CARGA SEGUNDO BASE “INICIO” CARGA TERCEIRO BASE “FIM” CARGA TERCEIRO BASE Pag.Ant. 3K Trecho do programa servido pelo registrador base R7 Trecho do programa servido pelo registrador base R6 “Sobra de base” Alberto Romano Schiesari – www.profars.com 461 Dicas de programação Supondo um programa com 1000K e 1 registrador base PROG START USING LR ... 0 *,3 3,15 Using quando o location counter tem zero CARREGA PRIMEIRO E UNICO REG BASE 4K 996K Trecho do programa servido pelo registrador base R3; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento terá o registrador R3 como base Sumário Pag.Ant. Trecho do programa sem registrador base; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento : ERRO Alberto Romano Schiesari – www.profars.com 462 Dicas de programação Supondo um programa com 1000K e 1 registrador base 4K 996K Instruções Áreas Trecho do programa servido pelo registrador base R3; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento terá o registrador R3 como base Sumário Pag.Ant. Trecho do programa sem registrador base; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento : ERRO Alberto Romano Schiesari – www.profars.com 463 Dicas de programação Supondo um programa com 1000K e 1 registrador base Instruções Áreas (com base) Áreas (SEM base) END (fim do fonte) LTORG (emitido pelo END) Trecho do programa servido pelo registrador base R3; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento terá o registrador R3 como base Sumário Pag.Ant. LITERAIS declaradas pelo LTORG (sem base) Trecho do programa sem registrador base; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento : ERRO Alberto Romano Schiesari – www.profars.com 464 Dicas de programação Supondo um programa com 1000K e 1 registrador base Instruções LTORG (explicitamente colocado pelo programador) Áreas (com base) Áreas (SEM base) LITERAIS declaradas pelo LTORG (com base) Trecho do programa servido pelo registrador base R3; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento terá o registrador R3 como base Sumário Pag.Ant. END (fim do fonte) Áreas ainda COM base Trecho do programa sem registrador base; qualquer símbolo definido neste trecho e que precise ser convertido em Base+Deslocamento : ERRO Alberto Romano Schiesari – www.profars.com 465 Dicas de programação Supondo um programa com 1000K e 1 registrador base Instruções LTORG (explicitamente colocado pelo programador) Áreas (com base) Áreas (SEM base) LITERAIS declaradas pelo LTORG (com base) END (fim do fonte) Áreas ainda COM base Vamos ver com detalhes Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 466 Dicas de programação Supondo um programa com 1000K e 1 registrador base Instruções Áreas L T O R G Literais (com base) Início das áreas “grandes” (supor: 1os 100 bytes de uma área de 500000 bytes, por ex. TABXX) TABXX DS 1000CL500 Restante da área (499900 bytes) + uma 2ª área grande TABYY + Uma pequena área de 4 bytes (XYZ) - as instruções, - as áreas antes do LTORG, - as literais e -o início das áreas “grandes” (específicamente os 100 primeiros bytes de TABXX) estão dentro do alcance do registrador base. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 467 Dicas de programação Supondo um programa com 1000K e 1 registrador base Instruções Áreas L T O R G TABXX Literais (com base) DS 1000CL500 100 1os bytes de TABXX Demias 499900 bytes de TABXX TABYY DS CL 1000CL52 XYZ DS CL4 Neste caso: Os 100 primeiros bytes de TABXX estão COM base. Os 499900 bytes seguintes de TABXX estão SEM base. Os 520000 bytes de TABYY estão todos sem base. Os 4 bytes de XYZ estão SEM base. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 468 Dicas de programação Supondo um programa com 1000K e 1 registrador base Instruções Áreas L T O R G TABXX Literais (com base) DS 1000CL500 100 1os bytes de TABXX Demias 499900 bytes de TABXX TABYY DS CL 1000CL52 XYZ DS CL4 Isto significa que: LA R9,TABXX OK! TABXX (o endereço de TABXX é o endereço de seu primeiro bytes à esquerda) está dentro do alcance do registrador base L R9,=A(TABXX) OK! A literal que tem o endereço de TABXX está dentro do alcance do registrador base LA R9,TABXX+1 OK! TABXX+1 é um endereço que está dentro do alcance do registrador base L R9,=A(TABXX+1) OK! A literal que tem o endereço de TABXX+1 está dentro do alcance do registrador base LA R9,TABXX+99 OK! TABXX+99 é um endereço que está dentro do alcance do registrador base L R9,=A(TABXX+99) OK! A literal que tem o endereço de TABXX+99 está dentro do alcance do registrador base Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 469 Dicas de programação Supondo um programa com 1000K e 1 registrador base Instruções Áreas L T O R G TABXX Literais (com base) DS 1000CL500 100 1os bytes de TABXX Demias 499900 bytes de TABXX TABYY DS CL 1000CL52 XYZ DS CL4 Isto significa que: LA R9,TABXX+100 ERRO!!! TABXX+100 é o 101º. Byte de TABXX, e, portanto, o primeiro a NÃO ser servido pelo registrador base. L R9,=A(TABXX+100) OK! A literal que tem o endereço de TABXX+100 está dentro do alcance do registrador base LA R9,TABYY base L R9,=A(TABYY) base LA R9,XYZ L R9,=A(XYZ) base Sumário ERRO!!! TABYY é um endereço que NÃO está dentro do alcance do registrador OK! A literal que tem o endereço de TABYY está dentro do alcance do registrador ERRO!!! XYZ é um endereço que NÃO está dentro do alcance do registrador base OK! A literal que tem o endereço de XYZ está dentro do alcance do registrador Pag.Ant. Alberto Romano Schiesari – www.profars.com 470 Dicas de programação Programas com 1 registrador base Especificação ao montador e carga na execução Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 471 Dicas de programação Carga do registrador base com o endereço do entry point com LR PROG START USING LR * * 0 *,3 3,15 CARREGA PRIMEIRO E UNICO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT CARREGAMENTO COM LR MUITO USADO EM MVS Carga do registrador base com o endereço do entry point com BALR+BCTR+BCTR PROG START USING BALR BCTR BCTR 0 *,3 3,0 3,0 3,0 * * Sumário Pag.Ant. CARREGA ENDERECO SEGUINTE AO BALR SUBTRAI 1 SUBTRAI MAIS 1 NESTE PONTO, O REG 3 ESTAH OK; ELE TEM O ENDERECO DO ENTRY POINT Alberto Romano Schiesari – www.profars.com 472 Dicas de programação Programas com 2 registradores base Especificação ao montador e carga na execução Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 473 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com LA 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 ! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 474 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com LA+LA+AR 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 ! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 475 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com LA+LA+AR 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 ! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 476 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com LA+LA 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 ! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 477 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com LA+LA PROG * * * * START USING LR 0 *,3,4 3,15 CARREGA PRIMEIRO REG BASE REG 3 FICA COM O ENDERECO DO ENTRY POINT LA 4,2048 CARREGA NRO 2048 NO REG 4 LA 4,2048(3,4) SOMA 2048 + ENTRY POINT FICOU COM ENTRY POINT + 4096 OU ENTRY POINT + X’001000’ PRONTO ! R4 CARREGADO OK TAMBEM ! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 478 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com LA+LA 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 ! Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 479 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com LA 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. Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 480 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com L 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 FORA do alcance do PRIMEIRO REG BASE (R3), QUE É O ÚNICO PREPARADO ATÉ ENTÃO, então NÃO PODE, dá erro de montagem. (CASO 1) Se a literal estiver dentro do alcance do PRIMEIRO REG BASE (R3), QUE É O ÚNICO PREPARADO ATÉ ENTÃO, então PODE (CASO 2). Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 481 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com L CASO 1 : Literal FORA do alcance do PRIMEIRO REG BASE (R3), QUE É O ÚNICO PREPARADO. NÃO PODE! Dá erro de montagem. PROG START USING LR L ... 0 *,3,4 3,15 4,=A(PROG+4096) Parte servida pelo 1o reg base (o L precisa do 2o base preparado, mas... ele prepara esse base; então, dá erro de execução) Programa = 8k END ... (as literais são declaradas após o END) =A(PROG+4096) Sumário Pag.Ant. Parte servida pelo 2o reg base Alberto Romano Schiesari – www.profars.com 482 Dicas de programação Carga do primeiro registrador base com o entry point address com LR e do segundo com entry point address + 4096 com L CASO 2 : Literal DENTRO do alcance do PRIMEIRO REG BASE (R3), QUE É O ÚNICO PREPARADO ATÉ ENTÃO, então PODE. PROG PULA START 0 USING *,3,4 LR 3,15 L 4,=A(PROG+4096) B PULA LTORG =A(PROG+4096) ... Parte servida pelo 1o reg base. Força que a literal fique nesta parte Programa = 8k END ... (as outras literais são declaradas) =... =... Sumário Pag.Ant. Parte servida pelo 2o reg base Alberto Romano Schiesari – www.profars.com 483 THE END Sumário Pag.Ant. Alberto Romano Schiesari – www.profars.com 484