Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Assembly 错误:运行时异常。。。存储地址在字边界上未对齐_Assembly_Mips - Fatal编程技术网

Assembly 错误:运行时异常。。。存储地址在字边界上未对齐

Assembly 错误:运行时异常。。。存储地址在字边界上未对齐,assembly,mips,Assembly,Mips,我试图打印任何整数输入的二进制数字,并从最后一个索引开始将它们存储在数组中。然后我尝试从数组中打印它 .data prompt: .asciiz "Enter an int: " errorLarge: .asciiz "Error Value to large CANNOT be held in 16 bit" errorSmall: .asciiz "Error Value is to small CANNOT be held in 16 bits" # 64bytes =512

我试图打印任何整数输入的二进制数字,并从最后一个索引开始将它们存储在数组中。然后我尝试从数组中打印它

    .data

prompt: .asciiz "Enter an int: "
errorLarge: .asciiz "Error Value to large CANNOT be held in 16 bit"
errorSmall: .asciiz "Error Value is to small CANNOT be held in 16 bits"

# 64bytes =512 bits created (1 int =4 bytes):: (16 int =64 bytes)
array: .space 64

newLine: .asciiz "\n"

    .globl main
    .text

main:
    li $v0,4
    la $a0,prompt
    syscall

    li $v0,5
    syscall
    move $t0,$v0

    li $t1,32767
    li $t2,-32767

    bgt $t0,$t1,InputToGreat
    blt $t0,$t2,InputToSmall

    li $t2,2
    li $t5,64     # last memory location in array+1

    li $t7,0

    j initializer

InputToGreat:

    li $v0,4
    la $a0,errorLarge
    syscall

    j main

InputToSmall:

    li $v0,4
    la $a0,errorSmall
    syscall

    j main

finalizer:

    subi $t5,$t5,4
    sw  $t4,array($t5)

    li $t4,0

    bne $t5,$zero, finalizer

OutPut:

    lw $t6,array($t7)

    li $v0,1
    move $a0,$t6
    syscall

    addi $t7,$t7,4
    bne  $t7,252,OutPut

    li $v0,10
    syscall

initializer:

    div    $t0,$t2  # (inside house) 1) 12/2  2) 6/2   3) 3/2
    mflo   $t0  #quotient       6        3        1
    mfhi   $t4  #rem                0        0        1

    beq    $t4,1,finalizer

InputToArray:

    subi $t5,$t5,4
    sw  $t4,array($t5) #first time array+60 last location in array

    li $v0,1
    move $a0,$t4
    syscall

    j initializer

我在第99行sw$t4,数组($t5)#第一次数组+60数组中的最后一个位置上得到一个错误,该位置表示

第99行:0x004000d8处的运行时异常:存储地址未在字边界0x100100ab上对齐


由于使用
sw
存储到
array
中,
array
必须是4字节对齐的。这是mips体系结构的一个限制。同样适用于
lw

因此,改变:

array: .space 64
进入:


另外,请注意,
$t5
应该可以被4整除(测试程序运行时就是这样)

我在第99行sw$t4,array($t5)上得到一个错误#第一次数组+60数组中的最后一个位置,表示第99行:0x004000d8处的运行时异常:存储地址未在字边界上对齐0x100100abI我不是MIPS程序员,但我怀疑,在定义
数组
之前,您只需要一个
.align
(可能不是确切的措辞)指令,以确保它从4字节边界(即
.asciiz
开始,然后才能在任何对齐上结束。或者,将其移动到.data部分的顶部,此处可能保证对齐。MARS中
.align
上的背景:。请注意,它采用二次幂参数,因此您只需要
.align 2
。有关其具体工作方式的更多详细信息,请参见。请注意,
.word
具有与单词边界的隐式对齐(除非您使用
.align 0
禁用它),但
.space
没有。
    .align 4
array: .space 64