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

Posted

技术标签:

【中文标题】MIPS,将寄存器中的值放入RAM?【英文标题】:MIPS, put values from registers into RAM? 【发布时间】:2014-02-08 20:07:55 【问题描述】:

我现在正在学习 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】:

这个错误没有什么奇怪的......但是你的代码,嗯,有点奇怪。

再次告诉我你认为这些台词在做什么?

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

【讨论】:

以上是关于MIPS,将寄存器中的值放入RAM?的主要内容,如果未能解决你的问题,请参考以下文章

MIPS 汇编中的整数问题

如何将寄存器放入 MASM 中的数组索引中?

MIPS指令学习二

keil C51中的data怎么设置成大一点的值?

循环遍历数组 MIPS 程序集

c语言中的多,多仿真之间的区别