如何在gas或avr-as中别名或重命名寄存器?

时间:2019-02-03 08:01:54

标签: assembly avr gas

例如:我需要将temp别名为r16寄存器。 在标准的atmel的编译器中,可以通过.def指令完成此操作:

.def temp=r16

但是在avr-as(gas)中它不起作用。

我尝试过这个:

    .set  temp, r16 
    #define temp r16  
    #define temp $r16

此方法不适用于寄存器,仅适用于常量。 我想这样写:

    ldi temp,0xff

请帮助)

2 个答案:

答案 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