计算机组成学习记录-体系结构-操作数

文章介绍了计算机操作数的来源,包括寄存器、存储器和立即数,重点讲解了MIPS架构的寄存器使用、存储器地址计算以及立即数在指令中的应用,特别是通过读写指令lw、sw和addi的示例进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作数有寄存器存储器常数立即数)。
计算机并不能直接操作程序中的变量名称,变量存放在操作空间中,常数一般直接在指令自身中写出,当计算机使用时会从操作空间中或者指令自身访问并取出数据,进行处理。
在指令自身中的操作数可以直接得到,寄存器中的操作数也可以很快得到,而在存储器中的操作数访问需要一定的查找时间。

寄存器

为了能让常用操作数可以更快地访问到,大多数体系结构定义了一组容量较小的寄存器来存放这些变量,用容量较大的存储器存放不常用的数据,在性能和存储容量中达到折中。MIPS定义了一组由32个寄存器组成的寄存器集,也称寄存器文件
每个寄存器都有一个名称(如$s1)和编号(从0到31,一般$28这种格式代表编号,中间带字母代表名称),各个编号的寄存器用于固定用途。其中 $0始终为0,因为0常常用到。
其中18个寄存器存储变量: $s0 - $s7 (为保存寄存器,用于存储如a, b, c等变量,有一个特殊用途是过程调用(还未学到,不太了解)), $t0 - $t9 (为临时寄存器,保存临时变量)
例如:
a = b + c - d的汇编语言表示为:

# a = $s1, b = $s2, c = $s3, d = $s4
add $t0, $s2, $s3
sub $s1, $t0, $s4

为了简化,MIPS处理器中add指令只能有三个操作数,不能变数目,其他指令我认为也被格式严格限定。复杂程序都被转化为数目更多的简单指令来实现。

存储器

MIPS采用32位存储器地址和32位数据字长(一个字32位,有4个8位字节组成),地址和数据都用十六进制表示,采用字节寻址方式,每一个地址唯一对应一个字节,字地址都是4的倍数。
在示例中采用小端的字节寻址组织方式。
有读取字指令,写入字指令,读取字节指令,写入字节指令。

读取字指令(lw)是将存储器对应字地址的内容传入对应名称的寄存器。
lw $s1, 4($0)
这个指令的意思为把内存中第1个字的内容传入$s1寄存器。(4为字地址,指向第一个字,字的号码从0开始)
$s1所在位置的操作数为要传入的寄存器, $0所在位置的操作数为基址(也是寄存器), 1所在位置的操作数是常数,直接包含在指令中,称为偏移量,存储器对应字地址就是基址和偏移量之和。
注意字地址为4的倍数,如果基址与偏移量相加不是4的倍数则为非法指令。

写入字指令(sw)是将对应名称的寄存器的内容传入存储器对应字地址。
sw $s1, 4($0)
注意,寄存器仍为第一个操作数,像lw中的一样,虽然指令意思已经与lw相反。

读取字节指令(lb),写入字节指令(sb)类似,但存储器地址可以不是4的倍数。

疑问

这里我有些不明白的地方,在读取写入指令中存储器对应的字地址或字节地址却以寄存器为基址,可以看到所给示例中寄存器名称也是寄存器集中已有名称,偏移量也是以寄存器为基准,难道存储器和寄存器集不是分立的吗?
疑问解决了。看书看到后面,我发现并不是以寄存器作为基址,而是以寄存器中所存储的32位数作为地址,这是非常合理的一件事。

立即数

直接放在指令中的常量,由于它们可以通过指令立即被访问到,所以称作立即数。
以立即数加法指令(addi)为例:
addi $s0, $s1, 4 #a = b + 4
这里4所在位置的常数为立即数,是一个16位的数字,用补码编码,可以为正数或者负数。为了简化没有立即数减法,只有立即数加法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lcandlyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值