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 <定数の値>
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 バイト |
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 <レジスタ・メモリ>, <即値・レジスタ・メモリ>
デモ
この記事で紹介した命令の使い方を紹介するサンプルコードです.
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
↓↓過去の投稿もよろしくね↓↓
-
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
↓↓コメントをいただけたら励みになります↓↓