20192413宗俊豪組合語言程式設計學習總結
組合語言學習總結——20192413宗俊豪
第一章 組合語言的基本概念
-
字母或符號表示機器語言的命令
-
十進位制數或十六進位制數表示資料
-
一條組合語言的語句與一條機器語言指令對應
-
組合語言程式與機器語言程式效率相同
一、進位計數制
B——二進位制數
O——八進位制數
D——十進位制數
H——十六進位制數
1.十進位制轉二進位制:(1)減權定位法 (2)除(乘)基取餘法
2.二進位制轉十進位制:(1)按權相加法 (2)逐次乘(除)積相加法
3.二進位制與八進位制十六進位制的轉換:3對1、4對1
二、帶符號數的表示
0和1表示正數和負數
1.原碼
0的原碼:00000000和10000000
2.補碼
[X]補=M+X
三、補碼變換
-
正數原碼和補碼相同
-
負數真值變補碼:各位變反,最低位加1
-
負數原碼變補碼:符號位不變,各位變反,最低位加1
-
0的補碼只有00000000,10000000是-128補碼,11111111是-1的補碼
四、補碼加減運算
-
[X+Y]補=[X]補+[Y]補
-
[X-Y]補=[X]補-[Y]補=[X]補+[-Y]補
([-Y]補是將[Y]補連通符號位一起求反再最低位加1)
第二章 微機結構
一.CPU
運算器+控制器
功能:分析指令功能、控制各項操作
1.CPU執行指令:從儲存器中取指令 執行指令規定的操作
序列方式和指令流水線方式
-
序列方式:CPU指令執行階段不需要佔用系統匯流排,CPU和匯流排利用率低,執行速度較慢
-
指令流水線方式:工作效率較高 執行單元EU+匯流排介面單元BIU
EU:取指令、運算、向BIU傳送命令
BIU:負責CPU與儲存器、IO的資訊傳遞
CPU暫存器:8個通用暫存器+2個控制暫存器+4個段暫存器
CPU訪問儲存器時:段+偏移量
通用暫存器:累加器AX、基址暫存器BX、計數暫存器CX、資料暫存器DX、堆疊暫存器SP、基址指標BP、源變址暫存器SI、目的變址暫存器DI
-
資料暫存器:AX、BX、CX、DX
例:MOV AX,BX
-
指標暫存器:SP、BP 一般做偏移量使用 SP指標指向堆疊頂部,BP指標指向堆疊段內某一儲存單元
-
變址暫存器:SI、DI,做地址指標
-
控制暫存器:指令指標IP、標誌暫存器FLAGS
段暫存器:程式碼段暫存器CS、資料段暫存器DS、附加段暫存器ES、堆疊段暫存器SS
標誌暫存器:反映CPU在程式執行時的某些狀態,如是否有進位、奇偶性等 分為狀態標誌、控制標誌
2.主儲存器
存放程式和資料
-
儲存器的容量:儲存單元的多少 儲存單元有唯一的編號(儲存地址)
-
多數以位元組為基本單位,每個基本單位稱為一個儲存單元
(CPU+主儲存器稱為主機)
特點:
-
段基址 一個小節的首址
-
16個位元組稱為一個小節,1M記憶體可劃分為64K小節
-
邏輯段有4種情況:鄰接、間隔、部分重疊、完全重疊
(記憶體中一個物理儲存單元可以映像到一個或多個邏輯段中) -
任意時刻一個程式只能訪問4個當前段中的內容
堆疊:用於暫存資料以及斷點資訊 先進後出 資料在堆疊中以字為單位存放
3.系統匯流排
分為地址匯流排、資料匯流排、控制匯流排
第三章 定址方式與指令系統
一、定址方式
指令:操作碼+運算元
提供運算元方法:
-
立即數運算元
-
暫存器運算元
-
儲存器運算元
-
IO埠運算元
定址方式:
-
立即數定址 運算元直接在指令程式碼中
MOV AH,20H
不另外佔用匯流排週期,執行速度快 -
暫存器定址
MOV AX,BX
CPU內部進行不需要匯流排週期,執行速度快 -
儲存器定址
(1)直接定址MOV BX,DS:VAR
(段基址DS,偏移量VAR)MOV BX,DS:[64H]
(段基址DS,偏移量100位元組,注意中括號)
(2)間接定址
通過暫存器取運算元
指示儲存器所在段的段暫存器:BP——SS,其餘DSMOV AX,[BX]——MOV AX,DS:[BX]
-
基址定址/變址定址
運算元EA=基址/變址+位移量
隱含使用規則同間接定址
位移量為常數是不能加方括號 -
基址變址定址
運算元EA=基址+變址+位移量 -
串操作定址方式
特點:尋找源運算元用SI做地址指標
尋找目的串時用DI做地址指標
串操作完成之後自動對SI和DI進行修改 -
I/O埠定址
(1)儲存器編制方法
將I/O埠視為儲存器的一個單元,訪問埠等同於訪問儲存單元
特點:程式設計靈活,但需要佔用儲存地址空間
(2)I/O埠編址方法
I/O埠的地址與儲存器地址分開,用專門的輸入指令和輸出指令-
直接埠定址
0-255個埠IN AL,25H
-
間接埠定址
用DX作為間接定址暫存器MOV DX,378H
OUT DX,AL
-
二、指令系統
分類:
1.傳送類指令
2.算術運算類指令
3.位操作類指令
4.串操作類指令
5.程式轉移類指令
6.處理器控制類指令
雙運算元指令:OPR DEST SRC
單運算元指令:OPR DEST
無運算元指令:OPR
一.傳送類指令
1.通用資料傳送指令
MOV DEST,SRC(對標誌暫存器的各位無影響)
- 段暫存器CS只能做源運算元,不能做目的運算元
- 儲存單元之間不能直接傳送資料
2.交換指令
XCHG DEST,SRC(對標誌暫存器的各位無影響)
- 暫存器之間或暫存器與儲存器單元之間進行
- 不能儲存單元之間
3.標誌傳送指令
4條都是無運算元指令(隱含運算元)
(1)取標誌暫存器指令LAHF
標誌暫存器的低八位送入AH暫存器,即將標誌SF、ZF、AF、PF、CF分別送入AH的第7、6、4、2、0位
(對標誌暫存器的各位無影響)
(2)儲存標誌暫存器指令SAHF
與取標誌暫存器指令相反
(3)標誌進棧指令PUSHF
(4)標誌出棧指令POPF
4.地址傳送指令
將儲存單元的地址送暫存器
(1)裝入有效地址LEA DEST,SRC
SRC是一個位元組或字儲存器運算元,DEST必須是一個16位通用暫存器
作用:將SRC儲存單元地址中的偏移量即有效地址傳送到一個16位通用暫存器中
(對標誌暫存器的各位無影響)LEA AX,[BX][SI]
源運算元是基址變址定址方式(存偏移量!不是存內容!)
(2)裝入地址指標指令LDS DEST,SRC
LES DEST,SRC
DEST是16位通用暫存器,SRC必須是一個儲存器運算元
將SRC儲存單元開始的4個位元組單元的內容(32位地址指標)送入DEST通用暫存器和段暫存器DS(LDS)或ES(LES)
低字單元內容為偏移量送通用暫存器,高字單元內容為段基值送DS或ES
二、算數運算類指令
1.加法指令
ADD DEST,SRC
-
影響標誌暫存器CF、PF、AF、ZF、SF、OF
-
DEST不能是立即數
-
SRC和DEST不能都為儲存器運算元
2.帶進位加法指令
ADC DEST,SRC
- DEST<=DEST+SRC+CF(進位標誌)(進行運算前的CF值)
3.加1指令
INC DEST
-
影響標誌暫存器PF、AF、ZF、SF、OF
-
用於某些計數器的技術和修改地址指標
4.減法指令
SUB DEST,SRC
-
影響標誌暫存器CF、PF、AF、ZF、SF、OF
-
DEST不能是立即數
-
SRC和DEST不能都為儲存器運算元
5.帶借位減法
SBB DEST,SRC
- DEST<=DEST-SRC-CF
6.減1指令
DEC DEST
- 影響標誌暫存器PF、AF、ZF、SF、OF
7.求負數指令
NEG DEST
-
也叫取補指令
-
當位元組運算元為-128或字運算元為-32768時執行指令運算元無變化但溢位標誌OF被置1
三、位操作類指令
1.邏輯運算指令
與 AND
或 OR
異或 XOR
非 NOT
NOT對標誌位無影響
其餘影響SF、ZF、PF,CF和OF總是置0,AF不確定
2.測試指令
TEST DEST,SRC
邏輯與,但不送入DEST
3.移位/迴圈移位指令
(1)算數移位
SAL DEST,COUNT算數左移 最高位移入CF,最低位補0
SAR DEST,COUNT算數右移 最低位移入CF,最高位不變(符號位)
當COUNT等於n時其作用相當於乘或除以2的n次方
(2)邏輯移位
SHL DEST,COUNT邏輯左移 與算數左移一樣
SHR DEST,COUNT邏輯右移 最高位補0
(3)迴圈移位
小迴圈:
ROL DEST,COUNT迴圈左移 最高位移入CF和最低位
ROR DRST,COUNT迴圈右移 最低位移入CF和最高位
大迴圈:
RCL DEST,COUNT帶進位的迴圈左移 最高位進CF,CF的值進最低位
RCR DEST,COUNT帶進位的迴圈左移 最低位進CF,CF的值進最高位
共同點:
- 移位次數為1是使用常數1或暫存器CL
- 移位次數大於1必須使用暫存器CL
- 算術移位和邏輯移位會修改CF、PF、ZF、SF、OF,AF不確定
- 迴圈移位只修改CF和OF
四、處理器控制類指令
1.標誌位操作指令
能操作的標誌位:CF、IF、DF
(1)清除進位標誌CLC:置CF為0
(2)置1進位標誌STC:置CF為1
(3)進位標誌取反CMC:CF的值取反
(4)清除方向標誌CLD:置DF為0
(5)置1方向標誌STD:置DF為1
(6)清除中斷標誌CLI:置IF為0
(7)置1中斷標誌STI:置IF為1
2.與外部事件同步的指令HLF:暫停指令
WAIT:等待指令
ESC:外部協處理器指令字首
LOCK:匯流排鎖定指令
3.空操作指令 NOP
執行一次NOP佔用CPU3個時鐘週期,用來延時
指令編碼
一、雙運算元指令編碼格式
運算元兩種情形:
1.一個運算元在暫存器中,另一個運算元在暫存器或者儲存器中
2.目的運算元在暫存器或儲存器中,源運算元是立即數
目的碼長度為2-6個位元組:操作特徵1位元組+定址特徵1位元組+位移量2位元組+立即數2位元組
1.操作特徵
(1)OPCODE:操作碼欄位
- 表示該指令所執行的功能和兩個運算元的來源
- 若源運算元是立即數則需要使用指令編碼的第2位元組中的REG欄位做輔助操作碼
(2)方向欄位d
- 與第二部分定址特徵一起來決定源運算元和目的運算元的來源(源運算元為立即數時d欄位無效,被併入操作碼欄位)
(3)字/位元組欄位W
- W=1時為字,W=0時為位元組
2.定址特徵
- 與d結合指定定址方式和暫存器
- REG確定一個運算元,MOD和R/M欄位確定另一個運算元
- d=1時REG決定目的運算元,MOD和R/M決定源運算元
- d=0時MOD和R/M決定目的運算元,REG決定源運算元
(1)REG欄位
- 使用暫存器定址方式
- 與W配合使用有16種組合,可以分別指定16個通用暫存器
- 若指定段暫存器:000——ES,001——CS,010——SS,011——DS
(2)MOD和R/M
- 共同確定一個運算元(可在暫存器中也可在儲存器中)
3.位移量部分
- 分為:沒有位移量、1位元組位移量disp8、2位元組位移量disp16
4.立即數部分
二、單運算元指令編碼格式
2-3位元組 操作特徵+定址特徵+位移量
(1)操作特徵
OPCODE+V+W三個欄位
V欄位只有位移/迴圈指令中才有:V=0用常數1作為COUNT,V=1用暫存器CL作為COUNT
(2)定址特徵
不需要REG欄位,該欄位被用作輔助操作碼
三、與AX或AL有關的指令編碼格式
用於隱含指定AX/AL作為一個運算元的雙運算元指令(另一個數可以是立即數或儲存單元)
四、其他指令編碼格式
標誌位操作指令
堆疊操作指令
一般只有一個位元組
第四章 組合語言程式格式
一、組合語言語句種類及其格式
指令語句(可執行語句)
標號:指令助記符 運算元,運算元;註釋
1.標號欄位
- 可選欄位
- 是一條指令的符號地址,代表了該指令的第一個位元組存放地址
- 一般放在一個程式段或子程式的入口處
2.指令助記符欄位
- 必選項
- 可在助記符前邊加上字首實現附加操作
3.運算元欄位
- 數量不定
4.註釋欄位
- 可選欄位
偽指令語句(命令語句)
本身不產生對應的機器目的碼
符號名 偽指令符 運算元;註釋
1.符號名欄位
- 可選項
- 根據偽指令的不同可以是常量名、變數名、過程名、結構名和記錄名等
- 偽指令符號名可以作為其他偽指令語句或指令語句的運算元,表示一個敞亮或儲存器地址
2.偽指令符欄位
- 必選項
- 偽指令功能
3.運算元欄位、註釋欄位
- 同指令欄位
識別符號
標號和符號名統稱為識別符號
規則:
- 字元個數為1-31個
- 第一個字元必須是字母、問號、@或下劃線
- 第二個字元開始可以是字母、數字、@、下劃線或問號
- 不能使用系統專用的保留字
二、組合語言資料
常數
1.二進位制數
2.八進位制數
3.十進位制數
4.十六進位制數 首位為字母在前邊加0
5.實數 整數部分.小數部分E+指數部分 例:2.134E+10
6.字串常數 儲存時以ASCII碼的形式儲存
使用:
(1)作指令語句的源運算元
(2)在指令語句的直接定址方式、變址(基址)定址方式或基址變址定址方試中作位移量
(3)在資料定義偽指令中使用
變數
- 變數用來表示存放資料的儲存單元
- 程式中以變數名的形式來訪問變數,可以認為變數名就是存放資料的儲存單元地址
1.變數的定義與預置
- 就是給變數在記憶體中分配一定的儲存單元
- 格式:
變數名+DB(位元組變數)/DW(字變數)/DD(4位元組變數)/DQ(8位元組變數)/DT(10位元組變數)+表示式1,表示式 2(儲存單元賦的初值)....
變數被定義後有了三個屬性:
(1)段屬性
表示變數存放在哪一個邏輯段中
(2)偏移量屬性(OFFSET)
表示變數所在位置與段起始點之間的位元組數
段屬性和偏移量屬性夠早了變數的邏輯地址
(3)型別屬性
表示變數佔用儲存單元的位元組數
賦初值形式:
(1)數值表示式
例如:
DATA1 DB 32,30H
(2)?表示式
表示可以預置任意內容
例如:
DA-BYTE DB ?,?,?
(3)字串表示式
字串為用引號括起來的不超過255個字元。給每一個字元分配一個位元組單元。字串俺從左到右將字元的ASCII編碼值以地址遞增的排列順序依次存放
例如:
STRING1 DB ‘ABCDEF’
對於DD偽指令,只能給兩個字元組成的字串分配4個位元組單元
兩個字元存放在較低地址的兩個位元組單元中,較高地址的兩個位元組單元存放0
DW和DD偽指令不能用兩個以上字元構成的字串賦初值否則將出錯
(4)DUP表示式
重複資料操作符
變數名+DB/DW/DD+表示式1 DUP(表示式2)
表示式1是重複的次數,表示式2是重複的內容
DUP可以巢狀使用
2.變數的使用
(1)在指令語句中引用
在指令語句中直接引用變數名就是對其儲存單元的內容進行存取
變量出現在變址(基址)定址或基址變址定址的運算元中時表示取用該變數的偏移量
(2)在偽指令語句中引用
標號
(1)段屬性
(2)偏移量屬性
(3)距離屬性(型別屬性)
三、符號定義語句
1.等值語句
(1)一般格式
符號名 EQU 表示式
- 左邊的符號名代表右邊的表示式。
注意:等價語句不會給符號名分配儲存空間,符號名不能與其它符號同名,也不能被重新定義。
(2)用符號名代表常量或表示式
- 當把一個常量或表示式定義成一個具有一定含義的符號名後,在程式中就可以用該符號名來代表該常量或表示式。
(3)用符號名代表字串
- 用一個具有一定含義的符號名定義某一個較長的字串,在隨後的程式中就用該符號名。
(4)用符號名關鍵字或指令助憶符
- 用一個(組)程式設計師自己習慣的符號名來代替組合語言中的關鍵字或指令助憶符。
2.等號語句
- 組合語言提供了用等號來定義符號常數的方法,即可用符號名代表一個常數。
格式:
符號名=數值表示式
四、表示式與運算子
1.算術運算子
+ , - , x , / , MOD,SHR,SHL
2.邏輯運算子
AND, OR, NOT, XOR
3.關係運算符
EQ、NE、LT、LE、GT、GE
4.數值返回運算子
(1)SEG運算子
取變數或標號所在段的段基值
(2)OFFSET運算子
取標量或標號在段內的偏移量
(3)TYPE運算子
取變數或標號的型別屬性,並用數字形式表示
(4)LENGTH運算子
取變數的長度
(5)SIZE運算子
只能作用於變數
五、程式的段結構
-
段定義偽指令
1.段名
使用者任意選定,符合識別符號規則的一個名稱
2.定位型別
3.組合型別 -
段定址偽指令
作用:告訴彙編程式,在處理源程式時,定義的段與哪個暫存器關聯
六、標題偽指令
語句格式 TITLE 標題名
七、從程式返回作業系統的方法
1.使用程式段字首PSP實現返回
2.使用DOS系統功能呼叫實現返回
學習心得
學習完四章視訊後,我對於組合語言有了初步的瞭解與認識。第一章第二章中對於計算機組成原理中的知識進行了回顧,複習了原碼補碼等資料表示方面的知識以及CPU、主儲存器、匯流排等硬體知識;第三章中對於作業系統中的定址方式進行了複習並且以更深入的角度瞭解了定址的實質,同時在第三章中也以彙編的角度學習了定址的過程和指令系統的相關內容;第四章中是對組合語言的詳細講解,通過學習本章瞭解了組合語言資料的分類,以及一些定義語句的使用,對於組合語言的具體應用有了一定的印象,並且可以分析一些簡單的彙編程式碼。通過對於這四章的學習,認識到了組合語言的一定難度,但同時也對計算機的執行本質有了進一步的瞭解。在今後的學習中需要對掌握的內容進行更多的分析與實踐才能有更透徹的理解。