1. Por que aprender Assembler em 2026?

Mainframes ainda rodam bilhões de transações bancárias por dia. Uma parcela significativa do código que faz isso funcionar foi escrita em Assembler nas décadas de 1960–1990 e ainda está em produção. Profissionais que conseguem ler, entender e modificar esse código são raros e muito valorizados.

Além disso, Assembler é essencial para:

  • Entender as mensagens de dump (ABEND) e diagnosticar falhas profundas de sistema
  • Escrever rotinas de performance que COBOL não consegue otimizar o suficiente
  • Fazer interface direta com serviços do z/OS via SVC e macros de sistema
  • Manter e modernizar sistemas legados que misturam COBOL com sub-rotinas Assembler

🦕 Analogia — Assembler como o motor do carro

Você pode dirigir um carro sem saber como o motor funciona. Mas um mecânico que entende o motor consegue diagnosticar problemas que outros não conseguem, otimizar o desempenho e fazer reparos que nenhum manual previu. Aprender Assembler no mainframe é ser a mecânica do sistema.

2. Estrutura de um programa Assembler

Um programa Assembler z/OS tem três seções principais:

SeçãoFunçãoDelimitadores típicos
Prólogo Salva registradores, estabelece base register, obtém área de trabalho STM / BALR / USING / GETMAIN
Corpo Lógica do programa — carrega dados, processa, grava resultados Instruções de lógica e I/O
Epílogo Restaura registradores e retorna ao chamador FREEMAIN / LM / BR

Além dessas seções, o programa tem declarações de dados (DC e DS) e macros.

3. Formato de instrução e campos

Uma linha de Assembler ocupa colunas específicas — herdado do formato de cartão perfurado de 80 colunas:

ColunasCampoDescrição
1–8LabelNome opcional da instrução — começa na coluna 1, sem espaço antes
10–14OperationO mnemônico da instrução (L, ST, MVC, etc.) — começa na col. 10
16–71OperandsOs operandos da instrução, separados por vírgula, sem espaços
72ContinuaçãoQualquer caractere aqui indica que a instrução continua na próxima linha
73–80NúmeroNúmero de sequência — ignorado pelo assembler, usado para ordenar cards
* Col: 1 10 16 * | | | INICIO STM R14,R12,12(R13) Salva registradores BALR R12,0 Carrega endereço base USING *,R12 Informa ao assembler LA R1,MENSAGEM Carrega endereço da msg WTO TEXT=(R1),MF=E Escreve no console B RETORNO Vai para epílogo RETORNO LM R14,R12,12(R13) Restaura registradores BR R14 Retorna ao chamador

Comentários em Assembler usam um * na coluna 1 (linha inteira de comentário) ou um espaço após os operandos na mesma linha.

4. Primeiro programa — Hello World

Um programa completo e funcional que exibe uma mensagem no console do operador:

* Programa: HELLO01 — exibe mensagem no console z/OS HELLO01 CSECT Define a seção de código STM R14,R12,12(R13) Salva registradores do chamador BALR R12,0 Carrega PC em R12 (base register) USING *,R12 Usa R12 como base de endereçamento ST R13,SAVAREA+4 Salva ponteiro da savearea anterior LA R13,SAVAREA Aponta R13 para nossa savearea * Corpo — exibir mensagem WTO 'LADY COBOL DIZ: OLA, MAINFRAME!' * Epílogo — retornar L R13,SAVAREA+4 Restaura ponteiro da savearea anterior LM R14,R12,12(R13) Restaura todos os registradores SR R15,R15 RC = 0 (sucesso) BR R14 Retorna ao chamador * Dados SAVAREA DS 18F Savearea padrão (18 fullwords) END HELLO01 Fim do programa

💡 WTO — Write To Operator

A macro WTO (Write To Operator) grava uma mensagem no console do sistema. É o equivalente mainframe do printf do C ou do DISPLAY do COBOL. Em programas reais, prefira escrever em datasets — o console é para mensagens de sistema, não para output de aplicação.

5. Compilando e executando com JCL

O processo de compilação Assembler no z/OS tem três passos:

//ASMHELLO JOB (ACCT),'HELLO ASM',CLASS=A * * PASSO 1: Assemblagem — source -> objeto //ASM EXEC PGM=ASMA90, // PARM='OBJECT,NODECK,XREF(SHORT)' //SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR // DD DSN=SYS1.MODGEN,DISP=SHR //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) //SYSPRINT DD SYSOUT=* //SYSGO DD DSN=&&OBJ,DISP=(NEW,PASS), // UNIT=SYSDA,SPACE=(TRK,(5,5)) //SYSIN DD * HELLO01 CSECT STM R14,R12,12(R13) BALR R12,0 USING *,R12 ST R13,SAVAREA+4 LA R13,SAVAREA WTO 'LADY COBOL DIZ: OLA, MAINFRAME!' L R13,SAVAREA+4 LM R14,R12,12(R13) SR R15,R15 BR R14 SAVAREA DS 18F END HELLO01 /* * * PASSO 2: Link-edit — objeto -> módulo executável //LKED EXEC PGM=IEWL,COND=(8,LT,ASM), // PARM='XREF,LIST,LET,NCAL' //SYSLIN DD DSN=&&OBJ,DISP=(OLD,DELETE) //SYSLMOD DD DSN=&&LOAD(HELLO01),DISP=(NEW,PASS), // UNIT=SYSDA,SPACE=(TRK,(5,5)), // DCB=DSORG=PO //SYSPRINT DD SYSOUT=* * * PASSO 3: Execução //RUN EXEC PGM=HELLO01,COND=(8,LT,LKED) //STEPLIB DD DSN=&&LOAD,DISP=(OLD,DELETE) //SYSPRINT DD SYSOUT=*

O assembler ASMA90 é o HLASM. Ele precisa das bibliotecas de macros (SYS1.MACLIB e SYS1.MODGEN) para resolver as macros do sistema como WTO e STM. O link-editor IEWL transforma o módulo objeto em um executável carregável.