彙編語言複習筆記1:基礎知識

彙整自個人OneNote筆記。
僅記錄重點,不記例題。

二進制編碼

位 字節 字
進制 進制轉換
(略)

  • 原碼:最高位表示符號(正0負1),其他位直接表示數值大小。
  • 反碼:正數反碼與原碼相同;負數反碼爲它的相反數(正數)各位(含符號位)按位取反而形成。
  • 補碼:正數反碼與原碼相同;負數反碼爲它的相反數(正數)補碼取反再加1。
十進制數 原碼 反碼 補碼
21 00010101 00010101 00010101
-21 10010101 11101010 11101011

BCD碼(8421 BCD碼)

十進制數位用4位二進制(1位十六進制)編碼表示,如用88H代表十進制的88。

  • 非壓縮BCD:1字節表達1位BCD碼(高4位爲0)。
  • 壓縮BCD:1字節表達2位BCD碼。

ASCII

(略)

8086寄存器

通用寄存器

數據寄存器

  • AX (AH/AL) 累加器:算術、邏輯運算,與外設傳送信息
  • BX (BH/BL) 基址寄存器:存放存儲器地址
  • CX (CH/CL) 計數器:循環操作等指令中的計數器
  • DX (DH/DL) 數據寄存器:存放數據,在輸入輸出指令中存放外設端口地址

變址寄存器

  • SI 源變址寄存器: 指向源操作數
  • DI 目的變址寄存器:指向目的操作數

指針寄存器

  • BP 基址指針:默認指向堆棧數據,主要用於子程序中訪問通過堆棧傳遞的參數和局部變量
  • SP 堆棧指針:總是指向堆棧頂部,在涉及堆棧操作的指令中會自動增加或減少

標誌寄存器 FLAGS

6狀態標誌 3控制標誌
|11|10|9|8|7|6|4|2|0|
|-|-|-|-|-|-|-|-|-|
|OF|DF|IF|TF|SF|ZF|AF|PF|CF|

  • 進位標誌 CF (Carry Flag):反映(無符號數)加減運算最高位($D_7$)有無進位/借位,有爲1。
  • 奇偶標誌 PF (Parity Flag):最低字節1的奇偶個數,偶數爲1。
  • 零標誌 ZF (Zero Flag):運算結果是否爲0,是爲1。
  • 符號標誌 SF (Sign Flag):運算結果最高位爲1,SF=1;否則SF=0。對有符號數來說,相當於判斷正負。
  • 溢出標誌 OF (Overflow Flag):反映(有符號數)運算結果是否溢出,有爲1。
  • 輔助進位標誌/調整標誌 AF (Auxiliary Carry Flag/Adjust Flag):反映加減運算最低半字節($D_3$向$D_4$)有無進位/借位,有爲1(由處理器內部使用,一般不必關心)。
  • 方向標誌 DF (Direction Flag):用於串操作指令中控制地址的變化方向,0爲自動增加,1爲自動減少。
    • CLD指令復位:DF=0
    • STD指令置位:DF=1
  • 中斷允許標誌 IF (Interrupt-enable Flag):控制外部可屏蔽中斷是否可以被處理器響應,1爲允許中斷,0爲禁止中斷。
    • CLI指令復位:IF=0
    • STI指令置位:IF=1
  • 陷阱標誌 TF (Trap Flag):控制處理器是否進入單步操作方式,0爲正常工作,1爲單步執行指令。

指令指針寄存器 IP

與代碼段寄存器CS聯用,確定下一條指令的物理地址。
計算機通過CS:IP控制指令序列執行流程。
IP具有自動增量功能,不能直接賦值修改。

段寄存器

  • CS 代碼段寄存器:指明代碼段起始地址
  • SS 堆棧段寄存器:指明堆棧段起始地址
  • DS 數據段寄存器:指明數據段起始地址
  • ES 附加段寄存器:指明附加段起始地址

存儲器組織

數據存儲格式

  • Word 字:2字節
  • Double Word 雙字:4字節

小端方式:字或雙字存放時,低字節存入低地址,高字節存入高地址;字或雙字單元的地址用它的低地址表示。
邊界對齊(Align):16位2字節數據起始偶地址,32位4字節數據起始模4地址。

分段管理

