Linuxでx86アセンブラ（基本的なコードの構造編）

# \:large_blue_diamond:dataセクション
初期化されている変数の宣言を行います．

```
section data
    message db "Hello World!!", 0
```

初期化された変数の確保には```db```、```dw```、```dd```ニーモニックを使います．

```
<変数の名前> db <変数の値>
```

```db``` はサイズが1バイトの変数を宣言します．```dw```は1ワード（2バイト）、```dd```は1ダブルワード（4バイト）のサイズの変数を宣言します．

C・C++でいわれる配列を宣言するためには下のように書きます．

```hoge db 1,2,3,4,5```

これにより、中身が[1,2,3,4,5]の配列が宣言されます．
定数の宣言もdataセクションで行うことができます．定数の宣言には```eq``` ニーモニックを使います．

```
<定数名> eq <定数の値>
```


# \:large_blue_diamond:bssセクション
初期化されていない変数の宣言を行います．

``` 
section bss
    hoge resb 4
```
この命令では初期化されていない変数```hoge```を定義しています．```hoge```は4バイトの大きさです．
変数のサイズは```resb```、```resw```、```resd```、```resq```、```rest```ニーモニックで指定します．
使い方は全て同じです

```
<変数名> resb <サイズ>
```

異なる点は命令で確保されるサイズの大きさです．

| 命令 | バイト数 |
|:------+:--------|
| resb | 1 バイト |
| resw | 2 バイト |
| resd | 4 バイト |
| resq | 8 バイト |
| rest | 10 バイト |

# \:large_blue_diamond:textセクション
実行される命令を定義します．

```
section text
   global _main
_main:
   enter 0,0
   mov eax, 10
   add eax, 2
   leave
   ret
```

```gloabl``` は指定されたラベルを他のモジュールから参照可能にします．```global``` がないラベルは同じオブジェクトファイルからしか参照できません．
dataとbssセクションで定義された変数にはこのようにアクセスします．

```
lea eax, [hoge]
mov ebx, [eax]
```

hogeは変数の名前です．hoge自体には変数の開始アドレスが入っています．ちょうどC言語でいうポインタのようにアクセスします．```lea```
ニーモニックは"load effective address"で、第二オペランドのアドレスを第一オペランドに格納します．

```
lea <レジスタ・メモリ>, <即値・レジスタ・メモリ>
```

# \:large_blue_diamond:デモ
この記事で紹介した命令の使い方を紹介するサンプルコードです．

```structure.asm
section .data
    msg db 'Takoyaki', 0

section .bss
    buff resd 5

section .text

global main

main:
   enter 0,0
   nop

.access_data:
   lea ebx, [msg]
   mov eax, [ebx] ; eax = T
   inc ebx
   mov eax, [ebx] ; eax = a
   inc ebx
   mov eax, [ebx] ; eax = k
   inc ebx
   mov eax, [ebx] ; eax = o
   inc ebx
   mov eax, [ebx] ; eax = y
   inc ebx
   mov eax, [ebx] ; eax = a
   inc ebx
   mov eax, [ebx] ; eax = k
   inc ebx
   mov eax, [ebx] ; eax = i
   xor ebx, ebx

.access_bss:
   mov eax, 100
   mov [buff],  eax
   mov eax, 200
   mov [buff + 4],  eax
   mov eax, 300
   mov [buff + 8],  eax
   mov eax, 400
   mov [buff + 12],  eax
   mov eax, 500
   mov [buff + 16],  eax

   mov eax, 4
   lea ebx, [buff+eax]
   mov eax, [ebx]

.final:
    mov eax, 0
    leave
    ret
```

このstructure.asmを下のコマンドでコンパイルしてください

```
nasm -g -f elf64 -o structure.o structure.asm
gcc -o structure structure.o
```

実行にはgdbを使います．

```
gdb -tui structure
```

gdb内のコマンド

```
display/c $eax
display $eax
```

で、data・bssセクションに格納された文字と数字がeaxに格納されるのを確認しましょう．

# 参考文献
* NASM development team site:   
http://www.nasm.us/
* GDB: The GNU Project Debugger site:   
https://www.gnu.org/software/gdb/
* Assembly Language Step-by-Step: Programming with Linux:   
http://www.amazon.co.jp/Assembly-Language-Step---Step-Programming/dp/0470497025/ref=sr_1_1?ie=UTF8&qid=1446704607&sr=8-1&keywords=assembly+language+step+by+step
 


↓↓\:bowtie:過去の投稿もよろしくね\:bowtie:↓↓

* Linuxでx86アセンブラ（論理演算編） 
http://qiita.com/MoriokaReimen/items/bf863585616ad0a0a969

* Linuxでx86アセンブラ(四則演算編)
http://qiita.com/MoriokaReimen/items/4853587dcb9eb96fab62

* Linuxでx86アセンブラ(Cとの連携編)
http://qiita.com/MoriokaReimen/items/590a4ddb3de15bfacb4b

* Linuxでx86アセンブラ(道具編)
http://qiita.com/MoriokaReimen/items/b316a68d76c1eafa18f8

* tmuxの使い方
http://qiita.com/MoriokaReimen/items/d7d5b158cb412dd65a60



↓↓\:bowtie:コメントをいただけたら励みになります\:bowtie:↓↓