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