谁能帮我解释这个 mips 问题的答案?

问题描述

  1. 给定以下 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% 的代码,您只需要知道两条指令:lalw。 (您还需要了解数据:s 的位置以及地址中每次 +/- 4 个字节分别表示下一个或上一个内存字。)

la 是一条伪指令,由汇编程序扩展为两条 MIPS 指令。它代表“加载地址”并接受一个寄存器目标和一个标签,可以说它做了看起来的事情:将命名标签的地址加载到命名目标寄存器中。它还推进程序计数器,以便处理器运行的下一条指令是下一个更高内存地址中的指令。

lw 是真正的机器指令,可以在手册中查找,或者快速参考,例如这里:https://inst.eecs.berkeley.edu/~cs61c/resources/MIPS_Green_Sheet.pdf