Você está na página 1de 53

Microprocessadores

Prof. Arthur Braga

Tópicos
„ Linguagem de Máquina e Linguagem Montadora
„ Introdução aos Montadores
„ Gerando um Programa Executável
„ Sintaxe do Assembly 8086
… Formato de Dados
… Estrutura de um Programa Assembly
… Conjunto de Instruções de Movimento de Dados
… Conjunto de Instruções Aritméticas
… Conjunto de Instruções Lógicas
… Conjunto de Instruções de Deslocamento e Rotação
… Conjunto de Instruções de Controle do Programa (Desvios)
… MACROS

1
Linguagem de Máquina

Linguagem de máquina
Linguagem de Máquina
• Instrução de 16 bits

Dado de 16 bits (W = 1)

Dado flui para registrador (D = 1)

Uso de registrador ou memória

Registro utilizado

Modo de endereçamento
?

2
Linguagem
Linguagem de máquina de Máquina
• Instrução de 16 bits
• Modo de endereçamento:

• REG e R / M (se MOD = 11):

Linguagem de máquina
Linguagem de Máquina
Exemplo 1: MOV BP,SP

Se MOD contém 00, 01 ou 10, o campo R/M toma outro significado:

3
Linguagem
Linguagem de máquina de Máquina
Exemplo 2: MOV DL,[DI]

Linguagem
Linguagem de máquina de Máquina
Exemplo 3: MOV [1000H],DL

4
Linguagem
Linguagem de máquina de Máquina
Exemplo 4: MOV [BP],DL

Linguagem de Máquina e
Linguagem Montadora

5
Linguagem de Máquina e Linguagem Montadora

Linguagem de Máquina e Linguagem Montadora

6
Linguagem de Máquina e Linguagem Montadora

Linguagem de Máquina e Linguagem Montadora

Assembly e Assembler
(LINGUAGEM) (PROGRAMA)

7
Linguagem Montadora

Linguagem Montadora

8
Linguagem Montadora

Linguagem Montadora

9
Gerando um Programa
Executável

Programa ECO Completo

10
MASM (montador da Microsoft).

MASM

LINK.

LINK ECO.OBJ <enter>

11
Qual montador será utilizado na disciplina ?

Gerando executável no EMU8086

Como “DEBUGAR” um programa em Assembly ?

12
Emulando o 8086

www.emu8086.com

Sintaxe do Assembly 8086

13
Sintaxe do Assembly 8086

Sintaxe do Assembly 8086

14
Sintaxe do Assembly 8086

Como são os diferentes campos de uma linha de programa ?

Sintaxe do Assembly 8086

O campo Rótulo:

15
Sintaxe do Assembly 8086

Sintaxe do Assembly 8086

16
Sintaxe do Assembly 8086

Formato de Dados

17
Formato de dados

Formato de dados

QUESTÃO: Como o montador trata 0Ah, Ah e “Ah” ?

18
Formato de dados
Tabela ASCII

Como os dados podem ser declarados como variáveis ou constantes ?

Formato de dados

19
Formato de dados

Formato de dados

Caso se queira trabalhar com valores constantes ?

20
Formato de dados

Formato de dados
Tabela ASCII

Variáveis e constantes podem ser declaradas em qualquer ponto do programa ?

21
Estrutura de um Programa
Assembly

Estrutura de um Programa Assembly

Modelo Descrição
TINY Todos os registradores de Segmento (DS, CS,
SS e ES) têm o mesmo valor.
SMALL Código em 1 segmento;
Dados em 1 segmento
MEDIUM Código em mais de 1 segmento;
Dados em 1 segmento
COMPACT Código em 1 segmento;
Dados em mais de 1 segmento
Código em mais de 1 segmento;
LARGE Dados em mais de 1 segmento;
Nenhum array maior que 64 Kbytes
Código em mais de 1 segmento;
HUGE Dados em mais de 1 segmento;
Arrays maiores que 64 Kbytes

22
Estrutura de um Programa Assembly

Estrutura de um Programa Assembly

23
Estrutura de um Programa Assembly

Estrutura de um Programa Assembly

24
Estrutura de um Programa Assembly

OBS:

Conjunto de Instruções de
Movimento de Dados

25
Conjunto de Instruç
Instruções de Movimento de Dados

Conjunto de Instruç
Instruções de Movimento de Dados

• Instruções de movimento de dados


• PUSH / POP – Armazenar e recuperar dados da pilha de memória tipo LIFO

