【发布时间】:2021-10-09 08:38:12
【问题描述】:
我的 MIPS 实现,遍历字符串: 我不断得到:
- PC=0x10010010 发生异常
- 文本读取地址错误:0x10010010
不知道为什么会这样,我尝试调试和单步执行。如果有人确切知道此代码中有什么问题,请回答。我正在继续尝试调试..
是的,这是整个代码,请随意在 QtSpim 中运行它。
.data
STR_str:
.asciiz "Cow, Bird, Beer"
.text
loop_over_strings:
addi $sp, $sp, -4
sw $ra, 0($sp)
sw $a1, 8($sp)
loop:
sw $a0, 4($sp)
lb $t0, 0($a0)
beqz $t0, end_loop
jalr $a1
lw $a0, 4($sp)
lw $a1, 8($sp)
addi $a0, $a0, 1
j loop
end_loop:
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
.text
.globl main
main:
addi $sp, $sp, -4 # PUSH return address
sw $ra, 0($sp)
la $a0, STR_str
la $a1, ascii
jal loop_over_strings
lw $ra, 0($sp) # POP return address
addi $sp, $sp, 4
jr $ra
【问题讨论】:
-
你有这个的 C 版本可以比较吗?我无法理解您可能想要做什么。
-
@ErikEidt,根据您的要求发布了 C 代码。谢谢。
-
这段 C 代码并不是一回事。名字不一样,参数不一样,C版没有函数指针,为什么汇编版有?
loop_over_strings在汇编中有 2 个参数,但我在 C 中没有看到两个参数函数(也没有一个名为loop_over_strings的函数)。 -
@ErikEidt,那是因为,我编写了一个从 MIPS 中的 main 调用的函数来分离代码。也许,我也应该在 C 中做到这一点。基本上,我试图一个接一个地遍历所有字符,并打印字符和它的原始 ASCII 代码。我正在发送到 MIPS 中的子程序
ascii函数。 -
为了您自己的清晰性(以及我们的),使 C 代码与您尝试执行的操作完全匹配。我认为,工作 C(或伪)代码对于清晰和让您的算法正常工作至关重要,因此请在汇编中完全遵循它——不要在进行汇编时进行优化或更改。如果您想要优化或其他更改,请先在 C 中进行,确保它们有效,然后按字面翻译 C。工作算法与其汇编翻译的适当分离使汇编编程变得更加容易。