我正在尝试使用MARS模拟器自己学习MIPS汇编语言.
出于教学原因,我限制自己不使用伪指令.
在尝试将某些数据的地址放入寄存器时,我遇到了一个问题,因为我无法使用la.
我尝试lui结合使用ori,就像我直接加载一个数字一样,无济于事:
.data
arr:
.byte 0xa1
.byte 0xb2
.byte 0xc3
.byte 0xd4
.byte 0xe5
.byte 0xf6
.byte 0x7a
.byte 0x8b
.byte 0x9c
.byte 0xad
.text
lui $s0, mem # <--- mars just gives me errors here :(
ori $s0, mem # ?? ...
Run Code Online (Sandbox Code Playgroud)
这是否可以使用专门的MARS,没有伪指令?怎么样?
提前致谢!
我试图提示用户输入字符串的长度,为该字符串分配空间,然后反向打印出来.
对于我的生活,我无法弄清楚为什么这不起作用..
Sample Output:
(spim) run
Please enter an integer:
7
string
(spim)
Run Code Online (Sandbox Code Playgroud)
现在"字符串"的长度应该是6对吧?+应该成为它的空终止字符7.任何人都可以找到我的方法出错的地方吗?
.data
nl: .asciiz "\n"
inputPrompt: .asciiz "Please enter an integer:\n"
theString: .space 32
theInteger: .word 1
.text
main:
la $a0, inputPrompt #load address a0 with prompt
li $v0, 4 #load system call, print string into v0
syscall
li $v0, 5 #load system call, read int into v0
syscall
sw $v0, theInteger #store saved int into $t0
li $v0, 8 #load system call, read string with mem …Run Code Online (Sandbox Code Playgroud) 我是汇编语言的新手,我对乘法感到非常困惑。
它说我使用后mult $t0, $t1结果存储在 Hi 和 Lo 中,我知道这些是特殊寄存器mult和div的特殊寄存器,但如何访问它们?
假设我在mult $t0, $t1where$t0和$t1都是 2。我如何得到结果?(4)
我针对 Valgrind 运行的 mips32 应用程序在 mmap 函数中失败。如果我单独运行它可以正常工作,但是当我针对 valgrind 运行它时,它每次都会因 EINVAL 而失败。
void * mem = (uint32_t *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, <fd>,
mmap_size);
Run Code Online (Sandbox Code Playgroud) 所以,我不知道装配是如何工作的,也不知道我在做什么.我以为我做了,但当然我错了.所以这是我的问题 - 我甚至不知道如何让用户输入一个整数,所以我可以将它存储在内存中.我也不知道我的变量是否对齐,因为我甚至不理解"对齐"究竟是什么.下面是我的汇编代码,以及显示我想要代码执行的内容的注释.请帮忙
.data
# variables here
intPrompt: .asciiz "\nPlease enter an integer.\n"
stringPrompt: .asciiz "\nPlease enter a string that is less than 36 (35 or less) characters long.\n"
charPrompt: .asciiz "\nPlease enter a single character.\n"
int: .space 4
string: .space 36
char: .byte 1
.text
.globl main
main:
# print the first prompt
li $v0, 4
la $a0, intPrompt
syscall
# allow user to enter an integer
li $v0, 5
syscall
# store the input in `int`
# don't …Run Code Online (Sandbox Code Playgroud) 我已经在几个地方阅读过此书,但并没有完全理解为什么。我理解为什么在MIPS32中所有指令必须字对齐到4个字节。
但是后来我读到堆栈帧必须是8的倍数,因为堆栈指针需要双字对齐。为什么?
我了解所附图像中的所有内容,但添加空白空间以将堆栈填充为8字节倍数的原因除外。
编辑:我在这里阅读本文的一个来源是第3页,项目符号4。另一个是过程调用示例下的Patterson和Hennessey的计算机组织与设计,第5版,附录A.6。但是,对我来说很明显,我现在误以为他们在谈论MIPS32。
我目前正在阅读 John L. Henessy 的《计算机组织与设计》建筑课程。据我了解, $sp 指向堆栈中最近分配的地址, $fp 指向堆栈的开头。为什么我们需要$fp?如果一个过程调用另一个过程,它们会如何表现?例如,当堆栈增长时,堆栈指针递减,但是 $fp 会发生什么变化?
不幸的是,我的PIC32应用程序需要OO太多,我不能继续用C语言.
你知道PIC32的任何MIPS32 C++编译器吗?
谢谢
考虑 MIPS 中的 j(jump) 指令。它在内存中能跳多远?会是32位吗?我可以解释一下吗?
我正在尝试使用跳转表为我的工作制作菜单。一切对我来说看起来都很好,但下面的代码不起作用。在“jr $s0”指令之后,mars 给了我一个错误,如下所示:
Error in : invalid program counter value: 268501840
我知道十进制地址268501840是 L1 标签的实际地址,并且代码应该位于该标签,但此时我遇到了此错误。为什么?
main:
.data
jTable: .word L0,L1,L2,L3,L4,L5,L6,default #jump table definition
msg: .asciiz "\nEnter Your Choice;\n [1] for build,\n [2] for insert,\n [3] for find,\n [4] for findMinMax,\n [5] for delete,\n [6] for print\n [0] for Exit\nYour choice:#"
.text
userInteraction:
li $v0,4 #print string
la $a0,msg #get string address
syscall
li $v0,5 #get a menu option from user(0 to 6)
syscall
move $s0,$v0 #get index in $s0 …Run Code Online (Sandbox Code Playgroud)