第7章 匯編語言程序設(shè)計(jì) (版本)_第1頁
第7章 匯編語言程序設(shè)計(jì) (版本)_第2頁
第7章 匯編語言程序設(shè)計(jì) (版本)_第3頁
第7章 匯編語言程序設(shè)計(jì) (版本)_第4頁
第7章 匯編語言程序設(shè)計(jì) (版本)_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、2022-4-121/41第7章 匯編語言程序設(shè)計(jì)7.1程序設(shè)計(jì)步驟程序設(shè)計(jì)步驟7.2簡(jiǎn)單程序簡(jiǎn)單程序7.3分支程序分支程序7.4循環(huán)程序循環(huán)程序7.5子程序子程序習(xí)題習(xí)題7.1 程序設(shè)計(jì)步驟2022-4-122/41 匯編語言程序設(shè)計(jì)步驟:匯編語言程序設(shè)計(jì)步驟: (1)(1)分析問題分析問題:已知條件、要解決的問題、功能:已知條件、要解決的問題、功能/ /性能要求等。性能要求等。 (2)(2)建立數(shù)學(xué)模型建立數(shù)學(xué)模型:把問題數(shù)學(xué)化、公式化,便于計(jì)算機(jī)處理。:把問題數(shù)學(xué)化、公式化,便于計(jì)算機(jī)處理。 (3)(3)確定算法確定算法:簡(jiǎn)單、速度快、精度高、代碼量小、編程容易。:簡(jiǎn)單、速度快、精度高、

2、代碼量小、編程容易。 (4)(4)繪制程序流程圖繪制程序流程圖:用箭頭、框圖、菱形圖等表示程序結(jié)構(gòu)。:用箭頭、框圖、菱形圖等表示程序結(jié)構(gòu)。 (5)(5)內(nèi)存空間分配:為程序或數(shù)據(jù)分配內(nèi)存空間內(nèi)存空間分配:為程序或數(shù)據(jù)分配內(nèi)存空間。 (6)(6)編制程序與靜態(tài)檢查編制程序與靜態(tài)檢查:程序結(jié)構(gòu)層次簡(jiǎn)單、清楚、易懂。:程序結(jié)構(gòu)層次簡(jiǎn)單、清楚、易懂。 (7)(7)程序調(diào)試程序調(diào)試:利用調(diào)試軟件:利用調(diào)試軟件DEBUGDEBUG進(jìn)行調(diào)試。進(jìn)行調(diào)試。2022-4-123/41匯編語言程序設(shè)計(jì)的特點(diǎn):匯編語言程序設(shè)計(jì)的特點(diǎn): (1)(1)算法要分解至算法要分解至指令級(jí)指令級(jí);高級(jí)語言為;高級(jí)語言為語句級(jí)語句

3、級(jí)。 (2)(2)要詳細(xì)考慮要詳細(xì)考慮內(nèi)存空間分配內(nèi)存空間分配問題:?jiǎn)栴}: 任何一個(gè)變量、一條指令都要明確其存儲(chǔ)位置任何一個(gè)變量、一條指令都要明確其存儲(chǔ)位置7.2 簡(jiǎn)單程序 這種程序的形式最簡(jiǎn)單,計(jì)算機(jī)執(zhí)行程序的方式是這種程序的形式最簡(jiǎn)單,計(jì)算機(jī)執(zhí)行程序的方式是“從頭到從頭到尾尾”, ,逐條執(zhí)行指令語句,直到程序結(jié)束。逐條執(zhí)行指令語句,直到程序結(jié)束。 這類簡(jiǎn)單程序不用這類簡(jiǎn)單程序不用按上述按上述7 7個(gè)步驟,可直接對(duì)給出的題目寫出助記符程序清單。個(gè)步驟,可直接對(duì)給出的題目寫出助記符程序清單。 【例7.1】用數(shù)據(jù)運(yùn)算指令,對(duì)兩個(gè)16位數(shù)做加法運(yùn)算。這兩個(gè)數(shù)從地址10050H開始連續(xù)存放,低位在小

4、地址一端,結(jié)果放在這兩個(gè)數(shù)之后。 (1) 分析題目:它是一個(gè)16位數(shù)相加的問題。在用加法指令時(shí),必須要考慮低8位和低8位相加后產(chǎn)生的進(jìn)位問題。2022-4-124/412022-4-125/41(2) 根據(jù)86系列指令系統(tǒng),可以直接對(duì)累加器AX做字操作,但在低位相加后,會(huì)影響標(biāo)志寄存器的進(jìn)位CF, 所以,要用帶進(jìn)位的加法指令。(3) 繪制程序流程圖,如右圖所示。簡(jiǎn)單程序框圖簡(jiǎn)單程序框圖(雙字節(jié)相加雙字節(jié)相加)2022-4-126/41(4) 內(nèi)存空間分配:被加數(shù)、加數(shù)及和在內(nèi)存的空間分配見下表內(nèi)存地址內(nèi)存地址內(nèi)內(nèi) 容容10050H被加數(shù)低被加數(shù)低8位位10051H被加數(shù)高被加數(shù)高8位位1005

5、2H加數(shù)低加數(shù)低8位位10053H加數(shù)高加數(shù)高8位位10054H和的低和的低8位位10055H和的高和的高8位位雙字節(jié)相加時(shí)的內(nèi)存分配雙字節(jié)相加時(shí)的內(nèi)存分配2022-4-127/4150H51H52H53H54H55H12H34HA1HBDHAX 00H 10H50H51H52H53H54H55HAX 12H 34HAX B3H F1HDIA1HBDH+=內(nèi)存地址內(nèi)存地址存儲(chǔ)內(nèi)容存儲(chǔ)內(nèi)容MOV AX,1000HMOV DS,AX MOV SI,50H MOV DI,52H MOV BX,54HSIDIBX50H51H52H53H54H55H12H34HA1HBDHB3HF1HBX B3H F1

