作者howay0516 (小浩浩)
看板Programming
标题[问题] 有关MIPS的问题
时间Sat Oct 7 21:37:39 2006
不知道这边有没有人对这组合语言比较熟悉的
我是初学者,在写程式时遇见一些问题,希望有高手可以替我回答唷 谢谢^^
以下附题目跟code 下半部有一行指令一直会出错
希望有人可以帮我看看唷 谢谢大家这麽有耐心^^
Q:Using SPIM, write and test a program that reads in a positive integer
using the SPIM system calls. If the integer is not positive, the program should
terminate with the message “Invalid Entry”; otherwise the program should print
out the names of the digits of the integers, delimited by exactly one space. For
example, if the user entered “728,” the output would be “Seven Two Eight.”
#程式开始
.data
msg: .asciiz "Invalid Entry\n"
prompt: .asciiz "Enter a positive integer..."
# Fix the length of the elements of the "name" array
names: .asciiz "Zero "
.space 1
.asciiz "One "
.space 2
.asciiz "Two "
.space 2
.asciiz "Three "
.asciiz "Four "
.space 1
.asciiz "Five "
.space 1
.asciiz "Six "
.space 2
.asciiz "Seven "
.asciiz "Eight "
.asciiz "Nine "
.space 1
# .globl main
# .data
.align 2
digits: .space 10
.globl main
.text
# push return address
main: sw $ra,0($sp)
addi $sp,$sp,-4
# DIY1: print a prompt
la $a0, prompt # load string address into $a0 and I/O code into $v0
li $v0, 4
syscall # execute the syscall to perform input/output
# DIY2: Read an integer
li $v0, 5 # an I/O sequence to read an integer from
# the console window
syscall
move $t1, $v0 # place the value read into register $t0
# DIY3: Reject if non-positive
slt $s0,$t1,$zero
beq $s0,$zero,cont
la $a0, msg # load string address into $a0 and I/O code into $v0
li $v0, 4
syscall # execute the syscall to perform input/output
j main
# Extract digits (right to left, store in digits[0]..)
cont:
addi $a0,$zero, 10
addi $t0,$zero, 0
again: div $v0,$a0
mflo $v0 # v0 = v0 div 10
mfhi $t1 # t1 = v0 mod 10
sb $t1,digits($t0)
beq $v0, $zero, abort # leave if v0 became 0
beq $t0, $a0, abort # or if 10 digits were extracted
addi $t0, $t0,1
j again
abort: # print the digits
addi $t7, $zero, 7 #t7=7, why? In order to access the data in names.
lb $t5, digits($t0)
beq $t5, $zero, skip #skip leading zero
next:
mult $t5,$t7
mflo $t5 # offset
addi $a0, $t5, names # a0 = the Name's address
#就是上面这一行,我code丢进去SPIM编辑时,就会出错,执行结果当然也不对
#不知道是不是我观念不清楚 少写什麽?
addi $v0, $zero, 4
syscall
skip: sub $t0, $t0,1
bltz $t0, fini
lb $t5, digits($t0)
j next
# Pop the stack, return to SPIM
fini: addi $sp, $sp, 4
lw $ra, 0($sp)
jr $ra
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.161.9.166