在我的avr工具链上使用“as”

时间:2013-11-21 22:08:01

标签: avr

当我尝试在终端中交叉编译程序集文件时,我收到错误。有人可以向我解释为什么会出现这些错误吗?

这是我的汇编文件:

.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'

3 个答案:

答案 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芯片具有对引导加载程序的特定支持,具有简单的存储区锁定和第二组中断向量,但是由于程序存储器是非易失性的,因此引导加载程序用于固件更新,而不是正常的程序启动。