问题描述
- 给定以下 MIPS 汇编程序:
data
byte 2
word 9 10 17 18 20 22
word 4 8
-text
global
start
la Ss0,h
la Ssl,6 (Ss0)
la $s2,s 1w $s3,-20 (Ss2)
sub $s4,$s2,$s3
li Svo,10
syscall
(编者注:这不是图像的准确转录)
起始地址s是Ox1006000,会是什么 之后的 $s0、$s1、$s2、$s3 和 $s4 执行?
答案:
Ss0 = -30
$si = = 0x00000050
$s2 = 0x100600
Ss3 = 16 = 0x00000040
Ss4 = $s2 - S3 = Ox00004010
解决方法
汇编语言和其他语言一样,必须有办法将代码和数据放在一起来制作程序。数据存储在内存中,因此每个数据都有一个地址。代码(机器码指令)也存储在内存中,所以每条指令也有地址。在代码或数据中,汇编器按顺序布置项目。
.data
指令通知汇编器接下来是数据而不是代码。 :
后面的名称是标签。数据中的每个给定字占用 4 个字节的存储空间(一个 .byte 只占用 1 个字节)。
您是否注意到他们在问题陈述中给出了 s
的地址?这很重要。
处理器一次执行一条指令。所以它从头开始(.text
表示代码在后面)并依次执行该指令序列。标签用于参考,但不占用机器代码或数据中的空间(因此它们不会执行)。 (像 .text
这样的指令会通知汇编器,但也不会在处理器上执行。)
为了理解 80% 的代码,您只需要知道两条指令:la
和 lw
。 (您还需要了解数据:s
的位置以及地址中每次 +/- 4 个字节分别表示下一个或上一个内存字。)
la
是一条伪指令,由汇编程序扩展为两条 MIPS 指令。它代表“加载地址”并接受一个寄存器目标和一个标签,可以说它做了看起来的事情:将命名标签的地址加载到命名目标寄存器中。它还推进程序计数器,以便处理器运行的下一条指令是下一个更高内存地址中的指令。
lw
是真正的机器指令,可以在手册中查找,或者快速参考,例如这里:https://inst.eecs.berkeley.edu/~cs61c/resources/MIPS_Green_Sheet.pdf