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バイト。