官术网_书友最值得收藏!

3.2 MCS-51單片機指令介紹

在匯編程序指令編寫和程序注釋過程中,會用到一些特殊符號,具體含義如下。

Rn:當前工作寄存器組中的任一寄存器(n=0~7)。

Ri:當前工作寄存器組中的R0和R1(i=0,1),Ri常用作間接尋址寄存器。

@:寄存器間接尋址或變址尋址符號。

(Ri):由Ri間接尋址指向的地址單元。用DPTR間接尋址時,含義相同。

((Ri)):由Ri間接尋址指向的地址單元中的內容。用DPTR間接尋址時,含義相同。

(XXH):某內部RAM單元中的內容。

Direct:內部RAM單元(包括SFR區)的直接地址(也有的寫成dir)。

#Data:8位數據。

#Data16:16位數據。

Addr16:16位地址。

Addr11:11位地址。

Rel:由8位補碼數構成的相對偏移量。

Bit:位地址,內部RAM和特殊功能寄存器的直接尋址位。

→:數據流向指示。

3.2.1 數據傳送指令

數據傳送指令共有29條,是指令系統中數量最多、使用非常頻繁的指令。

1.以累加器為目的操作數的指令(4條)

【例3.1】 已知R0=25H,(25H)=0AAH,下面指令執行后的結果分析如下。

2.以寄存器Rn為目的操作數的指令(3條)

【例3.2】 已知A=26H,R5=75H,(62H)=0ACH,下面指令執行后的結果分析如下。

注意:當操作數中出現16進制數據的高8位為A~F等字母時,需要在前面加上數字0,如ACH,需要在前面加上0,寫為0ACH,否則會出錯。

3.以直接地址Direct為目的操作數的指令(5條)

【例3.3】 設A=36H,(40H)=19H,(25H)=11H,R0=24H,(24H)=62H。下面指令執行后的結果分析如下。

4.以間接地址@Ri為目的操作數的指令(3條)

5.16位數據傳送指令(1條)

指令執行的操作是將16位的立即數#Data傳送到16位寄存器DPTR中。其中高8位的數據DataH送入DPH,低8位的數據DataL送入DPL。

例如:

6.外部數據傳送指令(4條)

在MCS-51單片機指令系統中,下面4條指令操作用于單片機對外部RAM或者外部I/O端口的數據傳送。

上述四條指令中采用了兩種指針對外部RAM或I/O端口進行間接尋址:8位的工作寄存器Ri和16位的數據指針DPTR,Ri尋址外部RAM的00H~0FFH單元,共256字節單元;DPTR尋址外部RAM或I/O端口的0000H~0FFFFH單元,共64KB。

7.訪問ROM的指令(2條)

這兩條指令也稱查表指令。編程時,預先在程序存儲器中建立數據表格,以后程序運行時利用這兩條指令查表。這兩條指令都為單字節指令,不同的是,第一條指令的基本地址為程序計數器,偏移地址為A;而第二條指令中,16位數據指針DPTR和A既可以作為基本地址,也可以作為偏移地址,使用比較靈活。因此,可以看出第一條指令查找范圍為256B,而第二條指令查找范圍可達整個ROM的64KB。

8.數據交換指令(5條)

其中,進行的操作是A與Rn(Rn=R0~R7)、Direct和@Ri(Ri=R0、R1)所尋址的單元內容,以及自身半字節的內容進行互換。其中,前三條指令為字節交換,而后面兩條指令進行的是半字節交換,XCHD完成低4位的交換而高4位不變,SWAP完成A自身的低4位與高4位的交換。

9.堆棧操作指令(2條)

上述兩條指令中,PUSH為入棧指令,POP為出棧指令,用于保護和恢復現場。它們都是雙字節指令,都不影響標志位。

入棧操作時,棧指針SP首先上移一個單元,指向棧頂的上一個單元,接著將直接地址Direct單元內容壓入當前SP指向的單元中。出棧操作時,首先將棧指針SP所指向的單元的內容彈出到Direct中,然后SP下移一個單元,指向新的棧頂。

