mp1 0203
mp1 0203
mp1 0203
(Famı́lia 51 da Intel)
jpsousa@fe.up.pt
Conteúdo
1 Objectivos 2
2 Introdução 2
4 Modelo de programação 4
4.1 Registos principais da famı́lia i51 . . . . . . . . . . . . . . . . . . . . . . . 5
4.2 Grupos de instruções da famı́lia i51 . . . . . . . . . . . . . . . . . . . . . . 5
4.3 Regras de sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5 O assemblador 7
5.1 Caracterı́sticas gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5.2 Alguns comandos do assemblador da KEIL . . . . . . . . . . . . . . . . . . 7
5.2.1 Indicações gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5.2.2 Nomes simbólicos e operadores simples . . . . . . . . . . . . . . . . 8
5.2.3 Segmentos absolutos . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5.2.4 Segmentos recolocáveis . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.3 Formato das listagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
6 Problemas 10
1
1 Objectivos
2 Introdução
1
cfr. Aulas teóricas da primeira semana
2
O programa adiciona o conteúdo da posição de memória 64 com o conteúdo da posição 65
e coloca o resultado na posição 66. Numa descrição de alto nı́vel, considerando a memória
representada pelo array mem[ ], o que este programa faz é:
De acordo com o estabelecido pela Intel, os códigos E5h, 25h e F5h representam, respec-
tivamente, as instruções:
A linguagem assembly é, pois, o nı́vel mais baixo em que se pode programar com alguma
comodidade. A tradução da linguagem assembly de cada microprocessador para o código
máquina correspondente pode ser feita à mão, mediante uma tabela de conversão, mas
normalmente é feita recorrendo a um assemblador, programa que normalmente é oferecido
pelo próprio fabricante do microprocessador.
3.1 Vantagens
3
3.2 Desvantagens
3.3 Conclusão
4 Modelo de programação
4
4.1 Registos principais da famı́lia i51
• Registos de trabalho – R0 a R7
• Registos privilegiados – A (acumulador) e B
• Registo de estado – PSW (program status word)
Os registos A e B são privilegiados no sentido de que existem algumas instruções que só
podem ser executadas neles, por exemplo as operações aritméticas só podem ser efectuadas
sobre o acumulador. O registo de estado (PSW) dá, entre outras, indicações sobre a
paridade do valor contido no acumulador e se houve ou não transporte e/ou overflow
na última operação aritmética efectuada; instruções especı́ficas permitem testar estas
condições.
As 256 instruções disponı́veis na famı́lia i51 podem dividir-se em cinco grupos consoante
a sua função:
As instruções lógicas permitem efectuar operações lógicas elementares (AND, OR, XOR,
NOT) assim como rotações de bits para a esquerda ou para a direita.
5
As instruções booleanas permitem manipular bits individualmente. A maior parte delas
obriga a utilizar a flag CY (carry) que funciona para o processamento booleano como o
acumulador para o processamento aritmético e lógico.
O resumo de instruções [1, páginas 13..16] ou [2] dá uma panorâmica geral das instruções
disponı́veis, pelo que deve ser lido com todo o cuidado.
mnemónica operando1[,operando2[,operando3]]
onde o segundo e terceiro operandos nem sempre existem. De acordo com o estabelecido
pela Intel um operando pode ser
2. o nome de um registo,
Estas regras de sintaxe entendem-se melhor com a apresentação de alguns exemplos sim-
ples ilustrativos da cada uma delas:
Note-se que dos registos de trabalho R0 a R7, apenas R0 e R1 podem assumir o papel
de apontadores. Quando o manual de programação [1] emprega a designação genérica Rn
está a referir-se aos registos R0 a R7 mas quando usa a designação Ri está a referir-se
apenas aos registos R0 e R1.
6
5 O assemblador
Não há distinção entre maiúsculas e minúsculas. Qualquer texto precedido do carácter ‘;’
é considerado comentário. Um comentário prolonga-se sempre até ao fim da linha. O fim
do código fonte é indicado pelo comando END. Qualquer texto que apareça depois desse
comando é ignorado pelo assemblador.
7
5.2.2 Nomes simbólicos e operadores simples
Uma das grandes vantagens de utilizar um assemblador é poder definir nomes simbólicos.
Para as constantes essa definição faz-se com os comandos EQU e DB e para as variáveis com
o comando DS cuja sintaxe se depreende dos exemplos apresentados:
A diferença entre EQU e DB é que o primeiro não gera qualquer código máquina enquanto
o segundo preenche a memória com os valores indicados. Note-se a necessidade de ‘:’ nos
comandos DB e DS.
.
.
mov a,#100
loop: dec a
jnz loop
.
.
8
; === Variáveis ========================================================
DSEG AT 40h ; Segmento absoluto com inı́cio em 40h
total: DS 2 ; Reserva dois bytes em memória de dados
contador: DS 1 ; Reserva um byte (42H)
9
; --- Rotinas de E/S ---------------------------------------------------
rseg rotinas ; Activa o segmento rotinas
.
.
.
No exemplo apresentado, só se sabe que o programa principal começa no endereço 0000h
da memória de programas pois é o único segmento absoluto existente. Os endereços dos
segmentos recolocáveis são definidos automaticamente durante o processo de geração do
código máquina.
6 Problemas
10
1. Escreva programas para efectuar as seguintes operações:
Nos problemas seguintes, a não ser que seja feita referência a endereços especı́ficos, deverão
ser utilizados segmentos de dados recolocáveis.
(a) x é de 8 bits
(b) x é de 16 bits
10. Considere que temptot contém a soma das medições de temperatura efectuadas
em 16 pontos diferentes de uma estufa. Apresente 3 modos diferentes de calcular
a temperatura média no interior da estufa. Suponha que está a trabalhar com
variáveis de 8 bits e o resultado é guardado em tempmed.
11
Referências
[1] Philips semiconductors; 80C51 family programmer’s guide and instruction set; Se-
tembro de 1997.
[2] Ferreira, José Manuel; Resumo das instruções do 80C51 ; FEUP, Setembro de 2000.
12