1 前言
搞計算機的肯定聽說過80x86,至少你的匯編基礎(chǔ)課程肯定是基于80X86系統(tǒng)來學習的。
x86或80x86是英特爾Intel首先開發(fā)制造的一種微處理器體系結(jié)構(gòu)的泛稱。該系列較早期的處理器名稱是以數(shù)字來表示,并以“86”作為結(jié)尾,包括Intel 8086、80186、80286、80386以及80486,因此其架構(gòu)被稱為“x86”。由于數(shù)字并不能作為注冊商標,因此Intel及其競爭者均在新一代處理器使用可注冊的名稱,如Pentium。現(xiàn)時Intel把x86-32稱為IA-32,全名為“Intel Architecture, 32-bit”。
“X86”是Intel和其他幾家公司處理器所支持的一組機器指令集,它大致確定了芯片的使用規(guī)范。從8086到80186、80286、80386、80486,再到后來的奔騰系列以及現(xiàn)在的多核技術(shù),都是使用一脈相承的x86指令集,既不斷擴展又向后兼容。
更多介紹,請參考百度百科。
2 80x86知識圖譜
本文先列個大綱,后續(xù)有時間再補充。
![image-20220130234307648](https://file.elecfans.com//web2/M00/59/1A/pYYBAGLknheAOiIDAAC6u0tXPIc516.png)
3 80x86匯編基礎(chǔ)三大塊
這里整理了80x86匯編中非常基礎(chǔ)的三大塊知識,了解了這三大塊內(nèi)容基本可以看懂甚至編譯一些簡單的匯編程序。
3.1 尋址方式
80x86的尋址方式就是表示指令中數(shù)據(jù)所在地址的方式。一共有七種尋址方案:立即數(shù)尋址、寄存器尋址、直接尋址、寄存器直接尋址、寄存器相對選址、基址變質(zhì)尋址、相對基址變質(zhì)尋址。
3.1.1 立即數(shù)尋址 / 寄存器尋址
? MOV AX, 1; AX = 1
? 立即數(shù)尋址,我覺得稱不上尋址,因為他給出的不是地址,而就是實際的數(shù)字,上面的命令中 1 就是立即數(shù),而AX就是寄存器尋址所以寄存器尋址就是直接使用寄存器,數(shù)據(jù)直接存入指定的寄存器
? 寄存器尋址可以使用的寄存器是AX(AL AH) BX(BL BH) CX(CL CH) DX(DL DH) SI DI SP BP等, 這些寄存器可以任意組合,舉例如下
MOV AX, BX; AX = BX
MOV BX, AX; BX =AX
MOV SI, DI; SI = DI
MOV DI, SI; DI = SI
? 這兩種尋址方式是不涉及內(nèi)存的操作的,所以速度是最快的,所以為了性能考慮應(yīng)該盡量多的使用這兩種尋址方式的操作。
注意: MOV 1, AX 是非法的,應(yīng)為1就是常數(shù),你不能給常數(shù)賦值
3.1.2 直接尋址
MOV AX, [1234H]
MOV AX, ES:[1234H]
直接尋址就是直接給出內(nèi)存地址的尋址方式,格式是 段寄存器:[偏移地址] 偏移地址是立即數(shù),用[]括起來。當然也可以直接省去前面的段寄存器寫作 [偏移地址],這樣匯編會自動選擇一個默認的段地址,一般來說是DS段寄存器。前面講過內(nèi)存地址是 段地址X16+偏移地址,所以使用段寄存器:[偏移地址] 給出的地址就是 段寄存器的值X16 + 偏移地址,
舉例
MOV AX, DS:[1234H]
這句話的就是將DSx16+1234H處的數(shù)據(jù)復制給AX寄存器,假設(shè)DS=5000H 那么就是將內(nèi)存51234處的數(shù)據(jù)復制給AX,具體是多少就要看當時內(nèi)存中是什么數(shù)據(jù)了。
MOV AX, ES:[1234H]
就是顯示指定了使用的ES段寄存器,所以就是將ESx16+1234H處的數(shù)據(jù)復制給AX
注意 ":"前面只能跟著段寄存器 DS ES SS CS寄存器
這一條尋址方式其實是最基礎(chǔ)的尋址方式,接下來的其他幾種尋址方式都是只是[]中偏移地址的表示方式發(fā)生了一些變化而已。
3.1.3 寄存器直接尋址 / 基址尋址
MOV AX, [BX]
MOV AX,CS:[BX]
本質(zhì)上和直接尋址是沒太大區(qū)別的,唯一的區(qū)別就是在直接尋之中[]中的數(shù)據(jù)是直接給出的,但是在寄存器間接尋址中這個數(shù)字是存儲在寄存器中而已。
這里有個限制就是[] 中能使用的寄存器只有 BX BP SI DI ,如果使用的是BX SI DI則默認的段寄存器是DS,如果是BP寄存器則默認使用SS寄存器。
當然如果特意指定寄存器那么就用指定的寄存器。
舉例 AX =1 BX = 1111H DS = 5000H
MOV AX, [BX] ; 等于MOV AX,DS:[1111H] 就是將51111H內(nèi)存出的數(shù)據(jù)復制到AX中
3.1.4 寄存器相對尋址 / 相對基址尋址
MOV AX, [BX + 1111H]
在寄存器直接尋址的基礎(chǔ)上加上立即數(shù),其他規(guī)則還是和寄存器直接尋址一樣的
舉例 AX =1 BX = 2222H DS=5000H
MOV AX, [BX + 1111H] ; 等于 MOV AX, DS:[2222H + 1111H] => MOV AX, DS:[3333H]
### 3.1.5 基址變址尋址
MOV AX,[BX+SI]
基址變址尋址就是用了兩個寄存器 {BX/BP}+{SI/DI}, 如果是出現(xiàn)BP寄存器則默認使用SS寄存器,否則默認使用DS寄存器.規(guī)則和寄存器間接尋址也是一樣的。
要注意的是這里分為兩組了寄存器 BX/BP 和SI/DI,一組中只能出現(xiàn)一個,即不能出現(xiàn)[ BX+BP ] 和 [SI+DI],從名字中就可以看出的 基址+變址,
BX 基地址寄存器
BP 基址指針寄存器(Base Point)
SI 源地址寄存器(Source Index)
DI 目的地址寄存器(Destination Index)
舉例 AX =1 BX=1111H SI=2222H DS= 5000H
MOV AX,[BX+SI]; 等于 MOV AX, DS:[BX+SI] => MOV AX, DS:[1111H+2222H] => MOV AX, DS:[3333H]
### 3.1.6 相對基址變址尋址
MOV AX,[BX+SI+4444H]
可以看出就是在基址變址尋址的基礎(chǔ)上加上了立即數(shù)其他規(guī)則不變
舉例 AX =1 BX=1111H SI=2222H DS= 5000H
MOV AX,[BX+SI+4444H]; 等于 MOV AX, DS:[BX+SI+4444H] => MOV AX, DS:[1111H+2222H+4444H] => MOV AX, DS:[7777H]
3.2 寄存器的用途
80x86 CPU 中寄存器總共為 14 個,且均為 16 位 。
即 AX,BX,CX,DX,SP,BP,SI,DI,IP,F(xiàn)LAG,CS,DS,SS,ES 共 14 個。
而這 14 個寄存器按照一定方式又分為了通用寄存器,控制寄存器和段寄存器。
![image-20220130235215566](https://file.elecfans.com//web2/M00/58/7C/poYBAGLknhiAP9ZbAANSO4N_kd4829.png)
3.2.1 通用寄存器:
AX,BX,CX,DX 稱作為數(shù)據(jù)寄存器:
AX (Accumulator):累加寄存器,也稱之為累加器;
BX (Base):基地址寄存器;
CX (Count):計數(shù)器寄存器;
DX (Data):數(shù)據(jù)寄存器;
SP 和 BP 又稱作為指針寄存器:
SP (Stack Pointer):堆棧指針寄存器;
BP (Base Pointer):基指針寄存器;
SI 和 DI 又稱作為變址寄存器:
SI (Source Index):源變址寄存器;
DI (Destination Index):目的變址寄存器;
3.2.2 控制寄存器:
IP (Instruction Pointer):指令指針寄存器;
FLAG:標志寄存器;
3.2.3 段寄存器:
CS (Code Segment):代碼段寄存器;
DS (Data Segment):數(shù)據(jù)段寄存器;
SS (Stack Segment):堆棧段寄存器;
ES (Extra Segment):附加段寄存器;
3.3 匯編指令
由于80x86的指令非常多,本文僅列舉常見的一些匯編指令,更多的指令格式,請參考其他資料。
從功能分類上來說,一共可分為
- 數(shù)據(jù)傳送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。
- 算術(shù)指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。
- 邏輯指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。
- 控制轉(zhuǎn)移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。
- 串操作指令:MOVS、LODS、STOS、CMPS、SCAS。
- 標志處理指令:CLC、STC、CLD、STD。
4 更多分享
歡迎關(guān)注我的github倉庫01workstation,日常分享一些開發(fā)筆記和項目實戰(zhàn),歡迎指正問題。
同時也非常歡迎關(guān)注我的專欄:有問題的話,可以跟我討論,知無不答,謝謝大家。
5 參考鏈接
- 80x86尋址方式
- 80x86寄存器
- 80x86指令
以上參考資料,由本人整理,但來源于網(wǎng)絡(luò),侵刪!
-
匯編
+關(guān)注
關(guān)注
2文章
214瀏覽量
26022 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1306瀏覽量
40436
發(fā)布評論請先 登錄
相關(guān)推薦
RT-Thread上CAN實踐
![<b class='flag-5'>RT-Thread</b>上CAN實踐](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
開源共生 商業(yè)共贏 | RT-Thread 2024開發(fā)者大會報名啟動!
![開源共生 商業(yè)共贏 | <b class='flag-5'>RT-Thread</b> 2024開發(fā)者大會報名啟動!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
【大連】9月7日RT-Thread巡回線下培訓-OpenMV機器視覺
![【大連】9月7日<b class='flag-5'>RT-Thread</b>巡回線下培訓-OpenMV機器視覺](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
獲獎公布!2024 RT-Thread全球巡回線下培訓火熱來襲!報名提問有獎!
2024 RT-Thread全球巡回 線下培訓火熱來襲!
![2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓火熱來襲!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread 新里程碑達成——GitHub Star 破萬!
![<b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
6月6日杭州站RT-Thread線下workshop,探索RT-Thread混合部署新模式!
![6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
5月16日南京站RT-Thread線下workshop,探索RT-Thread混合部署新模式!
![5月16日南京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread混合部署Workshop北京站來啦!
![<b class='flag-5'>RT-Thread</b>混合部署Workshop北京站來啦!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
4月25日北京站RT-Thread線下workshop,探索RT-Thread混合部署新模式
![4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
【4月10日-深圳-workshop】RT-Thread帶你探索混合部署新模式
![【4月10日-深圳-workshop】<b class='flag-5'>RT-Thread</b>帶你探索混合部署新模式](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!
![4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C6/D0/wKgaomYDlJyAKUBmAAAgR-TqYwc187.png)
4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!
![4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
恩智浦半導體正式加入RT-Thread全球合作伙伴計劃!
![恩智浦半導體正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴計劃!](https://file1.elecfans.com/web2/M00/C5/31/wKgaomXyY_eAHGhqAAAkpBZI8PE901.png)
RT-Thread設(shè)備驅(qū)動開發(fā)指南基礎(chǔ)篇—以先楫bsp的hwtimer設(shè)備為例
![<b class='flag-5'>RT-Thread</b>設(shè)備驅(qū)動開發(fā)指南基礎(chǔ)篇—以先楫bsp的hwtimer設(shè)備為例](https://file1.elecfans.com/web2/M00/C1/40/wKgaomXUXOGAMhesAAAk3OUcwHA076.png)
評論