




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第四章 匯編語言程序設(shè)計,4-1 匯編程序的約定,4-2 程序設(shè)計步驟,4-3 直線程序,4-4 分支程序,4-5 循環(huán)程序,4-6 子程序,4-8 編程舉例,4-7 算數(shù)運算,4-1 匯編程序約定,匯編語言程序: 用匯編語言編寫的、完成特定功能的指令序列。 匯編程序: 能將匯編語言源程序轉(zhuǎn)換成機器語言目標程序的系統(tǒng)軟件。,匯編語言程序到機器語言程序的轉(zhuǎn)換過程稱為匯編。 1.手工匯編:人工查指令表匯編。用于設(shè)計短小程序或調(diào)試程序的場合。 2.機器匯編:用匯編程序進行匯編。,源程序使用機器匯編要考慮匯編程序的約定,1)按指令格式和語法規(guī)則編寫程序。 常數(shù)的表示: 十進制數(shù):20 十六進制數(shù):87
2、H,0F0H 二進制數(shù):01011001B 字符:H 字符串:“Hello”。 2)使用偽指令提供匯編信息。,匯編的主要任務(wù):,1)確定程序中每條匯編語言指令的指令機器碼。 2)確定每條指令在存儲器中的存放地址。 3)提供錯誤信息。 4)提供目標執(zhí)行文件(*.OBJ/*.HEX)和列表文件(*.LST)。,一. 匯編語言指令類型 1.機器指令: 指令系統(tǒng)中的全部指令,每條指令有對應(yīng)的機器代碼。 2. 偽指令: 匯編控制指令,僅提供匯編信息,沒有指令代碼。,一. 匯編語言指令類型,3. 宏指令: 宏匯編功能:將需要多次反復執(zhí)行的程序段定義成一個宏指令名(宏定義),編程時,可在程序中使用宏指令名來
3、替代一段程序(宏調(diào)用)。,宏定義過程: 宏指令名 MACRO 形式參數(shù) ;定義程序段 ENDM 宏調(diào)用過程: 宏指令名 實際參數(shù) 宏指令名 實際參數(shù),二匯編控制指令(偽指令),偽指令是對匯編起某種控制作用的特殊命令,其格式與通常的操作指令一樣,并可加在匯編程序的任何地方,但它們并不產(chǎn)生機器指令,不同匯編程序允許的偽指令并不相同,但一些基本的偽指令在大部份匯編程序中都能使用,匯編控制指令(偽指令) 常用偽指令及其功能:,1. ORG起始地址指令:指明程序和數(shù)據(jù)塊起始地址。 指令地址 機器碼源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6MOV
4、 A,R0 ORG 3000H 3000H 23DB 23H,100,A 3001H 64 3002H41,2. DB 定義字節(jié)型常數(shù)指令。例: DB 12H,100,A,例如: ORG2000H TAB1:DB01H,04H,08H,10H 以上偽指令匯編后從2000H單元開始定義(存放)4個字節(jié)數(shù)據(jù)(平方表): (2000H)01H,(2001H)04H,(2002H)09H,(2003H)10H。,3. DW 定義字型常數(shù)指令。例: DW 1234H,5678H,例如: ORG2100H TAB2:DW 1067H, 1000H, 100 匯編后: (2100H)10H,(2101H)6
5、7H, (2102H)10H,(2103H)00H, (2104H)00H,(2105H)64H。,4. EQU 等值。為標號或標識符賦值。 X1 EQU 2000HX2 EQU 0FH MAIN:MOV DPTR,#X1 ADD A,#X2,5. END 結(jié)束匯編指令。 例:START: END START,判斷框 連接點 圖:常用流程圖符號,美國國家標準化協(xié)會ANSI(American National Standard Institute)設(shè)定了一些常用的流程圖符號如圖所示:,起止框 或 流程線,輸入輸出框 處理框,4-2 匯編語言程序設(shè)計步驟,一.確定方案和計算方法 二.了解應(yīng)用系統(tǒng)的
6、硬件配置、性能指標。 三.建立系統(tǒng)數(shù)學模型,確定控制算法和操作步驟。 四.畫程序流程圖 表示程序結(jié)構(gòu)和程序功能,五. 編制源程序 1.合理分配存儲器單元和了解I/O接口地址。 2.按功能設(shè)計程序,明確各程序之間的相互關(guān)系。 3.用注釋行說明程序,便于閱讀和修改調(diào)試和修改。,常用程序結(jié)構(gòu): 直線程序、分支程序、循環(huán)程序、子程序,4-3 直線程序 直線程序又稱簡單程序,程序走向只有一條路徑。,雙字節(jié)變補程序(設(shè)數(shù)據(jù)在R4R5中): MOV A,R5;取低字節(jié) CPL A ADD A,#1;低字節(jié)變補 MOV R5,A MOV A,R4;取高字節(jié) CPL A ADDC A,#0;高字節(jié)變補 MOV
7、R4,A,例4-3-4 壓縮式BCD碼分解成為單字節(jié)BCD碼。,MOV R0,#40H;設(shè)指針 MOV A,R0;取一個字節(jié) MOV R2,A;暫存 ANL A,#0FH;清0高半字節(jié) INC R0 MOV R0,A ;保存數(shù)據(jù)個位 MOV A,R2 SWAP A ;十位換到低半字節(jié) ANL A,#0FH INC R0 MOV R0,A;保存數(shù)據(jù)十位,十 個,4-4 分支程序由條件轉(zhuǎn)移指令構(gòu)成程序判斷框部分,形成程序分支結(jié)構(gòu)。,4-4-2單重分支程序 一個判斷決策框,程序有兩條出路。 兩種分支結(jié)構(gòu):,例 求R2中補碼絕對值,正數(shù)不變,負數(shù)變補。 MOV A,R2 JNB ACC.7,NEXT;
8、為正數(shù)? CPL A ;負數(shù)變補 INC A MOV R2,A NEXT:SJMP NEXT ;結(jié)束,例題行李計價:當G5,M=G3;當G5,M=G3+(G-5)(5-3),FRT: MOV A,40H;取行李重量G MOV R3,A ;G暫存R3中 MOV B,#03H;M=G3 MUL AB MOV R2,A;暫存3G到R2 MOV A,R3;取回G CJNE A,#05H,L1;G5 ? SJMP WETC L1:JC WETC;是,轉(zhuǎn)至WETC SUBB A,#05H;否則M=3G+2(G-5) RLC A ADD A,R2 SJMP LOOP WETC: MOV A,R2 ;3G到A
9、 LOOP: MOV 41H,A ;存結(jié)果M到41H RET,設(shè)重量存在40H中,4-4-3 多重分支程序一多次使用條件轉(zhuǎn)移指令,形成兩個以上判斷框。,例 求符號函數(shù)Y=SGN(X) +1 當 X0 SGN(X)= 0 當 X=0 -1 當 X0,SYMB: MOV A,40H ;取X JZ STOR ;X=0,Y=X JB ACC7,MINUS;X0跳轉(zhuǎn) MOV A,# 1 ;X0,Y=+1 SJMP STOR MINUS:MOV A,#0FFH;X0,Y= -1補碼 STOR: MOV 41H,A ;保存Y RET,設(shè)X存在40H中,結(jié)果Y存在41H,二按分支號轉(zhuǎn)移,如:分支號=0,程序轉(zhuǎn)
10、移到ADDR0處;當分支號=1,程序轉(zhuǎn)移到ADDR1處; 。,(1)用地址表法。設(shè)分支號已存入A。 MTJS:MOV DPTR,#TAB ;取表首地址 CLR C ;分支號2 RLC A MOV R2,A MOVC A,A+DPTR;取分支地址低位 PUSH ACC ;入棧保存 MOV A,R2 INC A MOVC A,A+DPTR;取分支地址高位 PUSH ACC ;入棧保存 RET ;分支地址PC,轉(zhuǎn)移 TAB: DW ADDR0 ;分支地址表 DW ADDR1 ADDR0: ;程序段0 ,4-5 循環(huán)程序包含多次重復執(zhí)行的程序段,循環(huán)結(jié)構(gòu)使程序緊湊。,4-5-1循環(huán)程序的構(gòu)成,各個環(huán)節(jié)
11、任務(wù): 一初始化部分 循環(huán)準備工作。如:清結(jié)果單元、設(shè)指針、設(shè)循環(huán)控制變量初值等。,二循環(huán)體 循環(huán)工作部分: 需多次重復處理的工作。 循環(huán)控制部分: 1.修改指針和循環(huán)控制變量。 2.檢測循環(huán)條件:滿足循環(huán)條件,繼續(xù)循環(huán),否則退出循環(huán)。 三.結(jié)束部分 處理和保存循環(huán)結(jié)果。 允許0次循環(huán)的循環(huán)結(jié)構(gòu):在循環(huán)工作之前檢測循環(huán)條件。,4-5-2 單重循環(huán)簡單循環(huán)結(jié)構(gòu):循環(huán)體中不套循環(huán)。,定時 例:試計算下列程序段執(zhí)行時間。 程序 指令執(zhí)行周期 MOV R7, #64H 1T LOOP:NOP 1T NOP 1T DJNZ R7, LOOP 2T,解:上述程序顯然屬于循環(huán)程序,其算法結(jié)構(gòu)如圖所示。循環(huán)次
12、數(shù)100次,根據(jù)每條指令的執(zhí)行周期可得每次循環(huán)消耗1+1+2=4(機器周期),加上第一條指令,整個程序段共計消耗時間為(4100+1)T= 401T,當晶振頻率為6MHZ時,T=2s,故上述程序?qū)嶋H消耗802s。,SUM:MOVR0,#42H;設(shè)指針 MOVA,R0 MOVR2,A ;循環(huán)計數(shù)器n CLRA ;結(jié)果單元清0 MOVR3,A ;進位數(shù)據(jù)存R3 ADD1:INCR0 ;修改數(shù)據(jù)指針 ADDA,R0 ;累加 JNC NEXT ;無進位轉(zhuǎn)NEXT INCR3 ;有進位,高字節(jié)加1 NEXT:DJNZ R2,ADD1 ;循環(huán)控制:數(shù)據(jù)是否加完? MOV40H,A ;循環(huán)結(jié)束,保存結(jié)果 M
13、OV41H,R3 RET,例:求n個單字節(jié)數(shù)據(jù)的累加和. 設(shè)數(shù)據(jù)串在43H起始的單元,數(shù)據(jù)串長度在42H單元,累加和不超過2個字節(jié),存在40H和41H中。,例 比較兩個數(shù)據(jù)串是否完全相等,若完全相等,A=0;否則A=FFH。,PMT:MOVR2,A;設(shè)數(shù)串長度 CHC:MOVA,R0;各取數(shù)串中的一個數(shù) MOV42H,R1 CJNE A,42H,NOM;是否相等?不相等轉(zhuǎn)移 INCR0;相等,修改指針 INCR1 DJNZ R2,CHC;全部比較完? MOVA,#0;完全相等 SJMP PEND NOM:MOVA,#0FFH;不完全相等 PEND:RET,4-5-3 多重循環(huán)循環(huán)體中套循環(huán)結(jié)構(gòu)
14、。以雙重循環(huán)使用較多。,軟件延時程序。用循環(huán)程序?qū)⒅噶钪貜投啻螆?zhí)行,實現(xiàn)軟件延時。,試計算延時程序的執(zhí)行時間。 源程序指令周期(M) 指令執(zhí)行次數(shù),DELAY:MOV R6,#64H1 I1: MOV R7,#0FFH1 I2: DJNZ R7,I22 DJNZ R6,I12 RET2,延時時間計算:(設(shè)時鐘f=12MHz,M=1s) t=(11+1100+2100255+2100+21)M=51.3 ms,1 100 100255 100 1,習題:試計算延時程序的執(zhí)行時間。 源程序指令周期(M) 指令執(zhí)行次數(shù),DELAY:MOV R6,#1001 D1: MOV R7,#101 D2: N
15、OP1 DJNZ R7,D22 DJNZ R6,D12 RET2 計算延時程序的執(zhí)行時間(設(shè)時鐘f=6MHz)。,4-6 子程序子程序:能完成某項特定功能的獨立程序段,可被反復調(diào)用。,4-6-1 子程序設(shè)計 一子程序入口用標號作為子程序名。 二調(diào)用子程序之前設(shè)置好堆棧。 三用返回指令RET結(jié)束子程序,并保 證堆棧棧頂為調(diào)用程序的返回地址。 四.子程序嵌套須考慮堆棧容量。 五.提供足夠的調(diào)用信息: 如:子程序名、子程序功能、入口參數(shù)和出口參數(shù)、子程序占用的硬件資源、子程序中調(diào)用的其他子程序名。,4-6-4 子程序的類型按子程序與主程序之間傳遞參數(shù)的方式分類。,入口參數(shù):調(diào)用子程序之前,需要傳給子
16、程序的參數(shù)。 出口參數(shù):子程序送回調(diào)用程序的結(jié)果參數(shù)。,選用不同的參數(shù)傳遞方式。 1.寄存器傳送參數(shù) 2.存儲器傳送參數(shù) 3.堆棧傳送參數(shù),設(shè)計子程序應(yīng)滿足通用性的要求,不針對具體數(shù)據(jù)編程。,4-7 算術(shù)運算程序4-7-1 多字節(jié)加減運算程序,1.多字節(jié)加法子程序,Z=X+Y。 ADDS:CLRC LOOP:MOVA,R0 ADDC A,R1 ;加一字節(jié) MOVR0,A ;存和一字節(jié) INCR0 ;修改指針 INCR1 DJNZ R2,LOOP ;全部字節(jié)加完? RET,習題1編寫多字節(jié)減法子程序,Z=X-Y。 思考題修改程序使運算結(jié)果保存到其他存儲單元。,4-7-2 多字節(jié)無符號數(shù)乘除運算,
17、相加計算多字節(jié)乘法程序,步驟: 1.部分積清零。 2.檢測乘數(shù)各位, 為1則部分積對位加被乘數(shù),否則加0。 3.對位方法:被乘數(shù)左移或部分積右移。,初值: 0 00 Cy R4R5 右移R6R7并檢測Cy + R2R3 當Cy=1 Cy R4R5 得部分積并右移對位 乘積最后右移一次,110 101 110 000 + 110 11110,例:雙字節(jié)相乘 R2R3R6R7R4R5R6R7 解:部分積清零,右移檢測乘數(shù),決定部分積是否加被乘數(shù),部分積右移對位。,循 環(huán) 16 次,相減計算多字節(jié)除法程序,步驟:1.對齊高位被除數(shù)試減除數(shù)。2.若夠減商上1,不夠減商上0且恢復 該次減之前的余數(shù)。3.
18、余數(shù)左移或除數(shù)右移對位。4.循環(huán)重復前3步,直至取夠相應(yīng)位數(shù)的商。,例R2R3R4R5R6R7R4R5 (余數(shù)R2R3) 解1.判斷R2R3R6R7?使商不大于16位。 2.被除數(shù)左移1位,試減除數(shù)。 3.若夠減,商加1并保留余數(shù)。,10111 0101/ 01110110 0101 0100 0101 1001 0101 1001 0101 1000 0101 011,CyR2R3R4R50 - R6R7 + 1 夠減 R2R3 不夠減恢復余數(shù),循環(huán)16次,4-8 匯編程序設(shè)計舉例,一、順序表查找,例4-1 已知在ROM 2000H204FH 單元中存放一組各不相同的八位二進制數(shù),試編程查找
19、其中是否有數(shù)據(jù)為80H,若有則將該單元地址送R1R0,否則將R1R0清零,并將標志位10H置1。,查表一般是先將表格內(nèi)容存放到ROM中,然后利用MOVC A,A+DPTR或MOVC A,A+PC指令將表格中的數(shù)據(jù)讀到累加器中。,參考程序如下; ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV SP, #30H ;設(shè)置堆棧指針SP。 MOV DPTR,#1000H ;數(shù)據(jù)指針DPTE指向數(shù)據(jù)區(qū)首地址1000H。 MOV R7,#50H ;數(shù)據(jù)長度參數(shù)50H 送計數(shù)器R7。 AGAIN: MOV A,#00H ;先指向數(shù)據(jù)區(qū)第一個數(shù)。 MOVC A,A+DPTR ;取數(shù)
20、據(jù)。 CJNE A,#80H,LOOP ;所取數(shù)據(jù)與關(guān)鍵字80H比較,若兩者不相等繼續(xù) ;查找(轉(zhuǎn)LOOP)。 MOV R1,DPH ;找到與關(guān)鍵字80H相同數(shù)據(jù),將該數(shù)據(jù)所在 MOV R0,DPL ;地址送R1R0。 SJMP FH ;返回。 LOOP: INC DPTR ;數(shù)據(jù)指針DPTR指向數(shù)據(jù)區(qū)下一單元。 DJNZ R7,AGAIN ;循環(huán)控制記數(shù)器R7內(nèi)容減一,不為零繼續(xù)。 MOV R1,#00H ;數(shù)據(jù)區(qū)查找完畢,沒有找到關(guān)鍵字80H,將 MOV R0,#00H ;R1R0清零。 SETB 10H ;標志位10H置1。; FH:RET ;返回。,二、查表 例4-2 利用查表技術(shù)求某
21、單字節(jié)BCD數(shù)的平方值。,分析:表格中的內(nèi)容應(yīng)是0099的平方值00009801,為使查表程序設(shè)計方便,每個數(shù)都寫成二個字節(jié)(即不足二字節(jié)的數(shù),在前面添加0,湊夠二字節(jié))。將這些數(shù)據(jù)全部放入程序存儲器中(ROM)中,設(shè)其首址為A000H。如圖所示:,設(shè)需要查平方值的數(shù)在R3中,查出的數(shù)據(jù)低位送R4,高位送R5。,程序清單如下: ORG 1000H MOV DPTR,#0A000H ;建立表首址 MOV A,R3 ;取數(shù) RL A ;乘2 MOV R6, A ;暫存R6中 MOVC A,A+DPTR MOV R4,A ;查表取得低八位數(shù)據(jù)送R4 INC DPTR ;地址1 MOV A,R6 ;取
22、出暫存數(shù)(原數(shù)的2倍值) MOVC A,A+DPTR MOV R5,A ;查表取得高八位數(shù)據(jù)送R5,平方值數(shù)據(jù)表如下: ORG 2000H DW 0000,0001,0004,0009 DW DW ,9801 或:ORG A000H DB 00,00,01,00,04,00 DB DB 01,98,三、排序,例將內(nèi)存一串單字節(jié)無符號數(shù)升序排序。 步驟: 第一次循環(huán),比較N-1次,取到數(shù)據(jù)表中最大值,交換數(shù)據(jù)位置。 第二次循環(huán),比較N-2次,取到次大值。 第N-1次循環(huán):比較一次,排序結(jié)束。,例4-3 試編程將內(nèi)部RAM 50H70H中數(shù)據(jù)由大到小進行原地排序。 解:排序的方法很多,這里介紹一種選擇排序法。其基本思路是:反復找出數(shù)據(jù)區(qū)中最大數(shù)并將該數(shù)與當前數(shù)據(jù)區(qū)首地址中內(nèi)容互換,同時將數(shù)據(jù)區(qū)長度減一,即數(shù)據(jù)區(qū)首地址下移,逐步擴大已排序區(qū),減小未排序區(qū),直至未排序區(qū)長度為零.,ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV SP,#30H ;設(shè)置SP指針。 MOV
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專題2.10 函數(shù)的綜合應(yīng)用(原卷版)-2024年高考數(shù)學一輪復習精講精練寶典(新高考專用)
- 2025年中考物理預測模擬試卷(含答案解析)
- 文藝匯演組織方案計劃
- 跨界學習的職業(yè)思路計劃
- 語言藝術(shù)欣賞活動安排計劃
- 員工培訓部工作總結(jié)與學習計劃
- 主管全年任務(wù)計劃
- 四川景鑫礦業(yè)有限公司四川省南江縣大火地金礦礦山地質(zhì)環(huán)境保護與土地復墾方案情況
- 醫(yī)學與急救知識培訓課件
- 統(tǒng)編版小學語文二年級下冊第25課《羿射九日》精美課件
- 2025年安陽職業(yè)技術(shù)學院單招綜合素質(zhì)考試題庫及參考答案1套
- 2025年內(nèi)蒙古建筑職業(yè)技術(shù)學院單招職業(yè)適應(yīng)性測試題庫1套
- 11《認識多媒體技術(shù)》教學設(shè)計、教材分析與教學反思2024年滇人版初中信息技術(shù)七年級下冊
- 2025年湖南環(huán)境生物職業(yè)技術(shù)學院單招職業(yè)技能測試題庫一套
- 2025年湖南安全技術(shù)職業(yè)學院單招職業(yè)技能測試題庫參考答案
- DB3202-T 1063-2024 質(zhì)量基礎(chǔ)設(shè)施“-站式”服務(wù)與建設(shè)規(guī)范
- 2025年廣東省深圳法院招聘書記員招聘144人歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
- 百所名校高一數(shù)學試卷
- 第九章-或有事項教學教材
- 《服務(wù)技能提升》課件
- 2025年春新冀教版英語三年級下冊課件 2L2
評論
0/150
提交評論