如何将AVR GCC风格的C内联汇编转换为Rust内联汇编?

柯比生活

我想将一些最初用C ++编写的Arduino代码转换为Rust,但是这行内联汇编给我带来麻烦。

    asm volatile(
      "     lds r16, %[timer0]    \n\t" //
      #if defined(__AVR_ATmega2560__)
      "     add r16, %[toffset]   \n\t" //
      #endif
      "     subi r16, %[tsync]    \n\t" //
      "     andi r16, 7           \n\t" //
      "     call TL               \n\t" //
      "TL:                        \n\t" //
      #if defined(__AVR_ATmega2560__)
      "     pop r17               \n\t" //ATMEGA2560 has a 22bit PC!
      #endif
      "     pop r31               \n\t" //
      "     pop r30               \n\t" //
      "     adiw r30, (LW-TL-5)   \n\t" //
      "     add r30, r16          \n\t" //
      //"   adc r31, __zero_reg__ \n\t" //
      "     ijmp                  \n\t" //
      "LW:                        \n\t" //
      "     nop                   \n\t" //
      "     nop                   \n\t" //
      "     nop                   \n\t" //
      "     nop                   \n\t" //
      "     nop                   \n\t" //
      "     nop                   \n\t" //
      "     nop                   \n\t" //
      //"   nop                   \n\t" //
      "LBEND:                     \n\t" //
    :
    : [timer0] "i" (&TCNT0),
      [toffset] "i" ((uint8_t)DEJITTER_OFFSET),
      [tsync] "i" ((uint8_t)DEJITTER_SYNC)
    : "r30", "r31", "r16", "r17");

我最好的尝试是这样的:

    const TCNT0: *mut u8 = 70 as *mut u8;
    const DEJITTER_OFFSET: u8 = 1;
    const DEJITTER_SYNC: i8 = -2;

    asm!(
"     lds r16, %[timer0]
\t     subi r16, %[tsync]
\t     andi r16, 7
\t     call TL
\tTL:
\t     pop r31
\t     pop r30
\t     adiw r30, (LW-TL-5)
\t     add r30, r16
\t     ijmp
\tLW:
\t     nop
\t     nop
\t     nop
\t     nop
\t     nop
\t     nop
\t     nop
\tLBEND:
\t"
    :
    : "{timer0}"(&TCNT0),
      "{toffset}"(DEJITTER_OFFSET),
      "{tsync}"(DEJITTER_SYNC)
    : "r30", "r31", "r16": "volatile");

我仍然无法编译。我尝试编译时显示的错误是:

error: couldn't allocate input reg for constraint '{timer0}'
  --> /home/kirbylife/Proyectos/rvgax/src/lib.rs:53:9
   |
53 | /         asm!(
54 | | r"     lds r16, ${timer0}
55 | |      subi r16, ${tsync}
56 | |      andi r16, 7
...  |
77 | |       "{tsync}"(DEJITTER_SYNC)
78 | |     : "r30", "r31", "r16": "volatile");
   | |_______________________________________^

我正在使用Cargo和Rustc 1.38.0。

约瑟夫·西布尔-恢复莫妮卡

你的错误的直接含义是,有没有寄存器叫timer0toffsettsync根本原因是"{}"Rust中的语法表示约束的寄存器名称,而不是符号名称。换句话说,它对应""于GCC中的内容,而不是[]内容。我看不到使用符号名称的方法,因此请改用数字名称。而且,它使用$代替代替%约束。尝试以下方法:

    const TCNT0: *mut u8 = 70 as *mut u8;
    const DEJITTER_OFFSET: u8 = 1;
    const DEJITTER_SYNC: i8 = -2;

    asm!(
"     lds r16, $0
\t     subi r16, $2
\t     andi r16, 7
\t     call TL
\tTL:
\t     pop r31
\t     pop r30
\t     adiw r30, (LW-TL-5)
\t     add r30, r16
\t     ijmp
\tLW:
\t     nop
\t     nop
\t     nop
\t     nop
\t     nop
\t     nop
\t     nop
\tLBEND:
\t"
    :
    : "i"(&TCNT0),
      "i"(DEJITTER_OFFSET),
      "i"(DEJITTER_SYNC)
    : "r30", "r31", "r16": "volatile");

(注意:未经测试,因为我当前未安装AVR-Rust)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Visual C / C ++内联汇编代码转换为GCC等效代码

来自分类Dev

