在字符串中打印 x 字符 (MIPS)

Printing the x char in a string (MIPS)

我的程序应该执行以下操作: - 从用户 (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"

我不断收到:"Exception occured at PC=0x00400034" 和 "Bad address in data stack read: 0x..." 恰好在我尝试 运行 我标记的行时。

$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
.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 :) ...