微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

arm-linux-gnueabi-gcc 坏指令 strhlo,strhhs Cortex-A9

如何解决arm-linux-gnueabi-gcc 坏指令 strhlo,strhhs Cortex-A9

我对 arm 很陌生,我正在尝试使用 arm-linux-gnueabi-gcc 为 arm (Cortex-A9) 编译代码

我使用的唯一标志是:-mcpu=Cort​​ex-A9 --static

在我的代码中,我写了以下说明:

strhlo r1,[sl,r0]

在 shellstorm 汇编器中似乎可以正常工作: http://shell-storm.org/online/Online-Assembler-and-Disassembler/?inst=strhlo+r1%2C%5Bsl%2Cr0%5D&arch=arm&as_format=inline#assembly

但由于某种原因 arm-linux-gnueabi-gcc 不会编译它们:

my_file.s:196: 错误错误指令 `strhlo r1,r0]'

我错过了什么吗?

解决方法

所以.s

strhlo r1,[sl,r0]

尝试使用 gcc

arm-none-eabi-gcc -mcpu=cortex-a9 so.s -o so.o
so.s: Assembler messages:
so.s:5: Error: bad instruction `strhlo r1,r0]'

尝试加气

arm-none-eabi-gcc -mcpu=cortex-a9 so.s -o so.o
so.s: Assembler messages:
so.s:5: Error: bad instruction `strhlo r1,r0]'

去除条件和半字

str r1,r0]

arm-none-eabi-gcc -c -mcpu=cortex-a9 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:   e78a1000    str r1,r0]

现在添加条件

strlo r1,r0]

汇编语言特定于汇编程序而不是目标,所以如果我们将半字放在条件之后而不是之前会怎样。

strloh r1,r0]

arm-none-eabi-gcc -c -mcpu=cortex-a9 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:   318a10b0    strhcc  r1,r0]

现在,如果你内联了这个或这个是拇指代码,那么让我们看看会发生什么,也许它有效:

.thumb
.syntax unified
strloh r1,r0]

arm-none-eabi-gcc -c -mcpu=cortex-a9 so.s -o so.o
so.s: Assembler messages:
so.s:4: conditional infixes are deprecated in unified syntax
so.s:4: Error: thumb conditional instruction should be in IT block -- `strloh r1,r0]'

这是一个不同的错误信息。在这一切结束之前,您可能还会遇到这种情况。

在这种情况下,arm 汇编器(几十年来有许多来自 arm 的)可能接受 strhlo 是汇编语言,但 GNU 汇编器和 gcc 显然不接受。同样,语言是由工具(gcc/gas)而不是目标(arm/thumb)定义的。

从你的问题中跳出来的第一件事是gcc,cortex-a9(意思是armv7-a),这意味着默认情况下是拇指模式(有时很难让它生成arm代码)。当然,您可能正在使用 gcc 来获取 GNU 汇编程序,而不仅仅是直接进入 gnu 汇编程序,但是没有显示最小的示例(正如您所见,只需一行代码即可查看哪里出了问题)。>


如评论中所述:

.thumb
.syntax unified
strh r1,r0]

Disassembly of section .text:

00000000 <.text>:
   0:   f82a 1000   strh.w  r1,r0]

无条件指令的 arm 版本以 0xE 开头,thumb2 版本以 0xF 开头,便于判断是哪种模式...

,

您使用的是哪个 GCC 版本?

在旧语法中,条件代码放在指令及其加载/存储指令的后缀之间,例如:

ldmneia
ldreqd
strneb

也许你应该试试 strloh 而不是 strhlo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。