crescimento
PUSH AX da pilha

26
Conjunto de Instruç
Instruções de Movimento de Dados
• POP – Executa a operação inversa do PUSH.

POP BX
redução
da pilha

Conjunto de Instruç
Instruções de Movimento de Dados

• Carga de Endereço Efetivo.


• LEA – (Load Effective Address)

LEA BX, LIST ;carrega o offset da posição de memória da variável LIST

A diretiva OFFSET realiza a função da instrução LEA. Exemplo:

MOV BX, OFFSET LIST

27
Conjunto de Instruç
Instruções de Movimento de Dados

• Carga de endereço efetivo.

• LDS – carrega a base do endereço em DS e o offset em um registrador


• LES – carrega a base do endereço em ES e o offset em um registrador
• LFS – (386 e acima)
• LGS – (386 e acima)
• LSS – (386 e acima)

LDS BX, LIST

Conjunto de Instruç
Instruções de Movimento de Dados

• Instruções de strings data transfers

• LODS, STOS, MOVS, INS e OUTS

• Flag de direção: a flag de direção seleciona autoincremento (D=0) ou


autodecremento (D=1).
CLD : faz D = 0
STD : faz D = 1
• Registradores DI e SI: durante uma execução de instrução de string o acesso
à memória ocorre através de DI e SI (ou ambos).
DI – Offset para acesso a dados no segmento extra
SI – Offset para acesso a dados no segmento de dados

Quando estas instruções podem ser úteis, e qual a sintaxe delas ?

28
Conjunto de Instruç
Instruções de Movimento de Dados

• LODS – Carrega AL, AX ou EAX com dado armazenado no SEGMENTO DE DADOS


com offset dado por SI.

Conjunto de Instruç
Instruções de Movimento de Dados
• STOS – Armazena AL, AX ou EAX em localizações do SEGMENTO EXTRA
endereçadas por DI

STOS com REP – O prefixo REP adicionado a uma instrução de string


provoca a repetição da ação da instrução e decrementa CX de 1 após cada
repetição. O final das repetições ocorre quando CX = 0.

EXEMPLO: Considere que CX = 100,


REP STOSB ; executa STOSB 100 vezes, DI é incrementado ou
; decrementado e o conteúdo de AL armazenado
; em um bloco de memória.

29
Conjunto de Instruç
Instruções de Movimento de Dados
• MOVS – É uma das mais úteis instruções de strings, pois transfere dados entre
posições de memória.
• Operação no segmento de dados envolve SI
• Operação no segmento extra envolve DI
• A instrução transfere 1 byte, 1 word ou double-word do segmento de dados
endereçado por SI para o segmento extra endereçado por DI.

Exemplo
“scrollup” uma linha
do vídeo

Conjunto de Instruç
Instruções de Movimento de Dados
• Outras importantes instruções de transferência de dados
• XCHG – Troca o conteúdo entre registradores ou entre registradores e posições
de memória.

30
Conjunto de Instruç
Instruções de Movimento de Dados
• IN e OUT
• As instruções IN e OUT executam operações de I/O. Nestas operações os
conteúdos de AL, AX ou EAX são transferidos entre o dispositivo de I/O e o
microprocessador
• Formas:
Fixed Port: o número da porta segue o código da operação da instrução
Variable Port: o número da porta esta armazenado no registrador DX

Conjunto de Instruç
Instruções de Movimento de Dados

• Prefixo de Passagem de Segmento


Pode ser adicionado a quase todas instruções em modo de endereçamento à
memória, permitindo ao programador desviar do segmento padrão.
MOV AX, [DI] ;acessa o segmento de dados (default)
MOV AX, ES::[DI] ;acessa o segmento extra

31
Conjunto de Instruções
Aritméticas

Conjunto de Instruç
Instruções Aritmé
Aritméticas

Estas instruções afetam os flags.

32
Conjunto de Instruç
Instruções Aritmé
Aritméticas

Estas instruções afetam os flags.

Relembrando: Registrador de Flags

Conjunto de Instruç
Instruções Aritmé
Aritméticas

• Adição com carry


• como o carry liga duas instruções de adição 16 bits em uma de 32 bit.
SUM32 PROC NEAR
ADD AX, CX
ADC BX, DX
RET
SUM32 ENDP

33
Conjunto de Instruç
Instruções Aritmé
Aritméticas

• Subtração com vem 1(borrow) – SBB

SUB AX, DI
SBB BX, SI

Conjunto de Instruç
Instruções Aritmé
Aritméticas

