Assembly 程序集,Mips地址超出范围
我必须写一个代码来反转输入中的字符串。 我写了这篇文章,但我得到: 第38行:0x00400080处的运行时异常:地址超出范围0x00000000。 你能帮我吗? 多谢各位Assembly 程序集,Mips地址超出范围,assembly,mips,runtimeexception,Assembly,Mips,Runtimeexception,我必须写一个代码来反转输入中的字符串。 我写了这篇文章,但我得到: 第38行:0x00400080处的运行时异常:地址超出范围0x00000000。 你能帮我吗? 多谢各位 .data prompt:.asciiz"String:: " str:.space 31 out:.asciiz"Reversed string: " .text .globl main main: la $a0, prompt li $v0, 4 syscall la $a0
.data
prompt:.asciiz"String:: "
str:.space 31
out:.asciiz"Reversed string: "
.text
.globl main
main: la $a0, prompt
li $v0, 4
syscall
la $a0, str
li $a1, 31
li $v0,8
syscall
jal Reverse
la $a0, str
li $v0,4
syscall
li $v0,10
syscall
Reverse: addiu $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
move $t0, $a0 #$t0 = first pointer
jal Strlen
li $t6, 1 #counter=1
subiu $t1, $v0, 2 # $t1 = strlen - 2
addu $t2, $a0, $t1 # $t2= last pointer
div $t3, $v0, 2 # $t3 = strlen/2
Loop: bgt $t6, $t3, Return # if t6 < t3 continue, else return
lb $t4, 0($t0) # swap
lb $t5, 0($t2)
sb $t5, 0($t0)
sb $t4, 0($t2)
addiu $t6, $t6, 1 # counter++
subiu $t2, $t2, 1 # last pointer-1
addiu $t0, $t0, 1 #first pointer+1
j Loop
Return: lw $a0, 0($sp)
lw $ra, 4($sp)
addiu $sp, $sp, 8
jr $ra
#Strlen gives me the lenght of the string
Strlen: li $v0, 0
Loop2: lb $t0, 0($a0)
beq $t0, $0, Ret
addiu $a0, $a0, 1
addiu $v0, $v0, 1
j Loop2
Ret: jr $ra
.data
提示:.asciiz“字符串::”
str:.空格31
输出:.asciiz“反向字符串:”
.文本
格洛博梅因酒店
主:la$a0,提示
李$v0,4
系统调用
洛杉矶$a0街
李:1美元,31美元
李$v0,8
系统调用
日航倒转
洛杉矶$a0街
李$v0,4
系统调用
李$v0,10
系统调用
反向:加上$sp,$sp,-8
西南$ra,4($sp)
sw$a0,0($sp)
移动$t0,$a0#$t0=第一个指针
日航斯特伦
李$t6,1#计数器=1
subiu$t1,$v0,2#$t1=strlen-2
addu$t2,$a0,$t1#$t2=最后一个指针
分区$t3、$v0、2#$t3=strlen/2
循环:bgt$t6,$t3,返回#如果t6
例外情况是在函数Reverse中,在循环中,我写入:lb$t4,0($t0)Your
Strlen()
function clobberst0
,因此在Reverse()
中调用Strlen()
后,它不再包含字符串开头的地址。我明白了!非常感谢。