Progr11 : Introduz os recursos de " MULTIPLICAR E DIVIDIR " |
||
|
||
; Denys E C Nicolosi |
||
|
||
; Para efetuar a multiplicação de dois números temos a seguinte |
||
; operação: MUL AB. Ele multiplica o valor do registrador B com |
||
; o valor contido no acc. O resultado ser mostrado da seguinte |
||
; maneira: 8 bits mais significativos no registrador B e os 8 |
||
; bits menos significativos no acc. |
||
|
||
; Para efetuar a divisão entre dois números, temos a seguinte |
||
; operação: DIV AB. O quociente , apresentado no acc. e o resto |
||
; , apresentado no registrador B. |
||
|
||
;label |
instr operando |
;comentários |
;***** |
***** |
********************************* |
; |
||
|
org 0 |
;começa em 0 |
|
mov A,#32h |
;move o valor 32h para o acc. |
|
mov b,#01h |
;move o valor 01 para o registrador B. |
|
mul ab |
;efetua a multiplicação entre Acc e B. |
|
; O resultado aparece da seguinte maneira: |
|
|
; B=00h e acc=32h (0032)h |
|
|
;repare na flag OV (OV=0) após esta operação. |
|
|
mov b,#32h |
;move o valor 32h para o registrador B. |
|
mul ab |
;32h x 32h = 09C4h, assim teremos: |
|
;B=09h e acc=C4h |
|
|
;repare na flag OV (OV=1) após esta operação. Nesta situação |
|
|
;OV é setado porque o resultado da multiplicação excedeu a um byte. Esta é a contribuição do flag OV para a multiplicação. |
|
|
div ab |
;divide o acc pelo registrador B. Quociente no |
|
;acc e resto no B. C4h / 09h = 15h resto = 07h. |
|
|
; acc = 15h e B=07h |
|
|
mov b,#00 |
;move 0 para reg. B |
|
div ab |
;como podemos ver, estamos dividindo 15h por 0. |
|
;neste caso o micro não efetua a operação mas |
|
|
;leva o bit ov(overflow) a 1, ou seja: |
|
|
; acc=15h b=00h OV=1 |
|
|
;Isto mostra que para divisão o indicador de erro , a flag OV |
|
|
clr ov |
;limpa ov |
|
mov B,#16h |
;valor 16h para registrador B |
|
div ab |
;15h / 16h = 0h resto = 15h, ou seja: acc=00h e B=15h |
|
end |
___________________________________________________________________________________________
Progr19 : Treino de utilização de MOVX e MOVC |
|
|
|
; Denys E C Nicolosi |
|
|
|
|
|
; Deve-se utilizar o MOVX para manipular dados da RAM externa ou I/O Mapeada |
|
; Deve-se utilizar o MOVC para ler dados da EPROM |
|
|
|
; Instruções disponíveis : |
|
|
|
; MOVX A,@DPTR |
; lê o conteúdo da posição de memória apontada por DPTR |
|
;e carrega em A. É bom dizer: move para A o conteúdo da posição externa |
|
;de memória RAM apontada por DPTR. DPTR é um endereço de 16 bits. |
;MOVX @DPTR,A |
;escreve o que está em A no conteúdo de memória externa RAM apontada por DPTR. |
. |
;É instrução reversa da primeira |
; MOVX A,@Ri. |
;move para A o conteúdo da RAM externa apontada por Ri ( i = 0 ou i = 1 ) |
|
; É um endereço de 8 bits |
; ;MOVX @Ri,A |
; escreve o que está em A no conteúdo de memória externa |
|
; apontada por Ri ( i = 0 ou i = 1 ). É instrução reversa da acima descrita |
;MOVC A,@A+DPTR ; lê o conteúdo da EPROM apontada por DPTR+A e põe em A. . |
|
|
Não tem instrução reversa pois a EPROM só se lê e não se escreve |
;MOVC A,@A+PC |
; lê a posição da EPROM apontada por A+PC e põe em A. |
|
;Também não tem instrução reversa. |
;Note que precisamos preparar o conteúdo de A e DPTR para executar |
|
;as instruções onde se utiliza A+DPTR. A instrução MOV DPTR,#Dado , |
|
;em 16 bits e em hexa, serve para preparar o DPTR com o endereço desejado |
|
|
|
;A instrução MOVC A,@A+DPTR é boa para ler tabelas gravadas na EPROM |
|
;Vamos supor que na posição 0100h da EPROM eu inicie gravação de código |
|
;de 7 segmentos de um display . Quando quero ler o quarto código da |
|
;mesma, é só carregar A=3 , DPTR= 0100h e aplicar a instrução citada |
|
;pois ela devolverá em A, o conteúdo de EPROM endereçada por A+DPTR, |
|
;que é no caso 0103h, onde gravei o código do display para desenhar no |
|
; mesmo o número que estabeleci. |
|
|
|
; Exemplo: |
;label |
Instr operando |
;comentários |
|||
;***** |
***** |
********************************************* |
|||
|
mov dptr,#2000h |
;carrega DPTR com 2000 em hexa |
|||
|
mov A,#11h |
; carrega A com 11 em hexa |
|||
|
movx @dptr,A |
;carrega o conteúdo de A na RAM ext., no endereço |
|||
|
;apontado por DPTR (2000h). |
||||
|
mov A,#0ffh |
;carrega A com FFh |
|||
|
movx A,@dptr |
;lê o conteúdo da RAM no endereço 2000 e põe em A. |
|||
|
;Rotina para preparar e ler posição de EPROM onde tenho ;tabela de códigos em 7 segmentos para |
||||
|
; desenhar no display de 0 a f |
||||
|
mov dptr,#0100h |
;carrego o dptr com o endereço da cabeça da tabela |
|||
|
mov A,#0h |
;acerto A para ler o primeiro endereço da tabela |
|||
|
;que desenhará o número "0" no display |
||||
|
movc A,@A+DPTR |
;leio efetivamente o valor da tabela em 0100+0 |
|||
|
;(A=0), que é o "0". |
||||
|
mov A,#5 |
; carrego A para ler o sexto valor da tabela |
|||
|
movc a,@a+dptr |
;leio a sexta posição da tabela, que é o desenho do nš "5". |
|||
|
|||||
; Tabela de código em 7 segmentos para desenhar no display |
|||||
|
|||||
|
org 0100h |
;posiciona endereço em 0100h ,i.é, o primeiro |
|||
|
;endereço do "db" será 0100h |
||||
|
|||||
|
db 0c0h |
;desenha o zero no display |
|||
|
db 0f9h |
;desenha o 1 |
|||
|
db 0a4h |
;desenha o 2 |
|||
|
db 0b0h |
;desenha o 3 |
|||
|
db 99h |
;desenha o 4 |
|||
|
db 92h |
;desenha o 5 |
|||
|
db 82h |
;desenha o 6 |
|||
|
db 0f8h |
;desenha o 7 |
|||
|
db 80h |
;desenha o 8 |
|||
|
db 90h |
;desenha o 9 |
|||
|
db 88h |
;desenha o A |
|||
|
db 83h |
;desenha o B |
|||
|
db 0c6h |
;desenha o C |
|||
|
db 0a1h |
;desenha o D |
|||
|
db 86h |
;desenha o E |
|||
|
db 8eh |
;desenha o F |
|||
|
|||||
|
end |
|
|||
;OBS: o código "db" é código do compilador para igualar o conteúdo da |
|||||
;memória com o valor posto em seguida a instrução db, na posição dada |
|||||
;por org,org+1,org+2,etc. |