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

またまた続きです。

作ったアセンブラの変換が正しく機能しているか確認するにはどうすればよいでしょうか。
いきなりマイコンに書き込んで動作確認するのは骨が砕けます。やはり、ただしいアセンブラとの結果比較がよいでしょう。

アセンブラの前に、C言語がどのように機械語に落とされているか確認します。このソースを使います。

root@raspberrypi:~# cat led-loop.c
#include <avr/io.h>
#include <util/delay.h>

int main()
{
        DDRB = _BV(3);

        while(1){
                PORTB ^= _BV(3);
                _delay_ms(500);
        }
}

ビルドします。

root@raspberrypi:~# make -f makefile-ledloop
avr-gcc -g -O2 -mmcu=attiny85 -DF_CPU=1000000UL -c -o led-loop.o led-loop.c
avr-gcc -g -O2 -mmcu=attiny85  led-loop.o   -o led-loop
avr-objcopy -j .text -j .data -O ihex led-loop led-loop.hex

ディスアセンブラです。

root@raspberrypi:~# avr-objdump -d led-loop.o

led-loop.o:     ファイル形式 elf32-avr


セクション .text.startup の逆アセンブル:

00000000 <main>:
   0:	88 e0       	ldi	r24, 0x08	; 8
   2:	87 bb       	out	0x17, r24	; 23
   4:	98 e0       	ldi	r25, 0x08	; 8
   6:	88 b3       	in	r24, 0x18	; 24
   8:	89 27       	eor	r24, r25
   a:	88 bb       	out	0x18, r24	; 24
   c:	2f e9       	ldi	r18, 0x9F	; 159
   e:	36 e8       	ldi	r19, 0x86	; 134
  10:	81 e0       	ldi	r24, 0x01	; 1
  12:	21 50       	subi	r18, 0x01	; 1
  14:	30 40       	sbci	r19, 0x00	; 0
  16:	80 40       	sbci	r24, 0x00	; 0
  18:	01 f4       	brne	.+0      	; 0x1a <main+0x1a>
  1a:	00 c0       	rjmp	.+0      	; 0x1c <main+0x1c>
  1c:	00 00       	nop
  1e:	00 c0       	rjmp	.+0      	; 0x20 <__zero_reg__+0x1f>

あれ、何か変です。18行目のbrneのジャンプ先がおかしい気がします。これだと動かないはずですが、LEDはピカピカしています。
HEXと比べてみましょう。

root@raspberrypi:~# cat led-loop.hex 
:100000000EC015C014C013C012C011C010C00FC064
:100010000EC00DC00CC00BC00AC009C008C011241E
:100020001FBECFE5D2E0DEBFCDBF02D011C0E8CF0A
:1000300088E087BB98E088B3892788BB2FE936E83A
:1000400081E0215030408040E1F700C00000F3CF54
:04005000F894FFCF52
:00000001FF
root@raspberrypi:~# 

avrasm-002

HEXの方は合ってそうです。これから作る予定のニモニック置換プログラムは(アセンブラとはあえて呼ばない)は、avr-asでアセンブルしたHEXと比べることにします。

One response to “perlでAVRニモニックを機械語に変換(その3)

  1. good.thank you!very much.|great experience, dude! thanks for this great post wow… it’s very wonderful reg.ato|prert experience, dude! thanks for this great

Leave a Reply

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

CAPTCHA