ARM アセンブラ Hellow World!
これまでは C言語にインラインでアセンブラを組み込んで動かしていました。
今回はアセンブラのみのコードで、”Hello, World!” を表示します。
コードは ‘Hello World!’ in ARM assembly をほぼそのままコピーさせてもらいました
いちおう、swi を svc に置き換えたりなどの修正はしていますが。
コンパイルリンクは以下のように行い、実行形式 a.out を作成しました。
$ arm-xilinx-linux-gnueabi-as -o helloworld_peter.o helloworld_peter.s
$ arm-xilinx-linux-gnueabi-ld -s helloworld_peter.o
実行しました。
システムコールは便利ですね
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
#include <unistd.h>
void _exit(int status);
$ man 2 write
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
今回はアセンブラのみのコードで、”Hello, World!” を表示します。
コードは ‘Hello World!’ in ARM assembly をほぼそのままコピーさせてもらいました
いちおう、swi を svc に置き換えたりなどの修正はしていますが。
コンパイルリンクは以下のように行い、実行形式 a.out を作成しました。
$ arm-xilinx-linux-gnueabi-as -o helloworld_peter.o helloworld_peter.s
$ arm-xilinx-linux-gnueabi-ld -s helloworld_peter.o
実行しました。
システムコールは便利ですね
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);
:以下、省略