O documento apresenta um exemplo de programa em assembly para o simulador 8085. Ele define variáveis, inicializa dados na memória e realiza um laço para armazenar um valor em vários endereços de memória consecutivos utilizando instruções como MVI, LXI, MOV, INX e DCR.
1. Introdução a Linguagem de Programação
8085
Prof. Dr. Remy Eskinazi
DEE – UPE – Escola Politécnica / CEFET-PE
remy.eskinazi@gmail.com
2. Introdução a Linguagem de Programação
• Cada µp tem suas próprias palavras (Opcodes ), significados e linguagem
• Opcodes length – nº de bits que o µp reconhece e processa de cada vez
• Opcodes são formados pelas várias combinações desses bits
• 8085: linguagem de até 256 opcodes (28)
• Projetista da CPU cria instruções:
• seleciona combinações de padrões de bits
• Atribui um significado especifico para cada combinação usando decodificadores
• Cada µp tem seu próprio conjunto de instruções
• Programa em assembly para um microprocessador não é transferível (executável) para outro
de arquitetura diferente.
• Instruções são compostas por uma ou mais palavras
• Conjunto de instruções: linguagem de máquina
• O µp determina:
• A linguagem de máquina e
• Operações do sistema
3. Linguagem Assembly do 8085
• 246 padrões de bits
• 74 instruções (Instruction set)
• Formatos da instrução
• Binário (difícil para se programar )
• Hexadecimal (difícil para se programar )
• Assembly (menos difícil )
• C (Fácil)
• Comprimento da Instrução no 8085
– Até 3 bytes
• Opcode (1º byte) RLC – rotaciona acumulador (1 byte)
• Operando (2º , 3º byte) CPI – compara valor com acumulador (2 bytes)
LXI B, dado16 – (3 bytes)
• Declaração em assembly pode ter 4 campos
Label Opcode Operando Comentário
START: LXI SP, 20FFH ;Inicializa stack pointer
Binário: 00111100
Hexadecimal: 3CH
Mnemônico: INR A
A A + 1
Binário: 10000000
Hexadecimal: 80H
Mnemônico: ADD B
B A + B
4. Formato da Instrução
• Identificação de registradores
Código Registradores Código Par de Registradores
000 B 00 BC
001 C 01 DE
010 D 10 HL
011 E 11 SP
100 H
101 L
111 A
110 Reservado
Instrução Código da Instrução
1. RLC: Rotaciona os bits de A à 00000111 = 07H (RLC)
esquerda de uma posição (opcode: 8bits)
2. ADD Reg: Adiciona o conteúdo de 10000 SSS (opcode: 5bits)
um registrador ao A (operando: 3bits)
3. ADD B 10000 000 = 80H
4. MOV C,A 01 001 111 = 4F (opcode: 01)
DDD SSS (operando: 001 111)
D7 D6 D5 D4 D3 D2 D1 D0
Opcode DDD SSS
5. Notações
• Notações usadas na descrição de instruções
• R um registrador de 8 bits (A,B,C,D,E,H,L)
• M registrador de Memória (HL)
• Rs registrador fonte
• Rd registrador destino (A,B,C,D,E,H,L)
• Rp par de registradores (BC, DE, HL, SP)
6. Assembly x Alto Nível
• Linguagem de máquina e linguagem
Assembly
• low-level
• Assembly x Linguagens de alto nível
• Programas compactos
• Requerem menos memória
• Maior eficiência
• Aplicações de controle: programas pequenos e compactos
• Alto nível (C, C++, Processing): Maior portabilidade
7. Ferramentas para Desenvolvimento
de Programas em Assembly
– Assembler/Compilador
• programa que faz a tradução para linguagem de máquina
– Assembly / C Código binário executável
– Linker
• Liga os vários arquivos objeto, gerando um único executável
– Cada µp tem seu próprio Assembler / Compilador
8. Montagem de Programa
8
– ASM file – arquivo fonte
– OBJ file – arquivo binário intermediário (Utilizado como entrada no Linker)
– HEX file – arquivo executável utilizado para programar o Microcontrolador
– LST file – arquivo com proposta de documentação:
» locações de memória, mnemônicos, comentários
- Obs. No simulador 8085 o arquivo de execução é o OBJ (*.o)
Programa
Fonte
Asm / C
(código fonte)
Programa em
Código binário
(código objeto)
montador
Programa em
Código binário
executável
(HEX file)
Linker
Compilador
11. Instruções 8085 – Mover Dados
• Movimenta (Copia) dados entre registradores e memória
• MOV R1,R2, M ;Move
• MVI Ri, <dado8> ;Move Immediate
• LDA <end16> ;Load Accumulator Directly from Memory
• STA <end16> ;Store Accumulator Directly in Memory
• LHLD <end16> ;Load H & L Registers Directly from Memory
• SHLD <end16> ;Store H & L Registers Directly in Memory
12. Instruções 8085 – Mover Dados
• An 'X' in the name of a data transfer instruction implies that it
deals with a register pair (16-bits);
• LXI Load Register Pair with Immediate data
• LDAX Load Accumulator from Address in Register Pair
• STAX Store Accumulator in Address in Register Pair
• XCHG Exchange H & L with D & E
• XTHL Exchange Top of Stack with H & L
13. Instruções 8085 – Aritmética
• Add, Subtract, Increment / Decrement data in registers or memory.
• ADD Add to Accumulator
• ADI Add Immediate Data to Accumulator
• ADC Add to Accumulator Using Carry Flag
• ACI Add Immediate data to Accumulator Using Carry
• SUB Subtract from Accumulator
• SUI Subtract Immediate Data from Accumulator
• SBB Subtract from Accumulator Using Borrow (Carry) Flag
• SBI Subtract Immediate from Accumulator
Using Borrow (Carry) Flag
• INR Increment Specified Byte by One
• DCR Decrement Specified Byte by One
• INX Increment Register Pair by One
• DCX Decrement Register Pair by One
• DAD Double Register Add; Add Content of Register Pair to H & L
Register Pair
14. Instruções 8085 – Lógica
• This group performs logical (Boolean) operations on data in registers
and memory and on condition flags.
• These instructions enable you to set specific bits in the accumulator
ON or OFF.
• ANA Logical AND with Accumulator
• ANI Logical AND with Accumulator Using Immediate
Data
• ORA Logical OR with Accumulator
• OR Logical OR with Accumulator Using Immediate
Data
• XRA Exclusive Logical OR with Accumulator
• XRI Exclusive OR Using Immediate Data
15. Instruções 8085 – Lógica
• The Compare instructions compare the content of an 8-bit value with
the contents of the accumulator;
• CMP Compare
• CPI Compare Using Immediate Data
• The rotate instructions shift the contents of the accumulator one bit
position to the left or right:
• RLC Rotate Accumulator Left
• RRC Rotate Accumulator Right
• RAL Rotate Left Through Carry
• RAR Rotate Right Through Carry
• Complement and carry flag instructions:
• CMA Complement Accumulator
• CMC Complement Carry Flag
• STC Set Carry Flag
16. Instruções 8085 – Lógica
• Unconditional branching
•
– JMP <addr16> Jump
– CALL <add16r> Call
– RET Return
• Conditional branching
– JNZ <addr16> Not Zero (Z = 0)
– JZ <addr16> Zero (Z = 1)
– JNC <addr16> No Carry (C = 0)
– JC <addr16> Carry (C = 1)
– JPO <addr16> Parity Odd (P = 0)
– JPE <addr16> Parity Even (P = 1)
– JP <add16r> Plus (S = 0)
– JM <addr16> Minus (S = 1)
17. Instruções 8085 – Operações com a pilha
• PUSH Push Two bytes of Data onto the Stack
• POP Pop Two Bytes of Data off the Stack
• XTHL Exchange Top of Stack with H & L
• SPHL Move content of H & L to Stack Pointer
18. Instruções 8085 – Operações de E/S
• IN <addr8> Input Operation
• OUT <addr8> Output Operation
19. Instruções 8085 – Operações de Controle
• EI Enable Interrupt System
• DI Disable Interrupt System
• HLT Halt
• NOP No Operation
39. Exemplo Para simulador 8085 -ES
; Diretivas do compilador 8085:
; a diretiva .define associa um valor a um nome a ser usado no programa
; a diretiva .data estabelece valores iniciais em posições da memória. DB significa “Defina Byte”
; a diretiva .org define um endereço inicial para o código que vem a seguir. ORG significa “origin”
; define variáveis
.define ;
BUFFER 2050H ; nomeia 2050H com nome BUFFER
DADO 10101010b ; byte para colocar no buffer
COUNT 32 ; byte contador
;Inicializa dados em 2100h
.data 2100h
V1: DB 200 ; variável global de 1 byte = 200
V2: DB 7,2,5 ; variável global de 3 bytes
;início do programa
.ORG 0000H ; inicio
MVI A, DADO ; inicializa A com valor
LXI H, BUFFER ; inicializa ponteiro de memória
MVI B, COUNT ; inicializa contador de laço
LOOP: MOV M, A ; armazena DATA na memória
INX H ; incrementa ponteiro BUFFER
DCR B ; decrementa contador
JNZ LOOP ; se não zero (Z=0), repita para o próximo byte
HLT