彙整自個人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 2
| mov al, 05h mov ax, 0102h
|
寄存器尋址方式
1 2
| mov ax, 1234h mov bx, ax
|
存儲器尋址方式
直接尋址方式
默認情況下,有效地址要與DS
一起構成操作數所在物理單元的物理地址。
數據也可存放於附加段、代碼段、堆棧段中,此時指令應指明段超越前綴。
寄存器間接尋址方式
有效地址存放在寄存器中(BX
/SI
/DI
),默認段地址在DS
段寄存器中。
寄存器相對尋址方式
操作數有效地址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
。
注意:
位移量可用符號表示,如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
(寄存器)
h
(十六進制運算)
1 2
| -h 20 19 ; 輸出兩個數的加減運算結果 0039 0007
|
q
(退出)