问题标签 [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.
assembly - ARMv8 A64 程序集中的立即数范围
我的理解是 ARMv8 A64 程序集中的立即参数可以是 12 位长。如果是这样,为什么这行汇编代码:
产生此错误(使用 gcc 编译时)
有趣的是,这行汇编代码编译得很好:
我正在使用 aarch64-linux-gnu-gcc (Linaro GCC 2014.11) 4.9.3 (prerelease)
assembly - 如何知道某个数字在 ARM 中可以表示为 32 位立即数?
给定一个数字 x,我们如何判断它可以表示为 32 位立即数。是否存在任何类型的公式?如果是,该公式是否详尽无遗,即涵盖了所有可能的情况?ARM 将指令集中最右边的 12 位分解为 4 位循环位和 8 位值位。
assembly - 为什么我们要使用 addiu 而不是 addi?
在 MIPS 汇编中,使用addiu
over 有什么好处addi
?不是未addiu
签名(并且会破坏我们的计算吗?)
assembly - 在 MIPS 汇编“addi”指令中,如何解释十六进制立即数?
当使用十六进制立即值时,是否有关于如何addi
在汇编中解释指令(和其他指令)的标准或建议?
例子:
我原以为这意味着与将符号扩展到的addi $t0, $zero, -1
位置相同,就像处理器所做的那样,但令人惊讶的是,火星模拟器的汇编程序将十六进制解释为 32 位无符号数字并尝试将其作为伪-指令(如果启用了伪指令)。0xffff
0xffffffff
addi $t0, $zero, 0x0000ffff
需要明确的是,MARS 的汇编器将该addi $t0, $zero, 0xffff
伪指令汇编为多个机器指令,这些指令在寄存器中创建该常量(65535 = 0xffff),然后在启用伪指令的情况下添加它。MARS 的模拟器可以正确模拟0x2008ffff
( ) 之类的指令addi $t0, $zero, -1
。
SPIM 汇编器只是因错误而中止。
我想知道的是汇编程序是否总是以这种方式解释,以及是否在某个地方写或解释了这一点,因为我找不到任何东西。
assembly - 将 32 位值加载到 arm 程序集中的寄存器中
我想使用 arm 程序集将 1 个 32 位十六进制直接加载到寄存器中。
这不能使用,因为从这条指令我们只能加载 8 位值。所以我直接从内存中加载了 32 位值。那么如何将 32 位值存储在内存中并使用 arm 程序集将其直接加载到寄存器中呢?
我试过这段代码。
但给出以下错误。
assembly - 带有负立即常数的 MIPS 中的 andi 与 addi 指令
假设 $t2= 0x55555550
,然后执行以下指令:
$t2 变成0x0005550
MIPS 仿真器1证实了这一点
然而,这不是我所期望的。我认为答案应该是 0x55555550 & 0xFFFFFFFF = 0x55555550。我认为常数 -1 在 and 逻辑之前被符号扩展为 0xFFFFFFFF 。但似乎答案是 0x55555550 & 0x0000FFFF
为什么 -1 符号扩展为 0x0000FFFF 而不是 0xFFFFFFFF
脚注 1:编者注:启用“扩展伪指令”的 MARS 确实将其扩展为多个指令以0xffffffff
在 tmp 寄存器中生成,因此保持$t2
不变。否则,MARS 和 SPIM 都会以不可编码的错误拒绝它。其他汇编程序可能不同。
assembly - x86-64 中 movq 和 movabsq 的区别
我是这里的新手,刚开始学习汇编语言。因此,如果我错了,请纠正我,或者如果这篇文章没有任何意义,我将删除。
我说的是 x86-64 Intel 架构中的数据移动指令。我已经读过,常规movq
指令只能有可以表示为 32 位二进制补码的立即源操作数,而movabsq
指令可以有任意 64 位立即数作为其源操作数,并且只能有一个寄存器作为目标.
你能详细说明一下吗?这是否意味着我可以movabsq
仅使用指令移动 64 位立即数?并且仅从立即值到寄存器?我看不到如何将 64 位立即值移动到内存中。或者,也许我在这里弄错了一些重要的东西。
assembly - 可接受的 ARM Cortex-M4F 浮点立即数的算法?
ARM Cortex-M4F 处理器有一条指令将立即数加载到浮点寄存器中,如下所示:
但是,常数的值是有限制的,必须等于可以表示为 +/-mx 2 -n的值,其中 m 是 16-31 范围内的整数,n 是 0- 范围内的整数7. 例如,上述指令有效,因为您可以在 m=27 和 n=2 时得到 6.75。
我真的很想找到一种算法来确定是否可以用这种方式表示特定的实数,如果可以,给出 m 和 n 的相应值。
assembly - 将以下机器语言代码 (0x2237FFF1) 翻译成 MIPS 程序集
到目前为止,我已经翻译了这段代码,我不明白的是如何计算(计算)16 位立即地址的数量。
转二进制
现在我正在阅读操作码(001000)并且知道它是 I-type 和
addi
指令
现在我将二进制文件分组为 I 型指令
查看 MIPS 参考表,发现该指令必须是
我在这里是堆栈,不知道如何确定一般的 16 位立即地址的方法。