我有一个类的项目,我们必须在汇编时使用sobel运算符转换图片,而且我在理解一些示例代码时遇到了一些问题。
在数据段和主要功能中,需要使功能工作的所有内容(代码有效,我只是不明白为什么)。
我不明白的是使用li
命令来更改$a
寄存器的值。
read_rgb_image:
# Place file and size in register,
move $s0, $a0 #file name
move $s1, $a1 #buffer
move $s2, $a2 #buffersize
# Open file
move $a0, $s0 # File's directory/name
li $a1, 0 #THIS LI ARE THE COMMANDS I DON'T UNDERSTAND
li $a2, 0 # Read life
li $v0, 13 # Option for opening file
syscall
# Read file
move $a0, $v0 # File descriptor
move $a1, $s1 # Buffer with result
move $a2, $s2 # Space of information to read
li $v0, 14 # Read file
syscall
# Store read buffer
move $s1, $v0
# Close file
li $v0, 16 # Close file
syscall
# Return
move $v0, $s1 # Make return
jr $ra
nop
有人可以向我解释一下吗?!
答案 0 :(得分:2)
LI指令将数值加载到寄存器中。在进行系统调用之前,需要使用分配给系统服务的编号加载$ v0寄存器。您还需要使用系统服务特定参数加载参数寄存器。如果没有文档,我们只能猜测(除了代码中的注释)为什么要将特定值加载到寄存器中。然而,这就是正在发生的事情。
我们可以猜测你正在调用open函数的4-paremeter版本,并且使用参数寄存器指定文件名,mode = 0和flags = 0。
答案 1 :(得分:1)
MIPS定义了实际上不属于其中的伪指令 指令集,但通常由程序员和编译器使用。
立即加载 li
是一个伪指令,它使用lui
和ori
指令的组合加载32位常量。
以下说明是等效的。
MIPS指令
lui $s0, 0x1234
ori $s0, 0xAA77
<强> pseudoinstruction 强>
li $s0, 0x1234AA77