ぷろぐらみんぐ中毒

プログラミングやらなんやら...とにかく情報関連を語るブログだよ!

アセンブリ言語でHelloWorldしよう。

こんにちは、中の人は雨が降ると頭痛がしてくる体質なのでストレスMAXです。

外にも気軽に出ることができないのでWoTばかりやっています(スマホ版)

おかげさまでやっとT-28が、KV-1になりました。

まあ、それは置いておいて、今回はみんな大好きアセンブリ言語でHelloWorldを表示していきましょう。

アセンブラはNASMを使用します。

プログラムを書こう

↓がHelloWorldを表示するプログラムです。

section .text

    global _start

_start:
                                               
    mov eax,4                
    mov ebx,1               
    mov ecx,msg
    mov edx,length
    int 0x80          

    mov eax,1            
    int 0x80  

section .data
    
    msg db 'HelloWorld',0xa    
    length equ $ - msg

初見だと何がなんだかよく分からないですよね…

最初から解説していくと、まず

section .text

global _start

_start:

C言語におけるmain関数のようなものです。 つまり_startからプログラムが始まるのです。 また、section .textはプログラム自体を書く場所?(説明が下手ですみません)のようなものです。

次に

mov eax,4
mov ebx,1
mov ecx,msg
mov edx,length
int 0x80

とあります。 movは値を代入する命令で、例えばiという変数に100を代入したいときには、mov i,100のようにして使います。 ここでは、eax、ebx、ecx、edxなどのレジスタに格納しています。 HelloWorldを表示する際に必要なsys_writeを呼び出すためには、eaxに4(sys_writeに割りつけられた番号のようなものです)、ebxに1(C言語で言うところのstdout、stderrも指定できる)、ecxに表示する文字列、edxに表示する文字列の文字数を格納し、システムコール(int 0x80)をする必要があります。

つぎに

section .data

msg db 'HelloWorld',0xa    
length equ $ - msg

とあります。 section .dataは定数を宣言するための場所のようなものです。ちなみに変数などはsection .bssに宣言します。 msg db ‘HelloWorld’,0xaと書くとmsgという定数にHelloWorldが格納されます。 また、length equ $ - msgと書くとlengthという定数にmsgの長さが格納されます。

全体的なイメージとしては

1.レジスタに定数などのシステムコールをするために必要な情報を格納 2.システムコールをする 3.格納した情報に基づいて実行される。

のような感じですね。 とてもシンプルです。 是非皆様もアセンブリに手を出してみてはいかがでしょうか。