有任何想法吗?为什么我得到:运行时异常在0x00400020:取字地址未在字边界上对齐0x00000007问题行是:lw $ s1,0($ a1)#copy arg2 =数组大小
.data
.align 4 #added this, didnt work
size: .word 7
.align 4 #added this, didnt work
search: .word 30
.align 4 #added this,didnt work
array: .word 10,20,30,40,50,60,70
.align 4
.text
main:
la $a0,array #$a0 = address of array
lw $a1,size #a1 = size of array
lw $a2,search #$a2 = search key
COUNT:
lw $s0,0($a0) #copy arg1 = address array
addi $s1,$zero,7
lw $s1,0($a1) #copy arg2 = size of array
lw $s2,0($a2) #copy arg3 = …Run Code Online (Sandbox Code Playgroud) 我正试图用MIPS汇编语言使用MARS模拟器弄湿我的脚.
我现在的主要问题是如何初始化一组内存位置,以便稍后通过汇编语言指令访问它们?
例如,我想初始化地址0x1001000 - 0x10001003,其值为0x99,0x87,0x23,0x45.我认为这可以在我的汇编程序的数据声明(.data)部分完成,但我不确定语法.这可能吗?
或者,在.data部分中,如何指定将整数值存储在某个内存位置(我不在乎哪里,但我只想在某处引用它们).所以我正在寻找C等价于"int x = 20,y = 30,z = 90;" 我知道如何使用MIPS指令,但是可以在MIPS汇编程序的.data部分声明类似的内容吗?
我目前正在学习计算机组织和汇编语言课程,主要使用MIPS指令集来教授汇编语言.
我注意到教授在网上发布的许多例子都使用add或addi将值移动到$ a0参数寄存器中,用于调用打印服务,如下所示......
# store the first integer in $a0 and print
add $a0, $zero, $t0
li $v0, 1
syscall
Run Code Online (Sandbox Code Playgroud)
要么...
# store the first integer in $a0 and print
addi $a0, $t0, 0
li $v0, 1
syscall
Run Code Online (Sandbox Code Playgroud)
我也注意到一些在线的例子,其他人只是使用移动指令完成同样的事情,如下所示...
# store the first integer in $a0 and print
move $a0, $t0
li $v0, 1
syscall
Run Code Online (Sandbox Code Playgroud)
在这种情况下,使用add或addi指令优先于简单地使用move吗?如果是这样,为什么?是否存在性能差异或仅仅是品味问题?
如果某些东西存储在0x1001 0000,则下一个存储在0x1001 0004.如果我是正确的,32位架构中的存储器块各为32位.那么0x1001 0002会指向32位的后半部分吗?
有什么区别
ldw r8,0(r4)
和
mov r8, r4
加载字表示"从内存中复制"但是当从r4加载字复制时,它是从寄存器复制而不是从内存中复制吗?
我正在经历一个MIPS处理器架构.
根据本教程,它指出:没有互锁管道阶段的微处理器 http://en.wikipedia.org/wiki/MIPS_architecture
流水线操作的一个主要障碍是某些指令(如除法)需要更长的时间才能完成,因此CPU必须等待将下一条指令传递到流水线之前.
该问题的一个解决方案是使用一系列互锁,允许阶段指示它们正忙,暂停上游的其他阶段.
Hennessy的团队认为这些联锁是主要的性能障碍,因为他们必须与CPU中的所有模块进行通信,这需要时间,并且似乎限制了时钟速度.
MIPS设计的一个主要方面是将所有指令的每个子阶段(包括高速缓存访问)都安装到一个周期中,从而消除了对互锁的任何需求,并允许单周期吞吐量.
这个链接说:--- https://www.cs.tcd.ie/Jeremy.Jones/vivio/dlx/dlxtutorial.htm
issue a "stall" instruction instead of a nop instruction upon a stall
Run Code Online (Sandbox Code Playgroud)
Interlock Pipeline到底有什么缺点?
为什么路由器更喜欢采用MIPS架构的处理器?
我正在学习这门课程,而且我真的很难理解指令的.align概念.
这是一个我无法理解的例子:

我知道在数据段内部有地址,从0x10010000,0x10010020开始等.
我知道,在每个地址内,有8个内存字段,每个字段有32位.
现在,我不明白的是,var2地址0x10010010内的方式和原因是什么?str1在地址0x10010003内,因为我们保留了3位var1.
最后一点是,指令究竟.align' doing? when I tested it in Mars4, it only shifted the data into the next memory field when I used对齐3`及以上,但我并没有真正得到它.
我很抱歉,如果这是非常令人困惑的家伙,我在这里有点绝望.
我是一名 CS 学生,刚刚学习mips了课堂基础知识(Patterson & Hennessy + spim),我正在尝试找到一种mips调试解决方案,允许在调试过程中执行任意指令。
尝试使用 gdb(所以你知道为什么不建议这样做)
推荐的mips交叉编译工具链是qemuand gdb,参见mips.com 文档和相关问答。
gdb的compile code命令不支持mips-linux-gnu-gcc,据我所知,请参阅gdb 文档(“重定位目标文件”)和相关的Q/A。我得到的错误malloc,mmap和无效的内存错误(显示的东西是想错了与即席连接gdb尝试使用时执行)compile code用mips-linux-gnu-gcc,甚至过滤出硬编码的编译参数后mips-linux-gnu-gcc不承认。
实际问题
lldb有一个类似的命令expression,请参阅lldb 文档,我有兴趣lldb与qemu. 该expression命令也依赖于clang而不是gcc,但在 clang 中交叉编译相对简单(clang -target mips-linux-gnu“正常工作”)。唯一的问题是qemu-mips -g …