问题标签 [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 - 为什么我不能将 #1001 移动到手臂上的 r5 中?
我有一个 RPi4,我正在尝试在汇编中编写一些代码以循环 1000 次。当我设置较少的循环数时,代码可以正常工作,但是当我尝试将其设置为 1001 时,会gcc
说:
这是代码:
c++ - 在 intel 内部函数 (AVX) 中使用混合指令
我有一个关于 AVX_mm256_blend_pd
功能的问题。
我想优化我大量使用该_mm256_blendv_pd
功能的代码。不幸的是,这具有相当高的延迟和低吞吐量。此函数将三个__m256d
变量作为输入,其中最后一个变量表示用于从前 2 个变量中进行选择的掩码。
我发现了另一个函数 ( _mm256_blend_pd
),它采用位掩码而不是__m256d
变量作为掩码。当掩码是静态的时,我可以简单地传递一些东西,比如 0b0111
从第一个变量中获取第一个元素和第二个变量的最后 3 个元素。_mm_cmp_pd
但是在我的情况下,掩码是使用返回__m256d
变量的函数计算的。我发现我可以用来_mm256_movemask_pd
从掩码返回一个 int,但是当将它传递给函数时,_mm256_blend_pd
我得到一个错误error: the last argument must be a 4-bit immediate
。
有没有办法使用它的前 4 位传递这个整数?或者是否有另一个类似于 movemask 的功能可以让我使用_mm256_blend_pd
?或者我可以使用另一种方法来避免使用对这个用例更有效的 cmp、movemask 和 blend 吗?
assembly - 将寄存器的所有位设置为1,ORI可以这样做吗?
在 MIPS 汇编考试中,我有几个问题被标记为不正确,我想知道是否有人可以帮助我找出原因,因为我根本不明白为什么。
第一个问题:
将寄存器 $t1 的所有位设置为 1
我的回答是ori $t1, $t1, -1
另外两个问题给出了一些汇编代码,并要求“编写每个汇编程序执行的操作”。原始代码未注释。下面的评论是我的。
第一个简答题:
我对第一个简短回答问题的回答是:“将数组的所有正元素相加,并返回数组的最后一个元素”
我认为倒数第二行应该有 $t0 而不是 $t2 以便它返回它计算的总和而不是最后一个元素,但是我在考试期间向讲师询问了这个问题,他说将所有给定的代码视为正确的/有意即使我认为这是一个错误。
第二个简答题。同样,原始代码未注释。下面的评论是我的。
我对第二个简短回答问题的回答是:“返回数组中所有元素的总和”
如果有人可以帮助我弄清楚我做错了什么,或者它是否被标记为错误?
riscv - RISC-V:12 位立即数逻辑运算是否对整个寄存器进行操作?
我正在尝试为 RISC-V CPU 编写一个模拟器,但找不到我的问题的明确答案。
假设我想使用
rs1 包含 0xFFFFFFFF,立即值为 0xFFF。
ANDI 是否对完整寄存器进行操作,并仅用零填充立即数的剩余 20 位,因此 rd 中的结果将为 0x000000FFF?
还是忽略高 20 位,rd 中的结果仍然是 0xFFFFFFFF?
XORI 和 ORI 命令的问题相同。
assembly - 为什么我们不能将 64 位立即数移动到内存中?
movq
首先,我对和之间的区别有点困惑movabsq
,我的教科书说:
常规movq
指令只能具有可以表示为 32 位二进制补码的立即源操作数。然后对该值进行符号扩展以生成目标的 64 位值。该movabsq
指令可以有一个任意的 64 位立即数作为其源操作数,并且只能有一个寄存器作为目标。
我对此有两个问题。
问题 1
该movq
指令只能具有可以表示为 32 位二进制补码数的直接源操作数。
所以这意味着我们不能做
我们必须这样做:
但是为什么movq
设计为不适用于 64 位立即数,这确实违背了q
(四分字)的目的,我们需要另一个movabsq
只是为了这个目的,不是很麻烦吗?
问题2
由于目标movabsq
必须是寄存器,而不是内存,所以我们不能将 64 位立即数移动到内存中:
但有一个解决方法:
那么为什么该规则旨在使事情变得更难呢?
assembly - 在汇编中明确输入一个十进制数
我发现自己经常无法立即识别数字是十进制还是十六进制(如果十六进制数字没有前缀或字母)。例如,从上一个问题中得到一个数字0000000000400078
,但不确定它是哪个。
有没有办法在 x86_64 中显式指定带前缀的十进制数?例如:
我知道这样做movb $22, -2(%rbx)
是可行的,但是有没有办法明确地为其添加前缀/后缀,以便我们知道它是小数?
assembly - 在 MIPS 架构中如何“立即”工作?
几周前我刚开始学习 MIPS32 架构,当我阅读其中的常量时,它说我可以添加一个不在内存或寄存器中的数字!
例如这个:
如果数字应该在一个 reg 中以计算出 T 那么这个数字(这里是 4)是从哪里来的?它代表什么?我们什么时候真正使用它?
assembly - 气体中的整数溢出
我不确定这是装配问题还是气体问题。我已经完成了以下操作,以了解汇编器如何处理太大而无法在相应寄存器中编码的立即数:
并运行$ as file.s
文件给我以下警告和错误:
以下是与此相关的几个问题:
- bl : 为什么没有警告尝试添加
0xFFFF
到中bl
?它在组装后被缩短FF
,但没有警告信息。 - bx:
65535
或者0xFF FF
是最大的 16 位值,所以这是有道理的。对此有一个警告。 - ebx :
4294967295
or0xFF FF FF FF
是最大的 32 位值,所以这是有道理的。对此有一个警告。 - rbx:这对我来说是令人惊讶的部分,在溢出时这实际上会引发错误而不是警告。为什么会出现这一错误?
assembly - 如何将浮点常数移动到 FP 寄存器中?
因此,我正在使用 A64 指令集以汇编形式 ARM 进行编程。我正在使用指令 fmov d1, #31.0 将值移动到 dx 寄存器。但是,当我使用 0.0 或任何高于 31.0 的值时,它会显示错误:
那么,如何在 A64 上定义浮点常量呢?为什么我不能使用 31 以上的任何值或使用 0?如何以十六进制表示值?
另一个问题是:根据arm 的网站,它支持使用浮点寄存器作为 Bx、Hx、Sx、Dx 和 Qx(分别为 8、16、34、64 和 128 位),但我就是不能使用 Bx ,Hx 和 Qx 寄存器,它显示:
" 错误:操作数不匹配 -- `fmov b1,#1.0'"
" 错误:选择的处理器不支持 `fmov h1,#2.0"
" 错误:操作数不匹配 -- `fmov q1,#2.0'"
如何正确设置第二个操作数?