堆棧操作的特殊性如下。

① 堆棧指令僅用于內部RAM的128字節單元或專用寄存器的操作;

② 堆棧操作必須遵循“先進后出”或者“后進先出”的原則,否則堆棧中的數據會出現混亂。

3.2.2 算術運算指令

算術運算指令共有24條,包括執行加、減、乘、除的指令和執行加1、減1、BCD碼的運算和調整的指令。雖然MCS-51單片機的算術邏輯單元(ALU)僅能對8位無符號整數進行運算,但利用進位標志C,可進行多字節無符號整數的運算。此外,利用溢出標志,還可以對帶符號數進行補碼運算。需要指出的是,除加1、減1指令外,其他指令的執行對程序狀態字(PSW)有影響。

1.加法指令(4條)

加法指令將Rn(R0~R7)、Direct、@Ri(Ri=R0,R1)及#Data與A相加,運算結果保存在A中。上面4條指令的執行將影響標志位AC、CY、OV、P。當和的第3位或第7位有進位時,分別將AC、CY標志位置1,否則為0。溢出標志位只有帶符號數運算時才有用。OV=1也可以理解為:由于進位破壞了符號位的正確性。

2.帶進位加指令(4條)

這組指令完成的功能是將Rn、Direct、@Ri及#Data,連同進位標志位CY,與A的內容相加,運算結果保存在A中。其他功能與ADD指令相同。

3.帶借位減法指令(4條)

注意:沒有不帶借位標志的減法指令,所以當兩個單字節或多字節最低位相減時,必須先清除CY。當兩個不帶符號位的數相減時,溢出與否與OV狀態無關,而根據CY是否有借位來判斷。

4.十進制調整指令(1條)

十進制調整指令用于對BCD碼十進制數加法運算的結果進行修正。其指令格式為

該指令的功能是對壓縮的BCD碼(一字節存放2位BCD碼)的加法結果進行十進制調整。兩個BCD碼按二進制相加之后,必須經本指令的調整才能得到正確的壓縮BCD碼。對于十進制數(BCD碼)的加法運算,須借助于二進制加法指令。

5.增1指令(5條)

這5條指令將指令中的變量加1,且不影響程序狀態字PSW中的任何標志位。若變量原來為0FFH,加1后將溢出為00H(前4條指令),標志位也不會受到影響。第5條指令是16位數加1指令。指令首先對低8位指針DPL的內容執行加1操作,當產生溢出時,就對DPH的內容進行加1操作,也不影響標志位CY的狀態。

6.減1指令(4條)

這4條指令的功能是將指定的變量減1。若原來為00H,減1后下溢出為0FFH,不影響標志位(P標志位除外)。

7.乘法指令(1條)

這條指令的功能是把A和B中的無符號8位整數相乘,其16位積的低8位在A中,高8位在B中。如果積大于255,則溢出標志位OV置1,否則OV清0。進位標志位CY清0。

8.除法指令(1條)

該指令的功能是用A中8位無符號整數(被除數)除以B中8位無符號整數(除數),所得的商(為整數)存放在A中,余數存放在B中,且CY和溢出標志位OV清0。如果B的內容為“0”(即除數為“0”),則存放結果的A、B中的內容不定,溢出標志位OV置1。

【例3.4】(A)=0FBH,(B)=12H,執行指令

結果為(A)=0DH,(B)=11H,CY=0,OV=0。

3.2.3 移位與邏輯運算指令

移位與邏輯運算指令共有24條,有左/右移位、清0、取反、與、或、異或等邏輯操作。這類指令一般會影響奇偶標志位P,循環指令會影響CY。

1.移位操作(4條)

第一條指令的功能是A的8位向左循環移一位,第7位循環移入第0位,不影響標志位。

第二條指令的功能是A的內容向右循環移一位,第0位移入第7位。

第三條指令的功能是將A的內容和進位標志位CY一起向左循環移一位,A的第7位移入進位標志位CY,CY移入A的第0位,不影響其他標志位。

第四條指令的功能是A的內容和CY一起向右循環移一位,A的第0位移入CY,CY移入A的第7位。