6、H低位在前,高位在后低位在前,高位在后CLC XOR AX,AX MOV AX,SI ADC AX,DI MOV BX,AX HLT設(shè)設(shè)SI=3412H DI=BDA1H內(nèi)存分配示意內(nèi)存分配示意程序詳細(xì)注釋見下頁程序詳細(xì)注釋見下頁 2022-4-128/41(5) 編制的程序如下:MOVMOVAXAX,1000H1000HMOVMOVDSDS,AXAX ; DSDS1000H1000HMOVMOVSISI,50H50H ; 被加數(shù)指針被加數(shù)指針SISI50H50HMOVMOVDIDI,52H52H ; 加數(shù)指針加數(shù)指針DIDI52H52HMOVMOVBXBX,54H54H ; 和的指針和的指針

7、BXBX54H54HCLCCLC ; 清清CFCFXORXORAXAX,AXAX ; 清清AX AX 異或異或MOVMOVAXAX,SISI ; 取一個(gè)字到取一個(gè)字到AXAXADCADCAXAX,DIDI ; AXAX+AXAX+DIDI+CF+CFMOVMOVBXBX,AXAX ; 存一個(gè)字到存一個(gè)字到BXBXHLTHLT ; 暫停暫停 問題:該程序能否簡(jiǎn)化?如何簡(jiǎn)化?問題:該程序能否簡(jiǎn)化?如何簡(jiǎn)化?2022-4-129/41 簡(jiǎn)化的程序:簡(jiǎn)化的程序:MOVAX,1000HMOVDS,AX ; DS1000HMOVAX,50H ; 取被加數(shù)到取被加數(shù)到AXADCAX,52H ; AX被加數(shù)被

8、加數(shù)+加數(shù)加數(shù)MOV54H,AX ; 存和數(shù)到存和數(shù)到54HHLT ; 暫停暫停2022-4-1210/41 【例7.2】將內(nèi)存(10050)單元的內(nèi)容(7AH)拆成兩段,每段4位,并將它們分別存入內(nèi)存(10051)和(10052)單元。即(10050)單元中的低4位放入(10051)的低4位,(10050)單元中的高4位放入(10052)的低4位,而(10051)和(10052)的高4位均為零。 (1) 分析題目:這個(gè)題目提出的任務(wù)在十六進(jìn)制顯示及二、十進(jìn)制計(jì)算中常遇到的. 現(xiàn)在假設(shè)內(nèi)存(10050)中放著7AH,則題目要求就是把7AH拆成07H和0AH兩部分,并把0AH放在(10051)單

9、元,07H放在(10052)單元。2022-4-1211/41 在拆字時(shí),想取得一個(gè)數(shù)的前4位和后4位可以用移位指令的方法,也可以用邏輯“與”一個(gè)0F0H(二進(jìn)制為11110000)和邏輯“與”一個(gè)0FH(二進(jìn)制為00001111)的辦法。 (2) 根據(jù)指令系統(tǒng)中含有的指令,先取出該數(shù)用邏輯指令與上一個(gè) 0FH,得到低4位,存入內(nèi)存。再取出該數(shù)用移位指令邏輯右移SHR4次,取得高4位,存入內(nèi)存即可。2022-4-1212/41(3) 繪制程序流程圖,如圖所示。(4) 內(nèi)存空間分配:把7AH拆成07H和0AH兩部分,它們?cè)趦?nèi)存空間的分配情況見下頁表。拆拆字字程程序序框框圖圖2022-4-1213

10、/41內(nèi)存分配示意圖內(nèi)存分配示意圖10050H7AH7HAH0H10051H0H10052H拆開拆開AH7AHAH7AHAH7AHAH7H內(nèi)存地址內(nèi)存地址內(nèi)容內(nèi)容10050H7AH10051H0AH10052H07H拆字程序的內(nèi)存分配拆字程序的內(nèi)存分配2022-4-1214/41(5)編制的程序如下:MOV AX,1000HMOV AX,1000HMOV DS,AX MOV DS,AX ;DS=1000HDS=1000HMOV SI,50H MOV SI,50H ;需拆字節(jié)的指針;需拆字節(jié)的指針SI=50HSI=50HMOV AL,SI MOV AL,SI ;取一個(gè)字節(jié)到;取一個(gè)字節(jié)到ALAL

11、中中AND AL,0FH AND AL,0FH ;把;把ALAL的前的前4 4位清位清0 0MOV SI+1,AL MOV SI+1,AL ;把得到的后;把得到的后4 4位放到位放到(10051)(10051)單元單元MOV AL,SI MOV AL,SI ;再取出需拆字節(jié)放到;再取出需拆字節(jié)放到ALAL中中MOV CL,4 MOV CL,4 SHR AL,CL SHR AL,CL ;邏輯右移四次,前;邏輯右移四次,前4 4位補(bǔ)位補(bǔ)0 0MOV SI+2,AL MOV SI+2,AL ;放入;放入(10052)(10052)單元單元2022-4-1215/41編程計(jì)算編程計(jì)算 1+2+3+4。

12、 MOV AX ,0 ADD AX ,1 ADD AX ,2 ADD AX ,3 ADD AX ,4初始化初始化: AX 0開始開始 AX AX+1 AX AX+2結(jié)束結(jié)束 AX AX+3 AX AX+4分析分析:需要有一個(gè)暫存空間存放累加和,需要有一個(gè)暫存空間存放累加和,初值設(shè)置為初值設(shè)置為0,之后依次累加。,之后依次累加。2022-4-1216/41練習(xí):練習(xí): 將數(shù)據(jù)1A2BH,1200H,339AH,1200H分別存入相鄰的內(nèi)存單元中,然后將前三個(gè)數(shù)相加并減去第四個(gè)數(shù),最后將結(jié)果傳遞到相近的內(nèi)存單元中。7.3 分支程序2022-4-1217/41 分支程序是利用分支程序是利用條件轉(zhuǎn)移指

