一、計算機系統組成
-
計算機系統組成:由硬件系統和軟件系統組成
- 硬件系統:CPU、存儲器、輸入/輸出設備等物理部件
- 軟件系統:操作系統、各種語言、系統軟件和應用軟件
-
匯編語言分類
- 屬于低級語言(直接面向硬件)
- 與高級語言(面向問題)和機器語言(二進制代碼)相區別
二、匯編程序開發過程
-
源文件擴展名
- .ASM:匯編語言源程序
- .OBJ:匯編后產生的目標文件
- .EXE:鏈接后生成的可執行文件
-
開發步驟:
- 編輯(.ASM)→ 匯編(.OBJ)→ 鏈接(.EXE)→ 執行
-
相關命令
- MASM:匯編命令,生成.OBJ和可選.LST文件
- LINK:鏈接命令,生成.EXE文件
三、8086/8088 CPU結構
-
CPU組成
- 運算器(ALU):算術邏輯運算
- 控制器:指令譯碼和執行控制
- 寄存器組:數據暫存和地址處理
-
寄存器分類:
- 通用寄存器(AX,BX,CX,DX,SI,DI,BP,SP)
- 段寄存器(CS,DS,SS,ES)
- 控制寄存器(IP,FLAGS)
-
寄存器位數
- 8位寄存器:AH,AL,BH,BL,CH,CL,DH,DL(共8個)
- 16位寄存器:AX,BX,CX,DX,SI,DI,BP,SP,CS,DS,SS,ES,IP,FLAGS(共14個)
四、標志寄存器(PSW)
-
標志位組成
- 條件狀態位(6個):CF,PF,AF,ZF,SF,OF
- 控制狀態位(3個):DF,IF,TF
-
各標志位含義:
- CF(進位標志):無符號數溢出
- PF(奇偶標志):結果低8位1的個數為偶數
- AF(輔助進位):BCD運算時低4位向高4位進位
- ZF(零標志):結果為0
- SF(符號標志):結果為負(最高位為1)
- OF(溢出標志):有符號數溢出
- DF(方向標志):串操作方向(0=遞增,1=遞減)
- IF(中斷允許):是否允許可屏蔽中斷
- TF(陷阱標志):單步執行
五、存儲器組織
-
存儲單元編址
- 按字節編址
- 1字節=8位
- 1字=2字節=16位
-
物理地址形成
- 物理地址 = 段地址×16 + 偏移地址
- 段地址左移4位(相當于×16)加偏移地址
-
邏輯地址與物理地址轉換
- 例:236FH:1000H → 246F0H
- 計算方法:236F0H + 1000H = 246F0H
-
段寄存器使用規則
- 默認段選擇:
- CS:代碼段
- DS:數據段
- SS:堆棧段(BP作基址時使用)
- ES:附加段(串操作目的地址)
- 默認段選擇:
六、尋址方式
-
尋址方式分類:
- 立即尋址:操作數在指令中
- 寄存器尋址:操作數在寄存器
- 存儲器尋址:
- 直接尋址:[偏移地址]
- 寄存器間接:[BX/BP/SI/DI]
- 寄存器相對:[BX/BP/SI/DI + 位移量]
- 基址變址:[BX/BP + SI/DI]
- 相對基址變址:[BX/BP + SI/DI + 位移量]
-
轉移地址尋址:
- 段內轉移:只修改IP
- 段間轉移:修改CS和IP
- 直接尋址:目標地址在指令中
- 間接尋址:目標地址在寄存器或內存
七、指令系統
-
數據傳送指令:
- MOV:傳送(不能直接段寄存器間傳送)
- XCHG:交換(不能與段寄存器交換)
- PUSH/POP:堆棧操作(16位操作)
- LEA:取有效地址
- LDS/LES:裝入遠指針
-
算術運算指令:
- ADD/ADC:加法/帶進位加
- SUB/SBB:減法/帶借位減
- INC/DEC:加1/減1(不影響CF)
- NEG:求補(相當于0-操作數)
- MUL/IMUL:無/有符號乘法
- DIV/IDIV:無/有符號除法
-
邏輯運算指令:
- AND/OR/XOR/NOT:與/或/異或/非
- TEST:測試(相當于AND但不保存結果)
- SHL/SHR:邏輯左/右移
- SAL/SAR:算術左/右移
- ROL/ROR:循環左/右移
- RCL/RCR:帶進位循環左/右移
-
串操作指令:
- MOVS/CMPS/SCAS/LODS/STOS
- 前綴:REP/REPE/REPNE
- 方向控制:CLD(DF=0)/STD(DF=1)
-
控制轉移指令:
- JMP:無條件轉移
- Jcc:條件轉移(JA,JB,JE,JG,JL等)
- LOOP/LOOPE/LOOPNE:循環控制
- CALL/RET:子程序調用/返回
- INT/IRET:中斷調用/返回
-
處理器控制指令:
- CLC/STC:清/置CF
- CLD/STD:清/置DF
- CLI/STI:清/置IF
- HLT/NOP:暫停/空操作
八、偽指令與程序結構
-
偽指令類型:
- 數據定義:DB/DW/DD(字節/字/雙字)
- 符號定義:EQU/=(等值)/LABEL(類型重定義)
- 段定義:SEGMENT/ENDS
- 過程定義:PROC/ENDP
- 程序結束:END
-
程序結構:
DATA SEGMENT; 數據定義 DATA ENDSSTACK SEGMENT STACK; 堆棧定義 STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:; 程序代碼MOV AH,4CHINT 21H CODE ENDSEND START
-
變量與標號:
- 變量:存儲單元符號地址,有段、偏移和類型屬性
- 標號:指令地址符號,有段、偏移和距離屬性(NEAR/FAR)
九、中斷與I/O
-
中斷類型:
- 內部中斷:除法錯、單步、斷點、溢出、指令中斷
- 外部中斷:NMI(非屏蔽)、INTR(可屏蔽)
-
中斷向量表:
- 位于內存0000:0000~0000:03FFH
- 每個中斷占4字節(CS:IP)
-
DOS功能調用:
- 使用INT 21H
- 常用功能:
- 01H:鍵盤輸入
- 02H:顯示輸出
- 09H:顯示字符串
- 4CH:程序結束
-
I/O指令:
- IN:從端口輸入
- OUT:向端口輸出
- 端口地址:0~FFFFH
十、典型程序結構
-
順序結構:
- 指令順序執行
-
分支結構:
CMP AL,BL JA LABEL1 ; AL>BL時轉移 JB LABEL2 ; AL<BL時轉移 JE LABEL3 ; AL=BL時轉移
-
循環結構:
MOV CX,10 LOOP1:; 循環體LOOP LOOP1 ; CX=CX-1, CX≠0時循環
-
子程序結構:
; 調用 CALL SUB1; 定義 SUB1 PROC NEAR/FAR; 子程序體RET SUB1 ENDP
十一、數值處理
-
數制轉換:
- BCD碼調整指令:
- AAA/AAS:非壓縮BCD加減調整
- AAM/AAD:非壓縮BCD乘除調整
- DAA/DAS:壓縮BCD加減調整
- BCD碼調整指令:
-
符號擴展:
- CBW:AL符號擴展到AX
- CWD:AX符號擴展到DX:AX
-
算術運算注意事項:
- 乘法:8位×8位→16位,16位×16位→32位
- 除法:被除數位數是除數兩倍
十二、調試與排錯
-
DEBUG命令:
- R:查看/修改寄存器
- D:顯示內存內容
- E:修改內存內容
- U:反匯編
- T/P:單步執行
- G:連續執行
- Q:退出
-
常見錯誤:
- 操作數類型不匹配
- 非法尋址方式
- 段寄存器使用不當
- 跳轉超出范圍
- 堆棧不平衡
創作不易,如果您都看到這里了,可以給我一個點贊、收藏并關注一下么?您的支持與喜愛是激勵我創作的最大動力!
如果內容有誤請及時聯系我進行修改