2.清零和取反(2條)

第一條指令的功能是A清0,不影響CY、OV等標志位。

第二條指令的功能是將A的內容按位邏輯取反,不影響標志位。

3.邏輯與指令(6條)

這組指令的功能是在指定的變量之間以位為基礎進行“邏輯與”操作,結果存放到目的變量所在的寄存器或存儲器中。

4.邏輯或指令(6條)

這組指令的功能是在所指定的變量之間執行以位為基礎的“邏輯或”操作,結果存到目的變量寄存器或存儲器中。

5.邏輯異或指令(6條)

這組指令的功能是在所指定的變量之間執行以位為基礎的“邏輯異或”操作,結果存到目的變量寄存器或存儲器中。

3.2.4 控制轉移指令

控制轉移指令可以改變PC的內容,從而改變程序運行的順序,將程序跳轉到某個指定的地址,再執行下去。程序轉移指令共有17條。所有指令的目標地址都應在64KB的程序存儲器地址范圍內。除NOP指令執行時間為1個機器周期外,其他指令的執行時間都是2個機器周期。

1.無條件轉移指令(1條)

該條指令是代碼在2KB范圍內的無條件跳轉指令。AJMP把AT89C51單片機的64KB程序存儲器空間劃分為32個區,每個區為2KB范圍,轉移目標地址必須與AJMP下一條指令的第一字節在同一2KB范圍內(即轉移的目標地址必須與AJMP下一條指令地址的高5位地址碼相同),否則將引起混亂。執行該指令時,先將PC加2(本指令為2B),然后把Addr11送入PC.10~PC.0,PC.15~PC.11保持不變,程序轉移到目標地址。

2.相對轉移指令(1條)

這是無條件轉移指令,其中Rel為相對偏移量,是一個單字節的帶符號8位二進制補碼數,因此它所能實現的程序轉移是雙向的。Rel如為正,則向地址增大的方向轉移;Rel如為負,則向地址減小的方向轉移。執行該指令時,在PC加2(本指令為2B)之后,把指令的有符號的偏移量Rel加到PC上,并計算出目標地址,因此跳轉的目標地址可以在與這條指令相鄰的下一條指令的前128B到后127B(-128~+127)之間。用戶在編寫程序時,只需要在相對轉移指令中直接寫上要轉向的目標地址標號就可以了,相對偏移量由匯編程序自動計算。例如:

程序在匯編時,轉移到LOOP處的偏移量由匯編程序自動計算和填入。

3.長跳轉指令(1條)

這條指令執行時,把跳轉的目標地址,即指令的第二和第三字節分別裝入PC的高位和低位字節中,無條件地轉向Addr16指定的目標地址。目標地址可以在64KB程序存儲器地址空間的任何位置。

4.間接跳轉指令(1條)

這是一條單字節的轉移指令,轉移的目標地址由A中8位無符號數與DPTR的16位無符號數內容之和來確定。該指令以DPTR內容作為基址,A的內容作為變址。因此,只要DPTR的值固定,而給A賦予不同的值,即可實現程序的多分支轉移。

5.條件轉移指令(2條)

條件轉移即程序的轉移是有條件的。執行條件轉移指令時,如指令中規定的條件滿足,則進行轉移;條件不滿足,則順序執行下一條指令。轉移的目標地址在以下一條指令地址為中心的256B范圍內(-128~+127)。當條件滿足時,PC裝入下一條指令的第一字節地址,再把帶符號的相對偏移量Rel加到PC上,計算出要轉向的目標地址,條件轉移指令有兩條。

6.比較不相等轉移指令(4條)

這組指令的功能是比較前面兩個操作數的大小,如果它們的值不相等則轉移,在PC加上下一條指令的起始地址后,把指令最后1字節的有符號的相對偏移量加到PC上,并計算出轉向的目標地址。如果第一操作數(無符號整數)小于第二操作數(無符號整數),則進位標志位CY置1,否則CY清0。該指令的執行不影響任何一個操作數的內容。

7.減1不為0轉移指令(2條)