13、令條件轉(zhuǎn)移指令實(shí)現(xiàn)實(shí)現(xiàn)程序執(zhí)行次序改變程序執(zhí)行次序改變的一種程的一種程序結(jié)構(gòu)形式,即當(dāng)程序執(zhí)行到某一指令后,根據(jù)某個(gè)條件是否序結(jié)構(gòu)形式,即當(dāng)程序執(zhí)行到某一指令后,根據(jù)某個(gè)條件是否滿足,分別執(zhí)行不同的指令序列滿足,分別執(zhí)行不同的指令序列。 一般來說,分支程序經(jīng)常是先用一般來說,分支程序經(jīng)常是先用比較指令比較指令或或數(shù)據(jù)操作數(shù)據(jù)操作及及位檢測(cè)位檢測(cè)指令指令等來等來改變改變標(biāo)志寄存器各個(gè)標(biāo)志寄存器各個(gè)標(biāo)志位標(biāo)志位。然后用條件轉(zhuǎn)移指令進(jìn)。然后用條件轉(zhuǎn)移指令進(jìn)行分支。行分支。 分支程序執(zhí)行完后可以立即結(jié)束,也可以轉(zhuǎn)到公共點(diǎn)結(jié)束。分支程序執(zhí)行完后可以立即結(jié)束,也可以轉(zhuǎn)到公共點(diǎn)結(jié)束。 分支程序可以分支程序可

14、以再分支再分支。 程序框圖:在繪制程序流程圖時(shí),需用菱形判斷框程序框圖:在繪制程序流程圖時(shí),需用菱形判斷框, ,表示判定條表示判定條件。在繪制好流程圖編寫助記符程序時(shí),建議先按上下流程線件。在繪制好流程圖編寫助記符程序時(shí),建議先按上下流程線寫寫, ,寫完上下流程線上的各框環(huán)節(jié)后,再寫分支部分里的框框。寫完上下流程線上的各框環(huán)節(jié)后,再寫分支部分里的框框。2022-4-1218/41 【例7.3】求AX累加器和BX寄存器中兩個(gè)無符號(hào)數(shù)之差的絕對(duì)值,結(jié)果放在內(nèi)存(2800)單元中。 (1) 分析題目:此題目中,AX累加器和BX寄存器中的數(shù)是不知道的。對(duì)兩個(gè)不知大小的數(shù)相減并求絕對(duì)值,顯然應(yīng)該先解決哪

15、一個(gè)值稍大些,然后再用大數(shù)減小數(shù)的方法,才可求得絕對(duì)值。2022-4-1219/41(2) 根據(jù)指令系統(tǒng)中的比較指令,編出判斷大小的環(huán)節(jié),即可解決問題,下圖即為該例題的程序流程圖。求求絕絕對(duì)對(duì)值值程程序序流流程程圖圖JC=Jump if Carry 當(dāng)運(yùn)算產(chǎn)生進(jìn)位標(biāo)志時(shí),即CF=1時(shí),跳轉(zhuǎn)到目標(biāo)程序處。(3) 根據(jù)流程圖編制程序如下:CLC ; 清除CFSUBAX,BXJCAA ; CF轉(zhuǎn)AA去執(zhí)行(即AXBX時(shí)轉(zhuǎn)移MOVDI,2800H ; 結(jié)果指針DI2800HMOVDI,AX ; 結(jié)果送到2800H和2801H單元HLT ; 暫停AA:SUB BX,AX ; BXBX-AXMOVDI,2

16、800HMOVDI,BXHLTSUB BX, AX2022-4-1220/41 問題問題: 這段程序有無錯(cuò)誤?這段程序有無錯(cuò)誤? 如果有錯(cuò),如何改正?如果有錯(cuò),如何改正?CMPAX,BXSUBAX,BX2022-4-1221/41 【例7.4】 編一個(gè)程序,從外設(shè)71H號(hào)中取一個(gè)數(shù)M,判斷其值是否在10和20之間,即10M20。如果M20H,則送0FFH給外設(shè)73H;如果M10,則送00H給外設(shè)73H;如果10M20,則送88H給外設(shè)73H。 (1) 分析題目:根據(jù)題意,這是一個(gè)需要兩次判斷M大小的問題。先判M是否大于10,再判M是否大于20。2022-4-1222/41(2) 根據(jù)解決問題的

17、思路,先畫出程序流程圖,如圖。 從圖的程序流程圖看,兩個(gè)分支都要“回歸”原程序。判斷判斷M的兩分支流程圖的兩分支流程圖2022-4-1223/41 (3) 編制的程序如下:STARTSTART:ININALAL,71H71H ; 將將71H71H端口的字節(jié)讀入端口的字節(jié)讀入ALALCLCCLC ; 清除清除CFCFCMPCMP ALAL, 1010; 將將ALAL的內(nèi)容和的內(nèi)容和1010相比較相比較JCJCLP1LP1 ; 小于小于1010轉(zhuǎn)轉(zhuǎn)LP1LP1CMPCMP ALAL, 2020 ; 將將ALAL的內(nèi)容和的內(nèi)容和2020相比較相比較JCJCLP2LP2 ; 10AL10AL2020轉(zhuǎn)

18、轉(zhuǎn)LP2LP2MOV MOV BL BL , 0FFH0FFH; 將將0FFH0FFH送入送入BLBL寄存器寄存器LP3LP3:OUTOUT73H73H,BLBL ; 將將0FFH0FFH輸出到輸出到73H73H端口端口HLTHLT ; 暫停暫停LP1LP1: MOV MOV BLBL, 0000 JMPJMPLP3LP3LP2LP2: MOV MOV BLBL, 88H88H JMPJMPLP3LP3問題問題:這段程序有無錯(cuò)誤?這段程序有無錯(cuò)誤? 如果有錯(cuò),如何改正?如果有錯(cuò),如何改正?MOV BL, ALBLBLALALALAL;無條件轉(zhuǎn)移STARTSTART:ININALAL,71H71

19、H ; 將將71H71H端口的字節(jié)讀入端口的字節(jié)讀入ALAL MOV BL, AL MOV BL, AL CLCCLC ; 清除清除CFCFCMPCMP BLBL, 1010 ; 將將BLBL的內(nèi)容和的內(nèi)容和1010相比較相比較JCJCLP1LP1 ; 小于小于1010轉(zhuǎn)轉(zhuǎn)LP1LP1CMPCMP BLBL, 2020 ; 將將BLBL的內(nèi)容和的內(nèi)容和2020相比較相比較 JCJCLP2LP2 ; 10BL10BL2020轉(zhuǎn)轉(zhuǎn)LP2LP2 MOV MOV AL AL , 0FFH0FFH ; 將將0FFH0FFH送入送入ALAL寄存器寄存器LP3LP3: OUTOUT73H73H,ALAL ;

20、 將將0FFH0FFH輸出到輸出到73H73H端口端口 HLTHLT ; 暫停暫停LP1LP1: MOV MOV ALAL, 0000 JMPJMPLP3LP3LP2LP2: MOV MOV ALAL, 88H88H JMPJMPLP3LP32022-4-1224/412022-4-1225/41編一程序段,完成符號(hào)函數(shù):編一程序段,完成符號(hào)函數(shù):1X0 ( -128X127)Y=0X=0-1X0 假設(shè)假設(shè) X的值存放在的值存放在DATA1中,中, Y的值存放在的值存放在DATA2中。中。練習(xí)練習(xí)2022-4-1226/41練習(xí)題程序如下:練習(xí)題程序如下:START:MOV AL,DATA1

21、AND AL,AL JGE BIGR MOV AL,0FFH MOV DATA2,AL ;X0,-1送送DATA2 HLTBIGR: JE EQUL MOV AL,1 MOV DATA2,AL ;X0,+1送送DATA2 HLTEQUL: MOV DATA2,AL ;X=0,0送送DATA2 HLT2022-4-1227/41讀程序,問:本段程序的執(zhí)行結(jié)果是什么讀程序,問:本段程序的執(zhí)行結(jié)果是什么?BEGIN:INAL,5FH TESTAL,80H JZBRCH1 MOVAH,0 JMPSTOPBRCH1:MOVAH,0FFHSTOP: HLT;將將5FH端口的字節(jié)讀入端口的字節(jié)讀入AL;如果

22、如果AL的最高位為的最高位為1,則,則ZF=0,否則,否則ZF=1;當(dāng)結(jié)果為零當(dāng)結(jié)果為零(即即ZF=1)時(shí),跳轉(zhuǎn)至?xí)r,跳轉(zhuǎn)至BRCH1;將立即數(shù)零送將立即數(shù)零送AH;無條件轉(zhuǎn)移至無條件轉(zhuǎn)移至STOP;將將0FFH送送AH;暫停暫停當(dāng)當(dāng)AL的最高位為的最高位為1時(shí),時(shí),AH=0;當(dāng)當(dāng)AL的最高位為的最高位為0時(shí),時(shí),AH=0FFH。2022-4-1228/41 雙分支程序設(shè)計(jì)雙分支程序設(shè)計(jì) 實(shí)現(xiàn)雙分支程序設(shè)計(jì)要完成以下幾項(xiàng)工作:實(shí)現(xiàn)雙分支程序設(shè)計(jì)要完成以下幾項(xiàng)工作:1 1 產(chǎn)生條件:主要用產(chǎn)生條件:主要用“比較比較”、“測(cè)試測(cè)試”等指令產(chǎn)生條等指令產(chǎn)生條件;件;2 2 測(cè)試條件、定向轉(zhuǎn)移:用條件

