Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays PC=0x004000a8时发生异常->;(之后中止)——>;在inst/data fetch中后跟未对齐的地址:0x1001012b_Arrays_Mips_Memory Address_Memory Alignment_Qtspim - Fatal编程技术网

Arrays PC=0x004000a8时发生异常->;(之后中止)——>;在inst/data fetch中后跟未对齐的地址:0x1001012b

Arrays PC=0x004000a8时发生异常->;(之后中止)——>;在inst/data fetch中后跟未对齐的地址:0x1001012b,arrays,mips,memory-address,memory-alignment,qtspim,Arrays,Mips,Memory Address,Memory Alignment,Qtspim,我正在尝试在程序集中重新创建C代码段。C程序本质上是: 创建一个字符数组[256]以及一个初始化为NULL的指针*a 然后,用户输入的某些字符串被存储到char数组中 而数组的每个第i个元素!=0 检查它,第i个元素是==某个定义的字符值V 如果数组[i]==V->set A=&array[i] 中断 最后检查A是否仍然初始化为NULL 如果不是pint,则为A的地址和值 否则找不到 不幸的是,当我使用Qtspim运行MIPS代码时,我发现前面提到的错误异常发生在PC=0x004000a8

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

  • 创建一个字符数组[256]以及一个初始化为NULL的指针*a

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

  • 而数组的每个第i个元素!=0

  • 检查它,第i个元素是==某个定义的字符值V

  • 如果数组[i]==V->set A=&array[i]

  • 中断

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

  • 否则找不到
不幸的是,当我使用
Qtspim
运行MIPS代码时,我发现前面提到的错误异常发生在PC=0x004000a8 ->(之后中止) ->在inst/data fetch中后跟未对齐的地址: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"   

好的,我解决了我最初的问题,我没有使用la进行系统调用,一旦我修复了,我就开始得到我想要的输出。现在唯一的问题是我能想出如何打印结果的实际地址。有人能帮我吗。 新代码,尝试了一些不同的方法来获取内存地址,但似乎没有任何效果

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

    # Get user input and store in input array

    la $a0, inputArray
    li $a1, 255
    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 
            sb   $s1, result 
            j outsideWhile
        outsideIf:
        addi $t0, $t0, 1
        j while

    outsideWhile:

        if2:
            beq $s1, $t1, else
            # Print results
            # Print string 2
            la $a0, str2
            li $v0, 4
            syscall
            # Print address of result
            la $t9, result
            li $t8, 4 
            li $t0, 0 
            #for:
            #    bge $t0, $t8  outsideFor  
            #    add $t9, $t9, $t0
            #    lb $t7, 0($t9)  
            #    sb $t7, resultAddr
            #    la $a0, resultAddr
            #    li $v0, 4
            #    syscall

            #    addi $t0, $t0, 1
            #    j for
            #outsideFor:
            sb 0($t9)  resultAddr
            la $a0, resultAddr
            li $v0, 4
            syscall

            sb 1($t9)  resultAddr
            la $a0, resultAddr
            li $v0, 4
            syscall

            sb 2($t9)  resultAddr
            la $a0, resultAddr
            li $v0, 4
            syscall

            sb 3($t9)  resultAddr
            la $a0, resultAddr
            li $v0, 4
            syscall

            # Print next line
            la $a0, nextline
            li $v0, 4
            syscall
            # Print string 3
            la $a0, str3
            li $v0, 4
            syscall
            # Print result char value
            la $a0, result
            li $v0, 4
            syscall
            # Print next line
            la $a0, nextline
            li $v0, 4
            syscall

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