LoginSignup
6
6

More than 5 years have passed since last update.

アセンブラ学習log_1

Last updated at Posted at 2017-12-28

モチベーション

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

参考書籍

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6