Assemblyで書いてみた。 2013年4月13日
アセンブリの書籍を読んでいるところですが、
まだ何もコード書いたことがなかったので書いて見ました。
最初ってことで、Helloしてみましょう。
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として、アセンブルしてみる。
$ nasm -f elf Hello.s $ ld -s -o Hello.out Hello.o $ ./Hello.out Hello Assembly World!
こんな感じ。
nasmのオプションの -f elf をとってみると、
$ 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で書いてみると、
#include<stdio.h> int main(){ puts("Hello Assembly World!"); return 0; }
多分こんな感じです。。
今度は何か面白いものをつくってみたいです。
あ、あとアセンブリコードみてCに戻せるよう頑張りたいです。。
Leave a Reply