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