23、轉(zhuǎn)移指令完成;測(cè)試條件、定向轉(zhuǎn)移:用條件轉(zhuǎn)移指令完成;3 3 設(shè)置執(zhí)行標(biāo)志設(shè)置執(zhí)行標(biāo)志( (標(biāo)號(hào)標(biāo)號(hào)) ):給執(zhí)行程序段定義地址標(biāo)號(hào)。:給執(zhí)行程序段定義地址標(biāo)號(hào)。7.4 循環(huán)程序2022-4-1229/41循環(huán)程序是循環(huán)程序是強(qiáng)制強(qiáng)制CPUCPU重復(fù)執(zhí)行某一指令序列重復(fù)執(zhí)行某一指令序列( (程序段程序段) )的一種程序的一種程序結(jié)構(gòu)形式。結(jié)構(gòu)形式。循環(huán)結(jié)構(gòu)程序循環(huán)結(jié)構(gòu)程序縮短了程序的長(zhǎng)度、減少了占用的內(nèi)存空間縮短了程序的長(zhǎng)度、減少了占用的內(nèi)存空間。循環(huán)程序循環(huán)程序并不簡(jiǎn)化程序執(zhí)行過程并不簡(jiǎn)化程序執(zhí)行過程,相反,由于增加了一些循環(huán),相反,由于增加了一些循環(huán)控制等環(huán)節(jié),控制等環(huán)節(jié),總的程序執(zhí)行語句

24、和時(shí)間會(huì)有所增加總的程序執(zhí)行語句和時(shí)間會(huì)有所增加。循環(huán)程序一般由循環(huán)程序一般由4 4部分組成:部分組成:初始化、循環(huán)體、循環(huán)控制和循環(huán)初始化、循環(huán)體、循環(huán)控制和循環(huán)結(jié)束處理結(jié)束處理。循環(huán)程序分為循環(huán)程序分為單循環(huán)單循環(huán)和和多重循環(huán)多重循環(huán), ,兩重以上循環(huán)稱為多重循環(huán)。兩重以上循環(huán)稱為多重循環(huán)。內(nèi)外循環(huán)不能交叉。內(nèi)外循環(huán)不能交叉。2022-4-1230/417.4 7.4 循環(huán)程序循環(huán)程序循環(huán)程序各部分的內(nèi)容循環(huán)程序各部分的內(nèi)容(1)初始化初始化建立建立循環(huán)次數(shù)計(jì)數(shù)器循環(huán)次數(shù)計(jì)數(shù)器,設(shè)定設(shè)定變量和存放數(shù)據(jù)的變量和存放數(shù)據(jù)的內(nèi)存地址指針內(nèi)存地址指針(常用間常用間址方式址方式)的的初值初值等。等。

