2019-08-26
ARMアセンブラ(2)
Nucleoボードのスタートアップルーチンを読んでいたのだが、もっと単純にアセンブラをアセンブルしてアソンデみようという話。
ググって親切そうだと思ったhttp://www.bravegnu.org/gnu-eprog/hello-arm.htmlを参考にした。
GNU-ARM-EABIツールチェインのarm-none-eabi-as
を使う。
.text
start:
mov r0, #5
mov r1, #4
add r2, r1, r0
stop:
b stop
こんな感じでアセンブラを書いて、hello.s
で保存。
label: instruction @comment
が基本文法。
$ arm-none-eabi-as.exe -o hello.o .\hello.s
.\hello.s: Assembler messages:
.\hello.s: Warning: end of file not at end of a line; newline inserted
次にリンク
$ arm-none-eabi-ld.exe -Ttext=0x0 -o hello.elf hello.o
arm-none-eabi-ld.exe: warning: cannot find entry symbol _start; defaulting to 00000000
んでニーモニック表示
:D:\dev\gcc-arm-none-eabi-8-2019-q3\bin\arm-none-eabi-nm.exe hello.elf
00010010 T __bss_start
00010010 T __bss_start__
00010010 T __data_start
00010010 T __end__
00010010 T _bss_end__
00010010 T _edata
00010010 T _end
00080000 T _stack
U _start
00000000 t start
0000000c t stop
ちゃんとstop:がstart:の0xc = 3命令ぶん先にあることが分かる。ARMは1命令=4Byteらしい。
OSはelfを解釈してくれるが、マイコンはそうではないのでバイナリ形式に変換する。
$ arm-none-eabi-objcopy.exe -O binary hello.elf hello.bin
hello.elfは64.8KiBだったが、hello.binはわずか16バイトだ。4つの命令から成るプログラムなので16バイト。