• Instrução de Comparação – CMP


• A instrução CMP é uma subtração que afeta apenas os bits de flags.
• É útil para comparar o conteúdo de registradores ou posições de memória.
• São, geralmente, seguidas por instruções de salto
CMP AL,10h ; compara AL com 10h
JAE SUBER ; salta para SUBER se AL = 10h ou AL > 10h

34
Conjunto de Instruç
Instruções Aritmé
Aritméticas

Conjunto de Instruç
Instruções Aritmé
Aritméticas

• Instruções de Multiplicação e Divisão


• Multiplicação
• Pode ser executado em Byte, word ou double-word, e pode considerar inteiro sinalizado (IMUL) ou
não sinalizado (MUL) – sempre utiliza o ACUMULADOR.
• 386 em diante, realiza multiplicação em 32 bits.
• O produto é sempre double-width.
• Flags afetados (O, C).

Para 8 bits:
• resultado em AX
Para 16 bits:
• resultado em DX e AX

35
Conjunto de Instruç
Instruções Aritmé
Aritméticas
• Divisão
• Pode ser executado em Byte, word ou double-word, considerando inteiro sinalizado (IDIV) ou não
sinalizado (DIV) – sempre utiliza o ACUMULADOR como DIVIDENDO.
• 386 em diante, realiza divisão em 32 bits.
• O Dividendo é sempre double-width, ou seja uma divisão de 8 bits divide um número de 16 bits
por um de 8 bits, uma divisão de 16 bits divide um número de 32 bits por um de 16 bits e uma
divisão de 32 bits divide um número de 64 bits por um de 32 bits.
• Dois tipos de erros:
• Divisão por zero
• Overflow

Para 8 bits:
• quociente em AL, e o resto para AH
Para 16 bits (dividendo DX e AX):
• quociente em AX, e o resto para DX

Conjunto de Instruções Lógicas

36
Conjunto de Instruç
Instruções Lógicas

XOR ?

Conjunto de Instruç
Instruções Lógicas

Restou alguma operação Lógica Básica ?

37
Conjunto de Instruç
Instruções Lógicas

• Instrução NOT
Aceita um operando. Realiza a inversão lógica do operando ou o
complemento 1.

NOT operando

• Instrução NEG
Aceita um operando. Realiza a inversão aritmética do operando, ou o
complemento 2. Muda o operando de positivo para negativo, ou vice-
versa.

NEG operando

Conjunto de Instruç
Instruções Lógicas

• Instruções de test e teste de bit


• TEST
A instrução de TEST executa uma operação AND. A diferença é que a instrução AND modifica o
operando destino, enquanto TEST não o faz. A instrução TEST afeta apenas o Registrador de Flags.
• Normalmente testa um bit ou conjunto de bits.
• A flag ZF = 1 se o bit sob teste é zero e ZF = 0 caso contrário.

• Geralmente uma instrução TEST é seguida por uma de salto.


Exemplo: TEST AL,1 ;testa bit menos significativo
JNZ RIGHT ;se igual a 1 saltar para RIGHT
TEST AL, 128 ;testa o bit mais significativo
JNZ LEFT ;se igual a 1 saltar para LEFT

38
Conjunto de Instruções de
Deslocamento e Rotação

Conjunto de Instruç
Instruções de Deslocamento e Rotaç
Rotação

• Deslocamento

39
Conjunto de Instruç
Instruções de Deslocamento e Rotaç
Rotação
• Instruções que executarão mais rápido

Conjunto de Instruç
Instruções de Deslocamento e Rotaç
Rotação

• Rotação

40
Conjunto de Instruç
Instruções de Deslocamento e Rotaç
Rotação

• Comparação de strings
SCAS (String scan) CMPS (String compare)

SCAS – compara o registro AL com um bloco de 1 byte da memória


(SCASB), AX com um bloco de 2 bytes (SCASW) ou EAX com um bloco
de double-word (SCASD). A comparação é feita com o conteúdo do
segmento extra. O flag D indica a direção da comparação.
Pode ser usada com o prefixo REPNE (repeat while not egual) – desta
forma a instrução é repetida até que CX = 0, ou o dado seja encontrado.

EXEMPLO: Em uma seção de memória de 100 bytes, deseja-se


encontrar 00H.

Conjunto de Instruç
Instruções de Deslocamento e Rotaç
Rotação

CMPS – compara duas seções de memória. Pode-se comparar bytes


