perlでAVRニモニックを機械語に変換(その1)


『アベンジャーズ』(2012)
神も含めた超人たちの中、生身の人間ホークアイが、危なっかしくてしょうがないです。でも、きっとそこが良いのでしょう。弓使いというだけで魅力的ですし。
コミックのタイトルは、『アベンジャーズ・アッセンブル』(Avengers Assemble)、「アベンジャーズ!集合せよ!」の意味で、コミック中の名セリフとなっているらしいです。しかし映画のセリフには出てきませんでした。まあいろいろあるのでしょうね。

AVRマイコンでトンボの羽根の周波数」で8ビットって面白いなあ、とAVRマイコンに興味を持ってしまったので、もう少し理解を深めていこうかと思います。理解を深めるために「Avengers Assemble」つながりで、「AVR Assemble」作っていきます。といっても、一気に作るのは大変なので、命令をひとつずつ理解しながら進めます。

ニモニックからマシン語への変換するのに、以下のデータシートを参考にしました。
http://www.atmel.com/Images/Atmel-0856-AVR-Instruction-Set-Manual.pdf

avrasm-001
上記は、ニモニックと、その機械語の構成です。このニモニックを機械語にするスクリプトを書いてみました。

~$ cat -n avr-asm.pl
     1	while(<>){
     2		if(/(?:LDI|ldi)\s+[rR](\d+),([0-9a-fxA-FX]+)/){
     3			$d=$1;
     4			$K=$2;
     5			$K=hex $K if $K =~ /x/;
     6			printf "%01X%01X%01X%01X\n"
     7				,$d-16
     8				,($K&0xf)
     9				,0xE
    10				,($K&0xf0)>>4
    11		}
    12	}
~$ 

解説です。正規表現でニモニック解析です。つまり2行目が要です。
(?:LDI|ldi)は、単純にオアです。(?:)をつけて、後方参照記憶をせずに、オアする単語を囲うだけにしています。
[rR](\d+)で、レジスタ番号を取得しています。この命令で指定できるレジスタはr16〜r31なので、$dに格納されて、機械語にするときに、16を引きます。
([0-9a-fxA-FX]+)は、16進または10進のみ許容です。

エラー処理は、まだ追加しません。

さて使ってみます。

~$ echo 'ldi r24,8' | perl avr-asm.pl
88E0
~$ echo 'ldi r24,9' | perl avr-asm.pl
89E0
~$ echo 'ldi r24,10' | perl avr-asm.pl
8AE0
~$ echo 'ldi r24,0xa' | perl avr-asm.pl
8AE0
~$ echo 'ldi r24,0xF' | perl avr-asm.pl
8FE0
~$ echo 'ldi r24,0x10' | perl avr-asm.pl
80E1
~$ 

マイコンを動かさないと合っているか分かりませんが、とりあえずここまで。

2 responses to “perlでAVRニモニックを機械語に変換(その1)

  1. You have shed a ray of sunishne into the forum. Thanks!

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA