197-第4章 匯編語言程序設(shè)計(jì).ppt_第1頁
197-第4章 匯編語言程序設(shè)計(jì).ppt_第2頁
197-第4章 匯編語言程序設(shè)計(jì).ppt_第3頁
197-第4章 匯編語言程序設(shè)計(jì).ppt_第4頁
197-第4章 匯編語言程序設(shè)計(jì).ppt_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、2020/7/16,1,第4章 匯編語言程序設(shè)計(jì),4-1 匯編程序約定,4-2 匯編程序設(shè)計(jì)步驟,4-3 順序程序,4-4 分支程序,4-5 循環(huán)程序,4-6 算術(shù)運(yùn)算程序,2020/7/16,2,4-1 匯編程序約定,匯編語言程序: 用匯編語言編寫的、完成特定功能的指令序列。 匯編程序: 能將匯編語言源程序轉(zhuǎn)換成機(jī)器語言目標(biāo)程序的系統(tǒng)軟件。,匯編語言程序到機(jī)器語言程序的轉(zhuǎn)換過程稱為匯編。 1、手工匯編:人工查指令表匯編。用于設(shè)計(jì)短小程序或調(diào)試 程序的場(chǎng)合。 2、機(jī)器匯編:用匯編程序進(jìn)行匯編。,2020/7/16,3,源程序使用機(jī)器匯編要考慮匯編程序的約定:,1)按指令格式和語法規(guī)則編寫程序。

