一個計算機的指令系統(tǒng)就是它能執(zhí)行的全部指令的集合。8051的指令系統(tǒng)共有111條指令,由42種助記符和7種尋址方式組合而成。
8051的指令通常包括操作碼,和操作數(shù)兩部分。操作碼規(guī)定指令進行什么操作,采用助記表示;操作數(shù)表示指令的操作對象。
匯編語言指令的基本形式是:操作碼助記符 目的操作數(shù),源操作數(shù)。
操作碼助記符與操作數(shù)分開書寫,操作數(shù)中目的操作數(shù)在前,源操作數(shù)在后,操作數(shù)之間用逗號分隔。
如指令MOV B,#23H中符號MOV就是操作碼助記符,這個助記符的意義為將源操作數(shù)傳入目的操作數(shù)地址中,累加器A是目的操作數(shù),寄存器B是源操作數(shù)。
8051的機器語言指令根據(jù)長度有一字節(jié)、二字節(jié)、三字節(jié)三種。一字節(jié)指令操作碼中包含了操作數(shù)的信息。如指令I(lǐng)NC A就是一條一字節(jié)指令,其操作碼為00000100B,這個操作碼的意義是將累加器的內(nèi)容加1,請注意這條指令中的A只是一個符號,而不是一個操作數(shù),累加器在指令中只有寫成ACC時才是一個操作數(shù)。編譯程序在編譯的過程中將ACC編譯為累加器的直接地址OEOH。
用指令I(lǐng)NC ACC也可以完成將累加器內(nèi)容加1的功能,但這條指令是兩字節(jié)指令。
其中,INC是操作碼助記符,代表的意思是將后面的操作數(shù)地址中的內(nèi)容加1,ACC是操作數(shù),在指令中作隱含操作數(shù)的除了符號A代表累加器外,還有R0到R7代表工作寄存器。
指令MOV A R0的機器碼為11101000B,即E8H指令MOV A R1的機器碼為11101001B,即E9H指令MOV A R2的機器碼為11101010B,即EAH指令MOV A R7的機器碼為11101111B,即EFH指令MOV A RN的機器碼為E8H-EFH。
兩字節(jié)指令中操作碼,操作數(shù)各占一個字節(jié)。
三字節(jié)指令格式為操作碼,操作數(shù)。操作數(shù)在傳送指令中,第一個操作數(shù)稱為目的操作數(shù),第二個操作數(shù)稱為源操作數(shù)。
三字節(jié)指令中操作碼占第一個字節(jié),操作數(shù)占后兩字節(jié),操作數(shù)所占兩字節(jié),每字節(jié)表示一個操作數(shù)。
下面我們看看指令描述中的符號。
Rn表示當前選擇的8個工作寄存器R0~R7中的一個。在具體編程時要把RN用到R0到R7中的一個替換。
@Ri表示用作間接尋址的工作寄存器,I可取值0或1。表示寄存器間接尋址方式,在具體編程時,符號@RI要用@R0或@R1替換。
Direct表示8位直接地址。用于尋址內(nèi)部RAM或特殊功能寄存器。
#data表示8位立即數(shù)。
@data16表示16位立即數(shù)。
Addr16表示16位目的地址。只限于LCALL和LJMP指令使用,在編程時,可直接使用地址標號,編譯時,再由編譯軟件自動將該標號轉(zhuǎn)換成16位目的地址。
Addr11表示11位目的地址。只限于ACALL和AJMP使用,在編程時,可直接使用地址標號,編譯時,再由編譯軟件自動將該標號轉(zhuǎn)換成11位目的地址。
Rel表示補碼表示的8位偏移量。用于相對轉(zhuǎn)移指令中,在編程時,可直接使用地址標號,編譯時,再由編譯軟件自動將該標號轉(zhuǎn)換成8位地址偏移量。
/bit表示位地址中的位取反。