8086CPU用16位字長可表達16位存儲器地址(0000HFFFFH),即$2^{16}\rm{B}=64\rm{KB}$容量。但是,8086CPU的地址線有20位,最大可尋址空間爲$2^{20}\rm{B}=1\rm{MB}$,其物理地址範圍爲00000HFFFFFH。

邏輯段(Segment):最大64KB。
段基地址(段地址):邏輯段在主存中的起始位置。8086段地址必須是模16地址,即xxxx0H形式。
段內偏移地址:距離段起始位置的偏移量。

物理地址(絕對地址):每個存儲器單元唯一的20位地址。
邏輯地址:形式爲「段地址:偏移地址」。如,邏輯地址1460H:100H表示物理地址14700H

段超越前綴指令

1
2
3
4
cs:                         ; 代碼段超越,使用代碼段數據
ss: ; 堆棧段超越,使用堆棧段數據
ds: ; 數據段超越,使用數據段數據
es: ; 附加段超越,使用附加段數據

尋址方式

8086的機器代碼格式

1/2字節 0/1字節 0/1/2字節 0/1/2字節
操作碼 mod reg r/m 位移量 立即數
指令 尋址方式 某些尋址方式需要的偏移量 立即尋址方式需要的數值本身
1
mov     dest, src

立即數尋址方式

1
2
mov     al, 05h
mov ax, 0102h

寄存器尋址方式

1
2
mov     ax, 1234h
mov bx, ax

存儲器尋址方式

直接尋址方式

1
mov     ax, [2000h]

默認情況下,有效地址要與DS一起構成操作數所在物理單元的物理地址。
數據也可存放於附加段、代碼段、堆棧段中,此時指令應指明段超越前綴。

1
mov     ax, es:[2000h]

寄存器間接尋址方式

有效地址存放在寄存器中(BX/SI/DI),默認段地址在DS段寄存器中。

1
mov     ax, [si]

寄存器相對尋址方式

操作數有效地址EA=BX/BP/SI/DI+8/16位位移量。
基址寄存器使用BX/SI/DI,默認段爲DS;基址寄存器使用BP,默認段爲SS

1
2
3
mov     ax, [di+06h]
mov ax, [bp+06h]
mov ax, [bp]

基址變址尋址方式

操作數有效地址EA=BX/BP+SI/DI
基址寄存器使用BX,默認段爲DS;基址寄存器使用BP,默認段爲SS

1
2
mov     ax, [bx+si]
mov ax, [bp]

相對基址變址尋址方式

操作數有效地址EA=BX/BP+SI/DI+8/16位位移量。
基址寄存器使用BX/SI/DI,默認段爲DS;基址寄存器使用BP,默認段爲SS

1
mov     ax, [bx+si+06h]

注意
位移量可用符號表示,如mov ax, [si+count]
統一尋址方式可寫成不同方式。

數據尋址的結合

1
2
指令助記符  reg, imm/reg/mem
指令助記符 mem, imm/reg

常用debug指令

a(彙編)

1
2
-a                      ; 不指定地址  
-a [addr] ; 指定地址

u(反彙編)

1
2
-u [start_addr]
-u [start_addr end_addr]

t(跟蹤)(單步執行)

1
2
3
-t                      ; 執行一條指令
-t 10 ; 執行下面10H(16)條指令
-t=3 2 ; 從指定IP=0003開始執行下面2條指令

g(斷點執行)

1
2
3
-g                      ; 從程序當前位置執行至斷點處,若無斷點則直到程序結束
-g 200 ; 從程序當前位置執行至斷點處(200H)結束
-g=200 260 ; 從指定地址(200H)執行至斷點處(260H)結束

d(數據顯示)

1
2
3
-d                      ; 顯示從上一次結果處開始80H個字節的內容    
-d 200 ; 顯示從DS:200H處開始80H個字節的內容
...

e(修改數據)

1
2
3
-e                      ; 修改數據
-e 200 (xx..) ; 修改從DS:200H處的內容爲兩位十六進制數xx(可修改多個)
...

r(寄存器)

1
2
-r                      ; 顯示所有寄存器內容  
...

h(十六進制運算)

1
2
-h 20 19                ; 輸出兩個數的加減運算結果
0039 0007

q(退出)

1
-q