25、(2) 循環(huán)體循環(huán)體實(shí)現(xiàn)程序?qū)崿F(xiàn)程序功能功能的、被的、被重重復(fù)執(zhí)行復(fù)執(zhí)行的指令序列。的指令序列。(3) 循環(huán)控制循環(huán)控制修改修改變量變量和地址和地址指針指針,為下一次循環(huán)做準(zhǔn)備;為下一次循環(huán)做準(zhǔn)備;修改循環(huán)修改循環(huán)計(jì)數(shù)器計(jì)數(shù)器或者判或者判斷斷循環(huán)條件循環(huán)條件是否滿足,是否滿足,滿足則繼續(xù)循環(huán),否則滿足則繼續(xù)循環(huán),否則結(jié)束循環(huán)。結(jié)束循環(huán)。(4) 結(jié)束處理結(jié)束處理它主要用來分析和存放它主要用來分析和存放程序的結(jié)果。程序的結(jié)果。2022-4-1231/41循環(huán)控制方式有多種,如循環(huán)控制方式有多種,如計(jì)數(shù)控制計(jì)數(shù)控制、條件控制條件控制等。計(jì)數(shù)控制事等。計(jì)數(shù)控制事先已知循環(huán)次數(shù),每次循環(huán)加或減計(jì)數(shù),通過

26、對(duì)循環(huán)次數(shù)的判先已知循環(huán)次數(shù),每次循環(huán)加或減計(jì)數(shù),通過對(duì)循環(huán)次數(shù)的判定來達(dá)到控制循環(huán)的目的;條件控制事先不知循環(huán)次數(shù),通過定來達(dá)到控制循環(huán)的目的;條件控制事先不知循環(huán)次數(shù),通過判定某種條件的真假來達(dá)到控制循環(huán)的目的。判定某種條件的真假來達(dá)到控制循環(huán)的目的。不管哪一種控制循環(huán)方式,最終都是要達(dá)到控制循環(huán)的目的。不管哪一種控制循環(huán)方式,最終都是要達(dá)到控制循環(huán)的目的。若考慮不周,會(huì)造成死循環(huán)若考慮不周,會(huì)造成死循環(huán),對(duì)這一點(diǎn)要注意。,對(duì)這一點(diǎn)要注意。 循環(huán)可以用跳轉(zhuǎn)語句實(shí)現(xiàn)循環(huán)可以用跳轉(zhuǎn)語句實(shí)現(xiàn), 如如JMP, JZ等等; 也可以用專用循環(huán)控制也可以用專用循環(huán)控制語句實(shí)現(xiàn)語句實(shí)現(xiàn), 如如LOOP、L

27、OOPE/LOOPZ、LOOPNE/LOOPNZ。 【例7.5】求兩個(gè)多字節(jié)數(shù)之和。這兩個(gè)數(shù)在10050H地址開始的內(nèi)存單元中,連續(xù)存放,低位在小地址一端,結(jié)果放在這兩個(gè)數(shù)之后。設(shè)這兩個(gè)多字節(jié)數(shù)均為8個(gè)字節(jié)長(zhǎng)。 程序流程圖如右圖所示。2022-4-1232/41 (1) 分析題目:這是一個(gè)重復(fù)累加內(nèi)存單元中數(shù)的問題,因此可以用循環(huán)程序形式解決。因?yàn)?6系列指令系統(tǒng)可以16位處理,所以,循環(huán)次數(shù)是4次。2022-4-1233/4112574341存儲(chǔ)器存儲(chǔ)器SI10050DI10058+BX100605598單擊單擊2022-4-1234/41(3) 編制的程序如下:STARTSTART: MO

28、VMOVAXAX,1000H1000HMOVMOVDSDS,AXAX ; DSDS1000H1000HMOVMOVSISI,50H50H; 第一個(gè)數(shù)指針第一個(gè)數(shù)指針SISI50H50HMOVMOVDIDI,58H58H; 第二個(gè)數(shù)指針第二個(gè)數(shù)指針DIDI58H58HMOVMOVBXBX,60H 60H ; 結(jié)果指針結(jié)果指針BXBX60H60HMOVMOVCXCX,4 4 ; 循環(huán)次數(shù)循環(huán)次數(shù)CXCX4 4CLCCLC ; 清進(jìn)位清進(jìn)位CFCF0 0AAAA: MOVMOVAX,AX,SISI; 取一個(gè)字到取一個(gè)字到AXAX下頁續(xù)下頁續(xù)2022-4-1235/41 ADCADCAXAX,DIDI

29、; AXAX+AXAX+DIDI+CF+CF MOVMOVBXBX,AXAX ; 存一個(gè)字到存一個(gè)字到BXBX PUSHFPUSHF ; 保護(hù)進(jìn)位保護(hù)進(jìn)位CFCFADDADDSISI,2 2 ; 修改第一個(gè)數(shù)的地址指針修改第一個(gè)數(shù)的地址指針SISI+2SISI+2ADDADDDIDI,2 2 ; 修改第二個(gè)數(shù)的地址指針修改第二個(gè)數(shù)的地址指針DIDI+2DIDI+2ADDADDBXBX,2 2 ; 修改結(jié)果指針修改結(jié)果指針BXBX+2BXBX+2POPFPOPF ; 恢復(fù)標(biāo)志寄存器恢復(fù)標(biāo)志寄存器LOOPLOOPAAAA ; CXCX-1CXCX-1,若,若CX0CX0轉(zhuǎn)轉(zhuǎn)AAAAHLTHLT ;

30、 CXCX0 0,暫停,暫停結(jié)束結(jié)束2022-4-1236/41 【例7.6】要求設(shè)計(jì)一個(gè)軟件延時(shí)程序,延時(shí)時(shí)間約1ms左右。 (1) 分析題目: 此題是想讓計(jì)算機(jī)做一些無用的操作,來拖延時(shí)間。從指令手冊(cè)中查得各條指令所需的時(shí)間節(jié)拍,但一般一條指令執(zhí)行時(shí)間只有幾個(gè)時(shí)鐘周期,亦即只有幾個(gè)微秒,為了能用較少的指令來編較長(zhǎng)時(shí)間的延時(shí),采用循環(huán)程序結(jié)構(gòu).2022-4-1237/41 (2) 程序流程圖如圖所示。延時(shí)的時(shí)間主要取決于循環(huán)體及循環(huán)次數(shù)。PUSHF和POPF指令分別為10和8個(gè)時(shí)鐘節(jié)拍,LOOP BX指令為3.4個(gè)時(shí)鐘節(jié)拍,即此循環(huán)體需要用10+8+3.421.4拍,而每個(gè)時(shí)鐘節(jié)拍是根據(jù)此系

