assembly 澄清要求提供一个月是否有28/29天、30天或31天的MIPS计划

piztneat  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(122)

由于缺乏来源,我可以得到我的手,这似乎很奇怪,我没有人张贴一个程序作为解决这个问题在互联网上的MIPS(除非我是在网上冲浪坏).我需要澄清我的程序是否可以写在一个更有效和优化的方式,而不仅仅是垃圾邮件标签和分支!

.data
    msg : .asciiz "Give the month: "
    msg1 : .asciiz "This month contains 31 Days."
    msg2 : .asciiz "This month contains 30 Days."
    msg3 : .asciiz "This month contains 28/29 Days."
.text
.globl main
main:
    li $v0,4
    la $a0,msg
    syscall
    
    li $v0,5
    syscall
    move $t0,$v0   #t0 contains given month
    
    li $t7,7
    li $t2,2       
    li $t1,0
    
    div $t0,$t2
    mfhi $t3
    mflo $t4
    
    bgt $t0,$t7,etiq3
    beq $t0,$t2,etiq2
    beqz  $t3,etiq1
    bgtz $t3,etiq
    
    
    etiq:
    li $v0,1
    addi $a0,$s1,0
    syscall
    li $v0,4
    la $a0,msg1
    syscall
    j exit 
    
    etiq1:
    li $v0,1
    addi $a0,$s0,0
    syscall
    li $v0,4
    la $a0,msg2
    syscall
    j exit
    
    etiq2:
    li $v0,1
    addi $a0,$s0,0
    syscall
    li $v0,4
    la $a0,msg3
    syscall
    j exit
    
    etiq3:
    beqz $t3,etiq
    bgtz $t3,etiq1
    
    exit:
    li $v0,10
    syscall
zdwk9cvp

zdwk9cvp1#

你的代码没有很好的注解,所以很难理解。特别是为什么你要打印$s0$s1,这两个都没有初始化。
对于优化的解决方案,一种可能性是使用位图(每月2比特):

.data
    msg : .asciiz "Give the month: "
    msg1 : .asciiz "This month contains 31 Days."
    msg2 : .asciiz "This month contains 30 Days."
    msg3 : .asciiz "This month contains 28/29 Days."
    table: .word msg3, msg2, msg1
.text
.globl main
main:
    li $v0,4
    la $a0,msg
    syscall

    li $v0,5
    syscall

    # 00 = 28/29, 01 = 30, 10 = 31
    li $a0, 0x099a6620  # 1001 1001 1010 0110 0110 0010 0000
    sll $v0, $v0, 1     # 2 bits per month
    srlv $a0, $a0, $v0  # shift the bitmap
    andi $a0, $a0, 0x0c # keep the 2 bits
    lw $a0, table($a0)
    li $v0,4
    syscall
    li $v0,10
    syscall

当然,您也可以将消息指针放到一个有12个条目的表中,这样代码会更简单,但会占用更多内存。

相关问题