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