例如:我需要将temp别名为r16寄存器。 在标准的atmel的编译器中,可以通过.def指令完成此操作:
.def temp=r16
但是在avr-as(gas)中它不起作用。
我尝试过这个:
.set temp, r16
#define temp r16
#define temp $r16
此方法不适用于寄存器,仅适用于常量。 我想这样写:
ldi temp,0xff
请帮助)
答案 0 :(得分:2)
#define temp r16
这就是我要做的。
但是,如果您使用C预处理程序指令(例如#define
,#ifdef
等),则不能将程序直接传递给as
,但必须先调用预处理程序。
如果通过调用as
“间接”运行gcc
,则可以使用文件扩展名.S
(大写的“ S”)代替.s
(小写的“ s”)。这告诉gcc
汇编程序文件包含预处理器指令。
或者,您可以使用gcc
命令行选项-x assembler-with-cpp
。这告诉gcc
应该忽略文件扩展名,并将文件视为.S
文件(即使文件名以.c
结尾)。
这是您拥有的三个选项:
1) gcc -o myFile.o -c myFile.S
2) gcc -o myFile.o -x assembler-with-cpp -c myFile.s
3) cpp -o temporaryFile.s myFile.s
as -o myFile.o temporaryFile.s
答案 1 :(得分:1)
一个人可以在寄存器位置使用 constant 。
$ cat t.s
.equiv temp, 16
.text
ldi r16, 0xCC
ldi temp, 0xAA
.end
$ avr-as t.s
$ avr-objdump -d a.out
a.out: формат файла elf32-avr
Дизасемблювання розділу .text:
00000000 <.text>:
0: 0c ec ldi r16, 0xCC ; 204
2: 0a ea ldi r16, 0xAA ; 170
实际上,我使用预处理器将寄存器名称重新定义为常量
#define r16 16 // and so on
所以,我可以像这样在宏中使用算术表达式
//---------------------------------- word add
.macro add_w dst:req, src:req
add \dst, \src $ adc \dst+1, \src+1
.endm