在gcc-avr中的内联汇编中,lpm rd,Z始终转换为lpm rd,Z +

来自分类Dev

将Pentium II时序代码转换为内联汇编?

来自分类Dev

将 VS 内联汇编器翻译成 GCC 内联汇编器

来自分类Dev

gcc如何知道用于内联汇编的寄存器大小?

来自分类Dev

gcc如何知道用于内联汇编的寄存器大小?

来自分类Dev

如何将 32 位字符与 32 位字符进行比较,内联汇编 C++

来自分类Dev

Armv8a NEON 内联汇编代码:如何将 16x8 位向量转换为四个 4x32 位(整数)向量?

来自分类Dev

C ++将参数传递给内联汇编器函数

来自分类Dev

将FPU与C内联汇编一起使用

来自分类Dev

如何在Linux C内联汇编中使用宏

来自分类Dev

如何在C中使用64位内联汇编?

来自分类Dev

如何在Linux C内联汇编中使用宏

来自分类Dev

avr-gcc内联汇编:跳转到带有运行时偏移量的标签

来自分类Dev

将C ++函数转换为MIPS汇编

来自分类Dev

将C数组运算转换为汇编

来自分类Dev

将double dq从汇编转换为C

来自分类Dev

如何在扩展的GCC内联汇编中将输入操作数(C寄存器变量)标记为混乱的输入?

来自分类Dev

GCC ARM如何使用内联汇编将值分配给特定的fp寄存器?

来自分类Dev

如何将Shellcode转换为可读的汇编代码/指令?

来自分类Dev

如何在FreeDOS中编写内联汇编

来自分类Dev

将GCC / ATT样式的汇编器转换为Visual Studio汇编器?

来自分类Dev

将标签移入64位寄存器-内联汇编(GCC / CLANG)

来自分类Dev

如何将这个汇编时间戳函数转换为C ++?

来自分类Dev

我如何告诉gcc我的内联汇编破坏了堆栈的一部分?

来自分类Dev

ARM GCC内联汇编

来自分类Dev

如何将委托函数转换为内联等待

来自分类Dev

如何将内联CSS转换为外部CSS?

来自分类Dev

如何将markdown转换为内联HTML?

Related 相关文章

  1. 1

    将Visual C / C ++内联汇编代码转换为GCC等效代码

  2. 2

    在gcc-avr中的内联汇编中,lpm rd,Z始终转换为lpm rd,Z +

  3. 3

    将Pentium II时序代码转换为内联汇编?

  4. 4

    将 VS 内联汇编器翻译成 GCC 内联汇编器

  5. 5

    gcc如何知道用于内联汇编的寄存器大小?

  6. 6

    gcc如何知道用于内联汇编的寄存器大小?

  7. 7

    如何将 32 位字符与 32 位字符进行比较,内联汇编 C++

  8. 8

    Armv8a NEON 内联汇编代码:如何将 16x8 位向量转换为四个 4x32 位(整数)向量?

  9. 9

    C ++将参数传递给内联汇编器函数

  10. 10

    将FPU与C内联汇编一起使用

  11. 11

    如何在Linux C内联汇编中使用宏

  12. 12

    如何在C中使用64位内联汇编?

  13. 13

    如何在Linux C内联汇编中使用宏

  14. 14

    avr-gcc内联汇编:跳转到带有运行时偏移量的标签

  15. 15

    将C ++函数转换为MIPS汇编

  16. 16

    将C数组运算转换为汇编

  17. 17

    将double dq从汇编转换为C

  18. 18

    如何在扩展的GCC内联汇编中将输入操作数(C寄存器变量)标记为混乱的输入?

  19. 19

    GCC ARM如何使用内联汇编将值分配给特定的fp寄存器?

  20. 20

    如何将Shellcode转换为可读的汇编代码/指令?

  21. 21

    如何在FreeDOS中编写内联汇编

  22. 22

    将GCC / ATT样式的汇编器转换为Visual Studio汇编器?

  23. 23

    将标签移入64位寄存器-内联汇编(GCC / CLANG)

  24. 24

    如何将这个汇编时间戳函数转换为C ++?

  25. 25

    我如何告诉gcc我的内联汇编破坏了堆栈的一部分?

  26. 26

    ARM GCC内联汇编

  27. 27

    如何将委托函数转换为内联等待

  28. 28

    如何将内联CSS转换为外部CSS?

  29. 29

    如何将markdown转换为内联HTML?

热门标签

归档