Assembly part 1.

Chihhh Linnn 香菇頭

Ref: ASM tutorial

X86 CPU Architecture

X86-Registers and Addressing Modes.pdf

Register

General Purpose Register

暫存器累加器計數器資料基址堆疊指標棧基址指標源變址目標索引
64-bitRAXRCXRDXRBXRSPRBPRSIRDI
32-bitEAXECXEDXEBXESPEBPESIEDI
16-bitAXCXDXBXSPBPSIDI
8-bitAH ALCH CLDH DLBH BL
  • AX:累加器(Accumulator),用於算術和運算。
  • BX:基址寄存器(Base),通常用於指向數組或數據區域。
  • CX:計數器(Counter),通常用於迴圈計數。
  • DX:數據寄存器(Data, IO),用於 I/O 操作。
text
1
2
3
4
4 個通用暫存器(AX、BX、CX、DX)由兩個獨立的 8 位元暫存器組成,
例如如果 AX= 00110000 00111001 b,則 AH= 00110000 b 且 AL= 00111001 b。
因此,當您修改任何 8 位元暫存器時,16 位元暫存器也會更新,反之亦然。
其他3個暫存器也是如此,「H」為高位,「L」為低位。

Segment Register : 區段寄存器

暫存器別名暫存器Size
程式區段暫存器CS16-bits
資料區段暫存器DS16-bits
額外區段暫存器ES16-bits
堆疊區段暫存器SS16-bits
  • CS:代碼段寄存器,存儲代碼段的偏移地址。

  • DS:數據段寄存器,存儲數據段的偏移地址。

  • SS:堆棧段寄存器,存儲堆棧段的偏移地址。

  • ES:額外段寄存器,通常用於額外數據段的偏移地址。

  • 邏輯位址→線性位址(實際位置),公式是:「Segment Register * 0x10 + Offset」

1
2
3
4
5
段寄存器的特殊用途:段寄存器不同於通用寄存器,它們有一個特殊的用途,即指向可以存取的記憶體區塊。每個段寄存器都代表了一個記憶體段(memory segment),而不是單個數值。

與通用暫存器的結合:為了存取記憶體中的數據,你需要使用段寄存器與通用寄存器一起工作。例如,如果你想要訪問記憶體中的某個位置,比如物理位址12345h(十六進位),你應該將段寄存器DS設置為1230h,並將通用寄存器SI設置為0045h。這樣的組合可以用來計算實際的記憶體地址。

計算實體位址:8086處理器通過將段寄存器的值左移四位(乘以10h,也就是16),然後加上通用寄存器的值,來計算實際的記憶體位址。在上面的例子中,DS * 10h + SI 的結果將是12345h,這是你想要訪問的物理位址。

Pointer Register : 指標暫存器

暫存器別名暫存器預設的區段暫存器Size (bits)
來源索引暫存器ESI , SI32 , 16
目的索引暫存器EDI , DI32 , 16
堆疊指標暫存器ESP , SPSS32 , 16
基底指標暫存器EBP , BP32 , 16
程式指標暫存器EIP , IPCS32 , 16

Flag

image

FlagFunction
Zero flag 零時旗標 :zero:set to 1 if result =0 ,set to 0 otherwise.
Sign flag 負號set to 1 if result <0 ,set to 0 otherwise.
Carry flagCarry out of a binary operation.
Parity flagset to 1 if the number of 1’s in a result is odd,set to 0 otherwise.
Overflow flagset to 1 if there’s a 2’s came overflow
Half carry flagContains carry from the least sig Foour bits
Direction flagSTD set to 1 , CLD set to 0

Addressing modes

暫存器定址法

  • 用暫存器的位址當作指令的位址,指令的位址由暫存器的位址決定。
1
2
EX:
MOV AX,BX

立即定址法

  • 把資料放在指令中,不需要去讀取記憶體中的資料。
1
2
EX:
MOV AX,111b

直接定址法

  • 直接給定資料的記憶體實際位址(物理位置),直接讀取記憶體中的資料。
1
2
EX:
MOV AX,[001H]

間接定址法

  • 指令的運算元欄內的值為有效位址的位址值,故需做二次的記憶體讀取,以取得所需之資料。(有點類似C++指標)
1
2
EX:
MOV AX,[BX]

基底定址法

  • 使用基底暫存器(BX)加上位址偏移量(Offset)的方式來定址。
1
2
EX:
MOV AX,[BX+0D5H]

索引定址法

  • 索引定址法是以固定的地址加上索引暫存器(SI,DI)的值,來得出位置。(通常用於陣列)
1
2
EX:
MOV AX,[0000H+SI]

基底索引定址法

  • 基底索引定址法是以基底暫存器(BX)加上索引暫存器(SI,DI)的值,來得出位置。(通常用於2維陣列)
1
2
EX:
MOV AX,[BX+SI+2]
  • Title: Assembly part 1.
  • Author: Chihhh Linnn
  • Created at : 2024-08-15 01:19:59
  • Updated at : 2024-08-15 01:19:59
  • Link: https://chihhhs.github.io/2024/08/15/asm/
  • License: This work is licensed under CC BY-NC-SA 4.0.