




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第3章 SPCE061A指令系統(tǒng) 3.1 概述 3.2 數(shù)據(jù)傳送指令 3.3 算術(shù)運(yùn)算指令 3.4 邏輯運(yùn)算指令3.5 控制轉(zhuǎn)移類指令 3.6 常用偽指令 思考題 3.1 概 述 3.1.1 指令分類 以nSP為內(nèi)核的單片機(jī)系列指令集按功能可劃分為: (1) 數(shù)據(jù)傳送指令:立即數(shù)到寄存器、寄存器到寄存器、寄存器到存儲(chǔ)器、存儲(chǔ)器到寄存器的數(shù)據(jù)傳送操作。 (2) 算術(shù)運(yùn)算指令:加、減、乘等運(yùn)算。 (3) 邏輯運(yùn)算指令:與、或、異或、測(cè)試、移位等操作。 (4) 轉(zhuǎn)移指令:條件轉(zhuǎn)移、無(wú)條件轉(zhuǎn)移、中斷返回、子程序調(diào)用等操作。 (5) 控制指令:如開(kāi)中斷、關(guān)中斷、有限沖擊響應(yīng)FIR(Finite Impl
2、use Response)濾波器的數(shù)據(jù)自由移動(dòng)等操作。 3.1.2 尋址方式 尋址方式主要有以下幾種: (1) 立即尋址:操作數(shù)以立即數(shù)的形式出現(xiàn)。 例如,R1 = 0 x1234是把十六進(jìn)制數(shù)0 x1234賦給寄存器R1。 (2) 直接尋址:通過(guò)存儲(chǔ)器地址來(lái)訪問(wèn)存儲(chǔ)器中的數(shù)據(jù)。 例如,R1 =0 x2222 將0 x2222單元的數(shù)據(jù)傳送到寄存器R1。 (3) 寄存器尋址:操作數(shù)在寄存器中。 例如,R1 = R2 是把寄存器R2中的數(shù)據(jù)賦給寄存器R1。 (4) 寄存器間接尋址:寄存器中存儲(chǔ)的是操作數(shù)的地址。 例如,R1 = BP 是把由BP指向的內(nèi)存單元的數(shù)據(jù)傳送到寄存器R1。 (5) 變址
3、尋址:操作數(shù)的地址由基址和偏移量共同提供。 例如,R1 = BP+0 x34,BP為基址,0 x34為偏移量,兩者共同確定操作數(shù)存放的地址。 表3.1 符 號(hào) 約 定 3.2 數(shù)據(jù)傳送指令 數(shù)據(jù)傳送指令是把源操作數(shù)傳送到指令所指定的目標(biāo)地址。數(shù)據(jù)傳送操作屬?gòu)?fù)制性質(zhì),不是搬家性質(zhì),指令執(zhí)行后源操作數(shù)保持不變,只是用源操作數(shù)代替目的操作數(shù)。 數(shù)據(jù)傳送指令的通用格式如下: = 源操作數(shù)可以是立即數(shù)、寄存器尋址、寄存器間接尋址、直接尋址、變址尋址等。目的操作數(shù)可以是寄存器和直接地址。 表3.2 數(shù)據(jù)傳送指令一覽表(ISA1.1指令集) 1. 立即尋址格式1:Rd = IM16說(shuō)明:16位立即數(shù)送入目標(biāo)
4、寄存器Rd。格式2:Rd = IM6說(shuō)明:6位立即數(shù)擴(kuò)展為16位送入目標(biāo)寄存器Rd。例如:R1=0 xF001 /R1的值變?yōu)? xF0012. 寄存器尋址格式1:Rd = Rs 說(shuō)明:將源寄存器Rs 的數(shù)據(jù)送給目標(biāo)寄存器Rd。例如:R2=0 xF001/R2的值為0 xF001R1=R2 /R1的值變?yōu)? xF001 3. 直接尋址格式1:Rd = A6 說(shuō)明:把A6指定的存儲(chǔ)單元數(shù)據(jù)讀到Rd寄存器。格式2:Rd = A16說(shuō)明:把A16指定的存儲(chǔ)單元數(shù)據(jù)讀到Rd寄存器。格式3:A6 = Rs 說(shuō)明:將源寄存器Rs中的數(shù)據(jù)送給以A6為地址的存儲(chǔ)單元。格式4:A16 = Rs 說(shuō)明:把Rs數(shù)據(jù)
5、存儲(chǔ)到A16 指出的存儲(chǔ)單元。例如:R1=0 x0011 /R1的值為0 x0011 0 x0010=R1 /0 x0010單元的值變?yōu)? x0011 4. 變址尋址 格式1:Rd = BP +IM6 說(shuō)明:把基址指針BP與6位的立即數(shù)的和作為地址,將該存儲(chǔ)單元的數(shù)據(jù)讀到Rd寄存器。 格式2:BP + IM6 = Rs 說(shuō)明:把Rs的值存儲(chǔ)到基址指針BP與6位的立即數(shù)之和為地址的存儲(chǔ)單元。例如: R1=0 x0010 BP+0 x0002=R1 5. 寄存器間接尋址 格式1:Rd = Rs 說(shuō)明:把Rs的數(shù)據(jù)存儲(chǔ)到Rd的值所指的存儲(chǔ)單元(Rd中存放的是操作數(shù)的地址)。 格式2:+Rd = Rs
6、 說(shuō)明:首先把Rd 的值加1,再將Rs的數(shù)據(jù)存儲(chǔ)到Rd的值所指的存儲(chǔ)單元。 格式3:Rd = Rs+ 說(shuō)明:讀取Rs所指的存儲(chǔ)單元的值存入Rd,而后Rs的值加1。 例1 將R3的值保存于0 x25單元。 R3 =0 x5678 /把16位立即數(shù)0 x5678賦給R3方法1: 0 x25=R3 /將R3的值存儲(chǔ)于0 x25存儲(chǔ)單元(直接尋址), / 0 x25單元的內(nèi)容為0 x5678 方法2: R2 =0 x25 /立即數(shù)0 x25送入R2 R2=R3 /將R3的值存儲(chǔ)于0 x25存儲(chǔ)單元(寄存器間/接尋址),0 x25單元的內(nèi)容為0 x5678方法3:BP= 0 x20 /立即數(shù)0 x20送
7、入BP BP+5= R3 /將R3的值存儲(chǔ)于0 x25存儲(chǔ)單元(變址尋 /址),0 x25單元的內(nèi)容/為0 x5678 例2 將0 x25,0 x26和0 x27單元清零。方法1:R1 = 0 R2 = 0 x25 /立即數(shù)0 x25送入R2中R2+ = R1/R1的值存儲(chǔ)于0 x25,存儲(chǔ)單元R2=R2+1R2+ = R1 /R1的值存儲(chǔ)于0 x26,存儲(chǔ)單元R2=R2+1R2 = R1 /R1的值存儲(chǔ)于0 x27 方法2:R1 = 0 R2 = 0 x27R2- =R1 /R1的值存儲(chǔ)于0 x27,存儲(chǔ)單元R2=R2-1R2- =R1 /R1的值存儲(chǔ)于0 x26,存儲(chǔ)單元R2=R2-1R2
8、 = R1 /R1的值存儲(chǔ)于0 x25 方法3:R1 = 0 /影響標(biāo)志位Z=1,N=0R2 = 0 x24/立即數(shù)0 x24 送入R2中+R2= R1 /R2=R2 +1,R2=0 x25,而后R1的值存儲(chǔ)于0 x25單元+R2=R1 /R2=R2 +1,R2=0 x26,而后R1的值存儲(chǔ)于0 x26 單元+R2=R1 /R2=R2 +1,R2=0 x27,而后R1的值存儲(chǔ)于0 x27單元 例3 用不同方式讀取存儲(chǔ)器的值。BP = 0 x20 /將立即數(shù)0 x20 賦給BPR1 = BP + 5 /BP+5=0 x25,則讀0 x25單元數(shù)據(jù)到R1中R1 = 0 x2345 /讀0 x234
9、5單元數(shù)據(jù)到R1中R1 = BP /讀0 x20單元的數(shù)據(jù)到R1中R1 = BP+ /讀0 x20 單元的數(shù)據(jù)到R1中,并使BP=0 x20+1R1 = BP- /讀取0 x21單元的數(shù)據(jù)到R1中,并使BP=0 x21-1R1 = +BP /修改BP=0 x201,讀0 x21單元的數(shù)據(jù)到R1 6. 堆棧操作 除以上介紹的指令外,堆棧(stack)操作屬于一種特殊的數(shù)據(jù)傳送指令,在此也一并作以介紹。堆棧操作如圖3.1所示。 圖3.1 堆棧操作 堆棧指針SP總是指向棧頂?shù)牡谝粋€(gè)空項(xiàng),壓入一個(gè)字后SP減1,將多個(gè)寄存器同時(shí)壓棧,總是序號(hào)最高的寄存器先入棧,然后依次壓入序號(hào)較低的寄存器。所以,執(zhí)行指
10、令 PUSH R1,R4 TO SP 與 PUSH R4,R1 TO SP是等效的,即將R4,R3,R2,R1壓棧,在數(shù)據(jù)出棧前SP加1,總是先彈出入棧指令中序號(hào)最低的寄存器,而后依次彈出序號(hào)較高的寄存器,即先進(jìn)后出,后進(jìn)先出。 堆棧操作的指令格式: PUSH Rx,Ry TO SP POP Rx,Ry FROM SP 說(shuō)明:Rx,Ry 可以是R1R4、BP、SP或PC中的任意兩個(gè)或一個(gè),執(zhí)行后將Rx、Ry的序列寄存器壓棧,或?qū)⒍褩V械臄?shù)據(jù)彈入Rx、Ry序列寄存器中。壓棧操作不影響標(biāo)志位,出棧操作影響N和Z標(biāo)志。當(dāng)Rx、Ry中含有SR時(shí),所有標(biāo)志位都會(huì)改變。壓棧、出棧操作的執(zhí)行周期為3n +
11、4,若出棧操作的目的寄存器中含有PC時(shí),執(zhí)行周期為3n+6,其中n是壓棧數(shù)據(jù)的個(gè)數(shù)。壓棧和出棧的指令長(zhǎng)度均為1字長(zhǎng)。例如: PUSH R1,R5 to SP /將R5,R4,R3,R2,R1壓棧 PUSH R2,R2 to SP /將R2壓棧PUSH R3 to SP /將R3壓棧POP R3 from SP /R3出棧POP R2,R2 from SP/R2出棧POP R1,R5 from SP /R1,R2,R3,R4,R5出棧 3.3 算術(shù)運(yùn)算指令 3.3.1 加法運(yùn)算指令 加法運(yùn)算影響標(biāo)志位N,Z,S和C,尋址方式有以下幾種。 1. 立即尋址(不帶進(jìn)位) 格式1:Rd += IM6 或
12、 Rd = Rd + IM6 操作:Rd + IM6 Rd 說(shuō)明:Rd的數(shù)據(jù)與6位(高位擴(kuò)展成16位)立即數(shù)相加,結(jié)果送Rd。 格式2:Rd = Rs + IM16 操作:Rs + IM16 Rd 說(shuō)明:Rd的數(shù)據(jù)與16位的立即數(shù)相加,結(jié)果送Rd。例如: R1=0 x0099 /R1的值為0 x0099 R1+=0 x0001/R1的值變?yōu)? x009A R1+=0 x0012 /R1的值變?yōu)? x00AC 2. 直接尋址格式1:Rd += A6 或 Rd = Rd + A6操作:Rd + A6 Rd說(shuō)明:Rd的數(shù)據(jù)與6位地址指定的存儲(chǔ)單元中的數(shù)據(jù)相加,結(jié) 果送Rd。格式2:Rd = Rs +
13、 A16操作:Rs + A16 Rd說(shuō)明:Rs的數(shù)據(jù)與16位地址指定的存儲(chǔ)單元中的數(shù)據(jù)相加,結(jié)果送Rd。例如:R2=0 x0010 /R2的值為0 x00100 x0088=R2 /把0 x0010送到內(nèi)存單元0 x0088 R1=0 xF099 /R1的值為0 xF099R1+=0 x0088 /R1的值變?yōu)? xF0A9 3. 變址尋址 格式:Rd += Bp + IM6 或Rd = Rd + BP + IM6 操作:Rd + Bp + IM6 Rd 說(shuō)明:取基址指針BP 與6 位立即數(shù)的和作為存儲(chǔ)單元的地址,存儲(chǔ)單元中的數(shù)據(jù)與Rd相加,結(jié)果送Rd寄存器。例如: R1=0 x0010 /R
14、1的值變?yōu)? x0010 R2=0 x0090 /R2的值變?yōu)? x0090 0 x0015=R2 /R2的值送到0 x0015 內(nèi)存單元 R1+=BP+0 x0015 /R1的值變?yōu)? x00A0(設(shè)BP=0 x0000) 4. 寄存器尋址格式: Rd += Rs操作: Rd + Rs Rd說(shuō)明:Rd與Rs的數(shù)據(jù)相加,結(jié)果送Rd。例如: R1=0 x0010 /R1的值為0 x0010 R2=0 x0032 /R2的值為0 x0032R1+=R2 /R1的值變?yōu)? x0042 5. 寄存器間接尋址 格式1:Rd += Rs 操作:Rd + Rs Rd 說(shuō)明:Rd的數(shù)據(jù)與Rs所指定的存儲(chǔ)單元中
15、的數(shù)據(jù)相加,結(jié)果送Rd。 格式2:Rd += Rs+ 操作:Rd + Rs Rd, Rs + 1 Rs 說(shuō)明:Rd的數(shù)據(jù)與Rs所指定的存儲(chǔ)單元中的數(shù)據(jù)相加,結(jié)果送Rd,并且Rs=Rs+1。 格式3:Rd += Rs 操作:Rd + Rs Rd, Rs 1 Rs 說(shuō)明:Rd的數(shù)據(jù)與Rs所指定的存儲(chǔ)單元中數(shù)據(jù)相加,結(jié)果送Rd,且Rs=Rs1。 格式4:Rd += +Rs 操作:Rs + 1 Rs, Rd + Rs Rd 說(shuō)明:首先修改Rs=Rs+1,Rd 的數(shù)據(jù)與Rs 所指定的存儲(chǔ)單元中的數(shù)據(jù)相加,結(jié)果送Rd。例如:R1=0 x0010/R1的值為0 x0010R2=0 x0020 /R2的值為0
16、 x00200 x0010= R2 /R2的值送到內(nèi)存單元0 x0010中R2=0 x0010 /R2的值為0 x0010 R1+=R2+ /R1的值變?yōu)? x0030,同時(shí)R2 的值變?yōu)? x0011 3.3.2 減法運(yùn)算指令1. 立即尋址格式1:Rd = IM6 或 Rd = Rd IM6操作:Rd IM6 Rd說(shuō)明:Rd的數(shù)據(jù)減去6位立即數(shù),結(jié)果送Rd。格式2:Rd = Rs IM16操作:Rs IM16 Rd說(shuō)明:Rs的數(shù)據(jù)減去16位立即數(shù),結(jié)果送Rd。例如:R1=0 x0010 /R1的值為0 x0010 R2=0 x0001 /R2的值為0 x0001 R1 =R2 /R1的值為0
17、 x000F 2. 直接尋址格式1:Rd = A6 或 Rd = Rd A16操作:Rd A6 Rd說(shuō)明:Rd的數(shù)據(jù)減去A6存儲(chǔ)單元中的數(shù)據(jù),結(jié)果送Rd。格式2:Rd = Rs A16操作:Rs A16 Rd 說(shuō)明:Rs的數(shù)據(jù)減去A16存儲(chǔ)單元中的數(shù)據(jù),結(jié)果送Rd。 例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x0002 /R1的值為0 x0002,N=0,Z=0,S=0,C=1 0 x0020=R1 /把R1的值送到內(nèi)存單元0 x0020中,標(biāo)志位不變 R2=0 x0001 /R2的值為0 x0001,N=0,Z=0,S=0,C=1 R2 =0 x0020 /R2的
18、值變?yōu)? xFFFF,C為0表明運(yùn)算過(guò)程產(chǎn)生了借位, /N=1,Z=0,S=1 3. 變址尋址 格式:Rd = BP + IM6 或 Rd = Rd BP + IM6 操作:Rd BP + IM6 Rd 說(shuō)明:Rd的值減去基址加變址指定的存儲(chǔ)單元的值,結(jié)果送Rd。例如: R1=0 x8031 /R1的值為0 x8031 R2=0 x0020 /R2的值為0 x0020 0 x0010=R2 /把0 x0020 送到地址單元0 x0010 R1 =BP+0 x0010 /R1的值變?yōu)? x8011(設(shè)BP=0 x0000) 4. 寄存器尋址格式:Rd=Rs操作:RdRsRd說(shuō)明:寄存器Rd的數(shù)據(jù)
19、減去Rs的數(shù)據(jù)結(jié)果送Rd寄存器。例如: R1 =0 x31E0 /R1的初值為0 x31E0R2 =0 x31DF /R2的初值為0 x31DFR1 =R2 /R1的值變?yōu)? x0001 5. 寄存器間接尋址 格式1:Rd= Rs 操作:RdRsRd 說(shuō)明:Rd的數(shù)據(jù)與Rs所指定的存儲(chǔ)單元中的數(shù)據(jù)相減,結(jié)果送Rd。 格式2:Rd = Rs+ 操作:Rd Rs Rd, Rs+1 Rs 說(shuō)明:Rd的數(shù)據(jù)與Rs所指定的存儲(chǔ)單元中的數(shù)據(jù)相減,結(jié)果送Rd,且RsRs+1。 格式3:Rd = Rs 操作:Rd Rs Rd, Rs1 Rs 說(shuō)明:Rd的數(shù)據(jù)與Rs所指定的存儲(chǔ)單元中的數(shù)據(jù)相減,結(jié)果送Rd, 且
20、RsRs1。 格式4:Rd= +Rs 操作:Rs + 1Rs, Rd Rs Rd 說(shuō)明:Rs的值加1,Rd的數(shù)據(jù)與Rs所指定單元的數(shù)據(jù)相減,結(jié)果送Rd。 3.3.3 帶進(jìn)位的加減法運(yùn)算指令 由于帶進(jìn)位的加減運(yùn)算與不帶進(jìn)位的加減運(yùn)算在尋址方式、周期數(shù)、指令長(zhǎng)度、影響標(biāo)志位等均相同,格式相似,故這里只給出指令格式供讀者參考。 帶進(jìn)位的加法指令格式: Rd += IM6,Carry Rd = Rd + IM6,Carry Rd = Rs + IM16,Carry Rd += BP + IM6 ,Carry Rd = Rd + BP + IM6 ,Carry Rd += A6 ,Carry Rd =
21、Rd + A6 ,Carry Rd = Rs + A16 ,CarryRd += Rs,CarryRd += Rs ,CarryRd += +Rs ,CarryRd += Rs ,CarryRd += Rs+,Carry帶進(jìn)位的減法指令格式:Rd = IM6,CarryRd = Rd IM6,CarryRd = Rs IM16,Carry Rd = BP + IM6 ,CarryRd = Rd BP + IM6 ,CarryRd = A6 ,CarryRd = Rd A6 ,CarryRd = Rs A16 ,CarryRd = Rs,CarryRd = Rs ,CarryRd = +Rs ,
22、CarryRd = Rs ,CarryRd = Rs+,Carry3.3.4 乘法運(yùn)算指令 Rd和Rs可用R1R2和BP;MR由R4、R3構(gòu)成,R4為高位字,R3為低位字。不影響標(biāo)志位。 格式1:MR = Rd * Rs或MR = Rd * Rs,ss 功能:Rd * Rs MR 說(shuō)明:表示兩個(gè)有符號(hào)數(shù)相乘,結(jié)果送MR寄存器。 格式2:MR = Rd * Rs,us 功能:Rd * Rs MR 說(shuō)明:表示無(wú)符號(hào)數(shù)與有符號(hào)數(shù)相乘,結(jié)果送MR寄存器。 例如,計(jì)算一年365 天共有多少小時(shí),結(jié)果存放R4(高位)、R3(低位)。 R1 = 365 /R1的值為0 x016D R2 = 24 /R2的值
23、為0 x0018 MR = R1 * R2,us/計(jì)算乘積,結(jié)果R3的值為0 x2238,R4的值為0 x0000 3.3.5 內(nèi)積運(yùn)算指令 內(nèi)積運(yùn)算指令不影響標(biāo)志位。 格式:MR = Rd * Rs ,ss ,n 功能:Rd與Rs寄存器內(nèi)容作為地址的存儲(chǔ)器內(nèi)有符號(hào)數(shù)與有符號(hào)數(shù)之間或無(wú)符號(hào)數(shù)與有符號(hào)字?jǐn)?shù)之間進(jìn)行n項(xiàng)內(nèi)積運(yùn)算,結(jié)果存入MR。符號(hào)的缺省選擇為ss,即有符號(hào)數(shù)據(jù)之間的運(yùn)算。n的取值為116,缺省值為1。內(nèi)積運(yùn)算操作如圖3.2所示,其中Rd與Rs可為寄存器R1R2或BP。 執(zhí)行周期:10n+6個(gè)周期 說(shuō)明:當(dāng)FIR_MOV ON 時(shí),允許FIR運(yùn)算過(guò)程中數(shù)據(jù)自由移動(dòng)。為新樣本取代舊樣本
24、進(jìn)行數(shù)據(jù)移動(dòng)準(zhǔn)備:Xn4=Xn3,Xn3=Xn2,Xn2=Xn1。如圖3.2所示,當(dāng)完成一次內(nèi)積運(yùn)算后X1、X2、X3自動(dòng)右移,X4移出,在數(shù)字信號(hào)處理中十分有用。比如你要計(jì)算連續(xù)4次采樣值的平均值,可將采樣值放到X1X4 中,加權(quán)系數(shù)放到C中,然后完成Rd * Rs ,ss ,4運(yùn)算,再求平均值。當(dāng)FIR_MOV ON時(shí),運(yùn)算完后X1、X2、X3自動(dòng)右移,X4 移出。這樣我們就可以把下一次的采樣值X0放到原X1的位置,下一次直接完成Rd * Rs ,ss ,4運(yùn)算,即X0X3的運(yùn)算,不必另外移動(dòng)Xn。 圖3.2 內(nèi)積運(yùn)算操作示意圖 3.3.6 比較指令 比較指令執(zhí)行兩數(shù)的減法操作,不存儲(chǔ)運(yùn)算
25、結(jié)果,只影響標(biāo)志位N、Z、S和C。下面按尋址方式分別介紹比較指令。 1. 立即尋址 格式1:CMP Rd,IM6 說(shuō)明:將Rd的值與6位立即數(shù)相比較。 格式2:CMP Rd,IM16 說(shuō)明:將Rd的值與16位立即數(shù)相比較。 2. 直接尋址 格式1:CMP Rd, A6 說(shuō)明:將Rd的值與A6指定地址單元的數(shù)據(jù)相比較。 格式2:CMP Rd, A16 說(shuō)明:將Rd的值與A16指定地址單元的數(shù)據(jù)相比較。 3. 寄存器尋址 格式:CMP Rd,Rs 說(shuō)明:將Rd與Rs的值相減,只影響標(biāo)志位,不存儲(chǔ)結(jié)果。 4. 變址尋址 格式:CMP Rd,BP + IM6 說(shuō)明:將Rd與BP + IM6指定地址單元
26、的數(shù)據(jù)相比較。 5. 寄存器間接尋址 格式1:CMP Rd,Rs 說(shuō)明:將Rd的值與寄存器Rs指定存儲(chǔ)單元的數(shù)據(jù)相比較。 格式2:CMP Rd,Rs+ + 說(shuō)明:將Rd的值與寄存器Rs指定存儲(chǔ)單元的數(shù)據(jù)相比較,且RsRs+1。 格式3:CMP Rd,Rs- - 說(shuō)明:將Rd的值與寄存器Rs指定存儲(chǔ)單元的數(shù)據(jù)相比較,且RsRs-1。 格式4:CMP Rd,+Rs 說(shuō)明:Rs加1,再將Rd的值與寄存器Rs指定存儲(chǔ)單元的數(shù)據(jù)相比較,結(jié)果只影響標(biāo)志位。 3.4 邏輯運(yùn)算指令 3.4.1 邏輯與指令 1. 立即尋址格式1:Rd &= IM6 或Rd = Rd & IM6功能:Rd & IM6Rd說(shuō)明:將
27、Rd的數(shù)據(jù)與6位立即數(shù)進(jìn)行邏輯與操作,結(jié)果送Rd 寄存器。格式2:Rd = Rs & IM16功能:Rs & IM16Rd說(shuō)明:將Rs的數(shù)據(jù)與16 位立即數(shù)進(jìn)行邏輯與操作,結(jié)果送Rd寄存器。例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。R1=0 x0010 /R1的初值為0 x0010,Z=0R1&=0 x000F /結(jié)果為0,標(biāo)志位Z由0變?yōu)? 2. 直接尋址 格式1:Rd &=A6 或 Rd=Rd&A6 功能:Rd & A6 Rd 說(shuō)明:將Rd和A6指定存儲(chǔ)單元的數(shù)據(jù)進(jìn)行邏輯與操作,結(jié)果送Rd寄存器。 格式2:Rd = Rs & A16 功能:Rs & A16 Rd3. 寄存器
28、尋址格式:Rd &= Rs或Rd=Rd&Rs功能:Rd & RsRd說(shuō)明:將Rd和Rs的數(shù)據(jù)進(jìn)行邏輯與操作,結(jié)果送Rd寄存器。例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。R1=0 x00FF /R1的初值為0 x00FF,Z=0,N=0R2=0XFFFF /R1的初值為0XFFFF,Z=0,N=1R1&=R2 /結(jié)果為0 x00FF標(biāo)志位N變?yōu)?,Z=0 4. 寄存器間接尋址 格式1:Rd &= Rs 功能:Rd & Rs Rd 說(shuō)明: 將Rd的數(shù)據(jù)與Rs指定的存儲(chǔ)單元數(shù)據(jù)進(jìn)行邏輯與操作,結(jié)果送Rd寄存器。 格式2:Rd &= Rs+ 功能:Rd & RsRd,Rs+1Rs 說(shuō)明
29、:將Rd的數(shù)據(jù)與Rs指定的單元的數(shù)據(jù)進(jìn)行邏輯與操作,結(jié)果送Rd寄存器,并使Rs加1。 格式3:Rd &= Rs- 功能:Rd & RsRd,Rs1Rs 說(shuō)明:將Rd 的數(shù)據(jù)與Rs 指定的單元的數(shù)據(jù)進(jìn)行邏輯與操作,結(jié)果送Rd寄存器,并使Rs減1。 格式4:Rd &= +Rs 功能:Rs+1Rs,Rd&RsRd 說(shuō)明:Rs加1,將Rd的數(shù)據(jù)與Rs指定的單元的數(shù)據(jù)進(jìn)行邏輯與操作,結(jié)果送Rd寄存器。 例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x00FF /R1的初值為0 x00FF,Z=0,N=0 R2=0XFFFF /R2的初值為0XFFFF,Z=0,N=1 0 x000
30、1=R2 R2=0 x0001 R1&=R2 /結(jié)果為0 x00FF,標(biāo)志位N變?yōu)?,Z=0 3.4.2 邏輯或指令 1. 立即尋址 格式1:Rd|=IM6或Rd=Rd|IM6 功能:Rd|IM6Rd 說(shuō)明:將Rd的數(shù)據(jù)與6位立即數(shù)進(jìn)行邏輯或操作,結(jié)果送Rd寄存器。 格式2:Rd=Rs|IM16 功能:Rs|IM16Rd 說(shuō)明:將Rs的數(shù)據(jù)與16位立即數(shù)進(jìn)行邏輯或操作,結(jié)果送Rd寄存器。 例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x00FF /R1的初值為0 x00FF,Z=0,N=0 R1|=0 xF000 /R1的值變?yōu)? xF0FF, Z=0,N=1 2. 直
31、接尋址 格式1:Rd|=A6或Rd=Rd|A6 功能:Rd|A6Rd 說(shuō)明:將Rd和A6指定單元的數(shù)據(jù)進(jìn)行邏輯或操作,結(jié)果送Rd寄存器。 格式2:Rd =Rs|A16 功能:Rs|A16Rd 說(shuō)明:將Rs的數(shù)據(jù)和A16指定單元的數(shù)據(jù)進(jìn)行邏輯或操作,結(jié)果送Rd寄存器。 例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x00FF /R1的初值為0 x00FF,Z=0,N=0 R1|=0 x0009 /R1值變?yōu)? x00FF, Z=0,N=0,假設(shè) 0 x0009的值為0 3. 寄存器尋址 格式:Rd|=Rs 功能:Rd|Rs Rd 說(shuō)明:將Rd 和Rs 的數(shù)據(jù)進(jìn)行邏輯或操作
32、,結(jié)果送Rd 寄存器。 例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x0000 /R1的初值為0 x0000,Z=1,N=0 R2=0 xFFF0 R1|=R2 /R1的值變?yōu)? xFFF0,Z=0,N=1 4. 寄存器間接尋址 格式1:Rd|= Rs 功能:Rd|Rs Rd 說(shuō)明:將Rd的數(shù)據(jù)與Rs指定單元的數(shù)據(jù)進(jìn)行邏輯或操作,結(jié)果送Rd寄存器。 格式2:Rd |= Rs+ 功能:Rd | Rs Rd,Rs + 1Rs 說(shuō)明:將Rd的數(shù)據(jù)與Rs 指定單元的數(shù)據(jù)進(jìn)行邏輯或操作,結(jié)果送Rd 寄存器,并使Rs加1。 格式3:Rd|= Rs- 功能:Rd|RsRd,Rs1R
33、s 說(shuō)明:將Rd的數(shù)據(jù)與Rs 指定單元的數(shù)據(jù)進(jìn)行邏輯或操作,結(jié)果送Rd寄存器,并使Rs減1。 格式4:Rd|= +Rs 功能:Rs+1Rs,Rd|RsRd 說(shuō)明:首先將Rs的值加1,然后將Rd與Rs指定單元的數(shù)據(jù)進(jìn)行邏輯或操作,結(jié)果送Rd寄存器。 例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x0000; /R1的初值為0 x0000,Z=1,N=0 R2=0 xFFFF; /把0 xFFFF送到地址單元0 x0002中 0 x0002=R2; R2=0 x0002; /R2的值為0 x0002,Z=0,N=0 R1|=R2; /R1的值變?yōu)? xFFFF,Z=0,N=
34、1 3.4.3 邏輯異或指令 邏輯異或影響標(biāo)志位N和Z,尋址方式有以下幾種。 1. 立即尋址 格式1:Rd=IM6或Rd= RdIM6 功能:RdIM6Rd 說(shuō)明:將Rd的數(shù)據(jù)與6位立即數(shù)進(jìn)行邏輯異或操作,結(jié)果送Rd寄存器。 格式2:Rd=RsIM16 功能:RsIM16Rd 說(shuō)明:將Rs的數(shù)據(jù)與16位立即數(shù)進(jìn)行邏輯異或操作,結(jié)果送Rd寄存器。 例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x0F00 /R1的初值為0 x0F00,Z=0,N=0 R1=0 x0FFF /R1的值變?yōu)? x00FF,Z=0,N=0 2. 直接尋址 格式1:Rd=A6或RdRdA6 功能:
35、Rd A6 Rd 說(shuō)明:將Rd 和A6 指定存儲(chǔ)單元的數(shù)據(jù)進(jìn)行邏輯異或操作,結(jié)果送Rd 寄存器。 格式2:Rd=RsA16 功能:RsA16 Rd 說(shuō)明:將Rs的數(shù)據(jù)和A16指定存儲(chǔ)單元的數(shù)據(jù)進(jìn)行邏輯異或操作,結(jié)果送Rd寄存器。 例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x0F00 /R1的初值為0 x0F00,Z=0,N=0 R2=0 x0FF0 0 x0010=R2 R1=0 x0010 /R1的值變?yōu)? x00F0,Z=0,N=0 3. 寄存器尋址 格式:Rd = Rs 功能:Rd RsRd 說(shuō)明:將Rd 和Rs 的數(shù)據(jù)進(jìn)行邏輯異或操作,結(jié)果送Rd 寄存器。
36、例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x0E01 /R1的初值為0 x0E01,Z=0,N=0 R2=0 x0FF1 /R2的初值為0 x0FF1,Z=0,N=0 R1=R2 /R1的值變?yōu)? x01F0,Z=0,N=0 4. 寄存器間接尋址 格式1:Rd= Rs 功能:RdRsRd 說(shuō)明:將Rd的數(shù)據(jù)與Rs指定的存儲(chǔ)單元的數(shù)據(jù)進(jìn)行邏輯異或操作,結(jié)果送Rd寄存器。 格式2:Rd= Rs+ 功能:RdRs Rd,Rs + 1Rs 說(shuō)明:將Rd的數(shù)據(jù)與Rs指定的存儲(chǔ)單元的數(shù)據(jù)進(jìn)行邏輯異或操作,結(jié)果送Rd寄存器,并使Rs加1。 格式3:Rd=Rs- 功能:RdRsRd
37、,Rs1Rs 說(shuō)明:將Rd的數(shù)據(jù)與Rs 指定的存儲(chǔ)單元中的數(shù)據(jù)進(jìn)行邏輯異或操作,結(jié)果送Rd寄存器,并使Rs 減1。 格式4:Rd=+Rs 功能:Rs+1Rs ,RdRsRd 說(shuō)明:首先使Rs 加1,然后Rd 的數(shù)據(jù)與Rs 指定的存儲(chǔ)單元中的數(shù)據(jù)進(jìn)行邏輯異或操作,結(jié)果送Rd 寄存器。 例如,假設(shè)開(kāi)始時(shí)的標(biāo)志位為N=0,Z=1,S=0,C=1。 R1=0 x0000 /R1的初值為0 x0000,Z=1,N=0 R2=0 xFFFF /R2的初值為0 xFFFF,N=1,Z=0 0 x0002=R2 R2=0 x0002 R1=R2 /R1的值變?yōu)? xFFFF, Z=0,N=1 3.4.4 測(cè)試
38、指令 測(cè)試指令是將兩個(gè)數(shù)進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位。 1. 立即尋址 格式1:TEST Rd,IM6 說(shuō)明:將Rd與IM6進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位。 格式2:TEST Rd,IM16 說(shuō)明:將Rd與IM16進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位。 例如,假設(shè)初始時(shí)標(biāo)志位分別為N=0,Z=1,S=0,C=1。 R1=0 x0E01 /R1的初值為0 x0E01,N=0,Z=0,S=0,C=1 TEST R1,0 x0000 /測(cè)試R1和0 x0000 相與的結(jié) 果,N=0,Z=1,S=0,C=1 JZ loop1 /測(cè)試結(jié)果為0,跳轉(zhuǎn)到loop1
39、 R2=0 x0020loop1: R1=0 x0001 /標(biāo)號(hào) 2. 直接尋址 格式1:TEST Rd, A6 說(shuō)明:將Rd與A6指定存儲(chǔ)單元的數(shù)據(jù)進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位。 格式2:TEST Rd, A16 說(shuō)明:將Rd與A16指定存儲(chǔ)單元的數(shù)據(jù)進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志。 例如,假設(shè)初始時(shí)標(biāo)志位分別為N=0,Z=1,S=0,C=1。R1=0 x0E01 /R1的初值為 0 x0E01,N=0,Z=0,S=0,C=1R2=0 x0011 /將0 x0011 送到內(nèi)存單元0 x0000中0 x0000=R2TEST R1,0 x0000 /R1和0 x
40、0000單元的值相與,此時(shí) N=0,Z=0,S=0,C=1JNZ loop1 /Z為0時(shí)跳轉(zhuǎn)到loop1,(此時(shí)測(cè)試結(jié)果 不為0)NOPNOPloop1: R1=0 x0000 . 3. 變址尋址 格式:TEST Rd,BP+IM6 說(shuō)明:將Rd與BP+IM6指定存儲(chǔ)單元的數(shù)據(jù)進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位。 例如,假設(shè)初始狀態(tài)標(biāo)志位分別為N=0,Z=1,S=0,C=1。 R1=0 x0E01 /R1的初值為0 x0E01,N =0,Z=0,S=0,C=1 R2=0 x0011 /將0 x0011送到內(nèi)存單元0 x0000中 0 x0000=R2 TEST R1,BP+0 x0
41、000 /已知BP的值為0,R1和BP+0 x0000單元的值相與, /N=0,Z=0,S=0,C=1 JNZ loop1 /測(cè)試結(jié)果不為0時(shí)跳轉(zhuǎn)到loop1 NOP NOPloop1: R1+=1 4. 寄存器尋址 格式:TEST Rd,Rs 說(shuō)明:將Rd 與Rs 的數(shù)據(jù)進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位。 例如,假設(shè)初始時(shí)標(biāo)志位分別為N=0,Z=1,S=0,C=1。 R1=0 x0000 /R1的初值為0 x0000,N=0,Z=1,S=0,C=1 R2=0 x1111 /R2的初值為0 x1111,N=0,Z=0,S=0,C=1 TEST R1,R2 /測(cè)試R1和R2的相與的
42、結(jié)果,N=0,Z=1,S=0,C=1 JZ loop1 /測(cè)試結(jié)果為0時(shí)跳轉(zhuǎn)到loop1 NOPloop1: R1-=1 /標(biāo)號(hào) 5. 寄存器間接尋址 格式1:TEST Rd,Rs 說(shuō)明:將Rd 與Rs 指定存儲(chǔ)單元中的數(shù)據(jù)進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位。 格式2:TEST Rd,Rs+ 說(shuō)明:將Rd與Rs指定存儲(chǔ)單元中的數(shù)據(jù)進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位,并且使Rs加1。 格式3:TEST Rd,Rs- 說(shuō)明:將Rd 與Rs 指定存儲(chǔ)單元中的數(shù)據(jù)進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位,并且使Rs減1。 格式4:TEST Rd,+Rs 說(shuō)明:首先Rs加1
43、,然后Rd 與Rs 指定存儲(chǔ)單元中的數(shù)據(jù)進(jìn)行邏輯與操作,不存儲(chǔ)結(jié)果,只影響N和Z標(biāo)志位。 例如,假設(shè)初始時(shí)標(biāo)志位分別為N=0,Z=1,S=0,C=1。 R1=0 x0000 /R1的初值為0 x0000,N=0,Z=1,S=0,C=1 R2=0 x1111 /0 x0001的初值為0 x1111,N=0,Z=0,S=0,C=1 0 x0001=R2 R2=0 x0001 TEST R1,R2 /測(cè)試R1和R2相與的結(jié)果,N=0,Z=1,S=0,C=1 JZ loop1 /測(cè)試結(jié)果為0時(shí)跳轉(zhuǎn)到loop1 Noploop1: R1=0 x0000/標(biāo)號(hào) 3.4.5 移位操作指令 1. 邏輯左移(L
44、SL) 格式:RdRs LSL n 說(shuō)明:對(duì)Rs 進(jìn)行n(可設(shè)為14)位邏輯左移,將Rs高n 位移入SB寄存器,同時(shí)Rs 的低n(14)位用0補(bǔ)足,結(jié)果送Rd寄存器。 例如,邏輯左移3位,寄存器移位前的狀態(tài)如下: 2. 邏輯右移(LSR) 格式:Rd=Rs LSR n 說(shuō)明: 對(duì)Rs進(jìn)行n(可設(shè)為14)位邏輯右移,將Rs低n位移入SB寄存器,同時(shí)Rs的高n(14)位用0補(bǔ)足,結(jié)果送Rd寄存器。 例如,邏輯右移3位,寄存器移位前的狀態(tài)如下: 3. 循環(huán)左移(ROL) 格式:RdRs ROL n 說(shuō)明:對(duì)Rs進(jìn)行n(可設(shè)為14)位循環(huán)左移,將Rs的高n位移入SB寄存器,同時(shí)將SB寄存器的高n位移入
45、Rs的低n位,結(jié)果送Rd 寄存器。 例如,循環(huán)左移1位,寄存器移位前的狀態(tài)如下: 4. 循環(huán)右移(ROR) 格式:Rd Rs ROR n 說(shuō)明:對(duì)Rs進(jìn)行n(可設(shè)為14)位循環(huán)右移,將Rs的低n位移入SB 寄存器,同時(shí)將SB寄存器的低n位移入Rs的高n位,結(jié)果送Rd寄存器。 例如,循環(huán)右移1位,寄存器移位前的狀態(tài)如下: 5. 算術(shù)右移ASR 格式:Rd Rs ASR n 說(shuō)明:將Rs算術(shù)右移n(可設(shè)為14)位,將Rs的低n位移入SB寄存器,并對(duì)最高有效位進(jìn)行符號(hào)擴(kuò)展(保持原符號(hào)不變),結(jié)果送Rd寄存器。該指令適用于有符號(hào)數(shù)的移位操作。 例如,算術(shù)右移3位。 R1=0 xF111 /R1的初值為
46、0 xF111 R1=R1 ASR 3 /R1移位后的值為0 xFE22 6. 多功能移位指令 SPCE061A在進(jìn)行移位的同時(shí),還可進(jìn)行其它運(yùn)算,現(xiàn)以算術(shù)右移為例說(shuō)明如下。(先移位后完成相應(yīng)的運(yùn)算) 格式1:Rd += Rs ASR n ,Carry 說(shuō)明:將Rs 移位后的結(jié)果與Rd 帶進(jìn)位相加,結(jié)果送Rd 寄存器。 格式2:Rd = Rs ASR n ,Carry 說(shuō)明:將Rs 移位后的結(jié)果與Rd 帶進(jìn)位相減,結(jié)果送Rd 寄存器。 格式3:CMP Rd, Rs ASR n 說(shuō)明:將Rs 移位后的結(jié)果與Rd 相比較。 格式4:Rd = Rs ASR n說(shuō)明:取Rs 移位后結(jié)果的負(fù)值,送Rd
47、寄存器。格式5:Rd&= Rs ASR n說(shuō)明:將Rs 移位后的值與Rd邏輯與,結(jié)果送Rd 寄存器。格式6:Rd|= Rs ASR n說(shuō)明:將Rs 移位后的值與Rd邏輯或,結(jié)果送Rd 寄存器。格式7:Rd= Rs ASR n說(shuō)明:將Rs 移位后的值與Rd邏輯異或,結(jié)果送Rd 寄存器。 格式8:TEST Rd,Rs ASR n 說(shuō)明:將Rs移位后的值與Rd邏輯與,不保存結(jié)果,只影響標(biāo)志位N和Z。例如: R1=0 xFF00/R1初值為0 xFF00 R2=0 x0001 R2+=R1 ASR 1/R1算術(shù)右移1位后的值變?yōu)? xFF80, 再與R2相加,最后R2的值為0 xFF81 3.5 控制
48、轉(zhuǎn)移類指令 SPCE061A單片機(jī)的控制轉(zhuǎn)移類指令主要有條件轉(zhuǎn)移指令、無(wú)條件轉(zhuǎn)移指令、中斷指令、中斷返回、子程序調(diào)用等,如表3.3、表3.4所示。 表3.3 條件轉(zhuǎn)移指令(指令長(zhǎng)度1,周期3/5)表3.4 無(wú)條件轉(zhuǎn)移指令 1. 無(wú)符號(hào)數(shù)的跳轉(zhuǎn)指令 判C的轉(zhuǎn)移指令JB 和JNB: JB loop1/小于,轉(zhuǎn)loop1 JNB loop1/不小于,轉(zhuǎn)loop1 這兩條指令都是通過(guò)判斷標(biāo)志位C決定程序的走向的,它們的執(zhí)行過(guò)程如圖3.3所示。 圖3.3 指令JB和JNB的執(zhí)行過(guò)程 例1 用JB指令。R1=0 x0001 /初值R2=0 x0006CMP R1,R2 /比較R1和R2的大小JB loop
49、1 /判C0(R1R2)嗎?是,跳到loop1R1=0 x00FFloop1:R1=0 x0000R2=0 x0000 2. 有符號(hào)數(shù)的跳轉(zhuǎn)指令 判S跳轉(zhuǎn)指令JGE(大于等于)和JNGE(小于): JGE loop1 JNGE loop1JGE表示大于等于,通過(guò)對(duì)標(biāo)志位S的判斷來(lái)決定程序的走向。S0 ,產(chǎn)生跳轉(zhuǎn);S1,繼續(xù)執(zhí)行下一條指令。JNGE表示小于。S1,產(chǎn)生跳轉(zhuǎn);S0,繼續(xù)執(zhí)行下一指令。 這兩條指令的執(zhí)行過(guò)程如圖3.4所示。 圖3.4 指令JGE和JNGE的執(zhí)行過(guò)程 例3 用JGE指令。R1=2 /賦初值,分別為有符號(hào)數(shù)R2=-3CMP R1,R2 /比較R1和R2的大小JGE loo
50、p1 /R1大于等于R2時(shí)跳轉(zhuǎn)到loop1R2=0 x00FFloop1:R1=0 x0000 例4 用JNGE指令。R1=-2 /賦初值, 分別為有符號(hào)數(shù)R2=3CMP R1,R2 /比較R1和R2的大小JNGE loop1 /R1小于R2(S=1)時(shí)跳轉(zhuǎn)到loop1R2=0 x00FFloop1: R1=0 x0000 3. 其它跳轉(zhuǎn)指令 判C跳轉(zhuǎn)指令JCC 和JCS: JCC loop1 JCS loop1 JCC是以C=0作為判斷的標(biāo)準(zhǔn),決定程序的跳轉(zhuǎn);JCS 是以C=1作為判斷的標(biāo)準(zhǔn),決定程序的跳轉(zhuǎn)。 這兩條指令的執(zhí)行過(guò)程如圖3.5所示。 圖3.5 指令JCC和JCS的執(zhí)行過(guò)程 例5
51、 用JCC指令。R1=0 x0020 /賦初值R1+=1JCC loop1 /如果C0跳轉(zhuǎn)到loop1R1=0 x00FFloop1:R1=0 x0000例6 用JCS指令。R1=0 x0002 /賦初值R1-=1JCS loop1 /如果C1跳轉(zhuǎn)到loop1R1=0 x00FFloop1:R1=0 x0000 3.6 常用偽指令 3.6.1 偽指令的語(yǔ)法格式及特點(diǎn) 偽指令可以寫(xiě)在程序文件中的任意位置,但在其前面必須用一個(gè)小圓點(diǎn)引導(dǎo)以區(qū)分匯編指令,偽指令行中方括弧里的參量是任選項(xiàng),如果某一個(gè)參量使用雙重方括弧括起來(lái),則說(shuō)明這個(gè)任選項(xiàng)參量本身就必須帶著方括弧。例如,count表示引用該任選參量時(shí)
52、必須寫(xiě)出count。 SPCE061A 匯編器規(guī)定的標(biāo)準(zhǔn)偽指令不必區(qū)分字母的大小寫(xiě),即書(shū)寫(xiě)偽指令時(shí)既可全用大寫(xiě)也可全用小寫(xiě)甚至可以大小寫(xiě)混用。但所有定義的標(biāo)號(hào)、宏名、結(jié)構(gòu)名、結(jié)構(gòu)變量名、段名及程序名一律區(qū)分其字母的大小寫(xiě)。 3.6.2 偽指令符號(hào)約定 為了敘述方便,在此對(duì)使用的符號(hào)作如下統(tǒng)一約定。bank 存儲(chǔ)器的頁(yè)單元ROM 程序存儲(chǔ)器RAM 隨機(jī)數(shù)據(jù)存儲(chǔ)器label 程序標(biāo)號(hào)value 常量數(shù)值variable 變量名number 數(shù)據(jù)的數(shù)目ASCII 數(shù)值或符號(hào)的ASCII 代碼argument# 參量表中的參量序號(hào)filename 文件名 任選項(xiàng) 3.6.3 標(biāo)準(zhǔn)偽指令 表3.5 偽指
53、令類別 1. DEFINE 類別:定義類 功能:定義常量符號(hào) 語(yǔ)法格式:.DEFINE variable value, 應(yīng)用解釋: 給常量符號(hào)所賦的值既可以是已定義過(guò)的常量符號(hào),也可以是表達(dá)式,切忌符號(hào)超前引用,即如果賦值引用的符號(hào)不是在引用前定義的,則會(huì)出現(xiàn)非法超前引用的錯(cuò)誤。例如: .DEFINE BODY 1.DEFINE IO_PORT 0 x7016.IFDEF BODYR1=0XFFFFIO_PORT=R1.ENDIF 2. PUBLIC 類別:定義類 功能:聲明將被引用在其它文件中的全局標(biāo)號(hào) 語(yǔ)法格式:.PUBLIC label label, 應(yīng)用解釋:在文件中聲明將被引用在外部
54、文件中的全局標(biāo)號(hào)。故在外部文件中用偽指令EXTERNAL 所聲明的標(biāo)號(hào)必須是用PUBLIC 偽指令聲明過(guò)的,當(dāng)要聲明多個(gè)全局標(biāo)號(hào)時(shí)要用逗號(hào)(,)將每一標(biāo)號(hào)分開(kāi)。例如: .PUBLIC sym1/聲明要引用在其它文件中的全局標(biāo)號(hào) .PUBLIC sym1,sym2 /聲明多個(gè)全局標(biāo)號(hào)需用逗號(hào)將每 /一標(biāo)號(hào)分開(kāi),空格會(huì)被忽略 3.6.4 宏定義與調(diào)用 1. 宏定義 所謂宏(Macro)是指在源程序里將一序列的源指令行用一個(gè)簡(jiǎn)單的宏名(Macro Name)所取代。這樣做的好處是使程序的可讀性增強(qiáng)。 宏在使用之前一定要先經(jīng)過(guò)定義,可分別用偽指令 .MACRO 和 .ENDM 來(lái)起始和結(jié)束宏定義。定義
55、的宏名將被存入標(biāo)號(hào)域,在匯編器首次編譯通過(guò)匯編指令時(shí),先將宏定義存儲(chǔ)起來(lái),待指令中遇有被調(diào)用的宏名時(shí)則會(huì)用同名宏定義里的序列源指令行取代此宏名。宏定義里可以包括宏參數(shù),這些參數(shù)可被代入除注釋域之外的任何域內(nèi),虛參數(shù)不能含有空格。 2. 宏標(biāo)號(hào) 宏定義里可以用顯式標(biāo)號(hào)(由用戶定義),亦可用隱含標(biāo)號(hào)(由匯編器自動(dòng)定義)。匯編器不會(huì)改變用戶定義的顯式標(biāo)號(hào)。在宏標(biāo)號(hào)后加上后綴符“#”則表明該標(biāo)號(hào)為隱含標(biāo)號(hào),匯編器會(huì)自動(dòng)生成一個(gè)后綴數(shù)字符號(hào)“_X_XXXX”(X表示一位數(shù)符,XXXX 表示4 位擴(kuò)展數(shù)符)來(lái)取代這個(gè)隱含標(biāo)號(hào)中的后綴符“#”。隱含標(biāo)號(hào)中的字母字符及其后綴數(shù)符總共不能超過(guò)32個(gè)字符。 3.
56、宏調(diào)用 在調(diào)用宏時(shí),可以使用任何類型的參數(shù)直接型、間接型、字符串型或寄存器型。只有字符串型參數(shù)才能含有空格,但必須用引號(hào)將此空格括起 或“ ”(而字符串參數(shù)中的單引號(hào),必須用雙引號(hào)將其括起)。即只要在宏嵌套中的形參名相同,那么這些參數(shù)就可以穿過(guò)嵌套的宏使用。宏嵌套使用惟一所受的限制是內(nèi)存空間的容量。宏的多個(gè)參數(shù)應(yīng)以逗號(hào)隔開(kāi),參數(shù)前的空格及Tab 鍵都將被忽略。單有一個(gè)逗號(hào),而后面未帶有任何參數(shù)會(huì)被匯編器表示為參數(shù)丟失錯(cuò)誤。 4. 宏參數(shù)分隔符 在一個(gè)宏體中宏參數(shù)的有效分隔符為“,”(逗號(hào))。 5. 宏內(nèi)字符串連接符 符號(hào)“”(40H)是字符串連接符。注意:字符串連接只能在宏內(nèi)進(jìn)行。 6. 助記符搜索順序 通常匯編器以表3.6列出的順序來(lái)搜索各種助記符或符號(hào)。 表3.6 匯編器助記符搜索順序 3.6.5 段定義與調(diào)用 1. 預(yù)定義段 在Xasm16 里共定義有9 個(gè)預(yù)定義段:CODE、DATA、TEXT、ORAM、OSRAM、RAM、IRAM、SRAM 及ISRAM段。這些預(yù)定義段都分別被規(guī)定了以下內(nèi)容: (1) 段內(nèi)存儲(chǔ)數(shù)據(jù)類型:指令/數(shù)據(jù),無(wú)初始值的變量/有初始值的變量; (2) 存儲(chǔ)介質(zhì)類型:ROM/RAM (SRAM); (3) 存儲(chǔ)范圍:零頁(yè)(或零頁(yè)中前64個(gè)字)或當(dāng)前頁(yè)/整個(gè)64頁(yè); (4) 定位排放方式:合并排放/重疊排放。 2.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- iso認(rèn)證合同范本
- 七夕節(jié)營(yíng)銷策劃方案
- 協(xié)議控制合同范本
- 一年級(jí)下冊(cè)《文具的家》教學(xué)反思
- 公司出售居間合同范本
- 與商家訂食品合同范本
- 出售手扶電梯合同范本
- 《愉快的夢(mèng)》教案
- 賣(mài)合同范本軟件
- 醫(yī)院路燈采購(gòu)合同范本
- 小學(xué)學(xué)校2024-2025學(xué)年教學(xué)質(zhì)量提升實(shí)施方案
- 施工影像資料交底
- 地連墻施工鋼筋籠吊裝計(jì)算書(shū)
- 風(fēng)電施工安全生產(chǎn)事故案例匯編(第一期)
- 吊籃施工風(fēng)險(xiǎn)分級(jí)管控與隱患排查治理(匯編)
- 車(chē)間維修工培訓(xùn)課件
- 安全管理工作中形式主義及防止對(duì)策
- 2024年鄭州信息科技職業(yè)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 藍(lán)牙基礎(chǔ)知識(shí)全解課件
- 第四次工業(yè)革命課件
- 2023-2024學(xué)年西安市高二數(shù)學(xué)第一學(xué)期期末考試卷附答案解析
評(píng)論
0/150
提交評(píng)論