アセンブリ言語で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.格納した情報に基づいて実行される。
のような感じですね。 とてもシンプルです。 是非皆様もアセンブリに手を出してみてはいかがでしょうか。