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 |