Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ##########################################################
- # Segmento de datos
- ##########################################################
- .data 0x10000000
- reloj: .word 0x00173b3b # HH:MM:SS (3 bytes de menor peso)
- cad_asteriscos: .asciiz "\n **************************************"
- cad_horas: .asciiz "\n Horas: "
- cad_minutos: .asciiz " Minutos: "
- cad_segundos: .asciiz " Segundos: "
- cad_reloj_en_s: .asciiz "\n Reloj en segundos: "
- ##########################################################
- # Segmento de código
- ##########################################################
- .globl __start
- .text 0x00400000
- __start: la $a0, reloj
- move $a0, $v0
- jal imprime_s
- la $a0, reloj
- jal imprime_reloj
- la $a0, reloj
- jal pasa_segundo # Incrementa el reloj en un segundo
- jal pasa_segundo # Incrementa el reloj en un segundo
- la $a0, reloj
- jal imprime_reloj
- salir: li $v0, 10 # Código de exit (10)
- syscall # Última instrucción ejecutada
- .end
- ##########################################################
- # Subrutina que imprime el valor del reloj
- # Entrada: $a0 con la dirección de la variable reloj
- ##########################################################
- imprime_reloj: move $t0, $a0
- la $a0, cad_asteriscos # Dirección de la cadena
- li $v0, 4 # Código de print_string
- syscall
- la $a0, cad_horas # Dirección de la cadena
- li $v0, 4 # Código de print_string
- syscall
- lbu $a0, 2($t0) # Lee el campo HH
- li $v0, 1 # Código de print_int
- syscall
- la $a0, cad_minutos # Dirección de la cadena
- li $v0, 4 # Código de print_string
- syscall
- lbu $a0, 1($t0) # Lee el campo MM
- li $v0, 1 # Código de print_int
- syscall
- la $a0, cad_segundos # Dirección de la cadena
- li $v0, 4 # Código de print_string
- syscall
- lbu $a0, 0($t0) # Lee el campo SS
- li $v0, 1 # Código de print_int
- syscall
- la $a0, cad_asteriscos # Dirección de la cadena
- li $v0, 4 # Código de print_string
- syscall
- jr $ra
- ##########################################################
- # Subrutina que imprime los segundos calculados
- # Entrada: $a0 con los segundos a imprimir
- ##########################################################
- imprime_s: move $t0, $a0
- la $a0, cad_asteriscos # Dirección de la cadena
- li $v0, 4 # Código de print_string
- syscall
- la $a0, cad_reloj_en_s # Dirección de la cadena
- li $v0, 4 # Código de print_string
- syscall
- move $a0, $t0 # Valor entero a imprimir
- li $v0, 1 # Código de print_int
- syscall
- la $a0, cad_asteriscos # Dirección de la cadena
- li $v0, 4 # Código de print_string
- syscall
- jr $ra
- ##########################################################
- # Subrutina que incrementa el reloj en una hora
- # Entrada: $a0 con la dirección del reloj
- # Salida: reloj incrementado en memoria
- # Nota: 23:MM:SS -> 00:MM:SS
- ##########################################################
- pasa_hora: lbu $t0, 2($a0) # $t0 = HH
- addiu $t0, $t0, 1 # $t0 = HH++
- li $t1, 24
- beq $t0, $t1, H24 # Si HH==24 se pone HH a cero
- sb $t0, 2($a0) # Escribe HH++
- j fin_pasa_hora
- pasa_segundo: lbu $t0, 0($a0)
- addiu $t0, $t0, 1
- li $t1, 60
- beq $t0, $t1, S60
- sb $t0, 0($a0)
- j fin_pasa_segundo
- devuelve_reloj_en_s_sd: lb $t0, 0($a0)
- lb $t1, 1($a0)
- lb $t2, 2($a0)
- li $t4, 0
- sll $t3, $t2, 11
- addu $t4, $t4, $t3
- sll $t3, $t2, 10
- addu $t4, $t4, $t3
- sll $t3, $t2, 9
- addu $t4, $t4, $t3
- sll $t3, $t2, 4
- addu $t4, $t4, $t3
- sll $t3, $t1, 5
- addu $t4, $t4, $t3
- sll $t3, $t1, 4
- addu $t4, $t4, $t3
- sll $t3, $t1, 3
- addu $t4, $t4, $t3
- sll $t3, $t1, 2
- addu $t4, $t4, $t3
- addu $t4, $t4, $t0
- move $v0, $t4
- jr $ra
- devuelve_reloj_en_s_srd: lb $t0, 0($a0)
- lb $t1, 1($a0)
- lb $t2, 2($a0)
- li $t4, 0
- sll $t3, $t2, 11
- addu $t4, $t4, $t3
- sll $t3, $t2, 9
- subu $t4, $t4, $t3
- sll $t3, $t2, 5
- addu $t4, $t4, $t3
- sll $t3, $t2, 4
- subu $t4, $t4, $t3
- sll $t3, $t1, 6
- addu $t4, $t4, $t3
- sll $t3, $t1, 2
- subu $t4, $t4, $t3
- addu $t4, $t4, $t0
- move $v0, $t4
- jr $ra
- H24: sb $zero, 2($a0) # Escribe HH a 0
- fin_pasa_hora: jr $ra
- S60: sb $zero, 0($a0)
- fin_pasa_segundo: jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement