指令系統(tǒng)是計(jì)算機(jī)硬件的語言系統(tǒng),也叫機(jī)器語言,它是軟件和硬件的主要界面,從系統(tǒng)結(jié)構(gòu)的角度看,它是系統(tǒng)程序員看到的計(jì)算機(jī)的主要屬性。指令系統(tǒng)表征了計(jì)算機(jī)的基本功能,決定了機(jī)器所要求的能力,也決定了指令的格式和機(jī)器的結(jié)構(gòu)。
51系列單片機(jī)一般使用匯編語言(Assembly Language)直接編程,其指令系統(tǒng)中,有進(jìn)行數(shù)據(jù)傳送、算術(shù)運(yùn)算、邏輯運(yùn)算、位操作、控制傳遞等功能的111條基本指令。此外也可以采用C語言進(jìn)行程序設(shè)計(jì)。
尋址方式尋址方式是CPU尋找操作數(shù)或操作數(shù)地址的方法,存放在不同位置的數(shù)據(jù)具有需要采用不同的方式進(jìn)行尋址,不同類型計(jì)算機(jī)的尋址方式也不同,它是計(jì)算機(jī)重要的性能指標(biāo)之一。MSC-51單片機(jī)有7種尋址方式。
立即尋址指令中直接給出參與操作的數(shù)據(jù),稱立即數(shù),用data表示。在匯編語言中,為標(biāo)明立即數(shù),為data加前綴”#”。立即數(shù)可以是8位和16位二進(jìn)制數(shù),分別用#data和#data16表示。
匯編指令格式:MOV A, #data
如:
MOV A, #30H ;8位立即數(shù)30H放入累加器ACC中 MOV DPTR, #2000H ;16位立即數(shù)2000H放入數(shù)據(jù)指針DPTR 直接尋址指令中直接給出參與操作的數(shù)據(jù)的地址,直接地址一般用direct表示。
匯編指令格式:MOV A, direct
如:
MOV A, 80H ;將80H單元,即P0口的內(nèi)容放入累加器ACC中 寄存器尋址參與操作的數(shù)據(jù)存放在寄存器中,匯編指令中直接以寄存器名來表示參與操作的數(shù)據(jù)地址,寄存器包括工作寄存器R0~R7、累加器ACC、寄存器B、數(shù)據(jù)指針DPTR。
匯編語言格式:MOV A, Rn ;n=0~7
如:
MOV A, R1 ;將R1中的內(nèi)容放入累加器ACC中 寄存器間接尋址二次尋址,尋址中寄存器的內(nèi)容為操作數(shù)所存放的地址。第一次尋址得到寄存器的內(nèi)容為(R0)、(R1)或(DPTR),第二次尋址是將第一次尋址得到的寄存器內(nèi)容作為地址,在其中存、取參與操作的數(shù)據(jù)。匯編語言中,寄存器前綴@是寄存器間接尋址的標(biāo)志,有@R0、@R1、@DPTR等。
匯編語言格式:MOV A, @R0/R1/DPTR
如:
MOV A, @DPTR ;將DPTR所指示的地址單元中的內(nèi)容放入累加器ACC中 變址尋址由兩個(gè)寄存器提供地址。若由ACC、PC提供,在匯編語言指令中尋址地址表示為@A+PC;若由ACC和DPTR提供,在匯編語言指令中尋址地址為@A+DPTR。其中,PC或DPTR被稱為基址寄存器,A被稱為變址寄存器,基址與變址相加為16位無符號(hào)加法。
若變址寄存器ACC中的內(nèi)容加基址寄存器DPTR(或PC)中內(nèi)容時(shí),低8位有進(jìn)位,則該進(jìn)位直接加到高位,不影響進(jìn)位標(biāo)志。因變址尋址指令多用于查表,故常稱為查表指令。
匯編語言格式:MOV A, @A+DPTP
如:
MOV A, @A+DPTR ;將A+DPTR所指示的地址單元中的內(nèi)容放入累加器ACC中 相對(duì)尋址以相對(duì)尋址指令的下一條指令的程序計(jì)數(shù)器PC的內(nèi)容為基值,加上指令機(jī)器代碼中的“相對(duì)地址”,形成新的PC值(要轉(zhuǎn)移的指令地址)。指令機(jī)器代碼中“相對(duì)地址”指的是用一個(gè)帶符號(hào)的8位二進(jìn)制補(bǔ)碼表示的偏移字節(jié)數(shù),其取值范圍為-128~+127,負(fù)數(shù)表示向后轉(zhuǎn)移,正數(shù)表示向前轉(zhuǎn)移。rel代表一個(gè)8位帶符號(hào)的偏移量,要轉(zhuǎn)移的指令地址=(PC)+相對(duì)尋址指令字節(jié)數(shù)+rel,“( )”代表存儲(chǔ)單元的內(nèi)容。
匯編語言格式:SJMP rel
如:
SJMP 08H ;指令代碼為雙字節(jié),該指令將轉(zhuǎn)到地址為(PC) + 02H + 08H 位尋址參與操作的數(shù)據(jù)為“位”,而不是字節(jié),是對(duì)片內(nèi)RAM中的位尋址區(qū)20H~2FH、SFR中11個(gè)可位尋址單元的位進(jìn)行操作。bit代表內(nèi)數(shù)據(jù)存儲(chǔ)器RAM或SFR的直接尋址位。
匯編語言格式:MOV C, bit
如:
MOV C, 00H ;或者寫成 MOV C, 20H.0 ;將字節(jié)地址20H的D0位內(nèi)容放到位累加器C中位尋址的位地址與直接尋址的字節(jié)地址形式完全一致,主要由操作碼進(jìn)行區(qū)分。
所有尋址方式的尋址范圍總結(jié)如下表:
尋址方式 尋址存儲(chǔ)器范圍立即尋址 程序存儲(chǔ)器ROM
直接尋址 片內(nèi)RAM低128KB,特殊功能寄存器SFR
寄存器尋址 工作寄存器R0~R7,A,C,DPTR,AB
寄存器間接尋址 片內(nèi)RAM低128KB,片外RAM
變址尋址 程序存儲(chǔ)器ROM (@A+DPTR,@A+PC)
相對(duì)尋址 程序存儲(chǔ)器ROM(相對(duì)尋址指令的下一指令PC值加 -128~+127)
位尋址 片內(nèi)RAM的20H到2FH字節(jié)地址的所有位,可位尋址SFR
指令系統(tǒng) 數(shù)據(jù)傳送指令 指令 功能
MOV (Move) 傳送內(nèi)部RAM和SFR的數(shù)據(jù)
MOVX (Move External RAM) 傳送外部RAM的數(shù)據(jù)(外部RAM只能和累加器ACC之間進(jìn)行傳送數(shù)據(jù))
MOVC (Move Code) 讀取并傳送ROM數(shù)據(jù)表格中的數(shù)據(jù)
PUSH (Push onto Stack) 入棧
POP (Pop from Stack) 出棧
XCH (Exchange) 全字節(jié)交換
XCHD (Exchange low-order Digit) 低半字節(jié)交換
SWAP 高、低字節(jié)互換
如:
MOV DPTR, #2000H ;外部RAM單元地址2000H傳入DPTR MOVX A, @DPTR ;外部RAM 2000H單元的數(shù)據(jù)送入A MOVC A, @A + PC ;ROM A+PC單元的數(shù)據(jù)送入A PUSH A ;將A中的數(shù)據(jù)放入堆棧 POP A ;將堆棧頂層的數(shù)據(jù)放入A XCH A, R0 ;交換A和R0中的數(shù)據(jù) XCHD A, R0 ;交換A和R0中的低4字節(jié)數(shù)據(jù) SWAP A ;交換A的高、低4字節(jié)數(shù)據(jù) 算數(shù)運(yùn)算指令 指令 功能ADD (Addition) 加法
ADDC (Add with Carry) 帶進(jìn)位加法
SUBB (Subtract with Borrow) 帶借位減法
INC (Increment) 加1
DEC (Decrement) 減1
MUL (Multiply) 乘法
DIV (Divide) 除法
DA (Decimal Adjust) 十進(jìn)制調(diào)整
邏輯運(yùn)算指令 指令 功能
ANL (AND Logic) 邏輯與
ORL (OR Logic) 邏輯或
XRL (Exclusive-OR Logic) 邏輯異或
CLR (Clear) 清零
CPL (Complement) 取反
RL (Rotate Left) 循環(huán)左移
RLC (Rotate Left throught the Carry flag) 帶進(jìn)位循環(huán)左移
RR (Rotate Right) 循環(huán)右移
RRC (Rotate Right throught the Carry flag) 帶進(jìn)位循環(huán)右移
控制轉(zhuǎn)移指令 指令 功能
SJMP (Short Jump) 短轉(zhuǎn)移,后接偏移量rel
AJMP (Absolute Jump) 絕對(duì)轉(zhuǎn)移,最大轉(zhuǎn)移范圍為2KB
LJMP (Long Jump) 長轉(zhuǎn)移,轉(zhuǎn)移目的地址在0~64KB空間范圍
ACALL (Absolute subroutine Call) 子程序絕對(duì)調(diào)用,最大調(diào)用范圍為2KB
LCALL (Long subroutine Call) 子程序長調(diào)用,調(diào)用64KB空間范圍內(nèi)的子程序
RET (Return from subroutine) 子程序返回
RETI (Return from Interruptio) 中斷返回
CJNE (Compare Jump if Not Equal) 比較不相等則轉(zhuǎn)移
DJNZ (Decrement Jump if Not Zero) 減1后不為0則轉(zhuǎn)移
JZ (Jump if Zero) 結(jié)果為0則轉(zhuǎn)移
JNZ (Jump if Not Zero) 結(jié)果不為0則轉(zhuǎn)移
JC (Jump if the Carry flag is set) 有進(jìn)位則轉(zhuǎn)移
JNC (Jump if Not Carry) 無進(jìn)位則轉(zhuǎn)移
JB (Jump if the Bit is set) 位為1則轉(zhuǎn)移
JNB (Jump if the Bit is Not set) 位為0則轉(zhuǎn)移
JBC(Jump if the Bit is set and Clear the bit) 位為1則轉(zhuǎn)移,并清除該位
NOP (No Operation) 空操作
位操作指令 指令 功能
SETB (Set Bit) 將某個(gè)位置1
偽指令
偽指令在匯編時(shí)不產(chǎn)生機(jī)器碼,不影響程序執(zhí)行,僅指明在匯編時(shí)執(zhí)行一些特殊的操作。
ORG 16位地址:起始指令,用在原程序或數(shù)據(jù)塊的開始,指明此語句后面目標(biāo)程序或數(shù)據(jù)塊存放的起始地址。
如:
ORG 1000H ;后面目標(biāo)程序或數(shù)據(jù)塊存放的起始地址為1000H[標(biāo)號(hào):]DB 字節(jié)數(shù)據(jù)項(xiàng)表:字節(jié)定義,將項(xiàng)表中的字節(jié)數(shù)據(jù)存放到從標(biāo)號(hào)開始的連續(xù)字節(jié)單元中。
如:
SEG: DB 32, 'A', 25H ;SEG~SEG+2地址單元依此存放20H、41H、25H[標(biāo)號(hào):]DW 雙字節(jié)數(shù)據(jù)項(xiàng)表:字定義,定義16位地址表,16地址按低位地址存低位字。
如:
TAB: DW 1234H, 25H ;TAB~TAB+3地址單元依此存放12H、34H、00H、25H[標(biāo)號(hào):]DS 數(shù)值表達(dá)式:保留字節(jié),指示在程序存儲(chǔ)器中保留與標(biāo)號(hào)為起始地址的若干字節(jié)單元,單元個(gè)數(shù)由數(shù)值表達(dá)式指定。
如:
L1: DS 32 ;L1地址開始保留32個(gè)存儲(chǔ)單元名字 EQU 表達(dá)式:等值指令,用與給一個(gè)表達(dá)式賦值或給字符串起名字。之后名字可用做程序地址,數(shù)據(jù)地址或立即數(shù)地址使用。名字必須是一字母開頭的字母數(shù)字串。
如:
SPACE EQU 10H ;程序中出現(xiàn)SPACE的地方都用10H代替名字 DATA 直接字節(jié)地址:給8位內(nèi)部RAM單元起個(gè)名字,名字必須是一字母開頭的字母數(shù)字串,同一單元可起多個(gè)名字。
如:
ERROR DATA 80H ;內(nèi)部RAM 80H單元名為ERROR名字 XDATA 直接字節(jié)地址:給8位外部RAM起個(gè)名字,名字規(guī)定同DATA偽指令。
如:
IO_PORT XDATA 0CF04H ;外部RAM 0CF04H單元名為IO_PORT名字 BIT 位指令:給一可位尋址的位單元起名,規(guī)定同DATA偽指令。
如:
SWT BIT 30H ; 30H單元名為SWT[標(biāo)號(hào):] END:結(jié)束指令,指出源程序到此結(jié)束。
C語言編程51單片機(jī)采用C語言編程后,通過C51編譯器進(jìn)行編譯后產(chǎn)生目標(biāo)代碼,下載到單片機(jī)內(nèi)部即可運(yùn)行。編程時(shí),不同存儲(chǔ)器的尋址和數(shù)據(jù)類型等細(xì)節(jié)問題都由編譯器解決,無需像使用匯編語言那樣都必須考慮到,而且其中還有豐富的子程序庫可以直接調(diào)用,大大減小編程工作量。此外,編程過程中還可以將C語言和匯編語言交叉使用,提高開發(fā)效率。
數(shù)據(jù)類型C51中定義的數(shù)據(jù)類型比C語言多幾種擴(kuò)展數(shù)據(jù)類型:
bit用于定義為變量的名字,編譯器會(huì)對(duì)其分配地址,位變量分配在內(nèi)部RAM的20H~2FH單元相應(yīng)的位區(qū)域,位地址范圍是00~7FH,共128個(gè)。
sbit用于定義位變量的名字和地址,地址是確定的且不用編譯器分配。它是SFR中的可以進(jìn)行位尋址的確定位,也可是內(nèi)部RAM的20H~2FH單元中確定的位。
sfr用于訪問一個(gè)內(nèi)存單元,利用它可以訪問51單片機(jī)內(nèi)部的所有SFR,一般用來聲明SFR。
存儲(chǔ)器類型C51是面向8051單片機(jī)的程序語言,應(yīng)用程序中使用的任何變量或常量必須以一定的存儲(chǔ)器類型定位于單片機(jī)的相應(yīng)的存儲(chǔ)區(qū)域中,因此在定義變量類型時(shí),還需要定義它的存儲(chǔ)器類型:
對(duì)于單片機(jī)來說,訪問片內(nèi)RAM比訪問片外RAM的速度要快得多,所以對(duì)于經(jīng)常使用的變量應(yīng)該置于片內(nèi)RAM中,要用bdata、data、idata來定義;對(duì)于不經(jīng)常使用的變量或規(guī)模較大的變量應(yīng)該置于片外RAM中,要用pdata、xdata來定義。
中斷函數(shù)使用C51編寫中斷程序時(shí),需要遵循如下格式:
“`C
void 函數(shù)名(void) interrupt 中斷號(hào) [using 工作寄存器組號(hào)] {
……
}
“`
更新歷史:
* 2017.11.23 完成初稿
原文鏈接
評(píng)論