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.

Página inicial