4

(これは「GCC を使用してハンド アセンブリを最適化する」のフォローアップです)

GCC (3.3.6-m68hc1x-20060122) にインデックス付きアドレス指定を使用して命令を発行bsetおよびbclrアセンブリさせようとしましたが、使用する制約のセットが機能していないようです。

asm:_

#define bset(base, offset, mask) { \
volatile unsigned char *__base = base; \
const unsigned char __offset = offset; \
const char __mask = mask; \
asm volatile ("bset %0 %1" : "=o" (__base[__offset]) : "X" (__mask),
  "x" (__base)); }

C:

inline void spi_init()
{
  bset(_io_ports, M6811_DDRD, 0x38);
  bset(_io_ports, M6811_PORTD, 0x20);
  bset(_io_ports, M6811_SPCR, (M6811_SPE | M6811_DWOM | M6811_MSTR));
}

アセンブリ コードの結果:

spi_init:
        ldx     #_io_ports
; Begin inline assembler code
#APP
        bset _io_ports+9 #56
        bset _io_ports+8 #32
        bset _io_ports+40 #112
; End of inline assembler code
#NO_APP
        rts

今、これは本当に、本当に近いです。しかし、残念ながらそれは完全に無効です。次のように読む必要があります。

spi_init:
        ldx     #_io_ports
; Begin inline assembler code
#APP
        bset 9,x #56
        bset 8,x #32
        bset 40,x #112
; End of inline assembler code
#NO_APP
        rts

そのアセンブリ コードを出力するように GCC に指示するには、どのような制約を使用する必要がありますか?

GCC 3.3.6 拡張アセンブリ ドキュメント
GCC 3.3.6 制約ドキュメント

4

0 に答える 0