问题标签 [immediate-operand]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - Y86 架构立即数 VS 寄存器算术效率问题
我正在与 Y86 程序的计算机体系结构课程中的一个团队合作,以实现乘法函数 imul。我们有一个可以工作的代码块,但我们正在努力使其尽可能高效地执行。目前,对于 imul,我们的块看起来像这样:
现在我们最好的想法是使用立即算术指令(isubq 等)而不是普通的 OPq 指令,并将常量设置到寄存器中并使用这些寄存器。在这种特定情况下,这种方法会更有效吗?非常感谢!
assembly - 关于 MIPS I 型指令符号扩展的困惑
我正在学习 MIPS 指令,当我测试需要签署扩展立即数的 I 型指令时,我对以下结果感到困惑(它们都在 MARS 中运行):
- 假设我们有源代码行
ori $s1, $s2, 0xfd10
,MARS 给出了基本的汇编指令ori $17, $18, 0x0000fd10
。这是期望,因为零ori
应该扩展16 位立即数。如果我们只将函数更改ori
为andi
,即源代码行andi $s1, $s2, 0xfd10
,MARS 给出几乎相同的基本汇编指令andi $17, $18, 0x0000fd10
。但是,与 不同ori
的是,andi
应该使用符号扩展。所以基本的汇编指令应该是andi $17, $18, 0xfffffd10
.
andi
也应该使用零扩展!请忽略第一个问题。
slti rt, rs, imm
例如,当我尝试使用时slti $s1, $s2, 0x8000
,MARS 拒绝执行该行并且错误消息是"0x8000": operand is out of range
. 我看不出立即数超出范围的原因。如果我稍微改变一下立即数,比如说,slti $s1, $s2, 0x7fff
它会起作用,并且立即数会扩展到0x00007fff
. 我的期望是0x8000
应该扩展到0xffff8000
. 我的理解有什么问题吗?
assembly - 大会(RiscV)中的定义问题,帮助我理解
学习 RiscV 我的讲师定义了一个名为 Load Upper Immediate (lui) 的新命令,如下所示:
将立即数 imm 的下半字加载到寄存器 rt 的上半字。寄存器的低位设置为 0。
带有以下图像:
但是有几件事我无法理解:
“加载立即数的下半字”这是什么意思?我认为如果我们在 imm 中有 32 位,那么它会加载前 16 位,对吗?
图像是否正确?前半部分不应该全为零并且定义提到了吗?为什么我们有那些 0xf, 0, rt 以及 rt 是从哪里来的?
给定以下命令:
lui S0, 0x1234
它将做什么?我不知道内存中位置 1234 的值...
cpu-architecture - 直接寻址方式的指令格式
假设一台计算机具有 16 位内存和 16 位数据和地址总线。因此,如果指令是 16 位的,假设操作码占用 6 位,操作数占用剩余的 10 位。在直接寻址方式中,操作数的内存地址在指令本身中指定。那么如何在 10 位指令操作数中指定 16 位内存位置。地址是否以某种方式编码或一条指令存储在多个内存位置?对不起,如果我的问题看起来有点愚蠢。
assembly - 设置小于立即无符号:可表示整数的范围 - MIPS
我目前正在写一篇关于机器语言和 MIPS 的研讨会论文,在研究小于立即无符号指令集时,我发现了一些我不理解的奇怪东西。
MIPS v5 文档(p. 277) 指出 16 位立即数在与寄存器 rs 的内容比较之前是符号扩展的,但被视为无符号数。这意味着,他们还在文档中指出,您可以表示 32 位无符号整数的下部和无符号整数的上部,两者之间有很大的差距。这是有道理的,因为您的立即数要么前面有 16 个零,要么是 16 个。
现在我不太明白的是他们作为示例提供的数字:他们说可表示的无符号整数的上下部分各有 32,767 大,这是 15 位可表示的最高数字。但是它们不应该是 65,535(最大的 16 位可表示数字),因为整数是无符号的,因此 MSB 不用作符号位吗?
assembly - 立即加载的 MIPS 流水线阶段
我了解 MIPS 中的指令有 5 个标准阶段。对于以下伪指令
谁能确认这是否使用了所有 5 个阶段?我认为这是一个基础,addi
但我真的不明白它是否需要使用 MEM 阶段?
我的想法是立即值存储在指令中,而不是内存中,所以 WB 阶段不会加载寄存器吗?
assembly - 在 ARM 机器码中,SUB SP、SP、#36 中的偏移量是如何编码的?
编辑: 我关心的是 ARM 指令是如何编码的。
让我们看看下面的例子:
assembly - 为什么当我将 qword 直接存储到堆栈时 NASM 会发出警告?
在 NASM 中,当使用 dwords 时,我可以写mov dword [rbp-16], 2147483647
而不是mov eax, 2147483647
后跟mov dword [rbp-16], eax
.
但是对于qwords,情况并非如此。如果我写mov qword [rbp-16], 2147483648
而不是mov rax, 2147483648
后跟mov qword [rbp-16], rax
,它会给我这个警告:
为什么会这样?
assembly - ARM 处理器:检查立即值的有效性(位循环)
在具有 32 位指令大小的 ARM 处理器中,我知道 ARM 可以使用 8 位存储值和 4 位用于位旋转指令(将 8 位值移位 2 的倍数)以获得比直接值的简单 8/12 位表示要好得多。
虽然我了解 ARM 如何获得扩展范围的过程,但我很想知道是否有一种方法可以轻松检查我们选择的立即值在此方案下是否有效。我们正在寻找什么样的数字特征(无论是二进制还是十六进制),可以帮助我们确定这个值在 ARM 的位循环方案下是否有效?
编辑:这是我正在谈论的概念的链接。