MIPS,将寄存器中的值放入RAM?

时间:2014-02-08 20:07:56

标签: assembly mips ram

我正在学习MIPS程序集,我想弄清楚如何将值存储到某个特定的RAM地址中,

这就是我现在所拥有的:

.global main

.text

.set noreorder

.ent main

main:
    lw $a0, 0x500
    sw $t0, 0($a0)          #set up contiguous memory
    lui $t0, 0x1122
    ori $t0, $t0, 0x3344
    lui $t1, 0x2233
    ori $t1, $t1, 0x4455
    lui $t2, 0x3344
    ori $t2 , $t2 , 0x5566
    lui $t3, 0x4455
    ori $t3 , $t3 , 0x6677
    lui $t4, 0x5566
    ori $t4 , $t4 , 0x7788
    lui $t5, 0x6677
    ori $t5 , $t5 , 0x8899
    lui $t6, 0x7788
    ori $t6 , $t6 , 0x99AA
    lui $t7, 0x8899
    ori $t7 , $t7 , 0xAABB
    lui $t8, 0x99AA
    ori $t8 , $t8 , 0xBBCC
    lui $t9, 0xAABB
    ori $t9 , $t9 , 0xCCDD
    nop
loop:
    nop
    b loop
    nop
    .end main

我想要的是设置它,以便我所做的值(0x1122 ......等)可以存储到连续的RAM位置。 我现在的代码一直给我这个奇怪的错误吗?

CORE-E0003:总线例外。未实现的RAM存储器访问,来自0x9d0000d8的指令

我正在使用MPLAB 8.92

1 个答案:

答案 0 :(得分:1)

这个错误并不奇怪......但是你的代码, 有点奇怪。

再次告诉我你认为这些线路在做什么?

lw $a0, 0x500          #set up contiguous memory
sw $t0, 0($a0)

我看到的是:

lw $a0, 0x500 # Load the *contents* of (invalid) memory address 0x00000500 into register $a0
sw $t0, 0($a0) # Store the (uninitialized) value in $t0 into the address pointed to by $a0

请注意,即使第一行有效,$ a0也不会包含0x00000500。它包含恰好存储在内存地址0x00000500的单词的值。

问题是您的代码无法访问0x00000500。据我了解,MIPS处理器有不同的模式,普通模式不允许访问该段内存。这就是为什么你会期望像“未实现的RAM内存访问”这样的错误。

我认为您可能需要回到教科书上才能找到原始问题的正确答案。但是,如果您的唯一目标就是您所说的 - “我所创造的值(0x1122 ......等)可以存储到连续的RAM位置。” - 然后这样做,不需要代码。但可能不是你想要或想要的方式......

.data
.byte 0x00
.byte 0x11
.byte 0x22
.byte 0x33
.byte 0x44
.byte 0x55
.byte 0x66
.byte 0x77
.byte 0x88
.byte 0x99
.byte 0xaa
.byte 0xbb
.byte 0xcc
.byte 0xdd
.byte 0xee
.byte 0xff