问题标签 [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 - 为什么 MIPS 没有像 Load Immediate 指令一样的 Store Immediate 指令?
MIPS 有一个 Load Immediate ( LI
) 伪指令,用于将 32 位立即数加载到寄存器中。但它没有 Store Immediate ( SI
) 指令来将 32 位立即数存储到内存中。有人可以解释我为什么吗?
assembly - 无法立即理解 lw 指令(Mips)
假设我想做一个lw
:
据我了解,我正在保存$s1
寄存器指向的单词($t1) + l2
(在这种情况下是立即数)。
但是偏移量不是对索引指定的行的某个块(在本例中为单词)的引用吗?如何仅使用偏移量而不使用索引进行加载?(如果我使用寄存器$t2
而不是寄存器,偏移量不会改变$t1
吗?)我想不会导致指针运算太复杂,那么它是如何工作的呢?
assembly - x86-64 AT&T 指令 movq 和 movabsq 有什么区别?
在阅读了这个堆栈溢出答案和这个文档之后,我仍然不明白和之间的movq
区别movabsq
。
我目前的理解是,在 中movabsq
,第一个操作数是 64 位立即操作数,而movq
符号扩展了 32 位立即操作数。从上面引用的第二个文件:
将立即数数据移动到 64 位寄存器可以使用
movq
指令来完成,该指令将对 32 位立即数进行符号扩展,或者movabsq
在需要完整的 64 位立即数时使用指令。
在第一个参考文献中,彼得说:
有趣的实验:
movq $0xFFFFFFFF, %rax
可能是不可编码的,因为它不能用符号扩展的 32 位立即数表示,并且需要 imm64 编码或%eax
目标编码。(编者注:这个错误的假设已在该答案的当前版本中得到修复)。
但是,当我组装/运行它时,它似乎工作正常:
$ clang file.s -o file && ./file
打印0xffffffff
。(这同样适用于较大的值,例如,如果您添加几个额外的“F”)。movabsq
生成相同的输出。
Clang 是在推断我想要什么吗?movabsq
如果是的话,还有好处movq
吗?
我错过了什么?
mips - lui 指令中的立即数范围
我不确定立即lui
指令的范围是多少。
当我组装时:
它成功地没有错误。
然而,
通知 -32768 超出范围。
binary - 如何在 MIPS 机器代码中将负数转换/编码为立即数
我想将此指令更改为二进制或机器码:
addi $s3, $s1, -1000
.
我知道如何对操作码、rs
和进行编码rt
,但我不知道如何转换-1000
为二进制。
我知道如何获得 1 的补码和 2 的补码。但我不知道如何在这个 I type 指令中表达它。
我只是不知道如何将 -1000 表示为二进制数的最后 16 位。
因为 1000(十进制)是 16 位的 0000001111101000。
所以整个指令的答案是
这是正确的吗?
mips - MIPS 中的“立即扩展到 32 位”是什么意思?
我正在阅读 MIPS 数据路径中的指令解码 (ID) 阶段,我得到以下引用:“一旦知道操作数,就读取实际数据(从寄存器)或将数据扩展到 32 位(立即数) 。”
有人可以解释“将数据扩展到 32 位(立即数)”部分是什么意思吗?我知道寄存器都包含 32 位,而且我知道立即数是什么。我只是不明白为什么需要将立即数从 26 位扩展到 32 位。
谢谢!
assembly - x86_64 Cannot add 64 bit value to rax, "operand mismatch on 'add'"
I am trying to assemble some 64-bit code and the assembling fails on the line:
with the error:
Error operand type mismatch for `add'
The first operand is a 64-bit value and the latter a register which should assemble fine. This instruction is preceded by a .code64
pseudo-op. I am assembling with
As for the assembler itself, when called with --version
it returns:
assembly - 如果在有符号数运算之前立即数超出范围怎么办
我的一项家庭作业如下:
当我第一次看到它时,我以为正数减去正数的结果不会溢出。我刚刚使 OF 等于 0。
但是我的汇编代码显示 OF = 1。
我正在使用 MASM6.15,32 位控制台环境
这是我的代码和输出:
代码 1:
输出 1:
代码 2:
输出 2:
代码 3:
输出 3:
在 'Code 1:' 我期望 OF=0 和 CF=1
在 'Code 2:' 我期望 CF=1
'Code 3:' 它的输出是正确的
有人能告诉我为什么会这样吗?如果在计算机完成计算之前立即数超出范围(如“代码 1:”)怎么办。我知道无论是签名还是未签名的号码,计算机都不知道。
顺便说一句:我在这里第一次问。如果我做错了什么,如果您能指出并告诉我正确的方法,我将不胜感激。:)
c++ - GCC 似乎更喜欢比较小的直接值。有没有办法避免这种情况?
首先是一个微不足道的数学事实:给定整数n
和m
,我们有n < m
当且仅当 ,n <= m - 1
。
GCC 似乎更喜欢绝对值较小的直接值。因此,当m
已知且满足其他条件时,编译器会在等效比较表达式中选择一个最小化绝对值的表达式。例如,它n <= 1000
比n < 1001
GCC 9.2 更喜欢这个
进入这个x86
汇编代码
这可能有良好的性能原因,但这不是我的问题。我想知道的是:有没有办法强制 GCC 保持原来的比较?更具体地说,我不担心可移植性,因此 GCC 细节(选项、编译指示、属性……)对我来说是可以的。但是,我正在寻找一种constexpr
似乎排除 inline 的友好解决方案asm
。最后,我的目标是 C++17,它不包括std::is_constant_evaluated
. (话虽如此,请随意提供答案,不管我的限制如何,因为它可能对其他人仍然有用。)
你可能会问我为什么要做这样的事情。开始了。据我了解(如果我错了,请纠正我)这种行为可能是x86_64
以下示例中的“悲观”:
由 GCC 6.2 翻译成
在x86_64
中,使用 64 位立即数的计算有一些限制,可能意味着这些值要加载到寄存器中。在上面的例子中,这发生了两次:常量5000000001
和5000000000
存储在rax
乘法和比较中。如果 GCC 保留 C++ 代码中出现的原始比较(即反对5000000001
),则不需要第二个movabs
.
这也意味着代码大小的损失,我猜这被认为是一个问题,并且最新版本的 GCC(例如 9.2)产生了这个:
因此,10movabs
字节长的指令被 4 字节长的subq
指令取代。无论如何,subq
也似乎没有必要。
assembly - Objconv 建议零扩展立即数,但 movzx 不起作用
Agner Fog 的 objconv 在我的源代码反汇编中显示了几个实例,其中出现了一条消息“注意:立即操作数可以通过零扩展而变小。”
例如,它出现在这两行的正上方:
就在调用 fopen 之前。
out_fname_L 在 .data 部分中定义为:
我试过这些:
但它们都不起作用。NASM 以“操作码和操作数的无效组合”响应。内存操作数是一个 64 位地址。
我的错误是什么?
使用适用于 Ubuntu 18.04 的 NASM 汇编器进行组装。