31、統(tǒng)的晶振頻率而定的。假設(shè)此系統(tǒng)用的是8MHz的晶振,則每個(gè)時(shí)鐘節(jié)拍需要0.125s,因此可以根據(jù)下列公式算出循環(huán)次數(shù): X延時(shí)時(shí)間/一次循環(huán)時(shí)間1ms/21.40.125s374次 換算成十六進(jìn)制數(shù)為176H。2022-4-1238/41延時(shí)延時(shí)1ms的程序流程圖的程序流程圖延時(shí)延時(shí)1ms的程序流程圖的程序流程圖2022-4-1239/41(3) 編制的程序如下:STARTSTART:MOVMOVCXCX,176H176H ;初始化,設(shè)定循環(huán)次數(shù);初始化,設(shè)定循環(huán)次數(shù)CXCX374374LP1LP1: PUSHFPUSHF ; 循環(huán)體循環(huán)體 POPFPOPF LOOPLOOPLP1LP1 ;

32、CXCX-1CXCX-1,若,若CX0CX0轉(zhuǎn)轉(zhuǎn) HLTHLT ; 暫停暫停 對(duì)于上例,如果想再延長(zhǎng)1000倍時(shí)間(即延時(shí)1s),可以采用雙循環(huán)的方法,如圖所示的程序流程圖。對(duì)應(yīng)的程序如下: 2022-4-1240/41 MOVMOVBXBX,3E8H3E8H; BX1000BX1000LP2LP2: MOVCXMOVCX,176H176HLP1LP1: PUSHFPUSHF POPFPOPF延時(shí)延時(shí)1ms1ms程序段程序段 LOOP LP1LOOP LP1 DECDECBXBX ; BXBX-1BXBX-1 JNZJNZLP2LP2 ; ZFZF0 0時(shí),轉(zhuǎn)至?xí)r,轉(zhuǎn)至LP2LP2,即,即BX

33、0BX0時(shí)轉(zhuǎn)時(shí)轉(zhuǎn) HLTHLT ; 暫停暫停 此程序中內(nèi)循環(huán)是1ms時(shí)間,而在外循環(huán)中的兩條控制指令DEC和JNZ所對(duì)應(yīng)的時(shí)鐘節(jié)拍分別為2個(gè)和4個(gè) ,一共只需0.75s,與1ms比較極短,所以在外循環(huán)里忽略不計(jì)了,外循環(huán)的循環(huán)初值仍設(shè)為1000次,對(duì)應(yīng)的十六進(jìn)制為3E8H。例 設(shè)AX寄存器中有一個(gè)16位二進(jìn)制數(shù),編一程序,統(tǒng)計(jì)AX中1的個(gè)數(shù),統(tǒng)計(jì)結(jié)果送CX中。該程序可用固定次數(shù)循環(huán)和條件判斷兩種方法實(shí)現(xiàn)。該程序可用固定次數(shù)循環(huán)和條件判斷兩種方法實(shí)現(xiàn)。條件判斷法編制程序如下:條件判斷法編制程序如下:STARTSTART:MOV CXMOV CX,0 0LOOPLOOP: SUBSUBAXAX,0

34、 0 JZ JZSTPSTP SAL SALAXAX,1 1 JNC JNCNODNOD INC INCCXCXNODNOD: JMPJMPLOOPLOOPSTPSTP: HLTHLT2022-4-1241/41固定次數(shù)循環(huán)法,循環(huán)次數(shù)為固定次數(shù)循環(huán)法,循環(huán)次數(shù)為16次,程序如下:次,程序如下:其中其中:CX中存放循環(huán)次數(shù),中存放循環(huán)次數(shù),BX中存放中存放“”的個(gè)數(shù)的個(gè)數(shù) MOV CX, 16 MOV BX, 0 AA: SHL AX,1 JC YY JMP PP YY: INC BX PP: LOOP AA HLT 例: 計(jì)算S=1+2+3+100的和值并將其存入數(shù)據(jù)段2000H單元.202

35、2-4-1242/41程序如下:程序如下: MOV CX, 0064H MOV AL, 0 MOV BL, 1AA: ADD AL,BL INC BL LOOP AA MOV 2000H,AL HLT例: 讀程序, (1) 本程序?qū)崿F(xiàn)什么功能? (2) 結(jié)果在哪里?2022-4-1243/41START: INAL,20HMOVBL,ALINAL,30HMOVCL,ALMOVAX,0ADLOP: ADDAL,BL ADCAH,0 DECCL JNZADLOP HLT;將將20H端口端口 的字節(jié)讀入的字節(jié)讀入AL; AL中的中的8位字節(jié)送位字節(jié)送 BL;將將30H端口端口 的字節(jié)讀入的字節(jié)讀入A

36、L; AL中的中的8位字節(jié)送位字節(jié)送 CL; 立即數(shù)立即數(shù)0送送 AX; AL與與BL的內(nèi)容相加,結(jié)果放的內(nèi)容相加,結(jié)果放AL; AH的內(nèi)容與立即數(shù)的內(nèi)容與立即數(shù)0以及以及CF相加相加; CL內(nèi)容減內(nèi)容減1,結(jié)果放,結(jié)果放CL; 當(dāng)結(jié)果不為零時(shí),執(zhí)行當(dāng)結(jié)果不為零時(shí),執(zhí)行ADLOP; 暫停暫停20H與與30H端口的內(nèi)容端口的內(nèi)容相乘,結(jié)果放在相乘,結(jié)果放在AX中中44 7.5 7.5 子程序和庫子程序和庫為了程序共享或模塊化設(shè)計(jì)的需要,為了程序共享或模塊化設(shè)計(jì)的需要,可以把一段公共語句序列設(shè)計(jì)成子程可以把一段公共語句序列設(shè)計(jì)成子程序或宏指令的形式。序或宏指令的形式。45 當(dāng)把一段可共享的語句序列

