25
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

:large_blue_diamond:dataセクション

初期化されている変数の宣言を行います.

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

初期化された変数の確保にはdbdwddニーモニックを使います.

<変数の名前> 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バイトの大きさです.
変数のサイズはresbreswresdresqrestニーモニックで指定します.
使い方は全て同じです

<変数名> 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に格納されるのを確認しましょう.

参考文献

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
25
Help us understand the problem. What are the problem?