?指令是計算機計算CPU根據人的意圖來執行某種操作的命令。一臺計算機所執行的全部指令的集合,稱為這個CPU的指令系統。而想要使計算機按照人們的要求完成一項工作,就必須讓CPU按順序執行預設的操作,即逐條執行人們編寫的指令。這種按照人民要求所編排的序列,稱為程序。編寫程序的過程叫做程序設計。程序時機語言就是編寫程序的一整套規則和方法,是實現人機交互的工具,分為機器語言、匯編語言和高級語言。我們本篇要了解的就是匯編語言。
匯編語言是用助記符、符號和數字等來表示指令的程序語言,相對于機器語言來說,匯編語言容易理解和記憶。接下來讓我們一起來學習一下匯編語言格式的基礎知識吧。
匯編語言格式
MCS-51匯編語言指令由4部分組成,其一般格式如下:
[標號:]? ? ? ?操作碼? ? ? [操作數]? ? ? [;注釋]
格式中的方括號表示可以沒有相應部分,可見,可以沒有標號、操作數和注釋,但至少要有操作碼。
其操作數最多可以是3項:
[操作數1]? ?[,操作數2]? ?[,操作數3]
操作數1常稱為目的操作數,操作數2稱為源操作數,操作數3多為跳轉的目標。
例如:START : MOV? ? ? ?A,#23? ? ?;23H→A
這里“START”為標號,“MOV”是操作碼,“A,#23H”是操作數,“23H→A”為注釋。
標號是相應指令的標記,便于查找,用于程序入口、循環等。
操作碼規定了指令所要執行的操作,由2~5個英文字母表示。例如:MOX,ADD,RRC,JZ等。
操作數指出參與操作的數據來源、操作結果存放的地方以及跳轉的目標位置。(操作數可以是一個數(立即數),也可以是數據所在的空間地址,即在執行指令時從指定的空間地址讀取或寫入數據)
注釋主要使程序容易閱讀。
上面一堆話看著頭大:總結一下就是匯編指令由四個部分:標號、操作碼、操作數和注釋;操作數是必有的;一般都是操作碼和操作數(有時候還會有注釋)(例如:MOV A)
操作碼和操作數都有對應的二進制代碼,指令代碼由若干字節組成;根據字節數不同分為:
單字節指令、雙字節指令、三字節指令。
1.單字節指令
(1)指令碼中隱含著對某個寄存器的操作
例如:"INC A","MUL AB"等指令,只需要一個8個二進制代碼就能表示出執行什么操作、操作數是哪個。
比如數據指針增加1指令“INC DPTR”,其二進制指令代碼是A3H,格式如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? 0? ? ? ? ? 1? ? ? ? ? ?0? ? ? ? ? ?0? ? ? ? ? ? 0? ? ? ? ? ? 1? ? ? ? ? ? 1
(2)?由指令碼中的 r? r? r 或 i 指定操作數。
如累加器A向工作寄存器傳送數據指令“MOV? Rn,A”,其指令格式為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? 1? ? ? ? ? 1? ? ? ? ? ?1? ? ? ? ? ?1? ? ? ? ? ? ?r? ? ? ? ? ?r? ? ? ? ? ? r
?2.雙字節指令
用1B表示操作碼,另1B表示操作數或操作數所在的地址。
其指令格式:
? ? ? ? ? ? ? ? ?操作碼? ? ? ? ? ? ? ? ?立即數或地址
MSC-51共有45條雙字節指令。
3.三字節指令
用1B表示操作碼,另外2B表示操作數或操作數所在的地址。
其指令格式:?
?? ? ? ? ? ? ? ? ?操作碼? ? ? ? ? ? ? ? ?立即數或地址? ? ? ? ? ? ? 立即數或地址
?上面部分不是很理解的同學不用著急,可以再看一遍熟悉一下,后面多看一些指令會幫助理解一些。接下來我們講一下尋址方式。
尋址方式
所謂尋址方式,是值CPU尋找參與運算的操作數的方式,或者尋找數據保存位置的方式。這一部分非常重要,大家要認真學習哦。里面的舉例如果看不懂的同學先不急,后面會講到指令系統分類,可以先大致了解一下了之后看最后一部分,然后再回來看這部分的例子哦。
立即尋址
立即尋址也稱立即數,它是在指令操作數中直接給出參加運算的操作數,其指令格式如
下:
如:? ? MOV? ?A ,? #70H? ;
這條指令的功能是將立即數70H傳送到累加器A中。
直接尋址
在直接尋址方式中,指令操作數域給出的是參加運算操作數地址。直接尋址方式只能用來表示特殊功能寄存器、內部數據寄存器和位地址空間。其中特殊功能寄存器和位地址空間只能用直接尋址方式訪問。
如:? ? ? ANL? 70H ,? ?#48H
表示70H單元中的數與立即數48H相“與”,結果存放在70H單元中。其中70H為直接地
址,表示內部數據存儲器RAM中的一個單元。
間接尋址
間接尋址采用R0或R1前添加“@”符號來表示。
例如,假設R1中的數據是40H,內部數據存儲器40H單元所包含的數據為55H,那么如下指令:
? ? MOV? ? ? ? A,? @R1
把數據55H傳送到累加器。
寄存器尋址
寄存器尋址是對選定的工作寄存器R7~RO、累加器A、通用寄存器B、地址寄存器和進位C中的數進行操作。其中寄存器R7~RO由指令碼的低3位表示,ACC、B、DPTR及進位位C隱含在指令碼中。因此,寄存器尋址也包含一種隱含尋址方式。
寄存器工作區的選擇由程序狀態字寄存器PSW中的RS1、RSO來決定。指令操作數指定的寄存器均指當前工作區中的寄存器。
如:? ? ? INC? ? R0? ? ?;(R0)+1→>R0
表1 低3位操作碼與寄存器Rn的關系
低3位r? r? r | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
寄存器Rn | R0 | R1 | R2 | R3 | R4 | R5 | R6 | R7 |
指令尋址
絕對尋址
絕對尋址是在指令的操作數中,直接提供目標位置的地址或地址的一部分。
例如:LJMP? ?SER_INT_T1? ? ;無條件跳轉到T1中斷服務程序SER_INT_T1? ?
相對尋址
相對尋址是將程序計數器PC中的當前值與指令第二字節給出的數相加,其結果作為轉移指令的轉移地址。轉移地址也稱為轉移目的地址,PC中的當前值稱為基地址,指令第二字節給出的數稱為偏移量。由于目的地址是相對于PC中的基地址而言,所以這種尋址方式稱為相對尋址。偏移量為帶符號的數,所能表示的范圍為+127 ~-128。這種尋址方式主要用于轉移指令。
如:? ?JC? ? ?80H? ? ;C=1 跳轉
表示若進位位C為0,則程序計數器PC中的內容不改變,即不轉移。若進位位C為1,則以PC
中的當前值為基地址,加上偏移量80H后所得到的結果作為該轉移指令的目的地址。
變址尋址
在變址尋址方式中,指令操作數指定一個存放變址基值的變址寄存器。變址尋址時,偏移量與變址基值相加,其結果作為操作數的地址。變址寄存器有程序計數器PC和地址寄存器DPTR
如:? ?MOVC? ? ?A, @A+DPTR
表示累加器A為偏移量寄存器,其內容與地址寄存器DPTR中的內容相加,其結果作為操作數的地址,取出該單元中的數送入累加器A。
位尋址
位尋址是指對一些內部數據存儲器RAM和特殊功能寄存器進行位操作時的尋址。在進行位操作時,借助于進位位C作為位操作累加器,指令操作數直接給出該位的地址,然后根據操作碼的性質對該位進行位操作。位地址與字節直接尋址中的字節地址形式完全一樣,主要由操作碼加以區分,使用時應注意。
如:? ? MOV? ? ? ? ? C,?20H? ? ?;? 片內位單元位操作型指令
以上是7種尋址方式
總結一下:
尋址方式 | 操作數尋址空間及范圍 | 示例指令 |
立即數尋址 | 在程序存儲空間,隨指令讀出 | MOV? A,#46H |
直接尋址 | 片內RAM種,低128B和SFR | MOV? A,46H |
間接尋址 | 片內RAM:使用@Ri、SP; 范圍為256B,不含SFR 片外RAM:使用@Ri、@DPTR; 范圍為64KB | MOV? ? ? A,@R0 MOVX? @DPTR,A |
寄存器尋址 | 使用R0~R7、A、B、C、DPTR | MOV? A ,R2 |
相對尋址 | 操作數是相對地址;在程序存儲空間;范圍-128~127 | STMP? ?LOOP |
絕對尋址 | 操作數是目標地址;在程序存儲空間;范圍為64KB全空間 | LJMP? SECON |
變址尋址 | 使用@A+PC、@A+DPTR;在程序存儲器中; 范圍分別在PC之后256B之內和64KB全空間 | MOVC? A,@A+DPTR MOVC? A,@A+PC |
位尋址 | 使用位地址;在位尋址空間;范圍-128~127 | SJMP? ? LOOP |
指令中常用符號注釋?
Rn:n=0~7,工作寄存器R0~R7。
Ri:i=0、1。可作為地址指針的R0和R1。
#data:8位立即數
#data16:16為立即數
direct:8位片內RAM單元地址
addr16:程序存儲空間的16位目的地址,用于LCALL和LJMP指令中
rel:補碼形式的8位地址偏移量。
bit:片內RAM或SFR中的直接尋址位地址。
@:間接尋址方式的前綴符號。
(×):表示×中的內容。(地址)
((×)):表示由×中指向的地址單元的內容。(數據)
^:邏輯與
(與邏輯與的形狀一樣,開口方向相反(鍵盤沒找到那個符號)):邏輯或
→:指令操作流程,將內容送到箭頭指向的地方
指令系統分類
數據傳送類指令
算術運算指令

邏輯操作類指令

控制轉移類指令

布爾變量操作類指令
歡迎大家指出問題!