




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 5. 移位指令 移位指令有如下循環(huán)左移、 帶進(jìn)位位循環(huán)左移、 循環(huán)右移和帶進(jìn)位位循環(huán)右移 4 條指令, 移位只能對累加器A進(jìn)行。 循環(huán)左移RL A ; (A n+1) (An) , (A0) (A7) , 23 帶進(jìn)位位循環(huán)左移 RLC A ; (A n+1) (An ), (CY) (A7 ), (A0 ) (CY) , 33 循環(huán)右移 RRA ; (An) (A n+1 ), (A7 ) (A0) , 03帶進(jìn)位位循環(huán)右移 RRC A ; (An) (A n+1 ), (CY) (A0), (A7) (CY) , 13 以上移位指令操作, 可用圖 3 5 表示。 圖 3 5 移位指令操作
2、示意圖 另外, 值得一提的是在前述數(shù)據(jù)傳送類指令中有一條累加器A的內(nèi)容半字節(jié)交換指令: SWAP A ; (A)74 (A)30 , C4 它實(shí)際上相當(dāng)于執(zhí)行循環(huán)左移指令 4 次。 該指令在BCD碼的變換中是很有用的, 如 3.3.2 節(jié)的例 4。 例如: 設(shè)(A)=43H, (CY)=0, 則執(zhí)行指令: RL A ; RLC A ; RR A ; RRC A ; 結(jié)果為: (A)=86H, (CY)=0 (A)=0CH, (CY)=1 (A)=06H, (CY)=1 (A)=83H, (CY)=0當(dāng)A的最高位(D7)為0時,執(zhí)行一次RL指令相當(dāng)于對A進(jìn)行一次乘2操作。 01111011 10
3、 0000000001111011 11110110當(dāng)A的最低位(D0)為0時,執(zhí)行一次RR指令相當(dāng)于對A進(jìn)行一次除2操作。即除是乘的反操作。 3.3.4 控制轉(zhuǎn)移類指令 控制轉(zhuǎn)移類指令共計 17 條, 可分為無條件轉(zhuǎn)移指令、 條件轉(zhuǎn)移指令、 子程序調(diào)用及返回指令。 有了豐富的控制轉(zhuǎn)移類指令, 就能很方便地實(shí)現(xiàn)程序的向前、 向后跳轉(zhuǎn), 并根據(jù)條件分支運(yùn)行、 循環(huán)運(yùn)行、 調(diào)用子程序等。 1. 無條件轉(zhuǎn)移指令 無條件轉(zhuǎn)移指令有如下 4 條指令, 它們提供了不同的轉(zhuǎn)移范圍和尋址方式: LJMP addr16; (PC) addr16, addr 158 addr 70 AJMP addr11; (P
4、C) (PC)+2, addr108 00001 addr 70 (PC)100 addr11 SJMP rel ; (PC) (PC)+2+rel , 80rel JMP A+DPTR ; (PC) (A)+DPTR , 73 (1) LJMP 稱為長轉(zhuǎn)移指令, 三字節(jié)指令, 提供 16 位目標(biāo)地址addr16。 例如: 在程序存儲器0000H單元存放一條指令: LJMP 3000H; (PC) 3000H, 02 3000 則上電復(fù)位后程序?qū)⑻?000H 單元去執(zhí)行用戶程序。 (2) AJMP稱為絕對轉(zhuǎn)移指令, 雙字節(jié)指令。 它的機(jī)器代碼是由 11 位直接地址addr11和指令特有操作碼
5、 00001, 按下列分布組成的: 該指令執(zhí)行后, 程序轉(zhuǎn)移的目的地址是由AJMP指令所在位置的地址PC值加上該指令字節(jié)數(shù) 2, 構(gòu)成當(dāng)前PC值。 取當(dāng)前PC值的高 5 位與指令中提供的 11 位直接地址形成轉(zhuǎn)移的目的地址, 即: a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 PC15 PC14 PC13 PC12 PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0PC 轉(zhuǎn)移目的地址: 由于 11 位地址的范圍是 0000000000011111111111, 即 2 KB范圍, 而目標(biāo)地址的高 5 位是由PC當(dāng)前值固定的,
6、所以程序可轉(zhuǎn)移的位置只能是和PC當(dāng)前值在同一 2 KB的范圍之內(nèi)。 本指令轉(zhuǎn)移可以向前也可以向后, 指令執(zhí)行后不影響狀態(tài)標(biāo)志位。 例如: 若AJMP指令地址(PC)=2300H。 執(zhí)行指令: AJMP 0FFH ; (PC) (PC)+2=2302H, 01 FF (PC)100 00011111111 結(jié)果為: 轉(zhuǎn)移目的地址 (PC)=20FFH , 程序向前轉(zhuǎn)向 20FFH單元開始執(zhí)行。 又如: 若AJMP指令地址(PC)=2FFFH。 執(zhí)行指令: AJMP 0FFH; (PC) (PC)+2=3001H, 01 FF (PC)100 00011111111 結(jié)果為: 轉(zhuǎn)移目的地址 (PC
7、)=30FFH , 程序向后轉(zhuǎn)向 30FFH單元開始執(zhí)行。 (3) SJMP稱為短轉(zhuǎn)移指令, 雙字節(jié)指令, 指令的操作數(shù)是相對地址rel。 由于rel是帶符號的偏移量, 所以程序可以無條件向前或向后轉(zhuǎn)移, 轉(zhuǎn)移的范圍是在SJMP指令所在地址PC值(源地址)加該指令字節(jié)數(shù)2的基礎(chǔ)上, 以-128+127 為偏移量(256 個單元)的范圍內(nèi)實(shí)現(xiàn)相對短轉(zhuǎn)移, 即: 目的地址=源地址+2+rel 用匯編語言編程時, 指令中的相對地址rel往往用欲轉(zhuǎn)移至的地址的標(biāo)號(符號地址)表示, 能自動算出相對地址值; 但人工將程序翻譯成機(jī)器代碼時, 需自己計算相對地址rel。 rel的計算公式如下: 向前轉(zhuǎn)移:
8、rel=FE(源地址與目的地址差的絕對值) 向后轉(zhuǎn)移: rel=(源地址與目的地址差的絕對值)2 若rel值大于 80H, 程序向前轉(zhuǎn)移; 若rel值小于 80H, 則程序向后轉(zhuǎn)移。 例如: 設(shè)(PC)=2100H, 若轉(zhuǎn)向215CH去執(zhí)行程序, 則: rel=(215CH2100H)2H=5AH (4) JMP稱為間接長轉(zhuǎn)移指令。 它是以數(shù)據(jù)指針DPTR的內(nèi)容為基址, 以累加器A的內(nèi)容為相對偏移量, 在 64 KB范圍內(nèi)可無條件轉(zhuǎn)移的單字節(jié)指令。 該指令的特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變。 例如: 根據(jù)累加器A的數(shù)值, 轉(zhuǎn)不同處理程序的入口。 MOV DPTR, TABLE ; 表首址
9、送DPTR JMP A+DPTR ; 依據(jù)A值轉(zhuǎn)移 TABLE: AJMPTAB1; 當(dāng)(A)=0時轉(zhuǎn)TAB1執(zhí)行 AJMPTAB2; 當(dāng)(A)=2時轉(zhuǎn)TAB2執(zhí)行 AJMPTAB3; 當(dāng)(A)=4時轉(zhuǎn)TAB3執(zhí)行 2. 條件轉(zhuǎn)移指令(判跳指令) 條件轉(zhuǎn)移指令是當(dāng)某種條件滿足時, 程序轉(zhuǎn)移執(zhí)行; 條件不滿足時, 程序仍按原來順序繼續(xù)執(zhí)行。 條件轉(zhuǎn)移的條件可以是上一條指令或者更前一條指令的執(zhí)行結(jié)果(常體現(xiàn)在標(biāo)志位上), 也可以是條件轉(zhuǎn)移指令本身包含的某種運(yùn)算結(jié)果。 1) 累加器判零轉(zhuǎn)移指令 這類指令有 2 條: JZ rel;若 (A)=0, 則 (PC) (PC)+2+rel 60 rel 若
10、 (A)0, 則 (PC) (PC)+2 JNZ rel ; 若 (A)0, 則 (PC) (PC)+2+rel, 70 rel 若 (A)=0, 則 (PC) (PC)+2 例 1: 將外部數(shù)據(jù)RAM的一個數(shù)據(jù)塊傳送到內(nèi)部數(shù)據(jù)RAM, 兩者的首址分別為DATA1 和 DATA2, 遇到傳送的數(shù)據(jù)為零時停止。 解: 外部RAM向內(nèi)部RAM的數(shù)據(jù)傳送一定要以累加器A作為過渡, 利用判零條件轉(zhuǎn)移正好可以判別是否要繼續(xù)傳送或者終止。 完成數(shù)據(jù)傳送的參考程序如下: MOV R0, DATA1 ; 外部數(shù)據(jù)塊首址送R0 MOV R1, DATA2 ; 內(nèi)部數(shù)據(jù)塊首址送R1LOOP:MOVX A, R0
11、; 取外部RAM數(shù)據(jù)入AHERE:JZ HERE ; 數(shù)據(jù)為零則終止傳送 MOV R1, A ; 數(shù)據(jù)傳送至內(nèi)部RAM單元 INCR0 ; 修改地址指針, 指向下一數(shù)據(jù)地址 INCR1 SJMP LOOP ; 循環(huán)取數(shù) 2) 比較轉(zhuǎn)移指令 比較轉(zhuǎn)移指令共有 4 條, 其一般格式為: CJNE目的操作數(shù), 源操作數(shù), rel 這組指令是先對兩個規(guī)定的操作數(shù)進(jìn)行比較, 根據(jù)比較的結(jié)果來決定是否轉(zhuǎn)移到目的地址。 4 條比較轉(zhuǎn)移指令如下: CJNE A, data , rel ; B4 data rel CJNE A, direct, rel ; B5direct rel CJNE Ri, data,
12、 rel ; B6B7data rel CJNER n, data, rel ; B8Bfdata rel 這 4 條指令的含義分別為: 第 1 條指令: 累加器內(nèi)容與立即數(shù)比較, 不等則轉(zhuǎn)移; 第 2 條指令: 累加器內(nèi)容與內(nèi)部RAM(包括特殊功能寄存器)內(nèi)容比較, 不等則轉(zhuǎn)移; 第 3 條指令: 內(nèi)部RAM內(nèi)容與立即數(shù)比較, 不等則轉(zhuǎn)移; 第 4 條指令: 工作寄存器內(nèi)容與立即數(shù)比較, 不等則轉(zhuǎn)移。 以上 4 條指令的差別僅在于操作數(shù)的尋址方式不同, 均完成以下操作: 若目的操作數(shù)=源操作數(shù), 則 (PC) (PC)+3 ; 若目的操作數(shù)源操作數(shù), 則 (PC) (PC)+3+rel, C
13、Y=0; 若目的操作數(shù)源操作數(shù), 則 (PC) (PC)+3+rel, CY=1; 指令的操作過程如圖 3 6 所示。 偏移量rel 的計算公式為: 向前轉(zhuǎn)移: rel = FD(源地址與目的地址差的絕對值) 向后轉(zhuǎn)移: rel =(源地址與目的地址差的絕對值)-3 例如: 當(dāng) P1 口輸入為 3AH時, 程序繼續(xù)進(jìn)行, 否則等待, 直至P1口出現(xiàn) 3AH。 參考程序如下: MOV A, 3AH ; 立即數(shù)3A送A; 74 3AWAIT: CJNE A, P1, WAIT ; (P1)3AH, 則等待, B5 90 FD圖 3 6 比較轉(zhuǎn)移指令操作示意圖 3) 減 1 條件轉(zhuǎn)移指令(循環(huán)轉(zhuǎn)移指
14、令)減 1 條件轉(zhuǎn)移指令有如下兩條: DJNZ direct, rel; (direct) (direct)1 , D5 direct rel 若(direct)=0, 則(PC) (PC)+3 否則, (PC) (PC)+3+relDJNZ Rn, rel ; (Rn) (Rn)1 , D8DF rel 若(Rn)=0, 則(PC) (PC)+2 否則, (PC) (PC)+2+rel 這組指令是把減1功能和條件轉(zhuǎn)移結(jié)合在一起的一組指令。 程序每執(zhí)行一次該指令, 就把第一操作數(shù)減 1, 并且結(jié)果保存在第一操作數(shù)中, 然后判斷操作數(shù)是否為零。 若不為零, 則轉(zhuǎn)移到規(guī)定的地址單元, 否則順序執(zhí)行
15、。 轉(zhuǎn)移的目標(biāo)地址是在以PC當(dāng)前值為中心的128+127 的范圍內(nèi)。 如果第一操作數(shù)原為 00H, 則執(zhí)行該組指令后, 結(jié)果為FFH, 但不影響任何狀態(tài)標(biāo)志。 例 2: 軟件延時程序: MOV R1, 0AH; 給R1賦循環(huán)初值 DELAY: DJNZ R1, DELAY; (R1) (R1)1, 若(R1)0則循環(huán) 由于DJNZ R1, DELAY 為雙字節(jié)雙周期指令, 當(dāng)單片機(jī)主頻為 12 MHz時, 執(zhí)行一次該指令需 24 個振蕩周期約 2 s。 因此, R1 中置入循環(huán)次數(shù)為 10 時, 執(zhí)行該循環(huán)指令可產(chǎn)生20 s 的延時時間。 例 3: 將內(nèi)部RAM中從DATA單元開始的 10 個
16、無符號數(shù)相加, 相加結(jié)果送SUM 單元保存。 解: 設(shè)相加結(jié)果不超過8位二進(jìn)制數(shù), 則相應(yīng)的程序如下: MOV R0, 0AH ; 給 R0 置計數(shù)器初值 MOV R1, DATA ; 數(shù)據(jù)塊首址送R1 CLR A ; A清零 LOOP: ADD A, R1 ; 加一個數(shù) INC R1 ; 修改地址, 指向下一個數(shù) DJNZ R0, LOOP ; R0 減 1, 不為零循環(huán) MOV SUM, A ; 存 10 個數(shù)相加和 4) 空操作指令 NOP ; (PC) (PC)+1, 00 空操作指令是一條單字節(jié)單周期指令。 它控制CPU不做任何操作, 僅僅是消耗這條指令執(zhí)行所需要的一個機(jī)器周期的時間
17、, 不影響任何標(biāo)志, 故稱為空操作指令。 但由于執(zhí)行一次該指令需要一個機(jī)器周期, 所以常在程序中加上幾條NOP指令用于設(shè)計延時程序, 拼湊精確延時時間或產(chǎn)生程序等待等。 3.3.5位操作類指令 位操作又稱為布爾變量操作, 它是以位(bit)作為單位來進(jìn)行運(yùn)算和操作的。 MCS51系列單片機(jī)內(nèi)設(shè)置了一個位處理器(布爾處理機(jī)), 它有自己的累加器(借用進(jìn)位標(biāo)志CY), 自己的存儲器(即位尋址區(qū)中的各位), 也有完成位操作的運(yùn)算器等。 這一組指令的操作對象是內(nèi)部RAM中的位尋址區(qū), 即20H2FH中連續(xù)的 128 位(位地址00H7FH), 以及特殊功能寄存器SFR中可進(jìn)行位尋址的各位。 在指令中,
18、 位地址的表示方法主要有以下 4 種(均以程序狀態(tài)字寄存器PSW的第五位 F0 標(biāo)志為例說明): (1) 直接位地址表示方式: 如D5H; (2) 點(diǎn)操作符表示(說明是什么寄存器的什么位)方式: 如PSW.5, 說明是PSW的第五位; (3) 位名稱表示方法: 如F0 ; (4) 用戶定義名表示方式: 如用戶定義用FLG這一名稱(位符號地址)來代替F0, 1. 位傳送指令 位傳送指令有如下互逆的兩條雙字節(jié)單周期指令, 可實(shí)現(xiàn)進(jìn)位位CY與某直接尋址位bit間內(nèi)容的傳送。 MOV C, bit ; (CY) (bit) , A2 bit MOV bit, C ; (bit) (CY) , 92 b
19、it 上述指令中: bit為直接尋址位, C為進(jìn)位標(biāo)志CY的簡寫。 第1條指令是把bit中的一位二進(jìn)制數(shù)送位累加器CY中, 不影響其余標(biāo)志。 第2條指令是將C中的內(nèi)容傳送給指定位。 由于兩個尋址位之間沒有直接的傳送指令, 常用上述兩條指令并通過C作為中間媒介來進(jìn)行尋址位間的傳送。 例如: 將內(nèi)部RAM中20H 單元的第7位(位地址為07H)的內(nèi)容, 送入P1口的P1.0中的程序如下: MOV C, 07H ; (CY) (07H) MOV P1.0, C ; (P1.0) (CY) 當(dāng)(20H)=A3H, (P1)=11111110B時, 執(zhí)行上述指令后修改了P1 口第 0 位, 即(CY)=
20、1, (P1)=11111111B。 2. 位置位指令 對進(jìn)位標(biāo)志CY以及位地址所規(guī)定的各位都可以進(jìn)行置位或清零操作, 共有如下4條指令: CLR bit ; (bit) 0 , C2 bit CLR C; (CY) 0 , C3 SETB bit ; (bit) 1 , D2 bit SETB C ; (CY) 1 , D3 前兩條指令為位清零指令, 后兩條指令為位置 1 指令。 當(dāng)?shù)?1、 3 條指令的直接尋址位為某端口的某位時, 指令執(zhí)行時具有讀修改寫功能。 例如: 將P1 口的P1.7 置位, 并清進(jìn)位位的程序如下: SETB P1.7 ; (P1.7) 1 CLR C ; (CY)
21、0 當(dāng)(P1)=00001111B時, 執(zhí)行完上述指令后, (P1)=10001111B, (CY)=0。 3. 位邏輯指令 位邏輯指令包含“與”ANL、 “或”O(jiān)RL、 “非”CPL位邏輯運(yùn)算操作, 共有如下 6 條指令: ANL C, bit ; (CY) (CY)( ) , 82bitANL C, / bit ; (CY) (CY)( ) , B0bitORL C, bit ; (CY) (CY)( ) , 72bitORL C, / bit ; (CY) (CY)( ) , A0bitCPL bit ; (bit) ( ) , B2bitCPL C ; (CY) (C) , B3 例
22、1: 完成(Z)=(X) (Y)異或運(yùn)算, 其中: X、 Y、 Z表示位地址。 解: 異或運(yùn)算可表示為: (Z)=(X)( )+( )(Y), 參考子程序如下: PR1: MOV C, X ; (CY) (X) ANL C, /Y ; (CY) (X)( ) MOV Z, C ; 暫存Z中 MOV C, Y ; (CY) (Y) ANL C, /X ; (CY)( ) (Y) ORL C, Z ; (CY) (X)( )+( )(Y) MOV Z, C ; 保存異或結(jié)果 RET 例 2: 利用位邏輯指令, 模擬圖 3 7 所示硬件邏輯電路功能。 參考子程序如下: PR2: MOV C, P1.
23、1 ; (CY) (P1.1) ORL C, P1.2 ; (CY) (P1.1)(P1.2) = A ANL C, P1.0 ; (CY) (P1.0)A CPL C ; (CY) MOV F0, C ; F0內(nèi)暫存B MOV C, P1.3 ; (CY) (P1.3) ANL C, /P1.4 ; (CY) (P1.3) ORL C , F0 ; (CY) BD MOV P1.5, C ; 運(yùn)算結(jié)果送入P1.5 RET 3. 位條件轉(zhuǎn)移指令 位條件轉(zhuǎn)移指令是以進(jìn)位標(biāo)志CY或者位地址bit的內(nèi)容作為是否轉(zhuǎn)移的條件, 共有 5 條指令。 (1) 以CY內(nèi)容為條件的雙字節(jié)雙周期轉(zhuǎn)換指令。 JC
24、rel ; 若(CY)=1, 則(PC) (PC)+2+rel轉(zhuǎn)移 , 40 rel 否則, (PC) (PC)+2 順序執(zhí)行 JNC rel ; 若(CY)=0, 則(PC) (PC)+2+rel轉(zhuǎn)移 , 50 rel 否則, (PC) (PC)+2順序執(zhí)行 這兩條指令常和比較條件轉(zhuǎn)移指令CJNE一起使用, 先由CJNE指令判別兩個操作數(shù)是否相等, 若相等就順序執(zhí)行; 若不相等則依據(jù)兩個操作數(shù)的大小置位或清零CY(參見圖 3 - 6), 再由JC 或JNC指令根據(jù)CY的值決定如何進(jìn)一步分支, 從而形成三分支的控制模式, 如圖 3 - 8 所示。 圖 3 7 例 2 硬件邏輯電路 圖 3 8C
25、JNE 與JC(或JNC)一起構(gòu)成三分支模式 例 3: 比較內(nèi)部RAM I、 J單元中A、 B兩數(shù)的大小。 若A=B, 則使內(nèi)部RAM的位K置 1; 若AB, 則大數(shù)存M單元, 小數(shù)存N單元。 設(shè)A、 B數(shù)均為帶符號數(shù), 以補(bǔ)碼數(shù)存入I、 J中, 該帶符號數(shù)比較子程序的比較過程示意圖如圖 3 9 所示。 參考子程序如下: 圖 3 9 帶符號數(shù)比較過程示意圖 MOV A, I ; A數(shù)送累加器A ANL A, 80H ; 判A數(shù)的正負(fù) JNZ NEG ; A0 則轉(zhuǎn)至NEG MOV A, J ; B數(shù)送累加器A ANL A, 80H ; 判B數(shù)的正負(fù) JNZ BIG1 ; A0, B0, 轉(zhuǎn)BI
26、G1 SJMP COMP ; A0, B0, 轉(zhuǎn)COMPNEG: MOV A, J ; B數(shù)送累加器A ANL A, 80H ; 判B數(shù)的正負(fù) JZ SMALL ; A0, B0, 轉(zhuǎn)SMALL COMP:MOV A, I ; A數(shù)送累加器A CJNE A, J, BIG ; AB則轉(zhuǎn)BIG SETB K ; A=B, 位K置 1 RETBIG: JC SMALL ; A0 Y= 0 X=0 -1 X0則轉(zhuǎn)移到POSI MOV A, 0FFH ; 若X0 時A=1 COMP: MOV FUNC, A ; 存函數(shù)Y值 HERE: AJMP HERE ; 結(jié)束程序 例 4: 3 個無符號單字節(jié)整數(shù)
27、分別存于R1、 R2、 R3 中, 找出其中最大數(shù)放于R0 中。 解: 首先將 R0 清零, 然后進(jìn)行(R1)與(R0)減法, 若(R1)(R0)0, 則(R1)(R0), 把(R1) 送(R0); 否則(R0)保持不變。 再將(R0)分別與(R2)和(R3)比較, 比較處理的方法與上面相同, 這樣比較 3 次后, R0 中即為 3 數(shù)中的最大數(shù)。 程序清單如下: BR2: ORG 2500H MOV R0, 00H ; R0 清零 MOV A, R1 ; 第一個數(shù)(R1)送A ACALL COMP ; 比較(R1)與(R0)大小 MOV A, R2 ; 第二個數(shù)(R2)送A ACALL CO
28、MP ; 比較(R2)與(R0)大小 MOV A, R3 ; 第三個數(shù)(R3)送A ACALL COMP ; 比較(R3)與(R0)大小 HERE: AJMP HERE COMP: MOV R4, A ; R4 暫存A的內(nèi)容 CLR C ; 清進(jìn)位位C SUBB A, R0 ; (A)(R0) JC M1 ; (A)(R0)時大數(shù)存R0 M1: RET 例: 把片外RAM的首地址為10H開始存放的數(shù)據(jù)塊,傳送給片內(nèi)RAM首地址為20H開始的數(shù)據(jù)塊中去,如果數(shù)據(jù)為“0”,就停止傳送。程序如下:ORG 2000HMOV R0, #10HMOV R1, #20HLOOP:MOVX A, R0 ; A
29、片外RAM數(shù)據(jù)HERE:JZ HERE ; 數(shù)據(jù)=0終止,程序原地踏步MOV R1, A ; 片內(nèi)RAMAINC R0 INC R1 SJMP LOOP ; 循環(huán)傳送 END 3.5.4 循環(huán)結(jié)構(gòu)程序設(shè)計 在解決實(shí)際問題時, 往往會遇到同樣的一組操作需要重復(fù)多次的情況, 這時應(yīng)采用循環(huán)結(jié)構(gòu), 以簡化程序, 縮短程序的長度及節(jié)省存儲空間。 例如, 要做 1 到 100 的加法, 沒有必要寫 100 條加法指令, 而只需寫一條加法指令, 使其執(zhí)行 100 次, 每次執(zhí)行時操作數(shù)亦作相應(yīng)的變化, 同樣能完成原來規(guī)定的操作。 循環(huán)程序一般由 3 部分組成: (1) 置循環(huán)初值: 即設(shè)置循環(huán)開始時的狀態(tài)
30、。 (2) 循環(huán)體: 即要求重復(fù)執(zhí)行的部分。 (3) 循環(huán)控制部分: 它包括循環(huán)參數(shù)修改和依據(jù)循環(huán)結(jié)束條件判斷循環(huán)是否結(jié)束兩部分。 例 5: 從BLOCK單元開始有一個無符號數(shù)數(shù)據(jù)塊, 其長度存于LEN單元,試求出數(shù)據(jù)塊中最大的數(shù)并存入MAX單元。 解: 該問題解決方法與例 4 相同, 所不同的是無符號數(shù)個數(shù)增加, 即搜索尋找最大值的范圍擴(kuò)大了。 因此, 本例題采用直到型單重循環(huán)的程序結(jié)構(gòu)方式比較合理。 程序框圖如圖 3 14 所示。 圖 3 14 例 5 程序框圖 程序清單: LOOP: ORG 2000H MOV R0, BLOCK ; 數(shù)據(jù)塊首址送R0 MOV R1, LEN ; 數(shù)據(jù)塊
31、長度送R1 MOV MAX, 00H ; 存最大數(shù)單元清零 LOOP1: MOV A, MAX ; (A) (MAX) CLR C ; 清C SUBB A, R0 ; (MAX)(R0) JNC NEXT ; 若(MAX)(R0), 則轉(zhuǎn)移 MOV MAX, R0 ; 若(MAX)(R0), 則(MAX) (R0) NEXT: INC R0 ; 修改地址指針 DJNZ R1, LOOP1 ; 若(R1)0則循環(huán)搜索 RET 例 6: 設(shè)計 100 ms延時程序。 解: 計算機(jī)執(zhí)行一條指令需要一定的時間, 由一些指令組成一段程序, 并反復(fù)循環(huán)執(zhí)行, 利用計算機(jī)執(zhí)行程序所用的時間來實(shí)現(xiàn)延時, 這種
32、程序稱為延時程序。 如當(dāng)系統(tǒng)使用 12 MHz晶振時, 一個機(jī)器周期為 1 s , 執(zhí)行一條雙字節(jié)雙周期DJNZ指令的時間為 2 s, 因此, 執(zhí)行該指令 50 000 次, 就可以達(dá)到延時 100 ms的目的。 對于 50 000 次循環(huán)可采用外循環(huán)、 內(nèi)循環(huán)嵌套的多重循環(huán)結(jié)構(gòu)。 本例題的程序流程如圖315所示。 程序清單: START: ORG 1000H MOV R6, 0C8H ; 外循環(huán) 200 次 LOOP1: MOV R7, 0F8H ; 內(nèi)循環(huán) 248 次 NOP ; 時間補(bǔ)償 LOOP2: DJNZ R7, LOOP2 ; 延時 2 s248=496 s DJNZ R6, L
33、OOP1; 延時 500 s200=100 ms RET 圖 3 15 例 6 程序框圖 返回 以上程序執(zhí)行MOV Rn, data 指令的時間為 1 s, DJNZ指令 2 s, NOP指令1 s, 所以, 內(nèi)循環(huán)延遲時間: 1 s+1 s+2 s248=498 s, 外循環(huán)延遲時間: 1 s+(內(nèi)環(huán)延時+2 s)200=100.001 ms。 3.5.5 子程序結(jié)構(gòu)程序設(shè)計 在一個程序中, 將反復(fù)出現(xiàn)的程序段編制成一個個獨(dú)立的程序段, 存放在內(nèi)存中, 這些完成某一特定任務(wù)可被重復(fù)調(diào)用的獨(dú)立程序段被稱為子程序。 在前面所舉的例子中, 已有一些程序段是以帶有RET指令的子程序形式出現(xiàn)的。 在匯
34、編語言編程時, 恰當(dāng)?shù)厥褂米映绦? 可使整個程序的結(jié)構(gòu)清楚, 閱讀和理解方便, 而且還可以減少源程序和目標(biāo)程序的長度, 不必多次重復(fù)書寫和翻譯同樣的指令。 在匯編語言源程序中使用子程序, 需要強(qiáng)調(diào)注意兩個問題, 即子程序中參數(shù)傳遞和現(xiàn)場保護(hù)的問題。 一般在匯編語言中采用的參數(shù)傳遞方法有以下 3 種。 (1) 用累加器或工作寄存器來傳遞參數(shù)。 (2) 用指針寄存器傳遞參數(shù)。 (3) 用堆棧來傳遞參數(shù)。 例 7: 將HEX單元存放的兩個十六進(jìn)制數(shù)分別轉(zhuǎn)換成ASCII碼, 并存入ASC和ASC+1 單元。 解: 由于偽指令DB在匯編后, 使字節(jié)以ASCII碼形式存放, 所以采用查表子程序的方式來實(shí)現(xiàn)
35、十六進(jìn)制數(shù)到ASCII碼的轉(zhuǎn)換。 轉(zhuǎn)換子程序?yàn)镠ASC, 調(diào)用時傳遞參數(shù)采用堆棧來完成。 程序清單如下: ORG 2000H PUSH HEX ; 第一個十六進(jìn)制數(shù)入棧 ACALL HASC ; 調(diào)查表轉(zhuǎn)換子程序 POP ASC ; 低 4 位轉(zhuǎn)換值保存 MOV A, HEX ; 十六進(jìn)制數(shù)送A SWAP A ; 高 4 位低 4 位交換 PUSH A ; 第二個十六進(jìn)制數(shù)入棧 ACALL HASC ; 調(diào)查表轉(zhuǎn)換子程序 POP ASC+1 ; 高 4 位轉(zhuǎn)換值保存 HERE: AJMP HERE ; 結(jié)束源程序 HASC: DEC SP ; DEC SP ; 修改SP到參數(shù)位置 POP A
36、; 彈出十六進(jìn)制數(shù)到A ANL A, 0FH ; 取A低 4 位 ADD A, 07H ; 為查表進(jìn)行地址調(diào)整 MOV CA, A+PC ; 查表轉(zhuǎn)換 PUSH A ; 轉(zhuǎn)換結(jié)果入棧 INC SP ; INC SP ; 恢復(fù)返回地址 RET ASCTAB: DB 0, 1, 2, 3, 4, 5, 6, 7 DB 8, 9, A, B, C, D, E, F END 由于堆棧操作是“先入后出”, 因此, 先壓入堆棧的參數(shù)應(yīng)后彈出, 才能保證恢復(fù)原來的狀態(tài)。 例如: SUBROU: PUSH A PUSH PSW PUSH DPL PUSH DPH POP DPH POP DPL POP PSW
37、 POP A RET3.6.3 代碼轉(zhuǎn)換程序設(shè)計【例3-46】 編寫一子程序,將8位二進(jìn)制數(shù)轉(zhuǎn)換為BCD碼。設(shè)要轉(zhuǎn)換的二進(jìn)制數(shù)在累加器A中,子程序的入口地址為BCD1,轉(zhuǎn)換結(jié)果存入R0所指示的RAM中。程序如下: BCD1:MOVB, #100 DIVAB ; A百位數(shù),B余數(shù)MOVR0, A ; (R0)百位數(shù)INCR0MOVA, #10XCHA, BDIVAB ; A十位數(shù),B個位數(shù)SWAPAADDA, B ; 十位數(shù)和個位數(shù)組合到AMOVR0, A ; 存入(R0) RET 例 1 : 十六進(jìn)制數(shù)到ASCII碼的轉(zhuǎn)換子程序設(shè)計。 解: 該轉(zhuǎn)換的算法為: 凡大于等于 10 的十六進(jìn)制數(shù)加
38、37 H, 凡小于 10 的十六進(jìn)制數(shù)加 30 H, 便可得到相應(yīng)的ASCII碼。 入口: R2(高4位為 0000, 低 4 位為 00001111 的一個十六進(jìn)制數(shù)0F)。 出口: R2(相應(yīng)的ASCII碼)。 程序清單如下: HASC1: MOV A, R2 ; 十六進(jìn)制數(shù)送A ADD A, 0F6H ; (A)+(-10)補(bǔ) MOV A, R2 ; 恢復(fù)十六進(jìn)制數(shù) JNC AD30H ; 若(A)10 則轉(zhuǎn)AD30H ADD A, 07H ; (A) 10 則先加 07H AD30H: ADD A, 30H ; (A)+30H MOV R2, A ; ASCII碼存R2 RET 例 2
39、: ASCII碼到十六進(jìn)制數(shù)的轉(zhuǎn)換子程序設(shè)計。 解: 該轉(zhuǎn)換的算法為: 若為 09 的ASCII碼, 則減去 30H; 若為AF的ASCII碼,則減去 37H, 便可得到相應(yīng)的十六進(jìn)制數(shù) 0F。 入口: R2(09 或AF的ASCII碼)。 出口: R2(高 4 位為 0000, 低 4 位為00001111)。 程序清單如下: ASCH1: MOV A, R2 ; ASCII碼值送A ADD A, 0D0H ; (A)+(-30H)補(bǔ) MOV R2, A ; R2暫存減結(jié)果 ADD A, 0F6H ; A+(-10)補(bǔ) JNC RET1 ; 若(A)10 轉(zhuǎn)RET1 MOV A, R2 ;
40、若(A)10 則(R2)送A ADD A, 0F9H ; (A)+(-07H)補(bǔ) MOV R2, A ; 十六進(jìn)制數(shù)存R2 RET1: RET 3.6.2 運(yùn)算子程序設(shè)計 在 3.3.2 節(jié)例 1、 例 2 中已經(jīng)介紹了雙字節(jié)無符號數(shù)的加法、 減法程序, 在 3.3.2 節(jié)例3中介紹了雙字節(jié)數(shù)乘單字節(jié)數(shù), 以及在 3.3.2 節(jié)例 5 、 例 6、 例 7 中介紹了BCD碼加法和利用DA調(diào)整指令進(jìn)行十進(jìn)制減法程序等。 下面再分別介紹雙字節(jié)乘法、 除法子程序。 例 3: 雙字節(jié)無符號數(shù)乘法子程序設(shè)計。 解: 算法: 兩個雙字節(jié)無符號數(shù)被分別放在R7、 R6和R5、 R4中。 由于MCS51指令中
41、只有 8 位數(shù)的乘法指令MUL, 用它來實(shí)現(xiàn)雙字節(jié)數(shù)相乘時, 可把被乘數(shù)分解為: (R7)(R6)=(R7)28+(R6),(R5)(R4)=(R5)28+(R4)則這兩個數(shù)的乘積可表示為: (R7)(R6)(R5)(R4)=(R7) 28 +(R6)(R5) 28 8+(R4)=(R7)(R5)216+(R7)(R4) 28+ (R6)(R5) 28 +(R6)(R4)=(R04)(R03)(R02)(R01) 顯然, 我們將(R6)(R4)放入(R02)(R01)中, 將(R7)(R4)和 (R6)(R5)累加到(R03) (R02)中; 再將(R7)(R5)累加到(R04)(R03)中即
42、可得到乘積結(jié)果。 入口: (R7 R6)=被乘數(shù); (R5 R4)=乘數(shù); (R0)=乘積的低位字節(jié)地址指針。 出口: (R0)=乘積的高位字節(jié)地址指針, 指向 32 位積的高 8 位。 工作寄存器: R3、 R2 存放部分積; R1存放進(jìn)位位。 程序清單如下: MUL1:MOV A , R6 MOV B , R4 MUL AB ; (R6)(R4) MOV R0, A ; R01 存乘積低 8 位 MOV R3, B ; R3暫存(R6)(R4)的高 8 位 MOV A , R7 MOV B , R4 MUL AB ; (R7)(R4) ADD A, R3 ; (R7)(R4)低 8 位加(
43、R3)MOV R3, A ; R3暫存28 部分項(xiàng)低 8 位MOV A, B ; (R7)(R4)高 8 位送AADD CA, 00H ; (R7)(R4)高 8 位加進(jìn)位CYMOV R2, A ; R2暫存 28 部分項(xiàng)高 8 位MOV A, R6MOV B, R5MUL AB ; (R6)(R5)ADD A, R3 ; (R6)(R5)低 8 位加(R3)INC R0 ; 調(diào)整R0 地址為R02 單元MOV R0, A ; R02 存放乘積 158 位結(jié)果MOV R1, 00H ; 清暫存單元MOV A, R2ADD CA, B ; (R6)(R5)高 8 位加(R2)與CYMOV R2,
44、 A ; R2暫存 28部分項(xiàng)高 8 位JNC NEXT ; 28 項(xiàng)向 216 項(xiàng)無進(jìn)位則轉(zhuǎn)移INC R1 ; 有進(jìn)位則R1 置 1 標(biāo)記 NEXT: MOV A , R7 MOV B, R5 MUL AB ; (R7)(R5) ADD A, R2 ; (R7)(R5)低 8 位加(R2) INC R0 ; 調(diào)整 R0 地址為R03 MOV R0, A ; R03 存放乘積 2316 位結(jié)果 MOV A , B ADD CA, R1 ; (R7)(R5) 高 8 位加 28 項(xiàng)進(jìn)位 INC R0 ; 調(diào)整 R0 地址為 R04 MOV R0, A ; R04 存放乘積 3124 位結(jié)果 RE
45、T 例 4: 雙字節(jié)帶符號數(shù)乘法子程序設(shè)計。 解: 算法: 由于帶符號數(shù)乘法和無符號數(shù)乘法的基本算法是一樣的, 因此可以根據(jù)入口條件調(diào)用例 3 MUL1子程序進(jìn)行計算。 不同之處有以下 3 點(diǎn): (1) 需根據(jù)被乘數(shù)和乘數(shù)的符號計算乘積的符號; (2) 當(dāng)被乘數(shù)和乘數(shù)為負(fù)數(shù)時, 應(yīng)對它們?nèi)⊙a(bǔ), 形成 2 的補(bǔ)碼, 然后才能調(diào)用MUL1進(jìn)行運(yùn)算; (3) 當(dāng)積為負(fù)數(shù)時, 計算的結(jié)果尚需取補(bǔ)后才是正確的積(絕對值), 積為 31 位。 乘積符號的算法在本程序中分兩步完成: 首先用ANL指令判斷兩數(shù)是否均為負(fù), 若與操作的結(jié)果為 1, 則兩數(shù)均為負(fù), 乘積應(yīng)為正, 對與的結(jié)果取反即為積的符號, 存入
46、SIG;若不屬于此情況, 則用ORL指令算出積的符號存入SIG。 程序中SIG、 SIG1 、 SIG2均為內(nèi)部RAM中的可尋址位。 入口: (R7 R6)=帶符號位被乘數(shù); (R5 R4)=帶符號位乘數(shù); (R0)=乘積的低位字節(jié)地址指針。 出口: (R0)=乘積的高位地址指針。 程序清單如下: MUL2: MOV A, R7 ; 被乘數(shù)高 8 位送A RLC A ; (R7)的符號位送CY MOV SIG1, C ; SIG1 存被乘數(shù)符號 MOV A, R5 ; 乘數(shù)高 8 位送A RLC A ; (R5)的符號位送CY MOV SIG2, C ; SIG2 存放乘數(shù)符號 ANL C,
47、SIG1 ; 計算積的符號 JC POSI ; 若兩數(shù)均負(fù)積為正則轉(zhuǎn)POSI MOV C, SIG1 ; 計算兩數(shù)非全負(fù)時積的符號 ORL C, SIG2 SJMP SIGN POSI: CPL C SIGN: MOV SIG, C ; 存積的符號 MOV A, R7 JB A.7, CPL1 ; 被乘數(shù)為負(fù)轉(zhuǎn)求補(bǔ) STEP1: MOV A, R5 JB A.7, CPL2 ; 乘數(shù)為負(fù)轉(zhuǎn)求補(bǔ) STEP2: ACALL MUL1 ; 調(diào)(R7 R6)(R5 R4)子程序 JB SIG, CPL3 ; 積符號為負(fù)轉(zhuǎn)求補(bǔ) RETCPL1: MOV A, R6 ; 被乘數(shù)求補(bǔ) CPL A ADD A
48、, 01H MOV R6, A MOV A, R7 CPLA ADDC A, 00H MOV R7, A SJMP STEP1 CPL2: MOV A, R4 ; 乘數(shù)求補(bǔ) CPL A ADD A, 01H MOV R4, A MOV A, R5 CPLA ADD CA, 00H MOV R5, A SJMP STEP2 CPL3: DEC R0 ; 乘積結(jié)果求補(bǔ) DEC R0 DEC R0 ; 使R0指向乘積低字節(jié)地址 MOV R2, 03H ; 待取補(bǔ)數(shù)字節(jié)數(shù)-1 送R2 ACALL CPL4 ; 調(diào)用多字節(jié)數(shù)求補(bǔ)子程序 RETCPL4: MOVA , R0 ; 多字節(jié)數(shù)求補(bǔ) CPL A
49、ADD A, 01H MOV R0, A STEP3: INC R0 MOV A, R0 CPL A ADD CA, 00H MOV R0, A DJNZ R2, STEP3 ; 字節(jié)未轉(zhuǎn)換完轉(zhuǎn)移 RET CPL4為多字節(jié)數(shù)求補(bǔ)子程序, 入口為(R0)=待取補(bǔ)數(shù)低字節(jié)地址指針; (R2)=待取補(bǔ)數(shù)字節(jié)數(shù)-1。 出口為(R0)=求補(bǔ)后的高位字節(jié)地址指針。 例 5: 雙字節(jié)無符號數(shù)除法子程序設(shè)計。 解: MCS51 除法指令只能進(jìn)行8位無符號數(shù)相除運(yùn)算, 而對于多字節(jié)除法, 還需用一般的除法算法進(jìn)行。 常用的除法算法采用“移位相減法”, 即: 先設(shè)余數(shù)為0, 并將被除數(shù)和余數(shù)分別左移一位, 使被除
50、數(shù)的最高位移入余數(shù)的最低位, 再求(余數(shù)除數(shù))之差, 若差為正, 則令差代替余數(shù), 商為1; 若差為負(fù), 則不作任何操作。 然后重復(fù)以上移位相減的過程, 使每位被除數(shù)都參與了運(yùn)算為止。 圖 3 16例 5 程序框圖(a) 除法程序框圖; (b) 四舍五入處理框圖 入口: (R7 R6)=被除數(shù), (R5 R4)=除數(shù)。 出口: (R7 R6)=商數(shù), (OVER)=溢出標(biāo)志(FFH為溢出)。 工作寄存器:(R3 R2)=部分余數(shù), (R1)=計數(shù)器, (R0)=差值暫存。 程序清單如下: DIV: MOV A, R5 ; 除數(shù)高 8 位送A JNZ BEGIN ; 除數(shù)非零則轉(zhuǎn)BEGIN MO
51、V A, R4 ; 除數(shù)低 8 位送A JZ OVER ; 除數(shù)為零置溢出標(biāo)志 BEGIN: MOV A, R7 ; 被除數(shù)高 8 位送A JNZ BEGIN1 ; 被除數(shù)非零則轉(zhuǎn)BEGIN1 MOV A, R6 ; 被除數(shù)低 8 位送A JNZ BEGIN1 ; 被除數(shù)非零則轉(zhuǎn)BEGIN1 RE T ; 被除數(shù)為零則返回BEGIN1: CLR A ; 清余數(shù)單元 MOV R2, A MOV R3, A MOV R1, 10H ; 雙字節(jié)除法計數(shù)器置 16 DIV1: CLR C ; 開始R3 R2 R7 R6 左移 MOV A, R6 ; 被除數(shù)低 8 位送A RLC A ; R6循環(huán)左移一
52、位 MOV R6, A ; 左移結(jié)果回送 MOV A, R7 ; 被除數(shù)高 8 位送A RLC A ; R7 循環(huán)左移一位 MOV R7, A ; 左移結(jié)果回送 MOV A, R2 ; 余數(shù)左移一位 RLC A MOV R2, A MOV A, R3 RLC A MOV R3, A DIV2: MOV A, R2 ; 開始部分余數(shù)減除數(shù) SUBB A, R4 ; 低 8 位先減 MOV R0, A ; 暫存差值 MOV A, R3 SUBB A, R5 ; 高 8 位相減 JCN EXT ; 若部分余數(shù)除數(shù)則轉(zhuǎn)NEXT INC R6 ; 若部分余數(shù)除數(shù)則商為1 MOV R3, A ; 新余數(shù)存
53、R3 R2 MOV A, R0 MOV R2, A NEXT: DJN ZR1, DIV1 ; 16 位未除完則返回 MOV A, R3 ; 開始四舍五入處理 JB A.7, ADD1 ; 若余數(shù)最高位為 1 則進(jìn) 1 CLR C ; 開始余數(shù)乘 2 處理 MOV A, R2 RLC A ; 余數(shù)低 8 位乘 2 MOV R2, A MOV A, R3 RLC A ; 余數(shù)高 8 位乘 2 SU BBA, R5 ; 余數(shù)2除數(shù) JC NOOVER ; 若余數(shù)2除數(shù)則轉(zhuǎn) JN ZADD1 ; 若夠減則轉(zhuǎn)進(jìn) 1 MOV A, R2 ; 高 8 位相等時比較低 8 位 SUBB A, R4 JC N
54、OOVER ; 余數(shù)2除數(shù)則轉(zhuǎn) ADD1: MOV A, R6 ; 開始商進(jìn)1處理 ADD A, 01H MOV R6, A MOV A, R7 ADDC A, 00H MOV R7, A NOOVER: MOV OVER, 00H ; 清溢出標(biāo)志 RET OVER: MOV OVER, 0FFH ; 置溢出標(biāo)志 RET 雙字節(jié)帶符號數(shù)除法的算法與無符號數(shù)除法的算法基本相同, 所不同的是在計算除法之前先進(jìn)行商的符號確定。 商的符號確定方法與例4帶符號數(shù)乘法中乘積符號的確定方法相同。所以雙字節(jié)帶符號除法程序首先要進(jìn)行商的符號確定, 再調(diào)用無符號數(shù)除法子程序DIV即可, 這里不再重復(fù)。 3.6.3
55、 查表程序設(shè)計 查表, 就是根據(jù)變量x, 在表格中查找y, 使y = f (x)。 單片機(jī)應(yīng)用系統(tǒng)中, 查表程序 是一種常用程序, 它被廣泛應(yīng)用于LED顯示器控制, 打印機(jī)打印以及數(shù)據(jù)補(bǔ)償、 計算、 轉(zhuǎn)換等功能程序中(如 3.3.1 節(jié)例 1、 2、 4; 3.5.4 節(jié)例 7 )。 例 6: 設(shè)有一巡檢報警裝置, 需要對 16 路值進(jìn)行比較, 當(dāng)每一路輸入值超過該路的報警值時, 實(shí)現(xiàn)報警。 要求編制一個查表子程序, 依據(jù)路數(shù)xi, 查表得yi的報警值。 解: xi為路數(shù), 查表時按照 0, 1, 2, , 15 取值, 故為單字節(jié)規(guī)則量。 表格依xi順序列表, 僅存二字節(jié)報警值yi, 其表格
56、構(gòu)造見表34。 表 3 4 路數(shù)xi與報警值yi對應(yīng)關(guān)系 程序入口 : (R2)=路數(shù)xi。 程序出口: (R4 R3)=對應(yīng)xi的報警值yi。 查表子程序如下: STA1: MOV A, R2 ; 路數(shù)xi送A RL A ; x-i2 MOV R4, A ; 暫存 ADD A, TABL(rel) ; 加上表首偏移量 MOV CA, A+PC ; 查y-i第一字節(jié) XCH A, R4 ; 第一字節(jié)送R4 ADD A, TABL(rel)+1 ; 形成第二字節(jié)表址 MOV CA, A+PC ; 取yi第二字節(jié) MOV R3, A ; 第二字節(jié)送R3 RET TAB2: DW 050FH, 0E
57、89H, A695H, 1EAAH ; 報警值表 DW 0D9BH, 7F93H, 0373H, 26D7H DW 2710H, 9E3FH, 1A66H,22E3H DW 1174H, 16EFH, 33E4H,6CA0H 上述查表程序中使用RL A使(A)乘 2, 這是由于DW定義的是雙字節(jié)空間, 為了保證指向正確的查表地址, 所以要進(jìn)行乘 2 處理。 另外, 程序中使用MOVCA, A+PC指令, 使表格偏移不得超過255個字節(jié)。 當(dāng)表格偏移大于255個字節(jié)時, 應(yīng)使用MOVCA, A+DPTR 查表指令。 表 3 5 x與表地址對應(yīng)關(guān)系 編制一個查表程序, 將查得的函數(shù)值yi存入R4、
58、 R3 中。 解: 入口: (R3R2)=由其它程序得到的xi規(guī)則量, 即: xi = 0000H, 0001H, 0002H, 。 出口: (R5 R4)=依據(jù) xi查得的函數(shù)值yi。 查表程序如下: STA: MOV DPTR, TABL ; 置表首地址 MOV A, R2 ; 求yi在表中序號 CLRC RLCA MOV R2, A MOV A, R3 RLC A MOV R3, A MOV A, R2 ; 求yi在表中地址 ADD A, DPL MOV DPL, A MOV A, R3 ADD CA, DPH MOV DPH, A CLR A MOV CA, A+DPTR ; 查表得y
59、i高位 MOV R5, A INC DPTR ; 表格地址加 1 CLR A MOV CA, A+DPTR ; 查表得yi低位 MOV R4, A RET TAB1: DW ; 函數(shù)值yi表 例 8: 輸入一個ASCII命令符, 要求按照輸入的命令字符轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序。 設(shè)命令為單字節(jié)字符 A、 D、 E、 L、 M、 X、 Z七種, 相應(yīng)的處理程序入口標(biāo)號分別為雙字節(jié)XA、 XD、 XE、 XL、 XM、 XX、 XZ。 解: 對于上述情況, 由于xi與yi 均為非規(guī)則量, 因此在表格中必須存放相應(yīng)的xi、 yi值, xi為輸入命令符, yi為相應(yīng)處理程序入口地址, 其表格構(gòu)造見表 3 6。表 3 6 存儲內(nèi)容與表地址關(guān)系 這類表格xi、 yi可以是單字節(jié)、 雙字節(jié)或多字節(jié), 它以兩種方式給出表格的容量。 一種是用表格結(jié)束標(biāo)志 0 來表示, 另一種則是給出表格中的項(xiàng)數(shù)。 本程序采用結(jié)束標(biāo)志 0 表示。 該查表子程序的算法為: 當(dāng)輸入一個ASCII命令符
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《國防建設(shè)》國防建設(shè)與外交成就課件-1
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)基礎(chǔ)項(xiàng)目教程 課件全套 崔海波 項(xiàng)目1-9 認(rèn)識創(chuàng)新創(chuàng)業(yè)-模擬開辦企業(yè)
- DB11 T 398-2006 絨山羊生產(chǎn)技術(shù)規(guī)范
- 2025年湛江b2貨運(yùn)上崗證模擬考試
- 玉米課程故事:探索與成長
- 2025快遞公司協(xié)議存款合同
- 基于增益率和基尼指數(shù)的決策樹分類模型
- 二零二五版酒店會務(wù)服務(wù)合同
- 基于動力學(xué)模型的mpc控制算法
- 吊車出租合同包月二零二五年
- 管理學(xué)基礎(chǔ)-形考任務(wù)三-國開-參考資料
- 2.2城鎮(zhèn)化課件高中地理人教版(2019)必修二
- 2024-2025學(xué)年北師大版七年級數(shù)學(xué)上冊期末復(fù)習(xí)壓軸題12個(84題)含答案
- 2023年北京市大興區(qū)小升初數(shù)學(xué)模擬試卷(含答案)
- 2025年3月版安全環(huán)境職業(yè)健康法律法規(guī)標(biāo)準(zhǔn)文件清單
- 2024-2025學(xué)年歷史統(tǒng)編版七年級下冊期末評估測試卷 (含答案)
- 2025年河南工業(yè)和信息化職業(yè)學(xué)院單招職業(yè)技能測試題庫參考答案
- 政府審計 課件匯 蔣秋菊 第5-12章 金融審計- 政府審計報告
- 第二十一章傳導(dǎo)熱療法講解
- 2025年河南職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 2025年福建福州港務(wù)集團(tuán)有限公司招聘筆試參考題庫含答案解析
評論
0/150
提交評論