跳转到内容

SPARC 汇编/内存指令

来自维基教科书,开放的书籍,开放的世界

指令格式

[编辑 | 编辑源代码]

这是一个关于如何编写这些内存指令的简要入门。

加载指令格式

[编辑 | 编辑源代码]

内存指令从内存中加载值,或将值存储到内存中。目标地址计算为基值加上可选偏移值的总和。

例如

ld [%r4 + 10], %r5

将寄存器 %r5 加载为内存中位于 [%r4 + 10] 的值。如果 %r4 包含数字 25,则读取的内存位置将是 [25 + 10] = 35。op2 参数,与算术指令一样,可以是寄存器或立即数。这意味着以下两者都是有效的

ld [%r4 + %r3], %r5
ld [%r4 + 100], %r5

偏移值是以字节为单位的偏移量,而不是以机器字或半字为单位的偏移量。这意味着要在 32 位机器上加载连续的字,偏移量需要递增 4

ld [%r4 + 4], %r5
ld [%r4 + 8], %r6
...

此外,偏移值是可选的。如果省略偏移量,汇编程序将假定值为 0。例如

ld [%r4], %r5

将从位置 %r4 读取,没有偏移量。

存储指令格式

[编辑 | 编辑源代码]

存储指令类似于加载指令,除了操作数颠倒了。这意味着我们有以下指令格式

st rd, [rs1 + op2]

所有其他上述内容都适用。

加载指令

[编辑 | 编辑源代码]
指令
ldub

从内存中加载无符号字节到 rd。

指令
ldsb

从内存中加载带符号字节到 rd。符号扩展结果。

指令
lduh

从内存中加载无符号半字到 rd。

指令
ldsh

从内存中加载带符号半字到 rd。符号扩展结果。

指令
ld

将机器字加载到 rd。

指令
ldd

将双字加载到 2 个连续寄存器。

存储指令

[编辑 | 编辑源代码]
指令
stb

将寄存器 rd 中的字节存储到内存。

指令
sth

将寄存器 rd 中的半字存储到内存。

指令
st

将寄存器 rd 中的机器字存储到内存。

指令
std

将两个连续寄存器中的双值存储到内存。

交换指令

[编辑 | 编辑源代码]
指令
swap

执行同时加载和存储操作,它有效地交换了内存中的值与 rd 中的值。格式像加载指令,例如

swap [%r3 + 4], %r5
华夏公益教科书