https://m.toutiaocdn.com/group/6728944023559471627/?app=news_article×tamp=1566713768&req_id=20190825141607110249203143D4ECBD51&group_id=6728944023559471627
早期的計(jì)算機(jī)很不靈活,每個(gè)設(shè)備要執(zhí)行的步驟都作為機(jī)器的一部分內(nèi)置在控制單元中了。為了提高靈活性,一些早期的電子計(jì)算機(jī)將CPU設(shè)計(jì)為可以方便地重新布線。這種靈活性是通過插拔裝置體現(xiàn)的,類似于老式電話交換臺(tái),跳線的端子插到接線孔中。
意識(shí)到程序可以像數(shù)據(jù)一樣編碼并存儲(chǔ)到主存中,這是一個(gè)重大的突破。如果控制單元被設(shè)計(jì)為從存儲(chǔ)器中獲取程序,解碼指令并執(zhí)行指令,那么只要更改計(jì)算機(jī)主存的內(nèi)容,就可以改變計(jì)算機(jī)運(yùn)行的程序,而不需要重寫CPU。
將計(jì)算機(jī)程序存入主存的想法被稱為存儲(chǔ)程序概念(Stored-Program Concept)。
為了應(yīng)用存儲(chǔ)程序概念,CPU被設(shè)計(jì)為可以識(shí)別編碼成位模式的指令。這組指令及相應(yīng)的編碼系統(tǒng)被稱為機(jī)器語言(Machine Language)。用機(jī)器語言表達(dá)的指令就叫作機(jī)器級(jí)指令,或機(jī)器指令(Machine Instruction)。
CPU所能完成的操作是由其執(zhí)行的指令決定的,這些指令稱為機(jī)器指令。CPU能執(zhí)行的所有機(jī)器指令的集合稱為該CPU的指令系統(tǒng)。指令系統(tǒng)設(shè)計(jì)的好壞、功能的強(qiáng)弱,會(huì)對(duì)整個(gè)計(jì)算機(jī)產(chǎn)生很大的影響,指令系統(tǒng)是計(jì)算機(jī)中硬件與軟件之間的接口。
指令是指揮計(jì)算機(jī)完成各種操作的基本命令,一般來說,一條指令包括兩個(gè)基本組成部分:操作碼和地址碼。
操作碼說明指令的功能及操作性質(zhì)。地址碼用來指出指令的操作對(duì)象,它指出操作數(shù)或操作數(shù)的地址及指令執(zhí)行結(jié)果的地址,類似于C語言的表達(dá)式及賦值語句。
按照指令中地址碼的數(shù)量,指令格式分為以下幾種:
三地址指令格式:OP A B C
A OP B → C
二地址指令格式:OP A B
A OP B → A
一地址指令格式:OP A
OP A → A
零地址指令格式:OP
如何對(duì)指令中的地址字段進(jìn)行解釋,以獲得操作數(shù)的方法或轉(zhuǎn)移地址的方法,操作數(shù)的位置可能在指令中、寄存器中、存儲(chǔ)器中或I/O端口中,常用的尋址方式有立即數(shù)尋址、直接尋址、寄存器尋址、寄存器間接尋址等。
2.1 立即數(shù)尋址方式
操作數(shù)作為指令的一部分而直接寫在指令中,這種操作數(shù)稱為立即數(shù),這種尋址方式也就稱為立即數(shù)尋址方式。
立即數(shù)可以是8位、16位或32位,該數(shù)值緊跟在操作碼之后。
在匯編語言中,規(guī)定:立即數(shù)不能作為指令中的第二操作數(shù)。該規(guī)定與高級(jí)語言中“賦值語句的左邊不能是常量”的規(guī)定相一致。
立即數(shù)尋址方式通常用于對(duì)通用寄存器或內(nèi)存單元賦初值。
如: MOV AX,2346H ;將16位立即數(shù)2346H送入寄存器AX。
2.2 寄存器尋址方式
指令所要的操作數(shù)已存儲(chǔ)在某寄存器中,或把目標(biāo)操作數(shù)存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助憶符)的尋址方式稱為寄存器尋址方式。
指令中可以引用的寄存器及其符號(hào)名稱如下:
8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;
16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;
32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器尋址方式是一種簡單快捷的尋址方式,源和目的操作數(shù)都可以是寄存器。
2.3 直接尋址方式
直接尋址方式是指操作數(shù)在存儲(chǔ)器中,操作數(shù)的有效地址(16位偏移量)直接包含在指令中。
2.4 寄存器間接尋址方式
寄存器間接尋址是將指定的寄存器內(nèi)容為地址,由該地址所指定的單元內(nèi)容作為操作數(shù)。
例如,設(shè)將內(nèi)部RAM的65H單元內(nèi)容(47H)送A,可執(zhí)行指令:MOV A,@R0,其中R0內(nèi)容為65H。
指令的執(zhí)行過程為:當(dāng)程序執(zhí)行到本指令時(shí),就以指令中所指定的工作寄存器R0的內(nèi)容(65H)為指針,將內(nèi)部數(shù)據(jù)存儲(chǔ)器65H單元的內(nèi)容(47H)送累加器A。
2.5 寄存器相對(duì)尋址方式
該尋址方式是以指定的寄存器內(nèi)容,加上指令中給出的位移量(8位或16位),并以一個(gè)段寄存器為基準(zhǔn),作為操作數(shù)的地址。指定的寄存器一般是一個(gè)基址寄存器或變址寄存器。
假設(shè)指令:MOV BX, [SI+100H],在執(zhí)行它時(shí),(DS)=1000H,(SI)=2345H,內(nèi)存單元12445H的內(nèi)容為2715H。
根據(jù)寄存器相對(duì)尋址方式的規(guī)則,在執(zhí)行本例指令時(shí),源操作數(shù)的有效地址EA為:
EA=(SI)+100H=2345H+100H=2445H
該操作數(shù)的物理地址應(yīng)由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2445H=12445H。
所以,該指令的執(zhí)行效果是:把從物理地址為12445H開始的一個(gè)字的值傳送給BX。
2.6 基址加變址尋址方式
基址加變址尋址方式是指將寄存器(該寄存器一般指基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個(gè)操作數(shù)的有效地址。
假設(shè)指令:MOV BX, [BX+SI],在執(zhí)行時(shí),(DS)=1000H,(BX)=2100H,(SI)=0011H,內(nèi)存單元12111H的內(nèi)容為1234H。
根據(jù)基址加變址尋址方式的規(guī)則,在執(zhí)行本例指令時(shí),源操作數(shù)的有效地址EA為:
EA=(BX)+(SI)=2100H+0011H=2111H
該操作數(shù)的物理地址應(yīng)由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2111H=12111H
所以,該指令的執(zhí)行效果是:把從物理地址為12111H開始的一個(gè)字的值傳送給BX。
2.7 相對(duì)基址加變址尋址方式
在相對(duì)基址變址尋址方式中,通常把BX和BP看作是基址寄存器,把SI和DI看作變址寄存器。它是把一個(gè)基址寄存器BX或BP的內(nèi)容,加上變址寄存器SI或DI的內(nèi)容,再加上指令中給定的8位或16位位移量,并以一個(gè) 段寄存器 作為地址基準(zhǔn),作為 操作數(shù) 的地址。
假設(shè)指令:MOV AX, [BX+SI+200H],在執(zhí)行時(shí),(DS)=1000H,(BX)=2100H,(SI)=0010H,內(nèi)存單元12310H的內(nèi)容為1234H。
根據(jù)相對(duì)基址加變址尋址方式的規(guī)則,在執(zhí)行本例指令時(shí),源操作數(shù)的有效地址EA為:
EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H
該操作數(shù)的物理地址應(yīng)由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2310H=12310H
所以,該指令的執(zhí)行效果是:把從物理地址為12310H開始的一個(gè)字的值傳送給AX。
3.1 數(shù)據(jù)傳送指令
這是一種常用的指令,用以實(shí)現(xiàn)寄存器與寄存器,寄存器與存儲(chǔ)單元以及存儲(chǔ)器單元與存儲(chǔ)器單元之間的數(shù)據(jù)傳送,對(duì)于存儲(chǔ)器來說,數(shù)據(jù)傳送包括對(duì)數(shù)據(jù)的讀(相當(dāng)于取數(shù)指令)和寫(相當(dāng)于存數(shù)指令)操作。
3.2 算術(shù)運(yùn)算指令
計(jì)算機(jī)指令系統(tǒng)一般都設(shè)有二進(jìn)制數(shù)加、減、比較和求補(bǔ)等最基本的指令,此外還設(shè)置了乘、除法運(yùn)算指令、浮點(diǎn)運(yùn)算指令以有十進(jìn)制動(dòng)算指令等。
3.3 邏輯運(yùn)算指令
一般計(jì)算機(jī)都具有與、或、非(求反)、異或(按位加)和測(cè)試等邏輯運(yùn)算指令。
3.4 移位操作指令
移位操作指令分為算術(shù)移位、邏輯移位和循環(huán)移位三種,可以實(shí)現(xiàn)對(duì)操作數(shù)左移或右移一位或若干位。
3.5 程序控制(轉(zhuǎn)移)類指令
主要有以下類別:
3.6 輸入輸出(I/O)指令。
計(jì)算機(jī)本身是數(shù)據(jù)處理和管理機(jī)構(gòu),不能產(chǎn)生原始數(shù)據(jù),也不能長期保存數(shù)據(jù)。所處理的一切原始數(shù)據(jù)均來自輸入設(shè)備,所得的處理結(jié)果必須通過外總設(shè)備輸出。
指令的功能是從I/O端口輸入(讀)數(shù)據(jù)到微處理器的累加器中,OUT指令的功能是將微處理器的累加器中的數(shù)據(jù)輸出(寫)到I/O端口中。
3.7 堆棧操作指令
堆棧是由若干個(gè)連續(xù)存儲(chǔ)單元組成的先進(jìn)后出(FILO)存儲(chǔ)區(qū),第一個(gè)送入堆棧中的數(shù)據(jù)存放在棧底,最后送入堆棧中的數(shù)據(jù)存放在棧頂。棧底是固定不變的,而棧頂卻是隨著數(shù)據(jù)的入棧和出棧在不斷變化。
堆棧指針sp總是指向已經(jīng)存入數(shù)據(jù)的棧頂(不是空單元),所以PUSH指令是將(SP)減2,后將內(nèi)容壓棧(即先修改SP是指指向空單元,后壓入數(shù)據(jù)),而POP是先從棧頂彈出一個(gè)字,后將堆棧指針SP加2。
3.8 字符串處理指令
字符串處理指令就是一種非數(shù)值處理指令,一般包括字符串傳送,字符串轉(zhuǎn)換(把一種編碼的字符串轉(zhuǎn)換成另一種編碼的字符串),字符串比較,字符串查找(查找字符串中某一子串),字符串匹配,字符串的抽取(提取某一子串)和替換(把某一字符串用另一字符串替換)等。
可以在代碼中設(shè)置斷點(diǎn)進(jìn)行調(diào)試然后查看調(diào)試窗口(Alt+8),即可看到C語言與匯編代碼的對(duì)照。
1: #include <iostream>
2: using namespace std;
3: int max(int a,int b)
4: {
00401550 push ebp
00401551 mov ebp,esp
00401553 sub esp,40h
00401556 push ebx
00401557 push esi
00401558 push edi
00401559 lea edi,[ebp-40h]
0040155C mov ecx,10h
00401561 mov eax,0CCCCCCCCh
00401566 rep stos dword ptr [edi]
5: if(a>=b)
00401568 mov eax,dword ptr [ebp+8]
0040156B cmp eax,dword ptr [ebp+0Ch]
0040156E jl max+25h (00401575)
6: return a;
00401570 mov eax,dword ptr [ebp+8]
00401573 jmp max+28h (00401578)
7: else
8: return b;
00401575 mov eax,dword ptr [ebp+0Ch]
9: }
00401578 pop edi
00401579 pop esi
0040157A pop ebx
0040157B mov esp,ebp
0040157D pop ebp
0040157E ret
10: void main()
11: {
00401590 push ebp
00401591 mov ebp,esp
00401593 sub esp,44h
00401596 push ebx
00401597 push esi
00401598 push edi
00401599 lea edi,[ebp-44h]
0040159C mov ecx,11h
004015A1 mov eax,0CCCCCCCCh
004015A6 rep stos dword ptr [edi]
12: int i = 0;
004015A8 mov dword ptr [ebp-4],0
13: i=max(3,4);
004015AF push 4
004015B1 push 3
004015B3 call @ILT+500(max) (004011f9)
004015B8 add esp,8
004015BB mov dword ptr [ebp-4],eax
14: cout<<i;
004015BE mov eax,dword ptr [ebp-4]
004015C1 push eax
004015C2 mov ecx,offset std::cout (0047be90)
004015C7 call @ILT+245(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010fa)
15:
16: }
004015CC pop edi
004015CD pop esi
004015CE pop ebx
004015CF add esp,44h
004015D2 cmp ebp,esp
004015D4 call __chkesp (00420310)
004015D9 mov esp,ebp
004015DB pop ebp
004015DC ret
-End-
聯(lián)系客服