我是arm的新手,我正在尝试使用arm -linux-gnueabi-gnueabi为arm (Cortex-A9)编译代码。
我使用的唯一标志是:-mcpu=Cortex-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-gnueabi不会编译它们:
my_file.s:196:错误:错误指令` `strhlo r1,sl,r0‘
我是不是遗漏了什么?
发布于 2021-04-18 01:13:30
so.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,[sl,r0]'尝试使用gas
arm-none-eabi-gcc -mcpu=cortex-a9 so.s -o so.o
so.s: Assembler messages:
so.s:5: Error: bad instruction `strhlo r1,[sl,r0]'删除条件词和半字词
str r1,[sl,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, [sl, r0]现在添加条件
strlo r1,[sl,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, [sl, r0]汇编语言是特定于汇编语言的,而不是目标语言,所以如果我们把半字放在条件句后面,而不是之前。
strloh r1,[sl,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, [sl, r0]现在,如果你已经内联了这个或者这是拇指代码,那么让我们看看会发生什么,也许它是有效的:
.thumb
.syntax unified
strloh r1,[sl,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,[sl,r0]'所以这是一个不同的错误消息。在这一切结束之前你可能还会碰到它。
在这种情况下,arm汇编器(几十年来有许多arm的汇编语言)可能会接受strhlo,但GNU汇编程序和gcc显然不接受。同样,语言是由工具(gcc/gas)定义的,而不是目标(arm/thumb)。
从你的问题中跳出来的第一件事是gcc,cortex-a9 (意思是armv7-a),这意味着默认的拇指模式(有时很难让它生成arm代码)。诚然,您可能会使用gcc来获取GNU汇编程序,而不是直接转到gnu汇编程序,但并没有显示最小的示例(正如您可以看到的那样,一行代码就可以看出出了什么问题)。
正如评论中提到的:
.thumb
.syntax unified
strh r1,[sl,r0]
Disassembly of section .text:
00000000 <.text>:
0: f82a 1000 strh.w r1, [sl, r0]无条件指令的arm版本以0xE开头,thumb2版本以0xF开头,因此很容易确定是哪种模式...
发布于 2021-04-18 14:36:16
您使用的是哪个版本的GCC?
在旧语法中,条件代码放在指令及其加载/存储指令的后缀之间,如下所示:
ldmneia
ldreqd
strneb也许你应该尝试strloh而不是strhlo
https://stackoverflow.com/questions/67139594
复制相似问题