やまものブログ

メモ書きブログです (^_^;A

ARM アセンブラ Hellow World!

これまでは C言語にインラインでアセンブラを組み込んで動かしていました。
今回はアセンブラのみのコードで、”Hello, World!” を表示します。

コードは ‘Hello World!’ in ARM assembly をほぼそのままコピーさせてもらいました
いちおう、swi を svc  に置き換えたりなどの修正はしていますが。

イメージ 2


コンパイルリンクは以下のように行い、実行形式 a.out を作成しました。
 $ arm-xilinx-linux-gnueabi-as -o helloworld_peter.o helloworld_peter.s
 $ arm-xilinx-linux-gnueabi-ld -s helloworld_peter.o



実行しました。
イメージ 1


システムコールは便利ですね
r7 にどのシステムコールを使うかを設定して、svc #0 でコールします。

ここで、システムコールとして何が使えるか? については、
linux-xlnx/arch/arm/include/uapi/asm/unistd.h
#define  が列挙されています。
全部で400個近くありますが、今回使った exit と write の周辺だけ抜粋します。

#define __NR_restart_syscall            (__NR_SYSCALL_BASE+  0)
#define __NR_exit                       (__NR_SYSCALL_BASE+  1)
#define __NR_fork                       (__NR_SYSCALL_BASE+  2)
#define __NR_read                       (__NR_SYSCALL_BASE+  3)
#define __NR_write                      (__NR_SYSCALL_BASE+  4)
#define __NR_open                       (__NR_SYSCALL_BASE+  5)
#define __NR_close                      (__NR_SYSCALL_BASE+  6)
: 以下、省略

man が使える Linux 環境(QEMUには載せないのでホストでしょうか) なら、
$ man syscalls
システムコールは一通り列挙されます。
残念ながら、r7 に設定する数字はこれでは分かりませんが。

システムコールを実行するには、引数を r0, r1, ...  に設定する必要があります。つまり、巻数のプロトタイプを知る必要があります。自分が調べた限りでは、man で Linux Programmer's Manual の SYNOPSIS を参照するのが便利かと思います。

$ man 2 exit
: 冒頭、省略
SYNOPSIS
       #include <unistd.h>

       void _exit(int status);
:以下、省略

$ man 2 write
: 冒頭、省略
SYNOPSIS
       #include <unistd.h>

       ssize_t write(int fd, const void *buf, size_t count);
:以下、省略