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