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

问题描述 投票:1回答:2

我的程序应该执行以下操作: - 持续获取用户(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 ...”正是当我尝试运行我标记的行时。

assembly mips qtspim
2个回答
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
投票
.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 :) ...
© www.soinside.com 2019 - 2024. All rights reserved.