37、組織成子程序后,一旦需要實(shí)現(xiàn)該功能,就由調(diào)用程序調(diào)用之,當(dāng)子程序執(zhí)行結(jié)束后再返回到主程序繼續(xù)執(zhí)行。7.5.1 7.5.1 子程序的定義子程序的定義 主程序主程序 子程序子程序 主子程序關(guān)系示意圖主子程序關(guān)系示意圖46定義子程序的一般格式在匯編語言中用過程定義偽指令定義子程序。過程名PROC 【類型】過程名ENDP477.5.1 子程序的定義子程序的定義u “子程序名”必須是一個(gè)合法的標(biāo)識(shí)符,并前后二者要一致;uPROC和ENDP必須是成對(duì)出現(xiàn)的關(guān)鍵字,表示子程序定義開始和結(jié)束;u子程序的類型有近(NEAR)、遠(yuǎn)(FAR)之分,其缺省的類型是近類型;uNEAR類型的子程序只能被與其同段的程序所調(diào)

38、用,F(xiàn)AR類型的子程序可被不同段的程序所調(diào)用;u子程序至少要有一條返回指令。返回指令是子程序的出口語句,但它不一定是子程序的最后一條語句;u子程序名有三個(gè)屬性:段值、偏移量和類型。其段值和偏移量對(duì)應(yīng)于子程序的入口地址,其類型就是該子程序的類型。48 調(diào)用子程序指令格式如下:CALL 子程序名子程序名/Reg/Mem子程序的調(diào)用指令分為近(near)調(diào)用和遠(yuǎn)(far)調(diào)用。如果被調(diào)用子程序的屬性是近的,那么,CALL指令將產(chǎn)生一個(gè)近調(diào)用,它把該指令之后地址的偏移量(用一個(gè)字來表示的)壓棧,把被調(diào)用子程序入口地址的偏移量送給指令指針寄存器IP即可實(shí)現(xiàn)執(zhí)行程序的轉(zhuǎn)移。7.2 子程序的調(diào)用和返回指令子

39、程序的調(diào)用和返回指令49如果被調(diào)用子程序的屬性是遠(yuǎn)的,那么,CALL指令將產(chǎn)生一個(gè)遠(yuǎn)調(diào)用。這時(shí),調(diào)用指令不僅要把該指令之后地址的偏移量壓進(jìn)棧,而且也要把段寄存器CS的值壓進(jìn)棧。在此之后,再把被調(diào)用子程序入口地址的偏移量和段值分別送給IP和CS,這樣完成了子程序的遠(yuǎn)調(diào)用操作。例如: CALL DISPLAY;DISPLAY是子程序名 CALL BX;BX的內(nèi)容是子程序的偏移量 CALL WORD1;WORD1是內(nèi)存字變量,其值是子程序的偏移量501 1子程序調(diào)用指令子程序調(diào)用指令 CALLCALL格式:格式:CALL DSTCALL DST功能:功能:調(diào)用子程序。調(diào)用子程序。執(zhí)行時(shí)先把返回地址壓

40、入堆棧,再形成子程序執(zhí)行時(shí)先把返回地址壓入堆棧,再形成子程序入口地址,最后把控制權(quán)交給子程序。入口地址,最后把控制權(quán)交給子程序。說明:其中說明:其中DSTDST為子程序名或子程序入口地址,其為子程序名或子程序入口地址,其目標(biāo)地址的形成與目標(biāo)地址的形成與JMPJMP指令類似指令類似, ,可以有段內(nèi)直接可以有段內(nèi)直接間接調(diào)用、段間直接間接調(diào)用之分間接調(diào)用、段間直接間接調(diào)用之分, ,只是不能使只是不能使用段內(nèi)直接尋址方式的用段內(nèi)直接尋址方式的SHORTSHORT格式。格式。51 段內(nèi)調(diào)用段內(nèi)調(diào)用這類調(diào)用指令實(shí)現(xiàn)同一段內(nèi)的子程序調(diào)用這類調(diào)用指令實(shí)現(xiàn)同一段內(nèi)的子程序調(diào)用, ,它它只改變只改變IPIP值,

41、不改變值,不改變CSCS值。值。執(zhí)行操作:執(zhí)行操作: 把返回地址(把返回地址(CALLCALL之后的那條指令地址的之后的那條指令地址的偏移量部分偏移量部分( (當(dāng)前當(dāng)前IPIP值值) ))壓入堆棧。)壓入堆棧。根據(jù)與轉(zhuǎn)移地址有關(guān)的尋址方式形成子程序根據(jù)與轉(zhuǎn)移地址有關(guān)的尋址方式形成子程序入口地址的入口地址的IPIP值。值。把控制無條件轉(zhuǎn)向子程序,即執(zhí)行把控制無條件轉(zhuǎn)向子程序,即執(zhí)行CS:IPCS:IP處處的指令。的指令。52 段內(nèi)直接調(diào)用:段內(nèi)直接調(diào)用: 格式:格式:CALL PROCEDURECALL PROCEDURE 或:或: CALL NEAR PTR PROCEDURE CALL NE

42、AR PTR PROCEDURE 功能:功能:調(diào)用調(diào)用PROCEDUREPROCEDURE子程序。執(zhí)行時(shí)先把返回地子程序。執(zhí)行時(shí)先把返回地址壓入堆棧址壓入堆棧, ,再使再使IPIP(IP)(IP)disp16disp16,最后把控制權(quán),最后把控制權(quán)交給子程序。交給子程序。 說明:說明:這種指令使用與轉(zhuǎn)移地址有關(guān)的尋址方式這種指令使用與轉(zhuǎn)移地址有關(guān)的尋址方式中的段內(nèi)直接尋址方式。中的段內(nèi)直接尋址方式。 例例1.1. 設(shè)子程序設(shè)子程序A A與與CALLCALL指令在同一段內(nèi),則調(diào)用指令在同一段內(nèi),則調(diào)用A A子程序的指令是:子程序的指令是: CALL A CALL A 或或: CALL NEAR

