我正在做一些涉及MIPS
汇编的工作,并且我不断遇到这四个浮点加载/存储伪指令:l.s
, l.d
, s.s
, s.d
。我在网上找到了一些文档,发现有四个“实际”指令似乎做同样的事情:lwc1
、、、和。ldc1
swc1
sdc1
我唯一的问题是,有什么区别?据我所知,两组指令的作用完全相同。伪类是否可能只是因为它们更易于阅读而存在?
提前感谢您的任何见解。
我正在做一些涉及MIPS
汇编的工作,并且我不断遇到这四个浮点加载/存储伪指令:l.s
, l.d
, s.s
, s.d
。我在网上找到了一些文档,发现有四个“实际”指令似乎做同样的事情:lwc1
、、、和。ldc1
swc1
sdc1
我唯一的问题是,有什么区别?据我所知,两组指令的作用完全相同。伪类是否可能只是因为它们更易于阅读而存在?
提前感谢您的任何见解。
我唯一的问题是,有什么区别?据我所知,两组指令的作用完全相同。
你是对的。可能出现的唯一区别是伪指令被翻译成多个“真实”指令时。
伪类是否可能只是因为它们更易于阅读而存在?
再次,是的。这就是它们存在的原因。它们给人一种更具表现力的指令集的错觉。引用计算机组织和设计 / Patterson & Hennessy:
...汇编器还可以将机器语言指令的常见变体视为它们本身的指令。硬件不需要执行这些指令;然而,它们在汇编语言中的出现简化了翻译和编程。...
鉴于您的示例,说起来更“清楚”:
l.s $f2, 24(t1) # Load Single contained in 24(t1) to $f2
比
lwc1 $f2, 24(t1) # Load Word into Coprocessor 1 from 24(t1) to $f2
以及您可以更好地理解:
move $7, $18 # move contents of $18 to $7
比
add $7, $18, $0
对我来说,它只是通过助记符来帮助获得更好的易读代码。
其实我觉得,
LWC1 is Load Word to Co-processor 1
LDC1 is Load Double Word to Co-processor 1
ETC...
你猜怎么着,我打开了一个专利页面,试图记住这些。
美国专利 5555384 - 通过将一条冲突指令延迟到与第三条非冲突指令相同的流水线级来重新调度冲突的已发布指令
FPC 20实现了两种类型的加载指令:
LWC1(加载字协处理器1,如图4所示)和
LDC1(加载双字协处理器1,如图8所示)。LWC1 将一个 32 位字从内存子系统加载到 FPC 通用寄存器中。
LDC1 将一个 64 位双字从内存子系统加载到 FPC 通用寄存器中。
这证实了这一点。
(顺便说一句:除非您可以访问该网站,否则不要费心搜索此处提到的数字)。