(CMPSB), palavras (2 bytes) (CMPSW) ou double-words (CMPSD). Os
conteúdos de dados do segmento de dados (indexado por SI) e dados do
segmento extra (indexados por DI) podem ser comparados. O flag D indica a
direção da comparação.
Utiliza-se normalmente em conjunto com: REPZ (repeat until zero), REPNZ
(repeat until not zero), REPE (repeat while equal) e REPNE (repeat while not
egual).

EXEMPLO: Compare se duas seções de memória são iguais.

41
Conjunto de Instruções de
Controle do Programa (Desvios)

Conjunto de Instruç
Instruções de Controle do Programa

• Grupo das instruções JMP (JuMP) – Incondicionais e Condicionais.


O Salto Incondicional é de três tipos: short, near e far.
• Short jump: executa salto para posições da memória localizadas entre -128 a 127
byes relativo ao endereço que segue a instrução.

O montador suporta endereçamento em


relação ao ponteiro da instrução IP,
usando $ +/-.

EXEMPLO:

JMP $+2 ; salta 2 posições que seguem


a posição do JMP

42
Conjunto de Instruç
Instruções de Controle do Programa

• Near jump: permite o salto entre +/- 32 Kbytes.

Conjunto de Instruç
Instruções de Controle do Programa

• Far jump: permite saltos inter-segmentos.

Mas nem todo salto é incondicional !

43
Conjunto de Instruç
Instruções de Controle do Programa

• Saltos condicionais: Os saltos condicionais testam os bits do registrador de flags


• sinal (SF), zero (ZF), carry (CF), paridade (PF), overflow (OF).

• As operações podem ser sinalizadas ou não:


• FF (255) nos números não sinalizados é maior que 00h, porém
• FF (-1) nos números sinalizados é menor que 00h.

Saltos condicionais
são sempre saltos
curtos no 8086.

Conjunto de Instruç
Instruções de Controle do Programa
• Quando números sinalizados são comparados usa-se:
• JG, JL, JGE, JLE, JE e JNE
• Os termo greater e less se referem a números sinalizados
• Quando números não-sinalizados são comparados usa-se:
• JA, JB, JAE, JBE, JE e JNE
• Os termos above e below se referem a números não-sinalizados

Estas instruções
de salto podem
ser utilizados para
implementar em
linguagens de alto
nível estruturas
como IF-THEN,
DO-WHILE e
REPEAT-UNTIL.

44
Conjunto de Instruç
Instruções de Controle do Programa

• Controle de fluxo em um programa assembly (apenas versão MASM 6.x):


• .IF, .ELSE, .ELSEIF
• DO – WHILE
• REPEAT – UNTIL

Versão do DOS acima da 3.3

• Saltos com registradores como operando: Neste tipo de instrução o conteúdo dos
registradores é transferido diretamente ao ponteiro de instruções.
Ex: JMP AX ; copia o conteúdo de AX em IP

Tecla - ASCII
‘1’ - 31H
‘2’ - 32H
‘3’ - 33H

-31H

Tecla - conversão
‘1’ - 0
‘2’ - 1
‘3’ - 2

45
• Saltos indiretos usando “index”: Uma instrução JMP pode ser utilizada com [ ] para
acesso direto à tabelas, por exemplo. O montador assume que estes saltos são do tipo near.
A menos que seja especificado outro tipo.

Conjunto de Instruç
Instruções de Controle do Programa

• Instrução LOOP:
• É uma combinação de decremento de CX com JNZ
• LOOP decrementa CX e se CX ≠ 0, salta para o endereço indicado pelo LABEL.
• LOOP – usa CX

46
Conjunto de Instruç
Instruções de Controle do Programa

• PROCEDIMENTOS:
Antes de apresentar as próximas instruções de Controle do Programa é preciso intoduzir
o conceito de PROCEDIMENTO (ou PROCEDURE, em inglês). O procedimento, ou
subrotina, é um conjunto de instruções que realiza uma tarefa específica.
Vantagens de utilizar procedimentos na programação Assembly:
• Como o código é reutilizável, salva espaço de memória.
• Torna mais simples o desenvolvimento do programa por torná-lo “modular”.
• Realiza um SALTO no programa, mas permite realizar um RETORNO.
RETORNO
Mas também há uma desvantagem:
• Consome uma parcela de tempo do processador para realizar o desvio para o
procedimento, e para retornar do procedimento.

Como é declarado um PROCEDIMENTO ?

Conjunto de Instruç
Instruções de Controle do Programa

