繁体   English   中英

从C Loop转换为MIPS汇编语言(错误地址错误)

[英]Converting from C Loop to MIPS assembly language (bad address error)

我正在编写一个简单的MIPS汇编代码,该代码可循环访问字符串中的字符

并找到给定子字符串的实例。

一,C代码:

for (i=0; i<length(text)-length(sub_string); i++) {

    match = TRUE

    for (j=0; j<length(sub_string); j++)
        if (text[i+j] != sub_string[j]) {
            match = False;
            break;
        }
}


这是我的MIPS代码的一部分。

.text

# a0: text
# a1: substring
# v0: count
myfunction:
    move $s0, $ra

    move $a2, $a0
    jal  strlen
    move $t1, $v1           # text_len

    move $a2, $a1
    jal  strlen
    move $t2, $v1           # substring_len

    sub  $t1, $t1, $t2      # text_len - substring_len

    li   $t0, 0             # i = 0

    j i_test



i_body:
    li $t3, 1    # match = TRUE
    li $t4, 0    # j = 0

    j j_test

i_test:
    blt $t0, $t1, i_body
    move $ra, $s0
    jr $ra



j_body:
    add $t6, $a0, $t0       # &text[i]
    add $t6, $t6, $t4       # &text[i+j]
    lb  $t6, 0($t6)         # text[i+j]

    add $t7, $a1, $t4       # &sub_string[j]
    lb  $t7, 0($t7)         # sub_string[j]

    beq $t6, $t7, j_skip    # if (text[i+j] == sub_string[j])

    # if (text[i+j] != sub_string[j])
    li  $t3, 0              # match = FALSE
    j   j_break             # break

j_test:
    blt $t4, $t2, j_body

j_skip:
    addi $t4, $t4, 1    # j++
    j    j_body

j_break:
    addi $t0, $t0, 1    # i++
    j    i_body



strlen:
    li $v1, 0           # i = 0
    b strlen_test
strlen_body:
    addi $v1, $v1, 1    # len++
strlen_test:
    add $t0, $a2, $v1           # &str[i]
    lb $t0, 0($t0)              # str[i]
    bne $t0, $0, strlen_body    # loop
    jr $ra




.globl main
main:

    la $a0, text1
    la $a1, substring1
    jal myfunction
    la $a0, text1
    jal print_string

    li  $v0, 10         # Exit
    syscall


print_string: 
          li    $v0, 4
          syscall
          la    $a0, newline
          li    $v0, 4
          syscall
          jr    $ra


.data
text1:      .asciiz "Hello, world!"
substring1: .asciiz "lo"

newline:    .asciiz "\n"


但是,当我运行这段代码时,我遇到了一个糟糕的无限循环

地址错误:


Exception occurred at PC=0x00400070                                                 
Bad address in data/stack read: 0x10021778                                                                                                                           
  Exception 7  [Bad address in data/stack read]  occurred and ignored                                                                                                    
Exception occurred at PC=0x00400078                                                                                                                                      
  Bad address in data/stack read: 0x10021786                                                                                                                             
  Exception 7  [Bad address in data/stack read]  occurred and ignored                                                                                                    
Exception occurred at PC=0x00400070                                                                                                                                      
  Bad address in data/stack read: 0x10021779                                                                                                                             
  Exception 7  [Bad address in data/stack read]  occurred and ignored                                                                                                    
Exception occurred at PC=0x00400078                                                                                                                                      
  Bad address in data/stack read: 0x10021787                                                                                                                             
  Exception 7  [Bad address in data/stack read]  occurred and ignored                                                                                                    
Exception occurred at PC=0x00400070                                                                                                                                      
  Bad address in data/stack read: 0x1002177a                                                                                                                             
  Exception 7  [Bad address in data/stack read]  occurred and ignored                                                                                                    
Exception occurred at PC=0x00400078                                                                                                                                      
  Bad address in data/stack read: 0x10021788                                                                                                                             
  Exception 7  [Bad address in data/stack read]  occurred and ignored                                                                                                    
Exception occurred at PC=0x00400070                                                                                                                                      
  Bad address in data/stack read: 0x1002177b                                                                                                                            
  Exception 7  [Bad address in data/stack read]  occurred and ignored                                                                                                    
Exception occurred at PC=0x00400078                                                                                                                                      
  Bad address in data/stack read: 0x10021789                                                                                                                             
  Exception 7  [Bad address in data/stack read]  occurred and ignored               


我意识到错误的地址错误来自第3行和第5行

j_body(加载字节指令)。 我已经初始化了字符串地址,所以我不确定为什么

发生...

这是我的问题:

  1. 为什么会出现此无限循环? (我以为我已经为i和j正确实现了for循环)

  2. 为什么我收到一个错误的地址错误?

谢谢 :)

j_test:
    blt $t4, $t2, j_body

j_skip:
    addi $t4, $t4, 1    # j++
    j    j_body

j_break:
    addi $t0, $t0, 1    # i++
    j    i_body

如果j_break的条件失败,您不应该跳到j_test吗? 立即编写此代码的方式是,即使j >= strlen(substring)也要继续执行“ j循环”的主体。

另外, j_break:之后的j i_body可能应该是j i_test (您增加了i ,所以您将要检查“ i循环”的条件是否仍然为真)。

在j_body中,您同时使用$ t7来存储str(i + j)和sub_str(j); 然后通过比较beq $ t7,$ t7,j_body来决定是否退出j_body(仅此一条指令总会始终为true,并将其变为无限循环)。 将sub_str(j)中的字节存储在$ t8中,并更改beq行以比较$ t7和$ t8。

可能还有更多; 但这肯定必须改变。 更正此问题后,建议运行,并用遇到的任何新错误更新您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM