我正在尝试在MIPS Assembly中创建一个数组,然后将所有元素添加到一起.但是,当我尝试组装以下内容时,它说
read_array第1行位置7出错:".word"指令不能出现在文本段中汇编:操作已完成但有错误.
这是我的集会:
list: .word 3, 2, 1, 0, 1, 2
li $t0, 0x00000000 #initialize a loop counter to $t0
li $t4, 0x00000005 #last index of array
li $t3, 0x00000000 #this will hold our final sum
la $t1, list #the address of list[0] is in $t1
loop: addi $t0, $t0, 0x00000001 #index++
add $t5, $t0, $t0 #array index X2
add $t5, $t0, $t0 #array index X2 again
add $t6, $t5, $t1 #4x array index in $t6
lw $t2, 0($t6) …Run Code Online (Sandbox Code Playgroud) 我正在使用类似SPIMS或MARS的系统调用函数.
我正在读一个字符串(它可以工作,因为我可以打印出来)如下:
li $v0, 8
la $a0, string
li $a1, 256
syscall
Run Code Online (Sandbox Code Playgroud)
但是,我在访问字符串的单个字符时遇到问题.因此,如果我想访问第一个字符并打印它,我正在尝试这样做:
la $t0, string
lb $a0, ($t0)
li $v0, 4
sys call
Run Code Online (Sandbox Code Playgroud)
如果我尝试这样的事情:
la $a0, string
li $v0, 4
syscall
Run Code Online (Sandbox Code Playgroud)
这会将整个字符串打印为字符串指向整个字符串.
如果我尝试类似的东西:
la $a0, string
lb $a0, ($t0)
li $v0, 4
syscall
Run Code Online (Sandbox Code Playgroud)
它给了我一个出界的错误.我不明白为什么 - 虽然不是一个字节长的字符,这只是将字符串中的第一个字节加载到$ a0?
谢谢
在MIPS中,la指令转换为lui和ori.但是,MARS Simulator似乎根本不这样做.当我转储以下机器代码时:
.text
la $a0, array
la $a1, array_size
lw $a1, 0($a1)
.data
array: .word 0:10
array_size: .word 10
message: .asciiz "The sum of numbers in array is: "
Run Code Online (Sandbox Code Playgroud)
我明白了:
00100000000001000010000000000000
00100000000001010010000000101000
10001100101001010000000000000000
Run Code Online (Sandbox Code Playgroud)
这显然是.它倾销la为一条指令.MARS做什么?我该如何解释la为lui和ori?
谢谢,
我正在尝试编写一个程序,该程序从 .dat 文件中读取字符,这些字符对应于要在 LED 模拟器中显示的不同颜色;x = 关闭,R = 红色,等等。我的问题是,我无法弄清楚打开 .dat 文件时我做错了什么。我环顾四周并尝试了所有我能想到的,但是每次我组装和运行时,我都会在 $v0 中得到一个 -1 表示错误。这是我打开/读取/关闭文件的代码:
.data
fin: .asciiz "maze1.dat" # filename for input
buffer: .asciiz ""
.text
#open a file for writing
li $v0, 13 # system call for open file
la $a0, fin # board file name
li $a1, 0 # Open for reading
li $a2, 0
syscall # open a file (file descriptor returned in $v0)
move $s6, $v0 # save the file descriptor
#read from file
li …Run Code Online (Sandbox Code Playgroud) 我将Mars MIPS汇编程序和运行时模拟器4.5用于组装类,当您盯着屏幕看几个小时时,我发现白色背景很累。
我想将编辑器的颜色更改为较暗的色调(最好是整个窗口),例如崇高的文字或Eclipse的深色主题。
设置中没有这样的选项,因此我尝试在.jar中搜索Java代码,以查看是否存在没有运气的合理解决方案。
实际上有改变颜色的方法吗,有人尝试过吗?
我正在编写一个MIPS汇编代码,它会询问用户文件名,并会生成一些有关文件内容的统计信息.
但是,当我从头开始将文件名硬编码到一个变量中时它工作得很好,但是当我要求用户输入文件名时它不起作用.
经过一些调试,我发现程序在内存中的用户输入结束时添加了0x00 char和0x0a char(检查asciitable.com),这就是为什么它不能根据用户输入打开文件的原因.
任何人都知道如何摆脱那些额外的字符,或如何从用户获取其名称后打开文件?
这是我的完整代码(它正常工作,除了来自用户的文件名,任何人都可以自由地将它用于他/她想要的任何目的):
.data
fin: .ascii "" # filename for input
msg0: .asciiz "aaaa"
msg1: .asciiz "Please enter the input file name:"
msg2: .asciiz "Number of Uppercase Char: "
msg3: .asciiz "Number of Lowercase Char: "
msg4: .asciiz "Number of Decimal Char: "
msg5: .asciiz "Number of Words: "
nline: .asciiz "\n"
buffer: .asciiz ""
.text
#-----------------------
li $v0, 4
la $a0, msg1
syscall
li $v0, 8
la $a0, fin
li $a1, 21
syscall
jal fileRead …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用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,没有伪指令?怎么样?
提前致谢!
mips-gcc生成的MIPS汇编代码几乎(但不是完全)运行在Mars MIPS模拟器上。例如:
此外,生成的程序集还没有完全设置好,因此无法正确启动和停止(即,末尾没有sycall 10)。
这些问题似乎都可以通过简单的脚本轻松解决。但是,在我重新发明轮子之前,我想知道:(1)是否有任何gcc标志将使其中的一些问题消失?(2)是否有人知道可以修复mips-gcc输出以使其在火星上运行的现有程序?
(FWIW,我在gcc 3.3.6和4.6.1上看到相同的行为。)
addi当使用十六进制立即数时,是否有关于如何在汇编中解释指令(和其他指令)的标准或建议?
例子:
addi $t0, $zero, 0xffff
Run Code Online (Sandbox Code Playgroud)
我期待这意味着相同的addi $t0, $zero, -1地方0xffff是符号扩展到0xffffffff,如由处理器完成的,而是由一个事实,即火星模拟器解释的十六进制数为32张无符号数和尝试的汇编做惊讶addi $t0, $zero, 0x0000ffff的伪指令(如果启用了伪指令)。
需要明确的是,MARS 的汇编器将该addi $t0, $zero, 0xffff伪指令组装为多条机器指令,这些指令在寄存器中创建该常量 (65535 = 0xffff),然后在启用伪指令的情况下添加它。MARS 的模拟器可以正确模拟0x2008ffff( addi $t0, $zero, -1)等指令。
SPIM 汇编器只是因错误而中止。
我想知道的是,汇编程序是否总是以这种方式解释,以及是否有写或解释的地方,因为我找不到任何东西。
我必须确定火星模拟器是大或小端作为家庭作业,这看起来非常简单,但我有一些问题.
首先我尝试在内存中存储4个字节,内存为0,0,0,1,在内存中显示为0x01000000,因此,以相反的顺序,这似乎表示模拟器是小端,但是,当我加载4字节作为寄存器的整数,寄存器中出现的内容再次为0x01000000,据我所知,如果它是小端,将加载的是0x00000001.
此外,当使用.word 1存储4个字节时,存储的是0x00000001,此时没有字节反转.
我想知道模拟器是大端还是小端,并解释这种行为