Log

アセンブリ言語 メモ その1

英語の勉強もかねて、ところどころ英語で書くかもです。

1.register and stack

アセンブリ言語を読み解く上で重要な概念 = レジスタ、スタック

アセンブリ言語 = 機械と一対一で対応。コンピューターがアセンブリ命令を解釈して実行できる形式

そのため、アセンブリ言語の命令群がどのような設計をしているか知ることはコンピューターの設計と密度に関わっている。

 

プロセッサーアーキテクチャにより、どのような命令が用意されているか変わっていくる。そのため、プロセッサーごとのアーキテクチャーの設計や、それぞれのデータ構造を理解してくてはいけない。

 

the most using processe architecture x86

 

what is register?

A register is memory device to exist within processer, and it operates faster than the memory or auxiliary strorage device. 

プロセッサーが命令を実行する時は、直接メモリを操作するのではなく、メモリからレジスタへ読み出したデータに対して操作することが多い。

 

the strage capacity is very small(many case 32bit or 64bit), 

the processer is called typically 32bit or 64bit CPU, but it is decided by the reegister width. the processer usually has multiple register within it , and use properly by usefulness.

 

the x86 architecuture have 6 general register and 3 special registe in the computer.

6 general register = EAX, ECX, EDX, EBX, ESI, EDI

3 special register = EBP, ESP, EIP

がある。 ESIとEDIはまとめてindex registerと呼ばれることがある。

f:id:yottiii:20180723150847p:plain

genelral register のうち EAX,ECX,EDX,EBXのの下位16びっとは、AX,CX,DX,BXと呼ばれ、さらにその上位8bitをAH,CH,DH,BH, 下位8bitをAL,CL,DL,BLと呼ばれている。h

 

how to  use each register?

EAX(accumulator register):演算の結果を格納

ECX(counter register):ループ回数などのカウントを格納

EDX(data register):演算に用いるデータを格納

EBX(base register):アドレスのベース値を格納

ESI(source index register):一部のデータ転送命令において、データ転送元を格納

EDI(destination index register): "データ転送先"

 

EBP(base pointer register):現在のスタックフレームにおける底のアドレスを保持

ESP(stack pointer register):現在のスタックトップのアドレスを保持

EIP(instraction pointer register):次に実行するアセンブリ命令のアドレスを保持

 

これらをベースポインター、スタックポインター、命令ポインターと呼ぶことがある。

 

flag registerは前の命令によって生じた状態このとや、プロセッサーの状態を格納する。

このレジスタの保持している値によって、動作の変わる命令などがある。

EFLAGSregisterと呼ばれる32bit registerで実装されており、17個のフラグが格納されている。

2.バイナリ解析のさい、利用する頻度があるフラグ

 

CF(carry flag):演算命令でキャリー(桁上がり)かボロー(桁借り)が発生した時にセットされる

ZF(zero flag):操作の結果が0になった時にセットされる。

SF(sign flag):操作の結果が負になった時にセットされる。

DF(destination flag):ストリームの方向を制御する。

OF(overflow flag):符号付き算術計算の計算の結果がレジスタの格納可能範囲を超えた場合にセットされる。

 

セグメントレジスタとは、セグメントのアドレスを参照するのに用いられるレジスタです。

what is segment?

メモリを管理するために、格納するデータの種類によって領域として区切ったもの、セグメントをメモリ管理に用いる方法をセグメント方式と言います。

 

CS(code segment registe):コードセグメントのアドレスを格納。

DS(data segment register):データセグメントのアドレスを格納

SS(stack segment register): スタック絵Sグメントのアドレスを格納

ES(extra segment register):エクストラセグメント (追加セグメント)のアドレスを格納する

FS(F segment register):2番目の追加セグメントのアドレスを格納

GS(G segment register):3番目の追加セグメントのアドレスを格納

 

x86-64レジスタは・・・x86を拡張したもの

 

stack

後入れ先出し、煽は先入れ後出しのデータ構造のこと、

コンピュータアーキテクチャの技術用語では、メモリ空間の一部で、先入れ後出しのデータ構造を持つ領域のこと。

 

コールスタック・・・関数呼び出しに用いられる。

マルチバイト・・・一文字を複数のバイトで表す体型

 

バイトオーダー・・・マルチバイトデータをメモリ上にどのように配置するかを表すもの。

主要なアーキテクチャーのアセンブリを読むためにはビッグエディアンとリトルエディアンのバイトオーダーを知っておく必要がある。

MSB、LSB

MSB...Most signification byte マルチバイトのデータの中で最上位のバイトを指す。

LSB...Least signfication byte マルチバイトのデータの中で最下位のバイトを指す。

 

example)byte:01020304

this is 4byte to strings.

MSB = 01 低位のアドレス番地

LSB = 04 高位のアドレス番地

リトルエディアンでは

MSB = 01 高位のアドレス番地

LSB = 04 低位のアドレス番地

 

つまりリトルエディアンでは

04030201という並びで格納される。

x86 or x64ではこのリトルエディアンが採用されている。