【微机原理笔记】第 4 章 - 8086 汇编语言程序设计
微機原理筆記 - 主頁
第 4 章 8086 匯編語言程序設計
1. 匯編語言的源程序
(1)編譯平臺的作用
- 自動分配地址
- 自動進行數(shù)值轉(zhuǎn)化
- 語法檢查
(2)匯編語言源程序的結(jié)構(gòu)
匯編語言源程序通常由一個或幾個程序模塊組成,每個模塊一般由三個邏輯段組成:
- 數(shù)據(jù)段 —— 存放數(shù)據(jù)、變量
- 堆棧段 —— 堆棧區(qū)域
- 代碼段 —— 存放程序指令
EXE 模板:
(3)8086 匯編語言的語句
匯編語言由指令性語句和指示性語句組成:
- 指令性語句(真指令):匯編時生成機器碼。
- 指示性語句(偽指令):匯編時不生成機器碼。
2. 8086 匯編中的偽指令
(1)符號定義語句
-
等值語句(全局)
格式: 符號名 EQU 表達式
eg. PORT EQU 123
-
等號語句(局部)
格式: NUM = …
注意: 用 EQU 定義的符號未清除前,不能重新定義;用 “=” 定義的符號可在任何時候進行重定義。
(2)變量定義語句
格式: 符號名 DB/DW/DD 表達式
功能: 定義一變量,并為其分配一定數(shù)量的存儲單元。
-
定義一組數(shù)據(jù)
eg. BUFF DW 1234H,8EH
定義一個字的變量,1234H 中 12 放到高地址,34 放到低地址;由于定義的是一個字,8EH 會變成 008EH ,其中 00 放到高地址,8E 放到低地址。
-
定義一串字符
eg. (考點)
S1 DB ‘AB’ 是定義一個字節(jié),即 S1 = 41 , 42H
S2 DW ‘AB’ 是定義一個字,即 S2 = 4241H ,將 A 放到高地址。
-
定義保留存儲單元
eg. SUM DW ?,?(SUM 偏移地址開始,4 個單元保留)
操作數(shù) ?用來保存存儲空間,但不存入數(shù)據(jù)
-
復制操作 —— DUP
eg. ALL_ZERO DB 5 DUP(0) 等價于 ALL_ZERO DB 0,0,0,0,0
(3)段定義語句
-
段定義
段名 SEGMENT [定位類型] [組合方式] [類別]
<匯編語言語句>
段名 ENDS
注意: 兩個偽指令總是成對出現(xiàn),前者說明一個段的開始,后者說明一個段的結(jié)束。
-
段假設
eg. ASSUME CS : code , DS : data , SS : stack
上面語句意思是,CS 將指向名字為 code 的代碼段,DS 和 SS 將指向名字為 data/stack 的段。
-
段賦值
確定基址,但是 CS 不能賦值。
eg. MOV AX , DATA ; MOV DS , AX
-
段結(jié)束
END 標號名
標記匯編源程序的結(jié)束,匯編到此停止匯編。
3. DOS 功能調(diào)用
(1)鍵盤輸入 —— 1 號調(diào)用
格式:
MOV AH , 1
INT 21H
功能: 等待鍵盤輸入一個字符并將輸入的字符的 ASCII 碼送入 AL 中,同時在顯示器上顯示該字符。
(2)顯示單個字符 —— 2 號調(diào)用
格式:
MOV AH , 2
MOV DL , 帶顯示字符的 ASCII 碼
INT 21H
功能: 將 DL 中的字符顯示出來。
(3)顯示字符串 —— 9 號調(diào)用
格式:
LEA DX , 字符串首偏移地址
MOV AH , 9
INT 21H
功能: 顯示當前數(shù)據(jù)區(qū)中以 $ 結(jié)尾的字符串。
(4)過程終止 —— 4CH 號調(diào)用
格式:
MOV AH , 4CH
INT 21H
功能: 結(jié)束當前程序。
4. 數(shù)據(jù)項及表達式
(1)常用運算符
-
算術(shù)運算符 —— + 、- 、* 、/ 、MOD
eg. MOV AX , 4 * 1024 匯編后 MOV AX , 4096
-
邏輯運算符 —— AND 、OR 、XOR 、NOT
eg. MOV CL , 36H AND 0FH 匯編后 MOV CL , 06H
考點: 不要把邏輯運算符與邏輯運算指令混淆。
eg. AND AX , 3FC0H AND 0FF00H
匯編后源操作數(shù)被翻譯為 3F00H ,所以上述指令與 AND AX , 3F00H 等價。
-
關(guān)系運算符 —— EQ 、NE 、LT 、GT 、LE 、GE
關(guān)系運算的結(jié)果是一個邏輯值:真或假
關(guān)系為真,結(jié)果為全 1 ,關(guān)系為假,結(jié)果為全 0 。
eg.
MOV AX , 4 EQ 3 ; MOV AX , 0
MOV AX , 4 NE 3 ; MOV AX , 0FFFFH
(2)其它操作符
-
分析操作符
-
SEG 操作符
eg. MOV AX , SEG BUFF
-
OFFSET 操作符
eg. MOV BX , OFFSET BUFF
考點(以下指令的異同):
MOV BX , OFFSET BUFF
LEA BX , BUFF
上面前者是匯編時將偏移地址賦值給 BX ,而 LEA 是在 CPU 執(zhí)行時才賦值。
eg. BUFF DB 01H , 02H , 03H
① MOV AX , BUFF (×) BUFF是三個字節(jié),不能賦給兩個字節(jié)的 AX
② MOV AL , BUFF ; MOV AL , BUFF[1]
前者是將 BUFF 得第一個字節(jié)賦值給 AL ,后者是將第二個字節(jié)賦值給 AL
③ LEA BX , BUFF ; MOV AL , [BX] ; MOV AK , [BX+1]
更推薦上面這些表達方式。
-
-
綜合運算符
功能: 用于指定其后儲存器操作數(shù)的類型。
-
PTR 運算符
格式:<類型> PTR <地址操作數(shù)>
類型包含 BYTE , WORD , DWORD , NEAR , FAR
eg. 假設 VAR 定義字變量
MOV AL , VAR
MOV AL , BYTE PTR VAR
-
ORG 偽指令
ORG 規(guī)定了段內(nèi)的指令或數(shù)據(jù)存放的開始地址(偏移地址的初值),從此地址起連續(xù)存放程序或數(shù)據(jù)。
格式: ORG <表達式>
eg. OEG 100H
-
地址計數(shù)器 $
這個是匯編程序?qū)iT設置的一個表示當前位置的計數(shù)器,正常情況下,匯編沒掃描一個字節(jié),位置計數(shù)器的值便加 1 。
語句:
ARRAY DW 1234H , 5678H
COUNT EQU $ - ARRAY
含義: COUNT 值就是 ARRAY 中數(shù)據(jù)所占的字節(jié)數(shù)。
語句:
JMP $
含義: 程序跳轉(zhuǎn)到本條指令執(zhí)行,起到延時作用。
-
5. 過程定義和宏定義偽指令(中斷)
(1)過程定義語句
過程(子程序):一段具有特定功能的,供其它程序調(diào)用的公用程序。
【格式】
(2)調(diào)用 CALL
CALL 指令完成調(diào)用子程序的功能。
CALL 指令將程序的返回地址(CALL 的下一條指令地址)壓入堆棧中保存。斷點保護,自動執(zhí)行。
如果是進調(diào)用則將目標的偏移地址等于 IP ,若為遠調(diào)用則再將目標的段地址等于 CS ,尋址和 JMP 相同。
如果是近調(diào)用,則堆棧中只保存返回地址的偏移地址;若是遠調(diào)用,則還必須保存返回地址的段地址。
(3)RET n 指令
在子程序中,最后一條指令必須返回指令 RET ,它將堆棧中保存的返回地址自動彈出至 CS 和 IP 。
返回地址彈出后,它使 SP 值在正常返回之后的基礎上再加上 n(n 為偶數(shù))。
(4)子程序設計
重點:
- 斷點保護通過調(diào)用CALL指令,返回RET指令自動執(zhí)行。(斷點保護,自動運行)
- 調(diào)用前要預先確定子程序中要使用哪些寄存器,并定義入口參數(shù)和出口參數(shù)。參數(shù)傳遞可利用寄存器、存儲單元或堆棧(要用BP尋址)
- 進入子程序后首先要保護主程序的運行狀態(tài),保護子程序使用的非參數(shù)寄存器(包括標志位) (稱為保護現(xiàn)場),退出子程序前要恢復現(xiàn)場。(現(xiàn)場保護,手動運行)
(5)宏定義偽指令
【格式】
eg.
宏定義與子程序的區(qū)別:宏定義是拿空間換時間。
(6)中斷指令和中斷返回指令
8086/8088 CPU 在程序中允許安排一條中斷指令來引起一個中斷過程,這種中斷叫內(nèi)部中斷,或叫軟中斷。被中斷的指令地址處稱為斷點。
-
INT n
中斷的分類:
- INT 0 - INT 4 :專用中斷
- INT 5 - INT 31H :備用中斷
- INT 32 - INT 0FFH :用戶中斷
-
入口地址
格式: INT n
入口地址的地址: n × 4
中斷和子程序的區(qū)別:
1、中斷里入口地址是固定的。
2、中斷里 FR 是自動保護,而子程序是需要手動。
3、中斷的事件是隨機發(fā)生的,而子程序是調(diào)用發(fā)生的。
6. 匯編語言程序設計
(1)常用匯編語言程序框架 (考點):
(1)匯編語言程序設計基本步驟(匯編面試高頻題)
1、分析問題,確定模型
2、確定算法
3、繪制流程圖 → 程序結(jié)構(gòu)
4、編寫程序
5、檢查和調(diào)試
總結(jié)
以上是生活随笔為你收集整理的【微机原理笔记】第 4 章 - 8086 汇编语言程序设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外挂的艺术-单机游戏辅助工具-网络游戏外
- 下一篇: 高斯模糊java代码_OpenCV3 J