了解在程序集中打开和读取文件

时间:2017-04-30 12:51:57

标签: file assembly mips

我有一个类的项目,我们必须在汇编时使用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

有人可以向我解释一下吗?!

2 个答案:

答案 0 :(得分:2)

LI指令将数值加载到寄存器中。在进行系统调用之前,需要使用分配给系统服务的编号加载$ v0寄存器。您还需要使用系统服务特定参数加载参数寄存器。如果没有文档,我们只能猜测(除了代码中的注释)为什么要将特定值加载到寄存器中。然而,这就是正在发生的事情。

我们可以猜测你正在调用open函数的4-paremeter版本,并且使用参数寄存器指定文件名,mode = 0和flags = 0。

答案 1 :(得分:1)

MIPS定义了实际上不属于其中的伪指令 指令集,但通常由程序员和编译器使用。

立即加载 li是一个伪指令,它使用luiori指令的组合加载32位常量。

以下说明是等效的。

MIPS指令

lui $s0, 0x1234
ori $s0, 0xAA77

<强> pseudoinstruction

li $s0, 0x1234AA77