在PC = 0x004000a8处发生异常->(之后中止)->在inst /数据提取中跟随未对齐的地址:0x1001012b

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

我正在尝试在汇编中重新创建C代码段。 C程序本质上:

  • 创建一个char数组[256]和一个指针* A初始化为NULL。

  • 然后将某些字符串的用户输入存储到char数组中

  • 同时数组的第ith个元素!= 0

  • 检查第ith个元素是否==一些已定义的char值V。

  • 如果array [i] == V->设置A =&array [i]

  • break

  • 最后检查A是否仍初始化为NULL如果不是,则为A的品脱地址和值[]]

  • 找不到其他
  • [不幸的是,当我使用Qtspim运行MIPS代码时,出现上述错误Exception at PC = 0x004000a8->(中止)->后跟inst /数据提取中的未对齐地址:0x1001012b

我感觉这与将字节值存储在数组中的方式或访问这些内存位置的方式有关,但是我无法弄清楚问题出在哪里。任何人都可以提供的任何见解将不胜感激。大家节日快乐!

下面是我的汇编代码:

# global functions aforementioned error
    .globl main 

# .text assembler directive
    .text       

# main
main:
    # register map 
    # use $t0 for i
    # use $t1 for NULL
    # use $s0 for &inputArray[i]
    # use $s1 for indexed array value
    # use $s2 for the base address inputArray
    # use $s3 for result
    # use $t2 for constCharlwr


# Prompt user for input
    la $a0, str1
    li $v0, 4
    syscall

# Get user input and store in input array

    la $a0, inputArray
    li $a1, 256
    li $v0, 8
    syscall

# set up registers
    lb $t0, i 
    lb $t1, NULL
    la $s2, inputArray
    lb $s3, result
    lb $t2, constCharlwr
    li $s0, 0
    add $s0, $s0, $s2  # s0 =  &arrayA[i]

    while:                           # while loop

        add $s0, $s0, $t0            # base address + 1 byte
        lb  $s1, 0($s0)              # load array index value into s1
        beq $s1, $t1, outsideWhile   # inputArray[i] != '\0'

        if1:
            bne  $s1, $t2, outsideIf # check if inputArray[i] == e 
            move $s3, $s1            # if true copy s1(inputArray[i] into s3(result)
            sb   $s3, result
            j outsideWhile
        outsideIf:
        addi $t0, $t0, 1
        j while

    outsideWhile:

        if2:
            beq $s3, $t1, else
            # Print results
            # Print string 2
            lw $a0, str2
            li $v0, 4
            syscall
            # Print address of result
            la $a0, result
            li $v0, 4
            syscall
            # Print next line
            lb $a0, nextline
            li $v0, 4
            syscall
            # Print string 3
            lw $a0, str3
            li $v0, 4
            syscall
            # Print result char value
            lb $a0, result
            li $v0, 4
            syscall
            # Print next line
            lb $a0, nextline
            li $v0, 4
            syscall

            j exitPrgm
        else:
            # Print No match
            lw $a0, str4
            li $v0, 4
            syscall


# Exit the program by means of syscall.

    exitPrgm:
    li $v0, 10 # Sets $v0 to "10" to select exit syscall
    syscall # Exit

# .data assembler directive
    .data

    inputArray:   .space 256
    constCharlwr: .byte  'e'
    result:       .byte  0
    NULL:         .byte  0
    i:            .byte  0

    str1:       .asciiz "Enter a word to search for letter e: \n"
    str2:       .asciiz "First match at address "
    str3:       .asciiz "The matching character is "
    str4:       .asciiz "No match found\n"
    nextline:   .asciiz "\n"   

我正在尝试在汇编中重新创建C代码段。 C程序实质上是:创建一个char数组[256]以及一个指针* A,该指针被初始化为NULL。然后将用户输入的某些字符串存储到...

arrays mips memory-address memory-alignment qtspim
1个回答
0
投票

好吧,所以我弄清楚了我的最初问题,我没有在系统调用中使用la,一旦修复,我就开始获得想要的输出。现在唯一的问题是我可以弄清楚如何打印结果的实际地址。有人可以帮我弄这个吗。新代码,尝试一些不同的操作来获取内存地址,但似乎无济于事。

© www.soinside.com 2019 - 2024. All rights reserved.