assembly 如何改进此MIPS组装程序[已关闭]

myss37ts  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(150)

已关闭。此问题需要更多的focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

两个月前关门了。
Improve this question
我有这个为一个简短的考试,这是我想出的解决方案。我离开了这个科目为我的最后一年,因为老师真的很糟糕,我在很大的压力下,所以这就是为什么这个程序是如此丑陋和野蛮强迫。任务是采取21个字母的字符串和建立一个正确的指向金字塔从中间开始,这意味着1个字母到3个字母等。我没有包括第二部分,因为它是显而易见的,我会做什么。
出于好奇,我如何大大缩短这个程序?我听到一个提示,我们应该使用快速操作,但我不知道如何使用它们。

.text
.globl main

# Code goes here
main:


    #print 1st char
     
    la $t0, str
    lb $t1, 10($t0)
    
    move $a0, $t0

    li $v0, 11
    add $a0, $t1, 0
    syscall    

    jal print_endl

    jal print3

    jal print_endl

    jal print5

    jal print_endl

    jal print7

    jal print_endl

    jal print9

    jal print_endl

    jal print11
    
    jal print_endl

    jal print13

    jal print_endl

    jal print15

    jal print_endl

    jal print17

    jal print_endl

    jal print19

    jal print_endl

    jal print21



    

# Program terminates here
exit:       li $v0, 10
            syscall

# Procedure that prints a newline
print_endl: addi $sp, $sp, -4
            sw   $a0, 0($sp)

            li   $v0, 4
            la   $a0, endl
            syscall

            lw   $a0, 0($sp)
            addi $sp, $sp, 4
            jr $ra

# Procedure that prints a space character
print_spc:  addi $sp, $sp, -4
            sw   $a0, 0($sp)

            li   $v0, 4
            la   $a0, spc
            syscall

            lw   $a0, 0($sp)
            addi $sp, $sp, 4
            jr $ra

