以字符串形式打印x char(MIPS)

时间:2015-09-28 09:27:47

标签: assembly mips qtspim

我的程序应该执行以下操作: - 持续获取用户(x)的整数, - 将字符打印在字符串中的x位置。 - 当用户输入0时程序退出。

.text           
.globl __start  
__start:
    li $s3,20 #string length

start:      li $v0,5 
    syscall
    move $s0,$a0 #integer now in $a0
    beq $s0,$zero,exit

    li $s1,0 #counter is 0
    la $s2,str #address of string now is $s2

loop:lbu $t1,0($s2) #choosing char of string
    addi $s1,1 #increment counter by 1
    addi $s2,1 #next char
    beq $s1,$s0,print  #is the char at the position we entered?
    j loop

print:      lbu $a0,0($t1) #<------------#
    li $v0,11
    syscall
    j start

exit:       li $v0,10
    syscall     



.data
str: .asciiz "abcdefghijklmnopqrst"

我一直得到:“在PC = 0x00400034时发生异常”和“数据堆栈中的错误地址读取:0x ...”正好在我尝试运行我标记的行时。

2 个答案:

答案 0 :(得分:3)

$t1在您执行lbu $a0,0($t1)时不包含有效地址。您在$t1中获得的内容是在退出loop循环之前从字符串中读取的最后一个字符。

我真的不知道循环的意义。你说你有一个字符串和整数X,并且你想在字符串中的偏移X处打印字符。所以,只要读完那个角色,你就完成了:

la $a1,string
addu $a1,$a1,$s0   # $a1 = &str[x].  assumes x is in $s0
lbu $a0,($a1)      # read the character
li $v0,11
syscall            # and print it

答案 1 :(得分:1)

.data
String: .space 1000
StringSize: .word  250
Msg: .asciiz "String length is: "

.text       
.globl main 
main:   
lw $a1, StringSize
la $a0, String                    # a0 points to the string
li $v0, 8
syscall

add $t2, $a0, $zero               # t2 points to the string
add $t1, $zero, $zero             # t1 holds the count
addi $t3, $zero, 10

LoopString: lb $t0, 0($t2)        # get a byte from string
beq $t0, $zero,  EndLoopString    # zero means end of string
beq $t0, $t3, Pointer             # remove newline (linefeed)
addi $t1,$t1, 1                   # increment count

Pointer:    addi $t2,$t2, 1       # move pointer one character
        j LoopString              # go round the loop again
EndLoopString:

la $a0, Msg                       # system call to print
add, $v0, $zero, 4                # out a message
syscall

add $a0, $t1, $zero               # system call to print
add, $v0, $zero, 1                # out the length worked out
syscall     

add, $v0, $zero, 10
syscall                           # good byeee :) ...