アセンブラで書いてて思うこと

最近、仕事しながらふと思っていることがあって、

それはこのアセンブラで書いたコード、誰がレビューするんだろうということである。


ここ最近、いろいろ事情があってアセンブラでプログラムを書くことがある。

これはマイコンの初期化処理など、アセンブラでないと記述が難しい事情がある。

サンプルコードそのままで済めば楽だけど、なかなかそうもいかなくて、

そこそこ新規の記述が必要になっている。


Cで書けるものは書いた方がよいという話もあるのだが……

前にコンパイラのバージョンを変えたら動かないという問題があって、

調べたらCで書かれたコードに変数にレジスタ割当を強制する指示(当然コンパイラの独自拡張)があって、

ところがそのレジスタの選び方が悪くて、他の処理に影響してしまう可能性があった。

以前のバージョンの生成物は偶然この問題を回避できていたのだが、

ちょっと条件が変わると影響が出たということである。


どうしてこんな記述をしていたのかというと、特定の期間にメモリアクセスが発生するのを防ぐ必要があったからなのだが、

それを実現するにはアセンブラで書いた方がよかったよねと。

コンパイラの独自拡張の仕様を改めて見るとイマイチだったんですよね。

結局この問題はアセンブラで書き直すのではなく、Cのコードにちょっとした対策を入れることで解決したのだけど。

対策内容は妥当な内容だと思うので、今後は回避し続けられるだろうけど。


話を戻って、アセンブラでコードを記述すると使用するレジスタを厳密に指定したり、

使用する命令やその順序を厳密に指定したり、いろいろメリットはある。

そこまでしないといけないコードは全体からすればごく僅かだろうけど。

ただ、記述するにはスクラッチレジスタなどの仕様を知ってなければいけない。

一本道のプログラムならまだいいけど、ループや分岐があるとより複雑である。


で、冒頭の話に戻るわけですね。

記述した本人としては問題ないと思っているし、期待通りの結果になることはデバッグで見ているけど、

それをレビューするというプロセスは果たして回るんかねと。

どうも最近そういう仕事が僕に集中している気がして、いろいろ事情はあるけど。

複数人で並走してやるほど分量の多い仕事ではないわけだし。

当然、どういう意図を持っているとかコメント含めて資料は残しているけど、

細かく命令単位でフローチャートとかは書いていないわけだし。

なかなか作りながら不安になってくるところではある。


なんかいい方法はないのかなと考えているのだけど、難しいですね。

C言語もかなりハードウェアを意識した記述が可能ではあって、

それはゆえに注意が必要ではあるが、それなりの抽象度はある。

処理順序などもvolatile修飾子で制御可能な部分はあるが、

一方で偶然に任せて作られているコードもそれなりにあるような気がする。

既存のコードの修正をしながら、これは運任せっぽいなというのはあった。

ビルド結果を確認してねというコメントを付けておいたが。