print3:
    addi $sp, $sp, -4
    sw   $a0, 0($sp)

    li $v0, 11

    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall

    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra

    print5:
    addi $sp, $sp, -4
    sw   $a0, 0($sp)

    li $v0, 11
    lb $a0, 8($t0)
    syscall
    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall
    lb $a0, 12($t0)
    syscall

    
    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra    

    print7:
    addi $sp, $sp, -4
    sw   $a0, 0($sp)

    li $v0, 11
    lb $a0, 7($t0)
    syscall
    lb $a0, 8($t0)
    syscall
    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall
    lb $a0, 12($t0)
    syscall
    lb $a0, 13($t0)
    syscall

    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra

    print9:
    addi $sp, $sp, -4
    sw   $a0, 0($sp)

    li $v0, 11
    lb $a0, 6($t0)
    syscall
    lb $a0, 7($t0)
    syscall
    lb $a0, 8($t0)
    syscall
    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall
    lb $a0, 12($t0)
    syscall
    lb $a0, 13($t0)
    syscall
    lb $a0, 14($t0)
    syscall

    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra    


    print11:
    addi $sp, $sp, -4
    sw   $a0, 0($sp)

    li $v0, 11
    lb $a0, 5($t0)
    syscall
    lb $a0, 6($t0)
    syscall
    lb $a0, 7($t0)
    syscall
    lb $a0, 8($t0)
    syscall
    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall
    lb $a0, 12($t0)
    syscall
    lb $a0, 13($t0)
    syscall
    lb $a0, 14($t0)
    syscall
    lb $a0, 15($t0)
    syscall

    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra

    print13:
    li $v0, 11
    lb $a0, 4($t0)
    syscall
    lb $a0, 5($t0)
    syscall
    lb $a0, 6($t0)
    syscall
    lb $a0, 7($t0)
    syscall
    lb $a0, 8($t0)
    syscall
    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall
    lb $a0, 12($t0)
    syscall
    lb $a0, 13($t0)
    syscall
    lb $a0, 14($t0)
    syscall
    lb $a0, 15($t0)
    syscall
    lb $a0, 16($t0)
    syscall

    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra

    print15:
    addi $sp, $sp, -4
    sw   $a0, 0($sp)

    li $v0, 11
    lb $a0, 3($t0)
    syscall
    lb $a0, 4($t0)
    syscall
    lb $a0, 5($t0)
    syscall
    lb $a0, 6($t0)
    syscall
    lb $a0, 7($t0)
    syscall
    lb $a0, 8($t0)
    syscall
    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall
    lb $a0, 12($t0)
    syscall
    lb $a0, 13($t0)
    syscall
    lb $a0, 14($t0)
    syscall
    lb $a0, 15($t0)
    syscall
    lb $a0, 16($t0)
    syscall
    lb $a0, 17($t0)
    syscall

    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra

    print17:
    addi $sp, $sp, -4
    sw   $a0, 0($sp)

    li $v0, 11
    lb $a0, 2($t0)
    syscall
    lb $a0, 3($t0)
    syscall
    lb $a0, 4($t0)
    syscall
    lb $a0, 5($t0)
    syscall
    lb $a0, 6($t0)
    syscall
    lb $a0, 7($t0)
    syscall
    lb $a0, 8($t0)
    syscall
    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall
    lb $a0, 12($t0)
    syscall
    lb $a0, 13($t0)
    syscall
    lb $a0, 14($t0)
    syscall
    lb $a0, 15($t0)
    syscall
    lb $a0, 16($t0)
    syscall
    lb $a0, 17($t0)
    syscall
    lb $a0, 18($t0)
    syscall

    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra

    print19:
    addi $sp, $sp, -4
    sw   $a0, 0($sp)

    li $v0, 11
    lb $a0, 1($t0)
    syscall
    lb $a0, 2($t0)
    syscall
    lb $a0, 3($t0)
    syscall
    lb $a0, 4($t0)
    syscall
    lb $a0, 5($t0)
    syscall
    lb $a0, 6($t0)
    syscall
    lb $a0, 7($t0)
    syscall
    lb $a0, 8($t0)
    syscall
    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall
    lb $a0, 12($t0)
    syscall
    lb $a0, 13($t0)
    syscall
    lb $a0, 14($t0)
    syscall
    lb $a0, 15($t0)
    syscall
    lb $a0, 16($t0)
    syscall
    lb $a0, 17($t0)
    syscall
    lb $a0, 18($t0)
    syscall
    lb $a0, 19($t0)
    syscall

    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra

    print21:
    addi $sp, $sp, -4
    sw   $a0, 0($sp)

    li $v0, 11
    lb $a0, 0($t0)
    syscall
    lb $a0, 1($t0)
    syscall
    lb $a0, 2($t0)
    syscall
    lb $a0, 3($t0)
    syscall
    lb $a0, 4($t0)
    syscall
    lb $a0, 5($t0)
    syscall
    lb $a0, 6($t0)
    syscall
    lb $a0, 7($t0)
    syscall
    lb $a0, 8($t0)
    syscall
    lb $a0, 9($t0)
    syscall
    lb $a0, 10($t0)
    syscall
    lb $a0, 11($t0)
    syscall
    lb $a0, 12($t0)
    syscall
    lb $a0, 13($t0)
    syscall
    lb $a0, 14($t0)
    syscall
    lb $a0, 15($t0)
    syscall
    lb $a0, 16($t0)
    syscall
    lb $a0, 17($t0)
    syscall
    lb $a0, 18($t0)
    syscall
    lb $a0, 19($t0)
    syscall
    lb $a0, 20($t0)
    syscall

    lw   $a0, 0($sp)
    addi $sp, $sp, 4
    jr $ra

# Data goes here
.data

endl: .asciiz "\n"
string: .asciiz "testring123\n"
str: .asciiz "mynameisslimshadyprol"
ans: .asciiz "The length is: "
r1wp621o

r1wp621o1#

正确性问题:
1.这段代码遵循了一个非标准的调用约定,要求$a0被调用保留,尽管在标准的调用约定中,$a0是一个调用乱码寄存器。虽然创建一个自定义的调用约定是可以的,但是应该注意到这一点,这确实意味着这些函数不一定能很好地与C语言混合,例如,用C语言编写其中的一个或多个。
1.在MIPS上,我们应该使用addiu而不是addi来进行所有的指针运算,包括堆栈指针调整。虽然addi可能经常工作,但它会在有符号溢出时捕获/出错--但指针是无符号数,所以我们不应该要求对它们的运算进行有符号溢出检查。
代码大小观察结果:
1.整个程序中没有一个循环,循环是最简单的抽象方法之一--它们允许重复执行某些代码(循环体),而不必重复重述该代码。
1.这段代码使用了函数,这是一种很好的抽象方法。但是,没有函数调用任何其他函数-只有main调用函数。函数本身调用其他函数是另一个重复代码执行而不重复代码的机会。
当你写C代码时,你是否避免使用循环,并以这种方式写出所有的东西?
虽然这对某些问题有效,但有许多问题不使用loops 1是无法轻易解决的--例如,如果字符串是用户输入的,并且允许任意长度,那该怎么办?编写一个处理任意字符串的无循环1程序是完全不切实际的。
1循环或递归...

相关问题