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

How to alias or rename the register in gas or avr-as?

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

.def temp=r16

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

我试过了:

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

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

    ldi temp,0xff

求求你帮忙)

#define temp r16

这就是我的做法。

但是,如果使用C预处理器指令(如#define#ifdef等),则不能直接将程序传递给as,必须调用预处理器首先.

如果你是运行as"indirectly"调用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

可以在寄存器位置使用常量

$ 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