Assemblyで書いてみた。 2013年4月13日
アセンブリの書籍を読んでいるところですが、
まだ何もコード書いたことがなかったので書いて見ました。
最初ってことで、Helloしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | bits 32 section .text global _start _start: mov eax,4 mov ebx,1 mov ecx,msg mov edx,len int 0x80 mov eax,1 int 0x80 section .data msg db "Hello Assembly World!" ,0x0a len equ $ - msg |
これをHello.sとして、アセンブルしてみる。
1 2 3 4 | $ nasm -f elf Hello.s $ ld -s -o Hello.out Hello.o $ . /Hello .out Hello Assembly World! |
こんな感じ。
nasmのオプションの -f elf をとってみると、
1 2 | $ file Hello.o Hello.o: COM executable for DOS |
という感じに、MS-DOS用のオブジェクトファイルになってしまいます(ふぇぇ
今回はLinuxでしたいので、 ELFなオブジェクトファイルを作成しました。。
コードについて少々説明。間違っていたらご指摘お願いします。。
・”bits 32″で32ビットプログラムであることを指定
・”mov eax,4″でeaxにシステムコール番号の4を指定(4はsys_write
・”mov ebx,1″でebxに標準出力を示す1を指定
・”mov ecx,msg”でecxにmsgのアドレスを指定
・”mov edx,len”でメッセージの長さを指定
・”int 0x80″で実行(syscall
・”mov eax,1″でeaxにシステムコール番号の1を指定(sys_exit
・”int 0x80″で実行
・”msg db “Hello Assembly World!”,0x0a”でmsgに文字列を指定 dbではスタックの大きさを指定(256byte)
・” len equ $ – msg”でラベル名を定義、長さを指定
こんな感じでしょうか。。
Cで書いてみると、
1 2 3 4 5 6 7 8 | #include<stdio.h> int main(){ puts ( "Hello Assembly World!" ); return 0; } |
多分こんな感じです。。
今度は何か面白いものをつくってみたいです。
あ、あとアセンブリコードみてCに戻せるよう頑張りたいです。。
Leave a Reply