- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在组装以下汇编器:
.syntax unified
.cpu cortex-m4
.thumb
.section .text
orr r1, #12800
orr r1, #12801
本质上,只是两个 OR 指令。如果我用 objdump
查看结果,我得到:
bla.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <.text>:
0: f441 5148 orr.w r1, r1, #12800 ; 0x3200
4: f243 2101 movw r1, #12801 ; 0x3201
第二个OR悄然变成了MOVW!汇编程序运行如下:arm-none-eabi-gcc -g -Wall -c bla.s
并且它没有显示任何警告。
as
的版本是 GNU assembler version 2.29.51 (arm-none-eabi) using BFD version (GNU Tools for Arm Embedded Processors 7-2017-q4-major) 2.29.51.20171128
,在 OSX 上运行。
知道为什么第二个 OR 变成了 MOV 吗?
最佳答案
.syntax unified
.cpu cortex-m4
.thumb
.section .text
orr r1, #12800
orr r1, #12801
arm-none-eabi-as --versionGNU 汇编器 (GNU Binutils) 2.29.1版权所有 (C) 2017 自由软件基金会, Inc.该程序是免费软件;您可以根据以下条款重新分发它GNU 通用公共(public)许可证版本 3 或更高版本。该程序绝对没有任何保证。该汇编器配置为“arm-none-eabi”目标。
构建
arm-none-eabi-as so.s -o so.o
arm-none-eabi-objdump -D so.o
so.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <.text>:
0: f441 5148 orr.w r1, r1, #12800 ; 0x3200
4: f243 2101 movw r1, #12801 ; 0x3201
Jester 在评论中给出了答案,你应该投票。
2.30 几天前刚刚发布。它也会产生相同的结果。
追溯起来,问题是从 2.27.1 到 2.28 之间开始的。该版本的 tc-arm.c 更改与添加了 armv8m 相关。 (Cortex-m23 和 cortex-m33)
这是气体中的错误
/* MOV accepts both Thumb2 modified immediate (T2 encoding) and
UINT16 (T3 encoding), MOVW only accepts UINT16. When
disassembling, MOV is preferred when there is no encoding
overlap.
NOTE: MOV is using ORR opcode under Thumb 2 mode. */
if (((newval >> T2_DATA_OP_SHIFT) & 0xf) == T2_OPCODE_ORR
&& ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2_v8m)
&& !((newval >> T2_SBIT_SHIFT) & 0x1)
&& value >= 0 && value <=0xffff)
{
/* Toggle bit[25] to change encoding from T2 to T3. */
newval ^= 1 << 25;
/* Clear bits[19:16]. */
newval &= 0xfff0ffff;
/* Encoding high 4bits imm. Code below will encode the
remaining low 12bits. */
newval |= (value & 0x0000f000) << 4;
newimm = value & 0x00000fff;
}
ARM 文档已有 10 多年的历史,没有人指出它在这些指令方面存在错误。
是的,有一个未使用的 ORR 编码用作 MOV 编码,这在指令集设计中很典型,并不罕见。无论如何,形状,或这是否意味着 MOV 是 ORR。此外,一旦错误地认为 MOV 是 ORR,就会选择其他 MOV 编码。我无语。
更糟糕的是,这种情况在发布的 Gas 版本中已经存在了近一年了。这怎么可能?
之所以可能,部分原因在于 GCC 更清楚地将其编码为两个单独的指令。
orr r1,#0x3200
orr r1,#0x0001
因此,除了 gnu 世界中明显缺乏同行评审之外,要发现这一点,就需要人类尝试这一点。 ARM 立即编码规则比拇指规则更容易记住。人们总是在与立即数作斗争,这是 RISC 指令集的野兽本质。现在应该有人已经做到了这一点,现在已经有人做到了。
尝试硬件 cortex-m7
测试.s
.cpu cortex-m7
.syntax unified
.thumb
.thumb_func
.globl test1
test1:
orr r0,#0x3200
bx lr
.thumb_func
.globl test2
test2:
orr r0,#0x3201
bx lr
运行并打印结果
hexstring(test1(0x0000));
hexstring(test2(0x0000));
hexstring(test1(0x00FE));
hexstring(test2(0x00FE));
天然气
arm-none-eabi-as --version
GNU assembler (GNU Binutils) 2.30
结果
0800005c <test1>:
800005c: f440 5048 orr.w r0, r0, #12800 ; 0x3200
8000060: 4770 bx lr
08000062 <test2>:
8000062: f243 2001 movw r0, #12801 ; 0x3201
8000066: 4770 bx lr
输出
00003200
00003201
000032FE
00003201
MOV 是 MOV,不是 ORR。
您在 gnu 汇编器中发现了一个非常令人讨厌的错误,我建议您归档此错误。尽管这个错误非常明显,但我很好奇会发生什么。我过去曾提交过其他错误,但他们只是找借口而不是修复,并将错误保留在原处。如果您选择提交此问题,请将票证链接作为评论发布,以便我们都可以看到他们对此做了什么。
bada43421274615d0d5f629a61a60b7daa71bc15 tc-arm.c:23596 是正确的提交和位置。
关于assembly - GNU Arm 汇编器将 ORR 更改为 MOVW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48561243/
我热衷于 HL7 解析器开发,并且仍在学习 HL7。阅读了有关订单的文章,但仍然不清楚如何识别HL7订单响应消息对应的HL7订单请求。 其他信息:关于 MSH 段中的“MessageControlId
我正在尝试在 Windows 上为 gcc-linaro-arm-linux-gnueabihf-4.8-2013.11 进行可用设置。 动态链接发生了一些事情: $(CC)-gcc -o tes
我正在组装以下汇编器: .syntax unified .cpu cortex-m4 .thumb .section .text orr r1, #12800 orr r1, #12801 本质上,
做什么: ORRS R1、R3 做什么? 是否只是 R1 |= R3,可能设置 N- 或 Z 标志? 这可能是显而易见的,但我还没有找到任何描述 ORR 助记符没有操作数 2 的文档。 非常感谢您的反
我是一名优秀的程序员,十分优秀!