2、 常數(shù)的表示: 十進(jìn)制數(shù):20 十六進(jìn)制數(shù):87H,0F0H 二進(jìn)制數(shù):01011001B 字符:H 字符串:“Hello”。 2)使用偽指令提供匯編信息。,2020/7/16,4,匯編的主要任務(wù):,1)確定程序中每條匯編語言指令的指令機(jī)器碼。 2)確定每條指令在存儲(chǔ)器中的存放地址。 3)提供錯(cuò)誤信息。 4)提供目標(biāo)執(zhí)行文件(*.OBJ/*.HEX)和 列表文件(*.LST)。,一、匯編語言指令類型: 1. 機(jī)器指令: 指令系統(tǒng)中的全部指令,每條指令有對(duì)應(yīng)的機(jī)器代碼。 2. 偽指令: 匯編控制指令,僅提供匯編信息,沒有指令代碼。,2020/7/16,5,3. 宏指令: 宏匯編功能:將需要多次反

3、復(fù)執(zhí)行的程序段定義成一個(gè)宏指令 名(宏定義),編程時(shí),可在程序中使用宏指令 名來替代一段程序(宏調(diào)用)。,宏定義過程: 宏指令名 MACRO 形式參數(shù) ;定義程序段 ENDM 宏調(diào)用過程: 宏指令名 實(shí)際參數(shù) 宏指令名 實(shí)際參數(shù),2020/7/16,6,二、匯編控制指令(偽指令):,常用偽指令及其功能: 1.ORG起始地址指令:指明程序和數(shù)據(jù)塊起始地址。 指令地址 機(jī)器碼源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0 ORG 3000H 3000H 23 DB 23H,100,A 3001H 64 3002H 41,2.

4、DB定義字節(jié)型常數(shù)指令。例: DB 12H,100,A,2020/7/16,7,5. END 結(jié)束匯編指令。 例:START: END START,3. DW 定義字型常數(shù)指令。 例: DW 1234H,5678H,4. EQU 等值。為標(biāo)號(hào)或標(biāo)識(shí)符賦值。 X1 EQU 2000H X2 EQU 0FH MAIN: MOV DPTR,#X1 ADD A,#X2,2020/7/16,8,4-2 匯編語言程序設(shè)計(jì)步驟,一、確定方案和計(jì)算方法; 二、了解應(yīng)用系統(tǒng)的硬件配置、性能指標(biāo); 三、建立系統(tǒng)數(shù)學(xué)模型,確定控制算法和操作步驟; 四、畫程序流程圖; 表示程序結(jié)構(gòu)和程序功能。,五、編制源程序。 1.

5、合理分配存儲(chǔ)器單元和了解 I/O接口地址。 2.按功能設(shè)計(jì)程序,明確各程序 之間的相互關(guān)系。 3.用注釋行說明程序,便于閱讀、 修改和調(diào)試。,2020/7/16,9,常用程序結(jié)構(gòu):,4-3 順序程序 順序程序又稱簡(jiǎn)單程序,程序走向只有一條路徑。,例:雙字節(jié)變補(bǔ)程序(設(shè)數(shù)據(jù)在R4R5中): MOV A,R5;取低字節(jié) CPL A ADD A,#01H;低字節(jié)變補(bǔ) MOV R5,A MOV A, R4 ;取高字節(jié) CPL A ADDC A,#00H;高字節(jié)變補(bǔ) MOV R4,A,順序程序、分支程序、循環(huán)程序。,2020/7/16,10,P84:例題(順序),例4.1 三字節(jié)無符號(hào)數(shù)相加,其中被加數(shù)

6、在內(nèi)部RAM的50H、51H和52H 單元中;加數(shù)在內(nèi)部RAM的53H、54H和55H單元中;要求把相加 之和存放在50H、51H和52H單元中,進(jìn)位存放在位尋址區(qū)的00H 位中。,低字節(jié),低字節(jié),中字節(jié),中字節(jié),高字節(jié),高字節(jié),R0,R1,2020/7/16,11,MOVR0,#52H MOVR1,#55H MOVA,R0 ADDA,R1 MOVR0,A DECR0 DECR1 MOVA,R0 ADDCA,R1 MOVR0,A DECR0 DECR1 MOVA,R0 ADDCA,R1 MOVR0,A CLRA ADDCA,#00H MOVR0,#00H MOVR0,A,;被加數(shù)的低字節(jié)地址

7、;加數(shù)的低字節(jié)地址 ;低字節(jié)相加 ;存低字節(jié)相加結(jié)果 ;中間字節(jié)帶進(jìn)位相加 ;存中間字節(jié)相加結(jié)果 ;高字節(jié)帶進(jìn)位相加 ;存高字節(jié)相加結(jié)果 ;存放進(jìn)位的單元地址 ;進(jìn)位送00H位保存,程序:,MOVC,ACC.0 MOV00H,C,MOVR0,#20H MOVR0,A,例: 壓縮式BCD碼分解成為單字節(jié)BCD碼。,MOV R0,#40H ;設(shè)指針 MOV A,R0 ;取一個(gè)字節(jié) MOV R2,A ;暫存 ANL A,#0FH ;高半字節(jié)清0 INC R0 MOV R0,A ;保存數(shù)據(jù)個(gè)位 MOV A,R2 SWAP A ;十位換到低半字節(jié) ANL A,#0FH INC R0 MOV R0,A ;

8、保存數(shù)據(jù)十位,十 個(gè),2020/7/16,13,4-4 分支程序,4-4-1單重分支程序 一個(gè)判斷決策框,程序有兩條出路。 兩種分支結(jié)構(gòu):,例:求R2中補(bǔ)碼絕對(duì)值: 正數(shù)不變,負(fù)數(shù)變補(bǔ)。 MOV A,R2 JNB ACC.7,NEXT ;為正數(shù)?為0跳 CPL A ;負(fù)數(shù)變補(bǔ) INC A MOV R2,A NEXT:SJMP NEXT ;結(jié)束,由條件轉(zhuǎn)移指令構(gòu)成程序判斷框部分,形成程序分支結(jié)構(gòu)。,P85:例題(單分支),例4.2 假定在外部RAM中有ST1、ST2和ST3共3個(gè)連續(xù)單元,其中 ST1和ST2單元中分別存放著兩個(gè)8位無符號(hào)二進(jìn)制數(shù),要求 找出其中的大數(shù)并存入ST3 單元中。 ST

9、ART:CLR C MOV DPTR,#ST1 MOVX A,DPTR MOV R2,A INC DPTR MOVX A,DPTR SUBB A,R2 JNC BIG1 XCH A,R2 BIG0: INC DPTR MOVX DPTR,A RET BIG1: MOVX A,DPTR SJMP BIG0,;進(jìn)位位清“0” ;設(shè)置數(shù)據(jù)指針,指向ST1 ;取第一個(gè)數(shù) ;第一個(gè)數(shù)存R2 ;數(shù)據(jù)指針加1,指向ST2 ;取第二個(gè)數(shù) ;兩數(shù)比較(第二個(gè)數(shù)第一個(gè)數(shù)) ;第二個(gè)數(shù)大轉(zhuǎn)BIG1(C=0無借位跳) ;第一個(gè)數(shù)大整字節(jié)交換繼續(xù) ;指向ST3單元 ;存大數(shù),例:,FRT: MOV A,40H ;取行李

10、重量計(jì)價(jià)單位G MOV R3,A MOV B,# 03H ;M=G3 MUL AB MOV R2,A ;暫存3G MOV A,R3 ;取回G CJNE A,# 05H,L1 ;G5 ? G 5 跳L1 SJMP WETC L1: JC WETC ;是,轉(zhuǎn)至WETC(C=1即G5跳) SUBB A,#05H ;否則M=3G+2(G-5) RLC A ADD A,R2 SJMP L2 WETC: MOV A ,R2 L2: MOV 41H,A ;存結(jié)果M RET,G5? :跳WETC :G5:跳WETC G5:順序執(zhí)行,行李計(jì)價(jià):當(dāng)G5,M=G3; 當(dāng)G5,M=G3+(G-5)(5-3) 。,4-

11、4-2 多重分支程序,例:求符號(hào)函數(shù)Y=SGN(X) +1 (當(dāng) X0) SGN(X)= 0 (當(dāng) X=0) -1 (當(dāng) X0),SYMB: MOV A,40H ;取X JZ STOR ;X=0跳,Y=X JB ACC.7,MINUS ;X0(A.7=1跳) MOV A,# 01H ;X0,Y=+1 SJMP STOR MINUS:MOV A,#0FFH ;X0,Y= -1 STOR: MOV 41H,A ;保存Y RET,一、多次使用條件轉(zhuǎn)移指令,形成兩個(gè)以上判斷框。,2020/7/16,17,溫控系統(tǒng)結(jié)構(gòu)框圖,電熱箱采用電熱絲加熱,由雙向可控硅控制加熱量的大??; 溫度傳感器檢測(cè)電熱箱內(nèi)的溫

12、度,經(jīng)放大與A/D轉(zhuǎn)換后進(jìn)入單片機(jī); 單片機(jī)將設(shè)定的溫度值與檢測(cè)到的電熱箱中的實(shí)際溫度進(jìn)行比較, 并調(diào)節(jié)運(yùn)算后,發(fā)出控制信號(hào)經(jīng)光電隔離器去驅(qū)動(dòng)雙向可控硅以調(diào)節(jié) 加在電熱絲的電壓,從而控制電熱箱的溫度。,電熱箱單片機(jī)溫控系統(tǒng)結(jié)構(gòu)框圖,2020/7/16,18,P86:例題(多分支),例4.3 某溫度控制系統(tǒng),采集的溫度值(Ta)放在累加器A中。此外, 在內(nèi)部RAM54H單元存放控制溫度下限值(T54), 在55H單元存放控制溫度上限值(T55)。 若TaT55,程序轉(zhuǎn)向JW(降溫處理子程序); 若TaT54,則程序轉(zhuǎn)向SW(升溫處理子程序); 若T55TaT54,則程序轉(zhuǎn)向FH(返回主程序)。

13、:去FH 思路: Ta=T55? : TaT55:去JW TaT55:Ta=T54? :去FH : TaT54:去SW TaT54:去FH 算法: (1) TaT55:去JW (2) TaT54:去SW (3) T55TaT54:去FH,2020/7/16,19,程序:,CJNE A,55H,LOOP1 AJMP FH LOOP1:JNC JW CJNE A,54H,LOOP2 AJMP FH LOOP2:JC SW FH: RET,;Ta T55:轉(zhuǎn)向LOOP1 ; Ta=T55 :返回 ;若CY=0,表明Ta T55,轉(zhuǎn)降溫處理程序 ; Ta T54:轉(zhuǎn)向LOOP2 ; Ta=T54 :返

14、回 ;若CY=1,表明Ta T54,轉(zhuǎn)升溫處理程序 ; T55TaT54,返回主程序,若TaT55,程序轉(zhuǎn)向JW(降溫處理子程序); 若TaT54,則程序轉(zhuǎn)向SW(升溫處理子程序); 若T55TaT54,則程序轉(zhuǎn)向FH(返回主程序)。,二、按分支號(hào)轉(zhuǎn)移。,如:當(dāng)分支號(hào)=0,程序轉(zhuǎn)移到ADDR0處; 當(dāng)分支號(hào)=1,程序轉(zhuǎn)移到ADDR1處; 。,例4.4有BR0、BR1、BR2和BR3共4個(gè)分支程序段,各分支程序段的功能 依次是從內(nèi)部RAM256B范圍取數(shù)、從外部RAM低256B范圍取數(shù)、 從外部RAM4KB范圍取數(shù)和從外部RAM64KB范圍取數(shù)。并假定R0 中存放取數(shù)地址低8位地址,R1中存放高

15、8位地址,R3中存放分支序 號(hào)值。假定以BRTAB作差值表首地址, BR0_BRTAB BR3_BRTAB為差值。 分析:差值表=分支入口地址該表首址,1、利用查地址表法:(P87),MOV A,R3 MOV DPTR,#BRTAB MOVC A,A+DPTR JMP A+DPTR BRTAB: DB BR0_BRTAB DB BR1_BRTAB DB BR2_BRTAB DB BR3_BRTAB BR0:MOV A,R0 SJMP BRE BR1:MOVX A,R0 SJMP BRE BR2:MOV A,R1 ANL A,#0FH ANL P2,#0F0H ORL P2,A MOVX A,R

16、0 SJMP BRE BR3:MOV DPL,R0 MOV DPH,R1 MOVX A,DPTR BRE: SJMP,;分支轉(zhuǎn)移值送A(如R3=2) ;差值表首址(BRTAB=3000H) ;查表A+DPTR=3002H,(A)=40H ;轉(zhuǎn)移(A+DPTR=3040H) ;差值表(=10H) (=20H) (=40H) (=60H) ;從內(nèi)部RAM取數(shù) ;從外部RAM256B取數(shù) ;從外部RAM4KB取數(shù) ;高位地址取低4位 ;清P2口低4位 ;發(fā)高位地址 ;從外部RAM64KB取數(shù),程序:,入口地址: 3010H 3020H 3040H 3060H,差值表=分支入口地址該表首址,P88:例

17、題(查轉(zhuǎn)移指令表),4.5假定鍵盤上有3個(gè)操作鍵,功能說明如下表: MOV DPTR,#3000H CLR C RLC A JMP A+DPTR AJMP DS AJMP XS AJMP CR ,3000H 3001H 3002H 3003H 3004H 3005H 3006H,;3000H為基址 ;進(jìn)位位CY清“0” ;A帶進(jìn)位位循環(huán)左移 ;轉(zhuǎn)操作鍵處理程序 ;轉(zhuǎn)讀數(shù)據(jù)程序 ;轉(zhuǎn)寫數(shù)據(jù)程序 ;轉(zhuǎn)插入程序,2、使用轉(zhuǎn)移指令表法。用分支轉(zhuǎn)移指令 AJMP ,對(duì)AJMP指令應(yīng)將分支序號(hào)乘以2, 轉(zhuǎn)移范圍為2KB;對(duì)LJMP指令應(yīng)將分支序號(hào)乘以3, 轉(zhuǎn)移范圍為64KB。,2020/7/16,23,設(shè)

18、分支號(hào)已存入A。把分支程序入口地址存放在表中。 MTJS:MOV SP,#30H MOV DPTR,#TAB ;取分支入口地址表首地址 CLR C ;分支號(hào)2 RLC A MOV R2,A MOVC A,A+DPTR ;取分支地址低位 PUSH A ;入棧保存 MOV A,R2 INC A MOVC A,A+DPTR ;取分支地址高位 PUSH A ;入棧保存 RET ;分支地址PC,轉(zhuǎn)移 TAB: DW ADDR0 ;分支程序入口地址表 DW ADDR1 ADDR0: ;程序段0 ADDR1: ;程序段1 ADDR2: ;程序段2 ,3、利用堆棧操作法: (P88),如:DPTR=3000H

19、 A=2, ,4-5 循環(huán)程序,4-5-1 循環(huán)程序的構(gòu)成,各個(gè)環(huán)節(jié)任務(wù): 一、初始化部分: 循環(huán)準(zhǔn)備工作。如:清結(jié)果單元、設(shè)指針、設(shè)循環(huán)控制變量初值等。,二、循環(huán)體: 循環(huán)工作部分: 需多次重復(fù)處理的工作。 循環(huán)控制部分: 1.修改指針和循環(huán)控制變量。 2.檢測(cè)循環(huán)條件:滿足循環(huán)條件,繼續(xù)循環(huán),否則退出循環(huán)。 三、結(jié)束部分: 處理和保存循環(huán)結(jié)果。 允許0次循環(huán)的循環(huán)結(jié)構(gòu):在循環(huán)工作之前檢測(cè)循環(huán)條件。,包含多次重復(fù)執(zhí)行的程序段,循環(huán)結(jié)構(gòu)使程序緊湊。,4-5-2 單重循環(huán),簡(jiǎn)單循環(huán)結(jié)構(gòu): 循環(huán)體中不套循環(huán)。,循環(huán)控制方法: 計(jì)數(shù)控制; 特征標(biāo)志控制。,2020/7/16,26,例:,求n個(gè)單字節(jié)

20、數(shù)據(jù)的累加,設(shè)數(shù)據(jù)串已在43H起始單元,數(shù)據(jù)串長(zhǎng)度在42H單元,累加和不超過2個(gè)字節(jié)。,SUM:MOVR0,#42H ;設(shè)指針 MOVA,R0 MOVR2,A ;循環(huán)計(jì)數(shù)器n CLRA ;結(jié)果單元清0 MOVR3,A ADD1:INCR0 ;修改指針 ADDA,R0 ;累加 JNC NEXT ;處理進(jìn)位(C=0跳) INCR3 ;有進(jìn)位,高字節(jié)加1 NEXT:DJNZ R2,ADD1 ;循環(huán)控制:數(shù)據(jù)是否加完? MOV40H,A ;循環(huán)結(jié)束,保存結(jié)果 MOV41H,R3 RET,R0,2020/7/16,27,一、計(jì)數(shù)控制:,(參看P89例4.6) 例:為一串7位ASCII碼數(shù)據(jù)的D7位加上奇

21、校驗(yàn),設(shè)數(shù)據(jù)存放在片外RAM的 2101H起始單元,數(shù)據(jù)長(zhǎng)度在2100H單元。,MOV DPTR,#2100H MOVX A,DPTR MOV R2,A NEXT:INC DPTR MOVX A,DPTR ORL A,#80H JNB P,PASS ;P=0:1的個(gè)數(shù)為偶數(shù),跳 MOVX DPTR,A PASS:DJNZ R2,NEXT DONE:SJMP DONE,設(shè)循環(huán)計(jì)數(shù)器,控制循環(huán)次數(shù)。正計(jì)數(shù)和倒計(jì)數(shù)兩種方式。,2020/7/16,28,二、特征控制:,例:找正數(shù)表最小值。正數(shù)表存在片外RAM中以LIST為 起始單元,用-1作為結(jié)束標(biāo)志。,START:MOV DPTR,#LIST;數(shù)表

22、首地址 MOV B,#127;預(yù)置最小值 NEXT:MOVX A,DPTR;取數(shù) INC DPTR;修改指針 CJNE A,#-1,NEXT1;是否為數(shù)表結(jié)尾?(A-1跳) SJMP DONE;循環(huán)結(jié)束 NEXT1:CJNE A,B,NEXT2;比較(AB跳) NEXT2:JNC NEXT ;C=0跳 MOV B,A;保存較小值 SJMP NEXT DONE:SJMP DONE,習(xí)題:統(tǒng)計(jì)一班考試為100分和不及格人數(shù),成績(jī)單 在41H起始單元。,設(shè)定循環(huán)結(jié)束標(biāo)志實(shí)現(xiàn)循環(huán)控制。(參看P89例4.7),4-5-3 多重循環(huán),例:將內(nèi)存一串單字節(jié)無符號(hào)數(shù)升序排序。(參看P102例4.14) 步驟:

23、 每次取相鄰單元的兩個(gè)數(shù)比較,決定是否需要交換數(shù)據(jù)位置。 第一次循環(huán),比較N-1次,取到數(shù)據(jù)表中最大值。 第二次循環(huán),比較N-2次,取到次大值。 第N-1次循環(huán):比較一次,排序結(jié)束。,循環(huán)體中套循環(huán)結(jié)構(gòu)。以雙重循環(huán)使用較多。,SORT: MOV A,#N-1;N個(gè)數(shù)據(jù)排序 MOV R4,A;外循環(huán)次數(shù) LOOP1: MOV A,R4 MOV R3,A;內(nèi)循環(huán)次數(shù) MOV R0,#TAB;設(shè)數(shù)據(jù)指針 LOOP2: MOV A,R0 ;取二數(shù) MOV B,A INC R0 MOV A,R0 CJNE A,B,L1;比較(AB跳) L1: JNC UNEX;AB,不交換 DEC R0 ;否則交換數(shù)據(jù)

24、 XCH A,R0 INC R0 MOV R0,A UNEX: DJNZ R3,LOOP2;內(nèi)循環(huán)結(jié)束? DJNZ R4,LOOP1;外循環(huán)結(jié)束? RET,2020/7/16,31,1、單循環(huán)定時(shí)程序: (參看P98) MOV R5,#TIME LOOP: NOP NOP DJNZ R5,LOOP,軟件延時(shí)程序:,1T 1T 1T 2T,設(shè):fOSC=6MHz, 則 T=12/6MHz=2s t=(1+4TIME)T =2+8TIME(s),用循環(huán)程序?qū)⒅噶钪貜?fù)多次執(zhí)行,實(shí)現(xiàn)軟件延時(shí)。,試計(jì)算延時(shí)程序的執(zhí)行時(shí)間。(參看P99) 源程序指令周期(M) 指令執(zhí)行次數(shù),習(xí)題: DELAY:MOV R

25、6,#100 1 D1:MOV R7,#10 1 D2:NOP 1 DJNZ R7,D2 2 t=6.606 ms DJNZ R6,D1 2 RET 2 計(jì)算延時(shí)程序的執(zhí)行時(shí)間(設(shè)時(shí)鐘fOSC=6MHz,T=2s 。,DELAY: MOV R6,#64H (=100)1 I1: MOV R7,#0FFH(=255)1 I2: DJNZ R7,I22 DJNZ R6,I12 RET2,延時(shí)時(shí)間計(jì)算:(設(shè)時(shí)鐘fOSC=12MHz) T=1s t=(11+1100+2100255+2100+21)T = 51.303 ms,1 100 100255 100 1,2、多重循環(huán)定時(shí):,用循環(huán)程序?qū)⒅噶钪?/p>

26、復(fù)多次執(zhí)行,實(shí)現(xiàn)較長(zhǎng)時(shí)間的延時(shí)。,2020/7/16,33,4-6 算術(shù)運(yùn)算程序4-6-1 多字節(jié)加減運(yùn)算程序,多字節(jié)加法子程序,Z=X+Y。(參看P90) ADDS:CLRC MOV R2,#23H LOOP:MOVA,R0 ADDC A,R1 ;加一字節(jié) MOVR0,A ;存和一字節(jié) INCR0 ;修改指針 INCR1 DJNZ R2,LOOP ;全部字節(jié)加完? RET,習(xí)題1:編寫十進(jìn)制多字節(jié)加法子程序,Z=X+Y。 習(xí)題2:編寫多字節(jié)減法子程序,Z=X-Y。 思考題:修改程序使運(yùn)算結(jié)果保存到其他存儲(chǔ)單元。,2020/7/16,34,4-6-2 多字節(jié)無符號(hào)數(shù)乘除運(yùn)算,相加計(jì)算多字節(jié)乘法

27、程序。步驟: 1.部分積清零。 2.檢測(cè)乘數(shù)各位, 為1則部分積對(duì)位加被乘數(shù),否則加0。 3.對(duì)位方法:被乘數(shù)左移或部分積右移。,初值: 0 00 Cy R4R5 右移R6R7并檢測(cè)Cy + R2R3 當(dāng)Cy=1 Cy R4R5 得部分積并右移對(duì)位 乘積最后右移一次,110 101 110 000 + 110 11110,(參看P92例4.9) 例:雙字節(jié)相乘 R2R3R6R7R4R5R6R7 解:部分積清零,右移檢測(cè)乘數(shù),決定部分積是否加 被乘數(shù),部分積右移對(duì)位。,循 環(huán) 16 次,(參看P94例4.10) 例:R2R3R4R5R6R7R4R5 (余數(shù)R2R3) 解:1.判斷R2R3R6R7

28、?使商不大于16位。 2.被除數(shù)左移1位,試減除數(shù)。 3.若夠減,商加1并保留余數(shù)。,10111 0101/ 01110100 0101 1001 0101 1000 0101 0110 0101 1,CyR2R3R4R50 - R6R7 +1 夠減 1165=231 R2R3 不夠減恢復(fù)余數(shù),循環(huán)16次,相減計(jì)算多字節(jié)除法程序。步驟: 1.對(duì)齊高位被除數(shù)試減除數(shù)。 2.若夠減商上1,不夠減商上0且恢復(fù)余數(shù)。 3.余數(shù)左移或除數(shù)右移對(duì)位。 4.循環(huán)重復(fù)前3步,直至取夠相應(yīng)位數(shù)的商。“四舍五入”:得到余數(shù)后,判斷余數(shù)乘2后 是否大于除數(shù),若大于除數(shù)則 商再加“1”;否則不加。,2020/7/16

29、,36,4-6-3 代碼轉(zhuǎn)換程序,(一) 十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼; (二) ASCII碼轉(zhuǎn)換為十六進(jìn)制數(shù)。,09的ASCII碼:3039H;,(一)十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼: HASC:CJNE A,#0AH,N N:JNC N1(C=0跳N1) ADD A,#30H SJMPSE N1:ADD A,#37H SE:RET,AF的ASCII碼:4146H。,(二)ASCII碼轉(zhuǎn)換為十六進(jìn)制數(shù): AHEX:CLR C SUBBA,#30H CJNEA,#0AH,N N: JC N1 SJMP AE N1: SUBB A,#11H CJNE A,#06H,N2 N2: JNCERR AD

30、DA,#0AH SJMP AE ERR: MOVA,#0FFH AE:RET,P96:例題(數(shù)制轉(zhuǎn)換),例4.11 在內(nèi)部RAM的hex單元中存有2位十六進(jìn)制數(shù),試將其轉(zhuǎn)換為 ASCII碼,并存放于asc和asc+1兩個(gè)單元中。設(shè)(hex)=7BH,MOVSP,#3FH MAIN: PUSHhex ACALLHASC POPasc (SP=40H) MOVA,hex SWAPA PUSHACC ACALLHASC POPasc+1 子程序 (HASC): HASC:DECSP DECSP POPACC ANLA,#0FH ADDA,#7 (A=12H) MOVCA,A+PC PUSHACC I

31、NCSP INCSP 7個(gè)字節(jié) RET (SP=40H) ASCTAB:DB“0,1,2,3,4,5,6,7” DB“8,9,A,B,C,D,E,F”,;十六進(jìn)制數(shù)進(jìn)棧(SP=40H) ;調(diào)用轉(zhuǎn)換子程序(SP=41H42H) ;第一位轉(zhuǎn)換結(jié)果送asc單元(SP=3FH) ;再取原十六進(jìn)制數(shù) ;高低半字節(jié)交換 ;交換后的十六進(jìn)制數(shù)進(jìn)棧(SP=40H) ;調(diào)用轉(zhuǎn)換子程序(SP=41H42H) ;第二位轉(zhuǎn)換結(jié)果送asc+1單元 ;跨過斷點(diǎn)保護(hù)內(nèi)容(SP=41H) ;跨過斷點(diǎn)保護(hù)內(nèi)容(SP=40H) ;彈出轉(zhuǎn)換數(shù)據(jù) (SP=3FH) ;屏蔽高位 (A=0BH) ;修改變址寄存器內(nèi)容(PC=2008H)

32、 ;查表 (12H+2009H=201BH) ;查表結(jié)果進(jìn)棧 (SP=40H) ;修改堆棧指針回到斷點(diǎn)保護(hù)內(nèi)容 ; (42H)PC815,(41H)PC07 ;ASCII碼表 ;(201BH)=0BH,2000H 2001H 2002H 2004H 2006H 2008H 2009H 200BH 200DH 200FH 2010H 2018H,2 2 2 1,2020/7/16,38,(三) BCD碼與二進(jìn)制數(shù)之間的轉(zhuǎn)換,1BCD碼轉(zhuǎn)換為二進(jìn)制數(shù): D = dn-110n-1+dn-210n-2+d1101+d0100 =( dn-110+dn-2 )10 +dn-3)10 + d1) 10+ d0 “整數(shù)十翻二”:從最高位開始,按二進(jìn)制運(yùn)算法則循環(huán)。 “乘十加次低位”:B=B10+bi 。,有乘法和除法兩種轉(zhuǎn)換方式。,2020/7/16,39,“整數(shù)二翻十”:從最高位開始,按十進(jìn)制運(yùn)算法則

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論