アセンブラ

アセンブラ学習log_1

モチベーション

  • エンジニアならアセンブラ読めて当然だよね的な煽り文句をはてぶで受けた
  • 年末年始でとりあえず入門してみよう
  • 飽きたら即終了の予定

参考書籍

http://amzn.asia/36bcPcT

2017_12_28 基礎知識と計算式

アセンブラの単位

アセンブラの命令 = 各CPUが実際に実行する命令

アセンブラ/アセンブリ/アセンブル

  • アセンブリ => アセンブリ言語プログラム
  • アセンブラ => ソフトウェア、命令の全てが整数
  • アセンブル => アセンブラが行う操作のこと

まとめ アセンブリ言語をアセンブラを通してアセンブルする

アセンブリ言語の1行1行はニモニック ソースオペランド デスティネーションオペランドで構成される

アセンブラの種類

この二つ、パラメータの順序もコマンドも異なる

  • Intel表記
  • AT&T表記
    • GNUアセンブラ(GAS)はこちら

書き方

▼コメント

 XXXXX YYYYYYYY    ;{この部分はコメント}

▼値の移動

mov 2h ah,02

2という値をCPUの2hに転送(=値の移動)させる

▼値の移動

mv1  $88, %ecx

88($88=10進数的に88)をecxというところに転送している

▼値の移動

mv1  $1  -4(%rbp)

1を RBPというレジスタから−4引いた場所に転送する

▼値の計算

計算した値は全てデスティネーションに保存される

加算処理

addl %edx %eax

減算処理

sub1 -8(%rbp) %eax

商算処理

imul1 -8(%rbp) %eax

除算処理

idiv -8(%rnp) %eax
  • ソースにはメモリもレジスタも可能
  • デスティネーションはレジスタのみ

▼アドレスを保存

サイズはq

ソースのアドレスをデスティネーションに保存(転送では無い)

leaq .LC0(%rip), %rcx

▼出力

leap .LC0(%rip), %rcx
call prinf

.LC0(%rip)は、printfが使うアドレス、前もってprintfで使用する書式を設定している

▼64bit拡張

32bitから64bitに符号拡張する

mov1 -4(%rbp) %eax
cltd

レジスタ/メモリアドレス

レジスタとメモリアドレスは別物

  • レジスタ
    • 計算する場所
    • RBP
    • EDX
    • EAX
  • メモリアドレス
    • 保存する場所
    • RBP-4
    • RPB-8

最重要なレジスタ => RAXレジスタ(別名アキュムレータ

  • 64bitを扱うときはRAXレジスタ
  • 32bitを扱うときはEAXレジスタ(RAXレジスタの下位32bit)
  • 16bitを扱うときはAXレジスタ(EAXレジスタの下位16bit)
  • 8bitを扱うときはAHレジスタまたはALレジスタ(AXレジスタの上位8bitをAH, 下位8bitをAL)

  • RAX

    • 最頻出
    • アキュムレータ
    • 算術演算
    • 操作結果保存
  • RBX

    • ベースレジスタ
    • メモリアドレス保存
  • RCX

    • カウンタレジスタ
    • シフト/ローテート命令
    • ループ命令
  • RDX

    • データレジスタ
    • 算術演算操作
    • I/O操作データ保存
  • RBP

    • スタックベースポインタ
    • スタックのベースの場所を示す