MIPS 3 - Calculator


MIPS - Calculator


org 0000h
JMP main ;Salta para a Label Main
org 0003h
JMP icalc ;Salta para a Label icalc

org 0030h
main: SETB EX0; ; pomos 1 no EX0 (External Interrupt)
SETB IT0; ; pomos 1 no IT0 (Internal Interrupt)
SETB EA; ;Re-habilita as Interrupções

CLR P3; ;Limpa o porto P3, metendo-o a zeros
SETB ie0 ; pomos o bit IE0 a 1;

loop: Mov A, P1 ;Movemos o valor de P1, para o acumulador (A)
JMP loop; ;Vamos para o procedimento loop


org 0100h
icalc: MOV A, P1 ; Movemos o valor do porto 1 (P1) para o acumulador (A)
SWAP A ;Troca os nibbles do acumulador (A) (equivale a 4 instruções RL A, ou seja, para efectuarmos a troca da parte baixa pela alta)
ANL A, #00001111b ;Efectuamos um AND ao acumulador (A), serve para filtrar a parte baixa do acumulador (R1)
MOV R1, A ;Movemos o valor do Acumulador (A), para o registo 1 (R1)
MOV A,P1 ;Movemos o valor do porto 1 (P1) para o acumulador (A)
ANL A, #00001111b ;Efectuamos um AND ao acumulador (A), serve para filtrar a parte baixa do acumulador (R1)
MOV R2,A ;Move o valor do acumulador (A) para o registo 2 (R2)
MOV a,P2 ;Move o valor do porto 2 (P2) para o acumulador (A)
ANL A, #00000011b ;Efectuamos um AND ao acumulador (A) para filtrar os 2 primeiros bits
CJNE A,#00h,Soma ;Compara e salta se o acumulador (A), não for igual com #00H e salta para Soma
MOV A,R2 ;Move o valor do registo 2 (R2) para o acumulador (A)
MOV B,r1 ;Move o valor do registo 1 (R1) para o registo b (B)
MUL AB ;Multiplica o valor de A com B;
JMP Resultado ;Salta para a Label Resultado

Soma: CJNE A,#01h,Subtracao ;Compara e salta se o acumulador (A), não for igual com #01H e salta para Subtracao
MOV A,R2 ;Move o valor do registo 2 (R2), para o acumulador (A)
ADD A,R1 ;Adiciona o valor do registo 1 (R1)com o valor do acumulador (A)
JMP Resultado ;Salta para a label Result

Subtracao: CJNE A,#02h,Divisao ;Compara e salta se o acumulador (A), não for igual com #02H e salta para Divisao
MOV A,R1 ;Move o valor do registo 1 (R1), para o acumulador (A)
SUBB A,R2 ;Subtrai o valor do registo 1 (R1) com o valor do acumulador (A)
JMP Resultado ;Salta para a label Resultado

Divisao CJNE A,#03h,Resultado ;Compara e salta se o acumulador(A), não for igual com#03h e salta para o resultado
MOV A,R1 ;Move o valor do registo 1 (R1) para o acumulador (A)
MOV B,R2 ;Move o valor do registo 2 (R2) para o acumulador (B)
DIV AB ;Divide o valor de A com B

Resultado: ADD A,#00h ; Somamos para activar a operação decimal
DA A ;Efectua o Decimal Adjustment de A
MOV P3, A ;Move o valor do acumulador (A) para o porto 3
RETI ;Retorno de sub-rotina de interrupção, ou seja, retorna ao local onde a interrupção foi chamada

0 comentários:

Enviar um comentário