【问题标题】:relative jumps with AVR-GCC inline assembler使用 AVR-GCC 内联汇编器的相对跳转
【发布时间】:2023-03-22 14:42:01
【问题描述】:

我刚刚开始在 AVR-GCC 中试验内联汇编器。我正在研究一个宏,它将两个 8 位无符号整数相乘并将结果存储在一个 16 位无符号整数中,用于没有硬件乘法的 AVR,比使用标准 C 函数的速度更快。代码是:

#ifndef UMULTFIX_H_
#define UMULTFIX_H_

#include <inttypes.h>

#define umultfix(a,b)                   \
({                          \
uint16_t product;                   \
uint8_t multiplier = a, multiplicand = b, count = 9;\
asm volatile  (                     \
"mov %A0, %1       \n\t"                    \
"ldi %B0, 0        \n\t"                    \
"clc               \n\t"                    \
"mult: ror %B0     \n\t"                    \
"ror %A0       \n\t"                \
"dec %3        \n\t"                \
"breq end      \n\t"                \
"brcc mult     \n\t"                \
"clc           \n\t"                \
"adc  %B0, %2      \n\t"                    \
"rjmp mult     \n\t"                \
"end:          \n\t"                \
:"=&r" (product): "a" (multiplier), "a" (multiplicand), "a" (count)\
);                          \
product;                        \
})
#endif /* UMULTFIX_H_ */

问题是我只能使用这个宏一次 - 编译器不喜欢在插入宏以对不同的参数集进行乘法时重新定义“mult:”和“end:”。有没有办法解决这个问题?

【问题讨论】:

    标签: assembly avr-gcc


    【解决方案1】:

    其实,在 AVR gcc 内联汇编器中,你应该

    利用特殊模式 %=,在每个 asm 语句中替换为唯一编号

    如在 "Cookbook" 中所描述的那样。

    然后你会写这样的:

    jmp someLabel_%=
    ...
    someLabel_%=:
    ...
    

    "%=" 会自动替换为使您的标签独一无二的任意数字。

    (注意:使用以数字文字结尾的标签时可能会遇到麻烦:例如,myLabel_1%=myLabel_12%= 可能会导致冲突。)

    【讨论】:

      【解决方案2】:

      如果定义以下宏:

      #define QUOTE_(x) #x
      #define QUOTE(x) QUOTE_(x)
      

      然后您可以将行号构建到汇编器标签中:

      ...
      "mult_" QUOTE(__LINE__) ": ror %B0     \n\t" 
      ...
      

      【讨论】:

      • 好吧,不幸的是我注意到了一个问题——上面的代码可以在标签中插入一个行号,但是我该如何跳转到它呢?我尝试了类似: "brcc mult"QUOTE(LINE-4) "\n\t" 但它不起作用。也许我只需要使用程序计数器和直接偏移量而不是使用标签。
      • @Bitrex: QUOTE(__LINE__) 应该解析为正在实例化 umultfix() 宏的行号的字符串版本。因此,每次使用时,都应该是唯一的。 (显然,如果您在不同的文件中使用该宏,您可能还需要使用(__FILE__)。)
      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多