当我尝试在终端中交叉编译程序集文件时,我收到错误。有人可以向我解释为什么会出现这些错误吗?
这是我的汇编文件:
.text
.globl start
start:
jmp main
mboot:
.set ALIGN, 1<<0
.set MEMINFO, 1<<1
.set FLAGS, ALIGN | MEMINFO
.set MAGIC, 0x1BADB002
.set CHECKSUM, -(MAGIC + FLAGS)
.section multiboot
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM
main:
call kernel_main
cli
hlt
我在ubuntu 13.10上打开终端并输入:
avr-as kernel_start.asm -o kernel_start.o
我收到了这些错误:
kernel_start.asm: Assembler messages:
kernel_start.asm:4: Error: illegal opcode jmp for mcu avr2
kernel_start.asm:19: Error: illegal opcode call for mcu avr2
kernel_start.asm:21: Error: unknown opcode `hlt'
答案 0 :(得分:2)
HLT
不是AVR指令,这就是为未知操作码提供错误的原因。如果你想要一个无限循环的等价物,你可以写一行像end: rjmp end
。
JMP
仅适用于Xmega核心,而且不包含在通用型号avr2中。请改用RJMP
。
似乎avr2模型也不支持CALL
。请改用RCALL
。
答案 1 :(得分:1)
操作码jmp和hlt不适用于所有微控制器。确保您的微控制器可以处理这些指令,并将正确的参数传递给汇编程序。
答案 2 :(得分:0)
我想首先要意识到的是装配不是一种语言;它是每个处理器系列至少一种语言,通常更多,并且方言在顶部。您发布的代码似乎与Multiboot相关,x86专为AVR而设计,可能与PDP-10无关,后者是一系列8位微控制器。
如果我们要尝试移植模块,我们需要理解指令,因为即使指令命名相同,它们也可能带有不同的含义;一个臭名昭着的例子是{{3}} JUMP
,这意味着从不跳跃。
对于AVR,特别是由于它们的片上系统性质,您需要在使用SLEEP
暂停之前设置睡眠模式,并且无条件跳转通常会被裁减为仅相对RJMP
因为它已经可以到达整个指令存储器。具有更多内存的型号还有其他选择。
引入的引导加载程序类型通常不在AVR上使用,因为引导内存通常是闪存EEPROM,并且没有单独的引导介质。您在start
中的跳转指令将驻留在复位中断向量中,通常为地址0.许多较大的AVR芯片具有对引导加载程序的特定支持,具有简单的存储区锁定和第二组中断向量,但是由于程序存储器是非易失性的,因此引导加载程序用于固件更新,而不是正常的程序启动。