• PROCEDIMENTOS:

NOME PROC NEAR / FAR


instrução 1
Instrução 2

M
instrução N
RET
NOME ENDP

A instrução CALL é que transfere a execução do programa para o procedimento.


EXEMPLO:
CALL NOME.

47
Conjunto de Instruç
Instruções de Controle do Programa

• CALL com registradores como operandos:


• EXEMPLO: CALL BX ; IP é colocado na pilha e offset da chamada esta presente
em BX, este tipo é intra-segmento.

Conjunto de Instruç
Instruções de Controle do Programa

• CALL com endereçamento indireto à memória:


• É particularmente útil quando um programa necessita escolher uma entre várias sub-
rotinas.

48
Conjunto de Instruç
Instruções de Controle do Programa

Conjunto de Instruç
Instruções de Controle do Programa
• Instrução RET: Remove um número de 16 bits (near return) ou 32 bits (far return) da pilha e
coloca em IP ou em IP e CS

49
Conjunto de Instruç
Instruções de Controle do Programa

• INTRODUÇÃO ÀS INTERRUPÇÕES:
Uma interrupção funciona como um CALL gerado por hardware (derivado
externamente por um sinal nos pinos do processador relacionados a interrupções), ou
por software (derivado da execução de uma instrução ou de algum outro evento
interno). Nos dois casos, o programa é interrompido, e é feita a chamada a um
procedimento de atendimento à interrupção.

Como isso ocorre em interrupções por software ?


(interrupções por hardware serão vistas mais à frente na disciplina)

O processador tem três diferentes instruções de interrupção:


• INTO - interrupção de overflow, chama a interrupção 4 se O = 1.
• INT 3 - interrupção de breakpoint, usado para “debugar” o programa.
• INT número - o número indica o vetor de interrupção da tabela de vetores de
interrupção.

VETOR DE INTERRUPÇÃO ?
TABELA DE VETORES DE INTERRUPÇÃO ?

Conjunto de Instruç
Instruções de Controle do Programa

• INTRODUÇÃO ÀS INTERRUPÇÕES:

? NOME PROC FAR


instrução 1
Instrução 2

M
instrução N
IRET
NOME ENDP

Obs.: Como CALL, a instrução INT armazena CS e


IP na pilha. Mas diferente de CALL, a instrução INT
também armazena as flags na pilha.

50
Conjunto de Instruç
Instruções de Controle do Programa

Grande número de funções ? Quais ? Como acessá-las ?

Conjunto de Instruç
Instruções de Controle do Programa

Outras interrupções do DOS: Apêndice G do Zelenovsky !

51
MACROS

MACROS

• Macro é um conjunto de instruções que realiza uma tarefa específica, da mesma


forma que ocorre com um procedimento ou subrotina. A diferença é que um
procedimento é acessado via instrução CALL, enquanto uma macro é inserida no
programa no ponto em que seu conjunto de instruções deve aparecer.

• Utiliza-se as diretivas MACRO e ENDM para delimitar início e final de uma macro.

EXEMPLO:

NOME MACRO parametros


instrução 1
Instrução 2

M
instrução N
ENDM

Como o montador trata uma MACRO ?

52
MACROS

MOVE MACRO A, B INTERPRETAÇÃO DO MONTADOR:


PUSH AX
MOV AX, B
M
PUSH AX
MOV A, AX
MOV AX, VAR2
POP AX
MOV VAR1, AX
ENDM
POP AX
ADD CX, VAR1
TRECHO DE PROGRAMA:
PUSH AX
MOV AX, VAR4
M MOV VAR3, AX
MOVE VAR1, VAR2 POP AX
ADD CX, VAR1 ADD CX, VAR3
MOVE VAR3, VAR4
ADD CX, VAR3
M
M Obs.: Diferente do procedimento, uma macro não
demanda tempo do processador para desviar o
ponto de execução do programa.

Bibliografia Básica
„ Zelenovsky, Ricardo e Mendonça, Alexandre, PC um
guia prático de Hardware e Interfaceamento, MZ Editora
Ltda, 4a. edição, 2006. (http://www.mzeditora.com.br/)
„ Brey, Barry, The Intel Microprocessors, Fourth Edition,
PHI, 1997.
„ Zanco, Wagner da Silva. Microcontroladores PIC
16F628A/648A – uma abordagem prática e objetiva,
Editora Érica, 2005.

Material da Disciplina
http://www.dee.ufc.br/~arthurp

53

Você também pode gostar