這是一組把減1與條件轉移兩種功能結合在一起的指令,共有兩條指令:

這組指令將源操作數(Rn或Direct)減1,結果回送到Rn或Direct。如果結果不為0則轉移。本指令允許程序員把Rn或內部RAM的Direct用作程序循環計數器。

這兩條指令主要用于控制程序循環。如預先把Rn或內部RAM的Direct裝入循環次數,則利用本指令,以減1后是否為0作為轉移條件,即可實現按次數控制循環。

8.調用子程序指令(2條)

調用子程序指令包括短調用指令(ACALL)和長調用指令(LCALL)。

ACALL指令也是2KB范圍內的調用子程序的指令。執行時先把PC加2(本指令為2B),獲得下一條指令地址,把該地址壓入堆棧中保護,即堆棧指針SP加1,PCL進棧,SP再加1,PCH進棧。最后把PC的高5位和指令代碼中的11位地址Addr11連接,獲得16位的子程序入口地址,并送入PC,轉向執行子程序。所調用的子程序地址必須與ACALL指令下一條指令的第一字節地址在同一個2KB區域內,否則將引起程序轉移混亂。由于在執行調用操作之前PC先加了2,因此如果ACALL指令正好落在區底的兩個單元內,程序就轉移到下一個區中了。

LCALL指令可以調用64KB范圍內程序存儲器中的任何一個子程序。指令執行時,先把PC加3,獲得下一條指令的地址(斷點地址),并把它壓入堆棧(先低位字節,后高位字節),同時把堆棧指針加2。接著把指令的第二和第三字節分別裝入PC的高位和低位字節中,然后從PC指定的地址開始執行程序。

9.子程序的返回指令

執行本指令時,

其功能是從堆棧中退出PC的高8位和低8位字節,把堆棧指針減2,從PC指定的地址開始執行程序。

10.中斷返回指令

其功能和RET指令相似,兩條指令的不同之處在于該指令清除了在中斷響應時被置1的AT89C51單片機內部中斷優先級寄存器的中斷優先級狀態,其他操作均與RET指令相同。

11.空操作指令

CPU不進行任何實際操作,只消耗一個機器周期的時間,且只執行(PC)+1→PC操作。NOP指令常用于程序中的等待或時間延遲。

3.2.5 位操作指令

AT89C51單片機內部有一個位處理機,其位操作指令共有17條。

1.數據位傳送指令(2條)

這兩條指令的功能是把由源操作數指定的位變量送到目的操作數指定的單元中。其中一個操作數必須為進位標志,另一個可以是任何直接尋址位。該指令不影響其他寄存器或標志位。

2.位變量修改指令(6條)

這6條指令實現對C(CY)或者bit中的內容進行清0、取反或置1。這些指令不影響除C以外的其他標志位。

3.位變量邏輯與指令(2條)

這兩條指令完成的是對C與bit中的內容或該位內容的取反進行邏輯與操作,結果返回C中。

4.位變量邏輯或指令(2條)

這兩條指令完成的是對C與bit中的內容或該位內容的取反進行邏輯或操作,結果返回C中。

5.條件轉移類指令(5條)

這5條指令中,前4條指令根據C或者bit是否為1或0,滿足條件則跳轉,但這些指令執行完畢后C或bit本身不會改變;而第5條指令執行完畢后,如果(bit)=1,程序跳轉到Rel并將bit清0,即(bit)=0。

主站蜘蛛池模板: 万安县| 汉中市| 洛阳市| 肃宁县| 陆河县| 保山市| 海淀区| 根河市| 咸宁市| 城市| 和田县| 徐闻县| 商城县| 吉木乃县| 岳阳市| 太仓市| 方山县| 阿拉善右旗| 新兴县| 黑龙江省| 金秀| 彭泽县| 江津市| 汶川县| 隆林| 山丹县| 类乌齐县| 会昌县| 枣强县| 西宁市| 彭水| 普陀区| 昌平区| 云霄县| 美姑县| 潞西市| 舞钢市| 天等县| 临猗县| 乐山市| 互助|