43、PTR A: CALL NEAR PTR A53 段內(nèi)間接調(diào)用:段內(nèi)間接調(diào)用:格式:格式:CALL REGCALL REGM M功能:功能:調(diào)用子程序。執(zhí)行時(shí)先把返回地調(diào)用子程序。執(zhí)行時(shí)先把返回地址壓入堆棧,再把指令指定的址壓入堆棧,再把指令指定的1616位通用寄存位通用寄存器或內(nèi)存單元的內(nèi)容送給器或內(nèi)存單元的內(nèi)容送給IPIP,最后把控制權(quán),最后把控制權(quán)交給子程序。交給子程序。 說明:說明:這種指令使用與轉(zhuǎn)移地址有關(guān)的尋這種指令使用與轉(zhuǎn)移地址有關(guān)的尋址方式中的段內(nèi)間接尋址方式,指令指定的址方式中的段內(nèi)間接尋址方式,指令指定的通用寄存器或內(nèi)存單元中存放段內(nèi)偏移量。通用寄存器或內(nèi)存單元中存放段內(nèi)偏

44、移量。54 段間調(diào)用段間調(diào)用 這類調(diào)用指令可以實(shí)現(xiàn)段間調(diào)用(這類調(diào)用指令可以實(shí)現(xiàn)段間調(diào)用(FARFAR型調(diào)用)型調(diào)用), ,執(zhí)行時(shí)即要改變執(zhí)行時(shí)即要改變IPIP值,值,也要改變也要改變CSCS值。值。55 段間直接調(diào)用:段間直接調(diào)用:格式:格式:CALL FAR PTR PROCEDURECALL FAR PTR PROCEDURE 功能:功能:調(diào)用調(diào)用PROCEDUREPROCEDURE子程序。執(zhí)行時(shí)先子程序。執(zhí)行時(shí)先把返回地址把返回地址( (當(dāng)前當(dāng)前IPIP值和當(dāng)前值和當(dāng)前CSCS值值) )壓入堆棧壓入堆棧,再把指令中的偏移量部分送給再把指令中的偏移量部分送給IPIP,段基址部分,段基址部

45、分送給送給CSCS,最后把控制權(quán)交給子程序。,最后把控制權(quán)交給子程序。說明:說明:這種指令使用與轉(zhuǎn)移地址有關(guān)的尋這種指令使用與轉(zhuǎn)移地址有關(guān)的尋址方式中的段間直接尋址方式。址方式中的段間直接尋址方式。例例3.3. 設(shè)子程序設(shè)子程序B B與與CALLCALL指令不在同一段內(nèi)指令不在同一段內(nèi), ,則段間直接調(diào)用則段間直接調(diào)用B B子程序的指令是:子程序的指令是:CALL FAR PTR B CALL FAR PTR B 56 段間間接調(diào)用:段間間接調(diào)用:格式:格式:CALL MCALL M功能:功能:調(diào)用子程序。執(zhí)行時(shí)先把返回地調(diào)用子程序。執(zhí)行時(shí)先把返回地址址( (當(dāng)前當(dāng)前IPIP值和當(dāng)前值和當(dāng)前C

46、SCS值值) )壓入堆棧,再把壓入堆棧,再把M M的的低字送給低字送給IPIP,高字送給,高字送給CSCS, ,最后把控制權(quán)交給最后把控制權(quán)交給子程序。子程序。說明:說明:這種指令使用與轉(zhuǎn)移地址有關(guān)的這種指令使用與轉(zhuǎn)移地址有關(guān)的尋址方式中的段間間接尋址方式,其中尋址方式中的段間間接尋址方式,其中M M 為為內(nèi)存的雙字長(zhǎng)地址指針,低字部分為內(nèi)存的雙字長(zhǎng)地址指針,低字部分為1616位的位的偏移量,高字部分為段基址。偏移量,高字部分為段基址。57例例4.4. 對(duì)于例對(duì)于例3 3,若子程序,若子程序B B的入口地址的入口地址( (偏偏移量和段基址移量和段基址) )放在變量放在變量VARVAR中中, ,

47、即可通過即可通過VARVAR實(shí)實(shí)現(xiàn)段間間接調(diào)用。如下所示:現(xiàn)段間間接調(diào)用。如下所示:CALL DWORD PTR VARCALL DWORD PTR VAR; ;從從VARVAR變量中得到子程序變量中得到子程序B B的入口地址實(shí)現(xiàn)調(diào)用的入口地址實(shí)現(xiàn)調(diào)用變量變量VARVAR的地址也可以通過寄存器間接尋的地址也可以通過寄存器間接尋址方式、基址變址尋址方式等存儲(chǔ)器操作數(shù)尋址方式、基址變址尋址方式等存儲(chǔ)器操作數(shù)尋址方式得到。址方式得到。例例. . CALL DWORD PTR 8BXDI CALL DWORD PTR 8BXDI 58 當(dāng)子程序執(zhí)行完時(shí),需要返回到調(diào)用它的程序之中。為了實(shí)現(xiàn)此功能,指令系統(tǒng)提供了一條專用的子程序返回指令。其格式如下:RET/RETN/RETF Imm 子程序的返回在功能上是子程序調(diào)用的逆操作。為了與子程序的遠(yuǎn)、近調(diào)用相對(duì)應(yīng),子程序的返回也分:遠(yuǎn)返回和近返回。7.5.2 返回指令返回指令59 如果返回指令后面帶有立即數(shù)(其值通常為偶數(shù)),則表示在得到返回地址之后,SP還要增加的偏移量,它不是類似于高級(jí)語言中子程序的返回值。例如:RET;可能是近返回,也可能是遠(yuǎn)返回RETN;近返回指令RETF;遠(yuǎ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. 人人文庫網(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)論