garbage following instruction -- `dmb ish'

本文介绍了在编译 Linux kernel 4.4 版本时遇到的 `garbage following instruction–`dmbish`’ 错误,并提供了解决方案。主要原因是使用的编译器存在问题,通过更换为 gcc-arm-linux-gnueabi 编译器并调整编译配置,可以成功编译内核。

编译linux kernel 4.4,报garbage following instruction – `dmb ish’

解决:

编译器问题。更换编译器即可。
sudo apt-get install gcc-arm-linux-gnueabi

编译内核时,修改编译器:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-

保存后执行make uImage。

<think> 首先,用户的问题是关于在ARM汇编文件中出现错误的解决方案。错误消息是:"garbage following instruction -- `mov SP,#0x4OOOOO2O'",出现在第286行。 错误消息的关键部分是:"garbage following instruction"。这通常意味着在指令之后有额外的无效字符或语法错误。 指令是:"mov SP,#0x4OOOOO2O"。我需要仔细检查这个指令的语法。 在ARM汇编中,mov指令用于移动数据。格式是:mov destination, source。 这里,目标是SP(堆栈指针),源是立即数#0x4OOOOO2O。 立即数应该是一个有效的数值。看看这个值:#0x4OOOOO2O。 问题在于数值的书写:#0x4OOOOO2O。这里有多个'O'字符。在十六进制表示中,数字应该是0-9和A-F(或a-f)。'O'不是有效的十六进制数字;它看起来像是字母'O'而不是零'0'。可能用户的意思是数字零。 在用户输入的字符串中是"0x4OOOOO2O",但在错误消息中是"0x4OOOOO2O"。错误消息说"0x4OOOOO2O",其中'OOOO'可能是'O'字符。 在用户的问题中是:"mov SP,#0x4OOOOO2O"。所以,很可能是数值写错了。应该是数字零,而不是字母O。 在十六进制中,数字是0-9和A-F。字母O(大写O)不是有效的;它应该被替换为数字0。 所以,正确的数值应该是类似#0x40000020或类似的。 用户写了"0x4OOOOO2O",可能是个打字错误,应该是"0x40000020"或类似的值。 错误消息指出"garbage following instruction",这可能是因为无效的字符导致汇编器无法解析数值。 解决方案是修复数值中的错误,将'O'替换为'0'。 在ARM汇编中,mov指令接受立即数,但立即数的值必须是有效的,并且可能需要符合特定的约束(例如,8位值带旋转),但那可能是另一个问题。首先解决语法错误。 此外,指令是"mov SP,#0x4OOOOO2O",SP是堆栈指针的别名,在ARM中是r13。 现在,参考用户提供的引用: 引用[1]提到了一些错误,包括"Error: garbage following instruction",这与用户的问题相关。 引用[2]是关于编译内核时设置交叉编译器的。 用户的错误发生在汇编阶段,具体是在汇编文件arm-asm.s的第286行。 我的响应需要结构化,帮助用户解决问题。 系统级指令要求: - 行内数学表达式用$...$,但这个问题没有数学,所以可能不需要。 - 独立公式用$$...$$,同样不需要。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾添加引用标识。 用户的上一个问题是关于快速排序的,但当前问题是不同的;是关于ARM汇编错误的。所以,我应该基于当前问题生成响应。 生成相关问题:在响应末尾添加相关问题。 响应结构:清晰,逐步帮助用户解决问题。 步骤: 1. 诊断错误:"garbage following instruction" 错误通常表示汇编器在指令后发现了无效字符。 2. 检查第286行的指令:"mov SP,#0x4OOOOO2O"。 3. 指出问题:数值#0x4OOOOO2O中有无效字符'O';应该使用数字'0'。 4. 建议修正:#0x40000020 或类似(取决于实际意图)。 5. 解释为什么:在十六进制中,字符必须是0-9或A-F。 6. 添加引用:因为引用[1]提到了类似错误。 可能的修正:将"#0x4OOOOO2O"改为"#0x40000020"。 但0x40000020是多少?在ARM汇编中,立即数可能有范围限制,但语法错误优先解决。 生成相关问题: 1. 如何避免ARM汇编中的常见语法错误? 2. ARM汇编中立即数的约束是什么? 3. 如何调试汇编代码错误? 使用中文回答。 最终响应结构: - 确认错误并解释原因。 - 提供具体解决方案。 - 添加引用标识。 - 生成相关问题。 </think> ### ARM汇编文件中出现“garbage following instruction”错误的解决方案 您在ARM汇编文件`arm-asm.s`的第286行遇到的错误`garbage following instruction -- \`mov SP,#0x4OOOOO2O'`是一个常见的语法错误。这个错误表示汇编器在解析指令时,发现指令后面有无效或不期望的字符(称为“垃圾字符”),导致无法正确编译。下面我将逐步解释错误原因并提供解决方案,确保问题完全解决。 #### 错误原因分析 在ARM汇编语言中: - `MOV`指令用于移动数据,格式为`MOV <destination>, <source>`。这里的目标是`SP`(堆栈指针寄存器,别名`r13`),源是一个立即数(以`#`开头的常数)。 - 立即数值必须是有效的十六进制格式:以`0x`开头,后跟数字0-9或字母A-F(不区分大小写)。 - 您的指令是`mov SP,#0x4OOOOO2O`。问题出在立即数值`#0x4OOOOO2O`: - 字符`O`(大写字母O)是无效的十六进制字符;十六进制只允许0-9和A-F。 - 这些无效字符被汇编器视为“垃圾”,因为它无法解析这个值。 - 常见原因:可能是打字错误(例如,误将数字`0`输入为字母`O`),或数值格式错误。在ARM汇编中,立即数还必须满足特定约束(如8位值可旋转),但语法错误优先于此。 引用[1]中提到了类似错误(`Error: garbage following instruction`),并指出这种错误通常在汇编阶段发生,源于指令行中的无效字符或额外空格[^1]。 #### 解决方案:修复第286行的错误 1. **修改立即数值**: - 将`#0x4OOOOO2O`中的无效字符`O`替换为数字`0`。 - 假设您的意图是设置堆栈指针为一个十六进制值(例如`0x40000020`),修正后的指令应为: ```assembly mov SP, #0x40000020 ; 注意:这里使用了数字0,而不是字母O ``` - **为什么这样修复?**: - `0x40000020`是一个有效的十六进制数(表示十进制值1073741856)。 - 在ARM汇编中,立即数如果是大值(如`0x40000020`),可能需要确保它符合“8位立即数加旋转”的约束(否则可能引发其他错误)。但首先解决语法错误,因为`garbage`错误会阻止汇编继续进行。 2. **验证数值的有效性(可选)**: - 如果`0x40000020`超出了ARM立即数的范围(例如在ARMv7中,立即数必须能用8位值加偶数位旋转表示),汇编器可能会报其他错误(如`Error: invalid constant`)。这时,您可以使用LDR伪指令: ```assembly ldr SP, =0x40000020 ; LDR加载一个32位常数到寄存器 ``` - 工具提示:使用`as`(GNU汇编器)编译时,添加`--verbose`选项可查看更多错误细节。 3. **检查其他潜在问题**: - **空格和分隔符**:确保指令后没有多余空格或字符(如`mov SP,#0x40000020` vs. `mov SP, #0x40000020`,逗号后的空格是可选的)。 - **行号定位**:打开`arm-asm.s`文件,直接跳转到第286行(在Vim中使用`:286`命令)。检查整行是否有隐藏字符(如制表符或UTF-8错误)。 - **工具链设置**:引用[2]提到,在ARM环境下需使用交叉编译器(如`arm-linux-gnueabi-gcc`)。确保您的编译命令正确,例如: ```bash arm-linux-gnueabi-as -o output.o arm-asm.s # 编译汇编文件 ``` 如果问题持续,检查Makefile或编译脚本中的`CROSS_COMPILE`设置(参见引用[2])[^2]。 #### 预防类似错误 - **编码规范**:在汇编文件中使用注释标记值来源(例如`#0x40000000 ; Base address`),避免混淆数字和字母。 - **测试工具**: - 使用`grep -n "O" arm-asm.s`搜索文件中的所有`O`字符。 - 在编译前运行汇编器模拟器(如`arm-none-eabi-as -S arm-asm.s`)捕获早期错误。 - **参考文档**:ARM官方汇编指南(如[ARM Architecture Reference Manual](https://developer.arm.com/documentation/ddi0406/b/))提供了完整语法规则。 这个错误通常能快速修复。如果您修改后仍有问题,请提供更多上下文(如完整编译命令或相关代码片段),我会进一步协助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值