[英]Pascal's Triangle in MIPS
我在MIPS組裝中需要一些認真的幫助。 該程序應該做兩件事。 那兩件事是:
輸入:spim -f 90.s 4 6
輸出:
6 4
720 24
15
2,顯示Pascal三角形的第n行,其中k = 0至n
輸入:與以前相同(spim -f 90.s 4 6)
輸出:6 4 720 24 15 1 6 15 20 15 6 1(這是最終輸入。)
我基本上需要編寫一個函數displayRow,以顯示k = 0到n的Pascal三角形的第n行。 忽略傳入的k的值。由於displayRow函數調用Cnk,因此您必須構造一個堆棧框架。 在displayRow中,我需要編寫一個從k = 0到n的循環。 在循環體內顯示Cnk(n,k)的返回值。 我被卡住了,我的輸出看起來像這樣:
spim:(解析器)解析文件90.s bgtz $ v0的第174行的錯誤以下符號未定義:atoi
6 4 720 24 24
我不知道從這里去哪里。 一些嚴重的幫助將不勝感激! 這是我的代碼。
# Display Row n of Pascal's Triangle for k=0 to n
# usage: spim -f 90.s 4 6
.data
newline: .asciiz "\n"
space: .asciiz " "
.text
.globl main
main:
# hard coded
li $t0 6
li $t1 4
# grab command line stuff - a0 is arg count and a1 points to list of args
move $s0 $a0
move $s1 $a1
# zero out these registers just to be safe
move $s2 $zero
move $s3 $zero
move $s4 $zero
# check if less than three arguments are given
li $t3 2
blt $a0 $t3 default
bgt $a0 $t3 default
# parse the first number
lw $a0 4($s1)
jal atoi
move $s2 $v0
# parse the second number
lw $a0 8($s1)
jal atoi
move $s3 $v0
# load a0 and a1 with two integers
move $a0 $s2
move $a1 $s3
move $t0, $a0
move $t1, $a1
# swap if n < k
slt $t3 $t0 $t1
beq $t3 $0 done
move $t2 $t0
move $t0 $t1
move $t1 $t2
done:
# move the result from t0 to v0 to print it
move $a0 $t0
li $v0 1
syscall
la $a0 space
li $v0 4
syscall
move $a0 $t1
li $v0 1
syscall
la $a0 newline
li $v0 4
syscall
move $t8 $t0
jal factorial
move $a0 $t9
li $v0 1
syscall
move $s2 $t9
la $a0 space
li $v0 4
syscall
move $t8 $t1
jal factorial
move $a0 $t9
li $v0 1
syscall
move $s3 $t9
la $a0 newline
li $v0 4
syscall
move $a0 $s3
li $v0 1
syscall
la $a0 newline
li $v0 4
syscall
li $v0 10 # 10=exit
syscall
default:
move $a0 $t0
move $a1 $t1
j done
pascal:
addi $sp, $sp, -16 # create stack frame
sw $ra, 12($sp) # save return address
sw $s0, 8($sp) # save three registers
sw $s1, 4($sp)
sw $s2, 0($sp)
beq $a1, $zero, one # branch if col == 0
beq $a1, $a0, one # branch if col == row
add $s0, $a0, $zero # save argument values
add $s1, $a1, $zero
addi $a0, $a0, -1 # compute args for first recursion
addi $a1, $a1, -1
jal pascal # pascal(row-1, col-1)
add $s2, $v0, $zero # save returned value
addi $a0, $s0, -1 # compute args for second recursion
add $a1, $s1, $zero
jal pascal # pascal(row-1, col)
add $v0, $v0, $s2 # add the two values
#done:
lw $ra, 12($sp) # restore registers
lw $s0, 8($sp)
lw $s1, 4($sp)
lw $s2, 0($sp)
addi $sp, $sp, 16
jr $ra # return
one:
addi $v0, $zero, 1 # return constant 1
j done
#---------------------Factorial
factorial:
li $t9 1
fac:
beqz $t8 return
mul $t9 $t9 $t8
addi $t8 $t8 -1
j fac
return:
move $v0 $t8
jr $ra
#---------------
Cnk:
addi $sp, $sp, -32 # Stack frame is 32 bytes long
sw $ra, 20($sp) # Save return address
sw $fp, 16($sp) # Save frame pointer
addi $fp, $sp, 28 # Set up frame pointer
sw $a0, 0($fp) # Save argument (n)
lw $v0 0($fp)
bgtz $v0
# --------- ATOI FUNCTION
atoi:
move $v0, $zero
# detect sign
li $t0, 1
lbu $t1, 0($a0)
bne $t1, 45, digit
li $t0, -1
addu $a0, $a0, 1
digit:
# read character
lbu $t1, 0($a0)
# finish when non-digit encountered
bltu $t1, 48, finish
bgtu $t1, 57, finish
# translate character into digit
subu $t1, $t1, 48
# multiply the accumulator by ten
li $t2, 10
mult $v0, $t2
mflo $v0
# add digit to the accumulator
add $v0, $v0, $t1
# next character
addu $a0, $a0, 1
b digit
finish:
mult $v0, $t0
mflo $v0
jr $ra
#----------------------------------------
答案在錯誤消息中:
spim: (parser) parse error on line 174 of file 90.s
bgtz $v0
^
The following symbols are undefined:
atoi
btgz
需要一個目標,而您沒有給出目標。 找出您希望其分支到的位置並分配目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.