问题标签 [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.

0 投票
1 回答
6985 浏览

assembly - 为什么 MIPS 没有像 Load Immediate 指令一样的 Store Immediate 指令?

MIPS 有一个 Load Immediate ( LI) 伪指令,用于将 32 位立即数加载到寄存器中。但它没有 Store Immediate ( SI) 指令来将 32 位立即数存储到内存中。有人可以解释我为什么吗?

0 投票
0 回答
50 浏览

assembly - 无法立即理解 lw 指令(Mips)

假设我想做一个lw

据我了解,我正在保存$s1寄存器指向的单词($t1) + l2(在这种情况下是立即数)。

但是偏移量不是对索引指定的行的某个块(在本例中为单词)的引用吗?如何仅使用偏移量而不使用索引进行加载?(如果我使用寄存器$t2而不是寄存器,偏移量不会改变$t1吗?)我想不会导致指针运算太复杂,那么它是如何工作的呢?

0 投票
1 回答
1864 浏览

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吗?

我错过了什么?

0 投票
1 回答
336 浏览

mips - lui 指令中的立即数范围

我不确定立即lui指令的范围是多少。

当我组装时:

它成功地没有错误。

然而,

通知 -32768 超出范围。

0 投票
1 回答
2302 浏览

binary - 如何在 MIPS 机器代码中将负数转换/编码为立即数

我想将此指令更改为二进制或机器码: addi $s3, $s1, -1000.

我知道如何对操作码、rs和进行编码rt,但我不知道如何转换-1000为二进制。

我知道如何获得 1 的补码和 2 的补码。但我不知道如何在这个 I type 指令中表达它。
我只是不知道如何将 -1000 表示为二进制数的最后 16 位。

因为 1000(十进制)是 16 位的 0000001111101000。

所以整个指令的答案是

这是正确的吗?

0 投票
2 回答
2493 浏览

mips - MIPS 中的“立即扩展到 32 位”是什么意思?

我正在阅读 MIPS 数据路径中的指令解码 (ID) 阶段,我得到以下引用:“一旦知道操作数,就读取实际数据(从寄存器)或将数据扩展到 32 位(立即数) 。”

有人可以解释“将数据扩展到 32 位(立即数)”部分是什么意思吗?我知道寄存器都包含 32 位,而且我知道立即数是什么。我只是不明白为什么需要将立即数从 26 位扩展到 32 位。

谢谢!

0 投票
1 回答
316 浏览

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:

0 投票
1 回答
40 浏览

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:”)怎么办。我知道无论是签名还是未签名的号码,计算机都不知道。

顺便说一句:我在这里第一次问。如果我做错了什么,如果您能指出并告诉我正确的方法,我将不胜感激。:)

0 投票
3 回答
252 浏览

c++ - GCC 似乎更喜欢比较小的直接值。有没有办法避免这种情况?

首先是一个微不足道的数学事实:给定整数nm,我们有n < m当且仅当 ,n <= m - 1

GCC 似乎更喜欢绝对值较小的直接值。因此,当m已知且满足其他条件时,编译器会在等效比较表达式中选择一个最小化绝对值的表达式。例如,它n <= 1000n < 1001GCC 9.2 更喜欢这个

进入这个x86汇编代码

这可能有良好的性能原因,但这不是我的问题。我想知道的是:有没有办法强制 GCC 保持原来的比较?更具体地说,我不担心可移植性,因此 GCC 细节(选项、编译指示、属性……)对我来说是可以的。但是,我正在寻找一种constexpr似乎排除 inline 的友好解决方案asm。最后,我的目标是 C++17,它不包括std::is_constant_evaluated. (话虽如此,请随意提供答案,不管我的限制如何,因为它可能对其他人仍然有用。)

你可能会问我为什么要做这样的事情。开始了。据我了解(如果我错了,请纠正我)这种行为可能是x86_64以下示例中的“悲观”:

由 GCC 6.2 翻译成

x86_64中,使用 64 位立即数的计算有一些限制,可能意味着这些值要加载到寄存器中。在上面的例子中,这发生了两次:常量50000000015000000000存储在rax乘法和比较中。如果 GCC 保留 C++ 代码中出现的原始比较(即反对5000000001),则不需要第二个movabs.

这也意味着代码大小的损失,我猜这被认为是一个问题,并且最新版本的 GCC(例如 9.2)产生了这个:

因此,10movabs字节长的指令被 4 字节长的subq指令取代。无论如何,subq也似乎没有必要。

0 投票
0 回答
27 浏览

assembly - Objconv 建议零扩展立即数,但 movzx 不起作用

Agner Fog 的 objconv 在我的源代码反汇编中显示了几个实例,其中出现了一条消息“注意:立即操作数可以通过零扩展而变小。”

例如,它出现在这两行的正上方:

就在调用 fopen 之前。

out_fname_L 在 .data 部分中定义为:

我试过这些:

但它们都不起作用。NASM 以“操作码和操作数的无效组合”响应。内存操作数是一个 64 位地址。

我的错误是什么?

使用适用于 Ubuntu 18.04 的 NASM 汇编器进行组装。