immediate-operand相关内容

ARM:为什么立即数只有 12 位?

这是什么意思:我只有 12 位用于立即常数,所以我可以只表示从 0 到 2^12 = 4096 的立即常数吗?操作数 2 如果是寄存器,可以有 32 位,但为什么立即数只有 12 位呢?这个数字是从哪里来的? 解决方案 由指令集定义.例如.MOV 指令编码为 31 28 |27 26 |25 |24 23 22 21 20 |19 16 |15 12 |11 0 |条件 |0 0 |我 ..

我可以将 64 位常量添加到 64 位寄存器吗?

在我的 64 位英特尔机器上,以下代码有效: mov rdi, 1 而这个看起来相当类似的会产生警告并且不起作用: add r10, 1 我应该坚持第一还是我错过了什么?这种行为似乎很尴尬. 代码 nr 2 产生的警告: 警告:有符号的双字立即超出范围 解决方案 mov r/m64, imm64 有操作码,但 add r/m64 没有操作码,imm64 在 x86-64 指 ..
发布时间:2021-12-18 09:17:27 其他开发

为什么我们不能将 64 位立即数移动到内存中?

首先我对 movq 和 movabsq 之间的区别有点困惑,我的教科书说: 常规 movq 指令只能具有可以表示为 32 位二进制补码的直接源操作数.然后对该值进行符号扩展以生成目标的 64 位值.movabsq 指令可以将任意 64 位立即数作为其源操作数,并且只能将寄存器作为目标. 我有两个问题. 问题 1 movq 指令只能有可以表示为 32 位二进制补码的立即数源操 ..

为什么我不能将#1001 移动到手臂上的 r5 中?

我有一个 RPi4,我正在尝试在汇编中编写一些代码以循环 1000 次.当我设置较少的循环数时,代码工作正常,但是当我尝试将其设置为 1001 时,gcc 说: loop.s: 汇编消息:loop.s:15: 错误:修正后的常量 (3e9) 无效 代码如下: .datams3: .asciz "%d\n".文本.global 主.extern 输出主要的:推{ip,lr}移动 r1, #0移 ..
发布时间:2021-11-17 22:33:02 其他开发

如何知道某个数字在 ARM 中可以表示为 32 位立即数?

给定一个数 x,我们怎么知道它可以表示为 32 位立即数.是否存在任何类型的公式?如果是,该公式是否详尽无遗,即涵盖所有可能的情况?ARM 将指令集中最右边的 12 位分解为 4 位循环位和 8 位值位. 解决方案 我会研究开源编译器以及它们是如何做到的... https://github.com/gcc-mirror/gcc/blob/cbca62831cb7c1c7c20d67f ..
发布时间:2021-11-17 21:59:56 其他开发

ARM:为什么立即数常量只有 12 位?

这是什么意思:我只有 12 位的立即数,所以我可以只表示 0 到 2^12 = 4096 的立即数吗?操作数 2 ,如果它是一个寄存器,可以有 32 位,但为什么立即常量只有 12 位?这个数字是从哪里来的? 解决方案 它由指令集定义.例如.MOV 指令被编码为 31 28 |27 26 |25 |24 23 22 21 20 |19 16 |15 12 |11 0 |条件 |0 0 | ..

ARM MOV 和 MVN 操作数

我正在尝试编写代码来做两件事:如果我的值在 ARM 数据处理指令中可以作为常量表示,则将 1 返回到寄存器 r2.这段代码就是这样做的(如果效率低,请提供更好的方法).但是,我也想修改它以告诉我是否需要使用 MOV 或 MVN. AREA ArmExample18b, CODE入口MOV r2, #0 ;寄存器返回值.如果=1,可表示,否则,不可表示LDR r1, TABLE1 ;我们要使用的 ..
发布时间:2021-11-17 21:48:59 其他开发

修复后常量无效?

出于某种原因,当我尝试编译这段代码时,编译器说syscall.s:72:invalid constant (0x172) after fixup: .globl _mach_msg_trap$MACH_mach_msg_trap$MACH:stmfd sp!, {r4,r7}mov r7, #370/* 这是第 72 行 */0ldmfd sp!, {r4, r7}bx lr 我不知道它为什么 ..
发布时间:2021-11-17 21:45:38 其他开发

ARM 的 MOV 指令如何以大数作为第二个操作数?

刚开始学习ARM汇编语言,不清楚如何使用MOV将立即数转入寄存器. 从ARM参考手册和我的教科书中,都说MOV指令后面的立即数范围是0-255.但是当我在自己的 PC 上使用 ADS 1.2 IDE 进行测试时,说明 MOV R2, #0xFFFFFFFF 表现良好.根据规范,数字 0xFFFFFFFF 是否超出范围? 解决方案 请记住,作为包含在 ARM 操作码中的桶形移位器的 ..

x86_64 无法将 64 位值添加到 rax,“'add' 上的操作数不匹配"

我正在尝试组装一些 64 位代码,但组装失败了: addq $0xffffff7fc0005000, %rax 错误: `add' 的错误操作数类型不匹配 第一个操作数是一个 64 位值,后者是一个应该可以正确组装的寄存器.该指令前面是 .code64 伪操作.我正在组装 x86_64-elf-as test.s -o test.o --64 至于汇编器本身,当使用 --ver ..
发布时间:2021-09-29 19:44:17 其他开发

MUL 指令不支持立即数

我已经阅读了一些教程和示例,但我无法理解 MUL 指令的工作原理.我使用 ADD 和 SUB 没有问题.很明显,这条指令将其操作数乘以寄存器中的值. 第一个操作数乘以哪个寄存器(eax、ebp、esp 等)?结果存储在哪个寄存器中,以便我可以将其移动到堆栈中?抱歉,我只是在学习 x86 汇编. 当我尝试编译这一行时... mul 9 我明白了,错误:'mul'的后缀或操作数无效.谁 ..
发布时间:2021-09-29 19:31:19 其他开发

MIPS I 指令立即域

该字段由算术和条件分支指令使用. 第一个问题是: 可以存储在立即算术指令和条件分支中的值的范围是多少? 第二个是: 如果 MIPS 处理器有 64 个寄存器,您将如何更改立即指令格式以引用这些寄存器?我将如何绘制和标记格式? 解决方案 第 1 部分: 如下图所示: I-Type 指令为立即数字段保留了 16 位.这当然意味着立即数字段可以采用 216 个 ..
发布时间:2021-06-02 22:18:46 其他开发

文字VS立即操作数

在本学期的系统软件课程中,我们正在学习组装程序和其他系统软件.在阅读本课程时,我遇到了文学主题. 文字与立即操作数之间有一个比较,即它们之间的唯一区别是文字不作为指令的一部分进行汇编,而立即操作数则作为指令的一部分. 如果可以使用立即数操作数,为什么必须使用文字?是什么让他们与众不同?换句话说,什么时候使用文字,什么时候使用立即数? 解决方案 立即操作数是可以将其编码为指令本身 ..

为什么我不能将#1001移到r5上?

我有一个RPi4,我试图在汇编中编写一些代码以循环1000次.当我设置较少的循环次数时,代码可以正常工作,但是当我尝试将其设置为1001时, gcc 说: loop.s:汇编程序消息:loop.s:15:错误:修正后无效的常数(3e9) 代码如下: .datams3:.asciz“%d \ n".文本.global主.extern printf主要的:推{ip,lr}mov r1,#0 ..
发布时间:2021-04-09 19:27:35 其他开发