MIPS组装在新行中的阵列中打印每个十个字符



我面临一个问题,试图打印出十行(每行十个字符(的100个字符的数组,以便使用汇编语言MIPS形成正方形的文本。代码正正确打印前十个字符,然后出错。

我非常感谢任何帮助或建议

这是代码:

#v20180326# 
# Prints string to stdout with length $a1
#
# $a0 -> string
# $a1 -> length
#
print:
# save s-Regs
addi $sp, $sp, -8
sw $s0, 0($sp)
sw $s1, 4($sp)
# save params
move $s0, $a0
move $s1, $a1
li $s1, 15
# alloc buffer (with double word alignment)
addi $s1, $s1, 1
andi $t0, $s1, 7
li $t1, 8
sub $t1, $t1, $t0
andi $t1, $t1, 7
add $s1, $s1, $t1
sub $sp, $sp, $s1
# copy string
li $t0, 0
loop_copy:
bge $t0, $a1, end_copy
add $t1, $s0, $t0
lb $t2, 0($t1)
add $t3, $sp, $t0
sb $t2, 0($t3)
addi $t0, $t0, 1
j loop_copy
end_copy:
# null terminated
add $t3, $sp, $t0
sb $zero, 0($t3)
# print buffer
move $a0, $sp
li $v0, 4
syscall
# free buffer
add $sp, $sp, $s1
# restore s-Regs
lw $s0, 0($sp)
lw $s1, 4($sp)
addi $sp, $sp, 8
jr $ra
#
# Prints a single linefeed (n) to stdout
#
print_lf:
li $a0, 10
li $v0, 11
syscall
jr $ra
#########################################
### ATTENTION: DO NOT CHANGE THE FOLLOWING LINE !!
### sed-hook ###
### Implement your solution below
#########################################
#
# Writes the board nicely line by line
#
write_board:
### TODO Implement your solution here ###

#########################################
### Implement your solution above
### ATTENTION: DO NOT CHANGE THE FOLLOWING LINE !!
### sed-hook ###
#########################################
# data
.data
size:
.word       10
#   board:          .asciiz     "oo  x xx o x  - o o  x  x  xxx x  -  oo   o             
- o -  oo o  o- xxxx  x -    o  -   xx    -     ooo - xx"
#   board:          .asciiz     "                                                                                                        
"
board:
.asciiz     "    x xx   x  x      x  x  xxx x  x         x   x         x     
xxxx  x x       x   xx    x         x xx"
#########################################
# main
.text
.globl main
main:
# save regs
addi $sp, $sp, -4
sw $ra, 0($sp)
# call function
jal write_board
# restore regs
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
#########################################

这是我的代码:

    #########################################
### ATTENTION: DO NOT CHANGE THE FOLLOWING LINE !!
### sed-hook ###
### Implement your solution below
#########################################
#
# Writes the board nicely line by line
#
write_board:
### TODO Implement your solution here ###
addi $sp, $sp, -12
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)    
addi $t0, $zero, 0
for:
la $a0, board
lw $a1, size
sw $s0, board($t0)
addi $t0, $t0, 4
bgt $t0, 99, exit
jal print
jal print_lf
j for  
exit:
li $v0, 10
syscall
lw $ra, 0($sp)
lw $s0, 4($sp)
lw $s1, 8($sp)
addi $sp, $sp, 12
jr $ra
#########################################
### Implement your solution above
### ATTENTION: DO NOT CHANGE THE FOLLOWING LINE !!
### sed-hook ###
#########################################

从干净的方法开始。以更高级别的语言原型。这是一个从:

开始的C函数
void
write_board(void)
{
    int chrcnt;
    int val;
    char *bp;
    bp = board;
    chrcnt = 0;
    while (1) {
        // fetch the next char
        val = *bp++;
        if (val == 0)
            break;
        // output it
        putchar(val);
        // count number of chars on line
        chrcnt += 1;
        // output newline when limit reached
        if (chrcnt == 10) {
            putchar('n');
            chrcnt = 0;
        }
    }
}

最新更新