匯編語言程序設(shè)計_第1頁
匯編語言程序設(shè)計_第2頁
匯編語言程序設(shè)計_第3頁
匯編語言程序設(shè)計_第4頁
匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩147頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯編語言程序設(shè)計5.1程序設(shè)計概述5.2匯編,鏈接和運行程序5.3模塊化的程序設(shè)計5.4匯編語言程序設(shè)計的基本方法內(nèi)容與要求:掌握匯編語言的基本語法、語句、操作數(shù)的尋址方式與匯編表示、常量與數(shù)值表達(dá)式,標(biāo)號、變量與地址表達(dá)式。2.掌握順序、分支、循環(huán)程序設(shè)計的基本方法和一般技巧。3.掌握子程序與堆棧技術(shù)。4.了解宏匯編和宏指令的應(yīng)用。5.1程序設(shè)計概述

1.機(jī)器語言(MachineLanguage)

機(jī)器語言是一種用二進(jìn)制表示指令和數(shù)據(jù),能被機(jī)器直接識別的計算機(jī)語言。它的缺點是不直觀,不易理解和記憶,因此編寫、閱讀和修改機(jī)器語言程序都比較繁瑣。但機(jī)器語言程序是計算機(jī)惟一能夠直接理解和執(zhí)行的程序,具有執(zhí)行速度快、占用內(nèi)存少等特點。

2.高級語言(HighLevelLanguage)

如果說機(jī)器語言是面向機(jī)器的,那么高級語言(如BASIC,F(xiàn)ORTRAN等)則是“面向過程”的語言。利用這些語言編程,程序員可以完全不考慮機(jī)器的結(jié)構(gòu)特點,不必了解和熟記機(jī)器的指令系統(tǒng),僅使用一些接近人們書寫習(xí)慣的英語和數(shù)學(xué)表達(dá)式形式的語句去編制程序。這樣編寫的程序與問題本身的數(shù)學(xué)模型之間有著良好的對應(yīng)關(guān)系,可在各種機(jī)器上通用(不同機(jī)器之間僅做少量修改)。但是,這種用高級語言編寫的源程序并不能在機(jī)器上直接執(zhí)行,需要被翻譯成對應(yīng)的目標(biāo)程序(即機(jī)器語言程序),機(jī)器才能運行。把具有這種翻譯作用的程序稱為解釋程序或編譯程序,見圖5.1。

由于高級語言程序是在未考慮機(jī)器的結(jié)構(gòu)特點的條件下編寫的,因而它就不能充分利用某種具體CPU所具有的某些特性,而通過編譯或解釋程序生成的目標(biāo)程序往往比較冗長,占有較多的內(nèi)存空間,執(zhí)行時間也比較長,這就限制了它在某些場合下的運用。例如,實時的數(shù)據(jù)采集、檢測和在線的實時控制等,往往要求程序的目標(biāo)代碼盡可能少占內(nèi)存并有盡可能快的執(zhí)行速度,在這些場合下,使用高級語言編寫的程序常常不能滿足要求。3.匯編語言(AssemblyLanguage)

匯編語言是一種采用助記符表示的程序設(shè)計語言,即用助記符來表示指令的操作碼和操作數(shù),用標(biāo)號或符號代表地址、常量或變量。助記符一般都是英文字的縮寫,以方便人們書寫、閱讀和檢查。實際上,用匯編語言編寫的匯編語言源程序就是機(jī)器語言程序的符號表示,匯編語言源程序與其經(jīng)過匯編所產(chǎn)生的目標(biāo)代碼程序之間有明顯的一一對應(yīng)關(guān)系,故也稱匯編語言為符號語言。

用匯編語言編寫程序能夠直接利用硬件系統(tǒng)的特性(如寄存器、標(biāo)志、中斷系統(tǒng)等)直接對位、字節(jié)、字寄存器或存儲單元、I/O端口進(jìn)行處理,同時也能直接使用CPU指令系統(tǒng)和指令系統(tǒng)提供的各種尋址方式,編制出高質(zhì)量的程序,這樣的程序不但占用內(nèi)存空間少,而且執(zhí)行速度快。當(dāng)然,由于源程序和所要解決的問題的數(shù)學(xué)模型之間的關(guān)系不夠直觀,使得匯編語言程序設(shè)計需要較多的軟件開發(fā)時間,也增加了程序設(shè)計過程中出錯的可能性。用匯編語言編寫的源程序也需要翻譯成目標(biāo)程序才能被機(jī)器執(zhí)行。這個翻譯過程稱為匯編,完成匯編任務(wù)的程序稱為匯編程序,見圖5.2。

圖5.2匯編程序的功能示意圖

匯編程序是最早也是最成熟的一種系統(tǒng)軟件。它除了能夠?qū)R編語言源程序翻譯成機(jī)器語言程序這一主要功能外,還能夠根據(jù)用戶的要求自動分配存儲區(qū)域(包括程序區(qū)、數(shù)據(jù)區(qū)、暫存區(qū)等);自動地把各種進(jìn)位制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù),把字符轉(zhuǎn)換成ASCII碼,計算表達(dá)式的值等;自動對源程序進(jìn)行檢查,給出錯誤信息(如非法格式,未定義的助記符、標(biāo)號,漏掉操作數(shù)等)等。具有這些功能的匯編程序又稱為基本匯編(或小匯編ASM)。在基本匯編的基礎(chǔ)上,進(jìn)一步允許在源程序中把一個指令序列定義為一條宏指令的匯編程序,就叫做宏匯編(MASM)。它包含全部ASM功能,還增加了宏指令、結(jié)構(gòu)、記錄等高級匯編語言功能。5.2

匯編,鏈接和運行程序5.3

模塊化的程序設(shè)計

(從功能分析——戰(zhàn)略上看);onefilewillcontainthemainmodule:

EXTRN SUBPROG1:FAR

EXTRN SUBPROG2:FAR

PUBLICVALUE1,VALUE2,SUM,PRODUCT ;declaredataheretobeshared

.MODELSMALL;

.STACK64;

.DATA VALUE1 DW 2050 VALUE2 DW 500 SUM DW 2DUP(?) PRODUCT DW 2DUP(?);

.CODEMAIN PROC FAR

MOV AX, @DATA MOV DS, AX

CALL SUBPROG1 ;callsubprog1toaddvalue1+value2

CALL SUBPROG2 ;callsubprog2tomulvalue1*value2 MOV AH, 4CH INT 21H MAIN ENDP

END MAIN ;thisprogramfindsthesumoftwoexternallydefinedwordsandstores;thesuminalocationdefinedbythecallingmodule

EXTRNVALUE1:WORD

EXTRNVALUE2:WORD

EXTRNSUM:WORD

PUBLICSUBPROG1

.MODELSMALL

.CODESUBPROG1 PROC FAR SUB BX,BX;initializecarrycount MOV AX,VALUE1 MOV DX,VALUE2 ADD AX,DX ADC BX,00 MOV SUM,AX MOV SUM+2,BX

RET

SUBPROG1 ENDP END;thisprogramfindstheproductoftwoexternallydefinedwordsandstorestheproductinalocationdefinedbythecallingmodule

EXTRN VALUE1:WORD

EXTRN VALUE2:WORD

EXTRN PRODUCT:WORD

PUBLICSUBPROG2

.MODELSMALL

.CODESUBPROG2 PROC FAR MOV AX,VALUE1 MOV CX,VALUE2 MUL AX,CX MOV PRODUCT,AX MOV PRODUCT+2,DX

RETSUBPROG2 ENDP

END注意:1.EXTRN在調(diào)用其他模塊的過程中,必須用偽指令EXTRN告訴匯編程序EXTRN后的過程或變量不在此模塊中。2.PUBLIC在說明變量或過程的模塊中,必須用偽指令PUBLIC告訴鏈接程序此變量或過程能被其他模塊所訪問。3.CALL4.RET5.C:>LINKPROGRAM1.OBJ+PROGRAM2.OBJ+…+PROGRAMn.OBJ5.3匯編語言程序設(shè)計的基本方法(戰(zhàn)術(shù)上看)

5.3.1程序設(shè)計步驟 1.問題的定義 2.算法及表示方法 3.選擇適當(dāng)?shù)闹噶?4.編寫程序

5.3.2結(jié)構(gòu)化程序設(shè)計

1.順序結(jié)構(gòu) 2.分支結(jié)構(gòu) 3.循環(huán)結(jié)構(gòu) 4.子程序設(shè)計5.4上機(jī)過程

1.編輯程序 2.匯編源程序 3.鏈接程序 4.調(diào)試源程序5.3.1程序設(shè)計步驟

1.問題的定義

仔細(xì)思考程序所要解決的問題,即用自然語言描述“做什么?以及程序做這些工作時的時序” 如:1.從傳感器讀取溫度值。

2.加上調(diào)整因子。

3.將結(jié)果存儲在存儲單元里。

2.算法及表示方法

用來表示程序設(shè)計問題的操作序列成為算法,即“怎樣做?”。表示方法:1)流程圖

2)偽指令3.選擇適當(dāng)?shù)闹噶睿ò垂δ埽?/p>

一、數(shù)據(jù)傳送類指令二、算術(shù)運算指令三、位操作指令四、串操作指令五、程序轉(zhuǎn)移指令六、處理機(jī)控制指令4.編寫程序(從算法到程序)4.編寫程序?qū)⑺惴ㄞD(zhuǎn)換成匯編語言(1)建立算法使用的數(shù)據(jù)結(jié)構(gòu)

1)數(shù)據(jù)將存放在存儲器還是存放在寄存器中

2)數(shù)據(jù)類型是字節(jié)、字或雙字?

3)有多少數(shù)據(jù)項?

4)數(shù)據(jù)為無符號數(shù)還是符號數(shù)?(2)在代碼段開始處寫出變量、段寄存器、外圍設(shè)備等所需要的初始化指令。 初始化表:數(shù)據(jù)段寄存器DS 堆棧段寄存器SS 附加段寄存器ES 堆棧段指針SP 8255A可編程并行端口 8259A優(yōu)先級中斷控制器 8254可編程計數(shù)器 8251可編程串行端口 初始化數(shù)據(jù)變量 設(shè)置中斷允許標(biāo)志(3)選擇實現(xiàn)算法中每一主要動作所需要的指令,并決定數(shù)據(jù)在這些指令中的存放形式。(4)按照主要指令的要求,用MOV指令或其他的指令把數(shù)據(jù)送到正確的位置。例題:1.定義問題:

已知某日的最高溫度和最低溫度,要求計算這一天的平均溫度。2.算法設(shè)計:最高溫度加最低溫度將和除以2得到平均溫度3.數(shù)據(jù)結(jié)構(gòu):

DATASEGMENTHI_TEMPDB92H;實際值可能是從傳感器讀取的數(shù)值

LO_TEMPDB52H AV_TEMPDB?

DATAENDS4.初始化表:

MOVAX,DATA MOVDS,AX5.選擇指令:選擇算法中每一主要動作所需的指令(按功能選擇指令),并決定數(shù)據(jù)在這些指令中的存放形式,最后則按照指令的要求,用MOV或其他的指令把數(shù)據(jù)傳送的正確的位置。

ADDdest,source;查指令表并閱讀細(xì)節(jié)

ADC

dest,source;dest=dest+source+CFDIV

source;DIV02immedmodenotallowed!!6.編寫程序:DATASEGMENTHI_TEMPDB92HLO_TEMPDB52HAV_TEMPDB?DATAENDSCODE SEGMENTMAIN PROC FAR

ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX MOV AL,HI_TEMP ADD AL,LO_TEMP MOV AH,00H ADC AH,00H MOV BL,02 DIV BL MOV AV_TEMP,AL

MOV 4CH INT 21HMAIN ENDPCODE ENDS

ENDMAIN5.3.2結(jié)構(gòu)化程序設(shè)計 1.順序結(jié)構(gòu)Readtemperaturefromsensor

Addcorrectionfactorof+7

Storecorrectedvalueinmemory例題:1.定義問題: 將ASCII碼‘47’轉(zhuǎn)換成壓縮BCD碼。2.算法設(shè)計: 轉(zhuǎn)換第一個ASCII碼到非壓縮BCD數(shù)。 轉(zhuǎn)換第二個ASCII碼到非壓縮BCD數(shù)。 將第一個BCD數(shù)的低半字節(jié)左移四位。 在一個字節(jié)中組合兩個BCD數(shù)。3.數(shù)據(jù)結(jié)構(gòu): DATA SEGMENT VAL_ASC DB‘47’ VAL_BCD DB? DATA ENDS4.初始化表:

MOVAX,DATA

MOVDS,AX5.選擇指令:1)用AND指令完成屏蔽操作。 AND dest,source ASCII4 00110100 屏蔽00001111 結(jié)果000001002)用循環(huán)位移指令左移四位。 ROL dest,CL3)用OR指令組裝字節(jié) OR dest,source OR AL,BL6.編寫程序:Key

ASCII

UnpackedBCD

PackedBCD434000001007370000011101000111(47H); ORG 0010HVAL_ASC DB ‘47’VAL_BCD DB ?; MOV AX, WORDPTRVAL_ASC AND AX, 0F0FH XCHG AH, AL MOV CL, 4 ROL AH, CL OR AL, AH MOV VAL_BCD, AL;2.分支結(jié)構(gòu)(IF-THEN-ELSE)問題定義:

有一臺控制印刷線路板制造機(jī)器的8086微機(jī)。其作用是檢查溫度傳感器,然后按照從傳感器讀到的溫度值打開綠燈或黃燈。如果溫度低于300C,則打開黃燈以告訴操作員溶液的溫度不夠。如果溫度高于或等于300C,則打開綠燈。算法設(shè)計:

輸入溫度值 IF溫度<300CTHEN 打開黃燈 ELSE 打開綠燈 讀傳感器3.數(shù)據(jù)結(jié)構(gòu):

AL(INAL,DX)4.初始化表:

MOV DX,0FFFEH;pointDXtoportcontrol MOV AL,99H;registerandloadcontrolword OUT DX,AL;toinitializeports5.選擇指令:

IN OUT CMP Jcc6.編寫程序:;PORTS:UseFFF8H-temperatureinput;FFFAH-lampcontroloutput(yellow=bit0,green=bit1) CODE SEGMENT

ASSUME CS:CODE;initialize8086portFFFAHasoutputport,FFF8Hasinput. MOV DX,0FFFEH;pointDXtoportcontrol MOV AL,99H;registerandloadcontrolword OUT DX,AL;toinitializeports MOV DX,0FFF8H IN AL,DX

CMP AL,30

JB YELLOW;iftemp<30thenlightyellow;lamp

JMP GREEN;elselightgreenlampYELLOW: MOV AL,01H;loadcodetolightyellowlamp MOV DX,0FFFAH;pointDXatoutputport OUT DX,AL;sendcodetolightyellowlamp JMP EXIT;gotonextmainlineinstructionGREEN: MOV AL,02H MOV DX,0FFFAH OUT DX,ALEXIT: MOV DX,0FFFCH;nextmainlineinstruction IN AL,DX ;readphsensorCODE ENDS END輸入溫度值IF溫度〉=300CTHEN打開綠燈ELSE打開黃燈讀傳感器

CMP AL,30

JAE GREEN

JMP YELLOWGREEN: MOV AL,02H MOV DX,0FFFAH OUT DX,AL JMP EXITYELLOW: MOV AL,01H MOV DX,0FFFAH OUT DX,ALEXIT: MOV DX,0FFFCH IN AL,DXCODE ENDS END2.多重IF-THEN-ELSE結(jié)構(gòu):IFconditionTHEN statement(s)1ELSE IFconditionTHEN statement(s)2 ELSEstatement(s)3問題定義:

有一臺控制印刷線路板制造機(jī)器的8086微機(jī)。其作用是檢查溫度傳感器,然后按照從傳感器讀到的溫度值打開綠燈、黃燈或紅燈。如果溫度低于300C,則打開黃燈以告訴操作員溶液的溫度不夠。如果溫度高于或等于300C但低于400C,則打開綠燈,否則,打開紅燈。算法設(shè)計:

輸入溫度值 IF溫度<300CTHEN 打開黃燈 ELSEIF溫度<400CTHEN 打開綠燈 ELSE打開紅燈 讀傳感器CODE SEGMENT

ASSUME CS:CODE MOV DX,0FFFEH MOV AL,99H OUT DX,AL MOV DX,0FFF8H IN AL,DX MOV DX,0FFFAH

CMP AL,30

JB YELLOW

CMP AL,40

JB GREENRED: MOV AL,04H OUT DX,AL JMP EXITYELLOW: MOVAL,01H OUT DX,AL JMP EXITGREEN: MOVAL,02H OUT DX,ALEXIT: MOVDX,0FFFCH IN AL,DXCODE ENDS END3.循環(huán)結(jié)構(gòu)

WHILE–DO--LOOPWHILEconditionDOstatement(s)WHILEnot24samplesDOReaddatasamplefromsensorAddcorrectionfactorof+7StoreresultinmemoryWait1hour.例1:定義問題

假設(shè)在一個化學(xué)處理控制過程中,只有當(dāng)溶液溫度上升到1000C后,才能繼續(xù)進(jìn)行下一步的處理。如果溶液溫度低于1000C,則需打開一個加熱器并等待溫度上升到1000C。如果溶液溫度等于或者高于1000C,則繼續(xù)進(jìn)行下一步的處理。由于打開加熱器前需要測設(shè)條件(溫度),因此WHILE-DO結(jié)構(gòu)適合于解決這樣的問題。當(dāng)然如果溶液的溫度因過度加熱而足夠高時,則不需要打開加熱器。2.算法設(shè)計(a)

輸入溫度值 WHILE溫度>=100 DO 關(guān)閉加熱器 打開加熱器3.數(shù)據(jù)結(jié)構(gòu)

AL(INAL,DX)4.初始化表

MOV DX,0FFFEH;initializeportFFFAHforoutput MOV AL,99H;andportFFF8Hforinput OUT DX,AL5.選擇指令

IN CMP Jcc OUT6.編寫程序;ports:usesFFF8Hfortemperaturedatainput;FFFAHforheatercontroloutput,0=off,1=onCODE SEGMENT

ASSUME CS:CODE MOV DX,0FFFEH;initializeportFFFAHforoutput MOV AL,99H;andportFFF8Hforinput OUT DX,ALTEMP_IN: MOV DX,0FFF8H;pointatinputport IN AL,DX;inputtemperauredata CMP AL,100;iftemp>=100then JAE HEATER_OFF;turnheateroff MOV AL,01H;elseloadcodeforheateron MOV DX,0FFFAH ;pointDXtooutputport OUTDX,AL;turnheateron JMPTEMP_IN;WHILEtemp<100read;tempagainHEATER_OFF:MOVAL,00H;loadcodeforheateroff MOVDX,0FFFAH;pointDXtooutputport OUTDX,AL;turnheateroffCODE ENDS END (a)加熱器控制程序清單算法設(shè)計(b)

輸入溫度值 WHILE溫度<100

DO 打開加熱器 關(guān)閉加熱器TEMP_IN: MOV DX,0FFF8H IN AL,DX CMP AL,100 JB HEATER_ON JMP HEATER_OFFHEATER_ON: MOV AL,01H MOV DX,0FFFAH OUT DX,AL JMP TEMP_INHEATER_OFF: MOVAL,00H MOV DX,0FFFAH OUT DX,ALCODE ENDS END3.循環(huán)結(jié)構(gòu): REPEAT—UNTIL

REPEAT 動作 UNTIL某些條件實現(xiàn)REPEAT

Getdatasamplefromsensor

Addcorrectionof+7

Storeresultinamemorylocation

Wait1hourUNTIL24samplestaken例1:1)問題定義:

許多與微機(jī)接口的系統(tǒng)的工作是首先在并行信號線上輸出數(shù)據(jù),然后再輸出以單獨信號用以指示有效數(shù)據(jù)在并行線上。這個數(shù)據(jù)準(zhǔn)備信號通常被稱為選通。一個ASCⅡ編碼計算機(jī)鍵盤就是一種選通數(shù)據(jù)系統(tǒng)的例子。下圖說明了這種鍵盤的并行數(shù)據(jù)線和選通線是怎樣與微機(jī)端口連接的。當(dāng)在鍵盤上敲入某個鍵時,鍵盤中的電路將檢測敲入的鍵,然后將該鍵的ASCⅡ碼發(fā)送到連接端口FFF8H的8位數(shù)據(jù)線上。當(dāng)經(jīng)過一段時間數(shù)據(jù)已駐留在這些數(shù)據(jù)線上后,鍵盤中的電路發(fā)出一個壓鍵選通信號,以指示8位數(shù)據(jù)線上的數(shù)據(jù)已經(jīng)有效。選通信號可以是有效高信號或有效低信號。對于本例假設(shè)一個有效ASCⅡ碼已在并行數(shù)據(jù)線上時,選通信號趨向于高。2)算法設(shè)計REPEAT讀鍵盤選通信號UNTIL選通信號=1從鍵盤讀ASCII碼3)數(shù)據(jù)結(jié)構(gòu)

AL(INAL,DX)4)初始化表

MOVDX,0FFFAH

;pointDXatstrobeport5)選擇指令

IN Jcc IN6)編寫程序;usesFFFAH-StrobesignalinputonLSB;FFF8H-ASCIIdatainputportCODE SEGMENT

ASSUME CS:CODE MOVDX,0FFFAH;pointDXatstrobeportLOOK:IN AL,DX;readkeyboardstrobe ANDAL,01;maskextrabitsandsetflags JZ LOOK;ifstrobeislowthenkeeplooking MOVDX,0FFF8H;elsepointDXatdataport IN AL,DX;readinASCIIcodeCODE ENDS END例2:1)問題定義

要求把通貨膨脹因子03H加入到具有8個元素價格數(shù)組的每個價格中,而其中每一個價格是以壓縮式BCD(每個字節(jié)中有兩個BCD數(shù))形式存放在一個字節(jié)存儲單元中,價格的范圍在1到99分之間。2)算法設(shè)計:REPEAT

從數(shù)組中得到一價格 加入通貨膨脹因子 結(jié)果調(diào)整為正確的BCD數(shù) 將結(jié)果放回數(shù)組中UNTIL

所有價格均已處理ARRAYS SEGMENT COST DB20H,28H,15H,26H,19H,27H,16H,29H PRICEDB36H,55H,27H,42H,38H,41H,29H,39HARRAYS ENDS4)初始化表

MOV AX,ARRAYS MOV DS,AX3)數(shù)據(jù)結(jié)構(gòu)5)選擇指令:

MOV ADD DAA Jcc6)編寫程序:ARRAYS SEGMENT COSTDB20H,28H,15H,26H,19H,27H,16H,29H PRICEDB36H,55H,27H,42H,38H,41H,29H,39HARRAYS ENDSCODE SEGMENT

ASSUMECS:CODE,DS:ARRAYSSTART: MOV AX,ARRAYS MOV DS,AX LEA BX,PRICES MOV CX,0008HDO_NEXT: MOV AL,[BX] ADD AL,03H DAA MOV [BX],AL INC BX DEC CX JNZ DO_NEXTCODE ENDS ENDSTART4.子程序設(shè)計:(1)模塊化的程序設(shè)計;onefilewillcontainthemainmodule:

EXTRN SUBPROG1:FAR

EXTRN SUBPROG2:FAR

PUBLICVALUE1,VALUE2,SUM,PRODUCT ;declaredataheretobeshared

.MODELSMALL;

.STACK64;

.DATA VALUE1 DW 2050 VALUE2 DW 500 SUM DW 2DUP(?) PRODUCT DW 2DUP(?);

.CODE MAIN PROC FAR MOV AX,@DATA MOV DS,AX

CALL SUBPROG1 ;callsubprog1toaddvalue1+value2

CALL SUBPROG2 ;callsubprog2tomulvalue1*value2 MOV AH,4CH INT 21H MAIN ENDP

END MAIN ;thisprogramfindsthesumoftwoexternallydefinedwordsandstores;thesuminalocationdefinedbythecallingmodule

EXTRNVALUE1:WORD

EXTRNVALUE2:WORD

EXTRNSUM:WORD

PUBLICSUBPROG1

.MODELSMALL

.CODESUBPROG1 PROC FAR SUB BX,BX;initializecarrycount MOV AX,VALUE1 MOV DX,VALUE2 ADD AX,DX ADC BX,00 MOV SUM,AX MOV SUM+2,BX

RET

SUBPROG1 ENDP END;thisprogramfindstheproductoftwoexternallydefinedwordsand;storestheproductinalocationdefinedbythecallingmodule

EXTRNVALUE1:WORD

EXTRNVALUE2:WORD

EXTRNPRODUCT:WORD

PUBLICSUBPROG2

.MODELSMALL

.CODESUBPROG2 PROC FAR MOV AX,VALUE1 MOV CX,VALUE2 MUL AX,CX MOV PRODUCT,AX MOV PRODUCT+2,DX

RETSUBPROG2 ENDP

END(2)調(diào)用過程近過程的調(diào)用1)運行機(jī)制2)數(shù)據(jù)保存例題:1.問題定義:

假設(shè)從一壓力傳感器讀取100個數(shù)據(jù)字的程序,要求每隔1ms從傳感器讀取一個數(shù)據(jù)字,然后屏蔽每個字的高4位并把結(jié)果放在一個數(shù)組中。2.算法設(shè)計:

初始化 REPEAT 從端口(傳感器)讀入數(shù)據(jù) 屏蔽高半字節(jié) 存入數(shù)組中 等待1ms過程 UNTIL讀入100個字節(jié)算法設(shè)計:

《采樣數(shù)據(jù)程序〉

初始化數(shù)據(jù)段寄存器,DS 初始化堆棧段寄存器,SS 初始化指向數(shù)組的指針,SI 初始化計數(shù)器,BX REPEAT 等待1ms過程 讀端口 初始化計數(shù)器CX 屏蔽高半字節(jié) REPEAT 存入數(shù)組中 減量CX

等待1ms過程 UNTILCX=0 增量指針,SI 減量計數(shù)器,BX UNTILBX=03.選擇指令:

IN AND CALL INC DEC Jcc4.數(shù)據(jù)結(jié)構(gòu): AL DW 100DUP(?)5.初始化表:

初始化數(shù)據(jù)段寄存器,DS 初始化堆棧段寄存器,SS 初始化指向數(shù)組的指針,SI 初始化計數(shù)器,BX 初始化計數(shù)器,CX6.編寫程序PRESSURE_PORTEQU0FFF8HDATA SEGMENT PRESSURE DW100DUP(?) SAMPLE EQU(($-PRESSURE)/2)DATA ENDSSTACK SEGMENT

DW40DUP(0)STACK ENDSCODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX LEA SI,PRESSURE MOV BX,SAMPLE MOV DX,PRESSURE_PORTNEXT_VAL: IN AX,DX AND AX,0FFFH MOV [SI],AX CALL WAIT_1MS INC SI INC SI DEC BX JNZ NEXT_VALSTOP: NOPWAIT_1MS PROC NEAR ;時鐘周期數(shù)(5MHZ): MOV CX,295 ;4=C0HERE: LOOP HERE ;17or5

RET ;CT=C0+17N-12WAIT_1MS ENDP ;N=(CT-C0+12)/17CODE ENDS ;N=(5000-4+12)/17

ENDSTART ;=295

以1ms時間間隔讀取100個采樣數(shù)據(jù)的匯編語言程序2)數(shù)據(jù)保存 MULTO PROCNEAR PUSHF PUSHAX PUSHBX PUSHCX .. POP CX POP BX POP AX POPF RET MULTO ENDP(3)調(diào)用過程的參數(shù)傳遞

當(dāng)調(diào)用一過程時,經(jīng)常需要把一些數(shù)據(jù)值或地址傳遞到過程中,另外過程也經(jīng)常需要把一些數(shù)據(jù)值或地址傳回到主程序。這些在主程序和過程之間來回傳遞的數(shù)據(jù)值或地址通常被稱為參數(shù)(parameters)。 傳遞參數(shù)的四種主要途徑是: 1在寄存器中 2在用名字存取的存儲器中 3用指針 4用堆棧用寄存器傳遞參數(shù)實例:問題定義:

要求將壓縮的BCD數(shù)17轉(zhuǎn)換成等價的二進(jìn)制數(shù)。算法設(shè)計: 將BCD數(shù)17分裂成兩個半字節(jié) 保存低半字節(jié)(不需乘1) 用0AH乘高半字節(jié) 將結(jié)果和低半字節(jié)相加例如:4596=4*1000+5*100+9*10+6*1 1000=03E8H 4000=4*03E8H=0FA0H 100=0064H 500=5*0064H=01F4H 10=000AH 90=9*000AH=005AH 1=0001H 6=1*0001H=0006H 4596 11F4HDATA SEGMENT BCD_IN DB17H BIN_VAL DB?DATA ENDSSTACK SEGMENT

DW 100DUP(0)STACK ENDSCODE SEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AL,BCD_IN CALL BCD_BIN MOV BIN_VAL,AL NOP

BCD_BIN PROCNEAR PUSHF PUSH BX PUSH CX MOV BL,AL AND BL,0FH AND AL,0F0H MOV CL,04 ROR AL,CL MOV BH,0AH MUL BH ADD AL,BL POP CX POP BX POPF

RETBCD_BIN ENDPCODE ENDS

ENDSTART

(a)用寄存器傳遞參數(shù)實例2.用一般存儲單元傳遞參數(shù)DATA SEGMENT BCD_IN DB17H BIN_VAL DB?DATA ENDSSTACK SEGMENT

DW 100DUP(0)STACK ENDSCODE SEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX CALL BCD_BIN NOP NOPBCD_BIN PROCNEAR PUSHF PUSH AX PUSH BX PUSH CX MOV AL,BCD_IN MOV BL,AL AND BL,0FH AND AL,0F0H

MOV CL,04 ROR AL,CL MOV BH,0AH MUL BH ADD AL,BL MOV BIN_VALUE,AL POP CX POP BX POP AX POPF

RETBCD_BIN ENDP CODE ENDS

ENDSTART

(b)用有名存儲單元傳遞參數(shù)的實例3.用指針傳遞參數(shù)

指針方法可以傳遞指向數(shù)據(jù)存放在任何存儲單元的過程指針,也能傳遞指向零散值或指向數(shù)組或串的指針,因而這種方法具有更大的靈活性。DATA SEGMENT BCD_IN DB17H BIN_VAL DB?DATA ENDSSTACK SEGMENT

DW 100DUP(0)STACK ENDSCODE SEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SI,OFFSET BCD_IN MOV DI,OFFSET BIN_VAL

CALL

BCD_BIN NOPBCD_BIN

PROC

NEAR PUSHF PUSH AX PUSH BX PUSH CX MOV AL,[SI] MOV BL,AL AND BL,0FH

AND AL,0F0H MOV CL,04 ROR AL,CL MOV BH,0AH MUL BH ADD AL,BL MOV [DI],AL POP CX POP BX POP AX POPF

RETBCD_BIN ENDP (c)用指向有名存儲單元CODE ENDS 的指針傳遞參數(shù)實例

ENDSTARTC語言程序:/*headcount=5*/#include<stdio>/*&headcount=404*//*present=404*/Voidmain()/**present=5*/{/*&present=406*/ int headcount=5; int *present=&headcount; printf(“headcount=%d\n&headcount=%d\npresent=%d\n *present=%d\n&present=%d\n”,headcount, &headcount,present,*present,&present);} DATA SEGMENT headcount DW 5 present DW OFFSETheadcount DATA SEGMENT CODE SEGMENT ASSUMECS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV BX, present MOV AX, [BX] … CODE ENDS END START 4.用棧傳遞參數(shù)

為了用棧傳遞參數(shù)到一過程,在主程序中的過程調(diào)用之前,應(yīng)把這些參數(shù)壓進(jìn)棧的某個地方,然后過程中的指令按需從棧中讀取參數(shù)。同理,過程也把傳回調(diào)用程序的參數(shù)寫入棧中,然后主程序中的指令把這些參數(shù)讀出。DATA SEGMENT BCD_IN DB17H BIN_VAL DB?DATA ENDSSTACK SEGMENT DW 100DUP(0)STACK ENDSCODE SEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX

MOV AX,STACK

MOV SS,AX MOV AL,BCD_IN

PUSH AX CALL BCD_BIN

POP AX

MOV BIN_VAL,AL NOPBCD_BIN PROCNEAR PUSHF PUSH AX PUSH BX PUSH CX PUSH BP

MOV BP,SP MOV AX,[BP+12]

MOV BL,AL AND BL,0FH AND AL,0F0H MOV CL,04 ROR AL,CL MOV BH,0AH MUL BH ADD AL,BL

MOV [BP+12],AL ;BP缺省段為SS POP BP POP CX POP BX POP AX POPF

RETBCD_BIN ENDP CODE ENDS

ENDSTART (d)用棧傳遞參數(shù)實例#include<stdio.h>int tempc,tempfint c2f(intc);void get_temp(int*ptr); void main(){ get_temp(&tempc); tempf=c2f(tempc); printf(“ThetemperatureinCelsiusis%d\n”,temp); printf(“ThetemperatureinFahrenheitis%d\n”,temp);}int c2f(intc){ int f; f=9*c/5+32; return(f);}Voidget_temp(int*ptr){ printf(“PleaseentertheCelsiustemperature./n”); scanf(“%d”,ptr);}

程序舉例:說明、調(diào)用和定義C函數(shù)模板參數(shù)傳遞小結(jié):

在調(diào)用程序和過程之間可以用(1)寄存器、(2)指定存儲單元(用名字或指針存?。┗蛘撸?)棧傳遞參數(shù)。選擇哪種方法很大程度上依賴于特定程序,沒有標(biāo)準(zhǔn)規(guī)則,不過有幾條建議。對于少量參數(shù)傳遞的簡單程序,使用寄存器通常是最容易的方法,對于向/從過程傳遞數(shù)組或其他數(shù)據(jù)結(jié)構(gòu),則用寄存器傳遞指向這些數(shù)據(jù)結(jié)構(gòu)開始地址的指針,如前面已解釋過的,傳遞指針到過程比過程用名字直接存取數(shù)據(jù)結(jié)構(gòu)要靈活的多。 對于多用戶程序中的過程,從高級語言中調(diào)用的過程或過程調(diào)用自身,應(yīng)該在棧中傳遞參數(shù)。當(dāng)編寫在棧中傳遞參數(shù)的程序中,應(yīng)該借助如上圖所示中的棧狀態(tài)圖幫助你記錄當(dāng)前棧中任何內(nèi)容的位置。5.5常用系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用

微型計算機(jī)系統(tǒng)(IBMPC及兼容機(jī))為匯編用戶提供了兩個程序接口,一個是DOS系統(tǒng)功能調(diào)用,另一個是ROM中的BIOS(BasicInput/OutputSystem)。系統(tǒng)功能調(diào)用和BIOS由一系列的中斷服務(wù)子程序構(gòu)成,但調(diào)用與返回不是使用子程序調(diào)用指令CALL和返回指令RET,而是通過軟中斷指令I(lǐng)NTn和中斷返回指令I(lǐng)RET調(diào)用和返回的。DOS系統(tǒng)功能調(diào)用和BIOS的服務(wù)子程序,使得程序設(shè)計人員不必涉及硬件就可以使用系統(tǒng)的硬件,尤其是I/O的使用與管理。DifferencebetweenINTandCALLinstructionsA“CALLFAR”instructioncanjumptoanylocationwithinthe1megabyteaddressrangeofthe8086/8088CPU,but“INTnn”goestoafixedmemorylocationintheinterruptvectortabletogettheaddressoftheinterruptserviceroutine.A“CALLFAR”instructionisusedbyprogrammerinthesequenceofinstructionsintheprogrambutanexternallyactivatedhardwareinterruptcancomeinatanytime,requestingtheattentionoftheCPU.A“CALLFAR”instructioncannotbemasked(disabled),but“INTnn”belongingtoexternallyactivatedhardwareinterruptscanbemasked.A“CALLFAR”instructionautomaticallysavesonlyCS:IPofthenextinstructiononthestack,while“INTnn”savesFR(flagregister)inadditiontoCS:IPofthenextinstruction.Attheendofthesubroutinethathasbeencalledbythe“CALLFAR”instruction,theRET(returnFAR)isthelastinstruction,whereasthelastinstructionintheinterruptserviceroutine(ISR)for“INTnn”istheinstructionIRET(interruptreturn).ThedifferenceisthatRETpopsCS,IPoffthestackbuttheIRETpopsofftheFR(flagregister)inadditiontoCSandIP.1.系統(tǒng)功能調(diào)用(MicrosoftDOS)

系統(tǒng)功能調(diào)用是微機(jī)的磁盤操作系統(tǒng)DOS為用戶提供的一組例行子程序,因而又稱為DOS系統(tǒng)功能調(diào)用。這些子程序可分為以下四個主要方面:(1)磁盤的讀/寫及控制管理。(2)內(nèi)存管理。(3)基本輸入/輸出管理(如鍵盤、打印機(jī)、顯示器 等)。(4)其他管理(如時間、日期等)。

為了使用方便,系統(tǒng)已將所有子程序按順序編號,稱為調(diào)用號。其調(diào)用號為0~75H,如表5.4所示。表中只列出了基本輸入/輸出管理中部分鍵盤和顯示器DOS功能調(diào)用。對于所有的功能調(diào)用,使用時一般需要經(jīng)過以下三個步驟:(1)子程序的入口參數(shù)送相應(yīng)的寄存器。(2)子程序編號送AH。(3)發(fā)出中斷請求:INT21H(系統(tǒng)功能調(diào)用指令).表5.4鍵盤和顯示器的DOS調(diào)用調(diào)用號功能入口參數(shù)出口參數(shù)1鍵入并顯示一個字符

鍵入字符的ASCII碼在AL中2顯示器顯示一個字符DL中置輸出字符的ASCII碼

5打印機(jī)打印一個字符DL中置輸出字符的ASCII碼

8鍵盤輸入一個字符

鍵入字符的ASCII碼在AL中9顯示器顯示一個字符串DS:DX置字符串首址,字符串以'$'結(jié)束

10(0AH)鍵入并顯示字符串DS:DX置字符串首址,第1單元置允許鍵入的字符數(shù)(含一個回車符)鍵入的實際字符數(shù)在第2單元中,鍵入的字符從第3單元開始存放11(0BH)檢測有無鍵入

有鍵入AL=FFH,無鍵入AL=0例如,顯示一個字符串'Goodmorning!'的程序如下:;

MSG DB'Goodmorning!$'; MOV DX,OFFSETMSG;字符串首字符的偏移地址送DX MOV AH,9 ;功能號9送AH INT 21H ;系統(tǒng)功能調(diào)用;有的子程序不需要入口參數(shù),這時步驟(1)可以略去。例如:MOV AH,4CH;功能號4CH送AH(返回DOS子程序) INT 21H1)01號功能調(diào)用

調(diào)用格式: MOV AH,01 INT 21H系統(tǒng)執(zhí)行該功能時將掃描鍵盤,等待鍵入。一旦有鍵按下,就將鍵值(相應(yīng)字符的ASCII碼值)讀入,先檢查是否是Ctrl–Break。若是,則退出命令執(zhí)行;否則將鍵值送入AL寄存器,同時將這個字符顯示在屏幕上。2)02號功能調(diào)用

調(diào)用格式: MOV DL,待顯示字符的ASCII碼 MOV AH,02 INT 21H本調(diào)用執(zhí)行后,顯示器顯示其ASCII碼值放入DL中的字符。3)09號功能調(diào)用調(diào)用格式: MOV DX,待顯示字符串首字符的偏移地址 MOV AH,09 INT 21H

本調(diào)用執(zhí)行后,顯示器顯示待顯示的字符串。調(diào)用時,要求DS:DX必須指向內(nèi)存中一個以“$”作為結(jié)束標(biāo)志的字符串。例如:

例1: DATA SEGMENT BUF DB'HOWDOYOUDO?$' DATA ENDS CODE SEGMENT

MOV AX,DATA MOV DS,AX

MOV DX,OFFSETBUF MOV AH,09 INT 21H

CODE ENDS例2:

.MODELSMALL

.STACK64;

.DATA MESSAGEDB'Thisisatestofthedisplayroutine','$';

.CODEMAIN PROC

FAR MOVAX,@DATA MOVDS,AX

CALLCLEAR;CLEARTHESCREEN

CALLCURSOR;SETCURSORPOSITION

CALLDISPLAY;DISPLAYMESSAGE MOVAH,4CH INT 21H;GOBACKTODOSMAIN ENDP;THISSUBROUTINECLEARSTHESCREENCLEAR PROC MOV AX,0600H;SCROLLSCREENFUNCTION MOV BH,07;NORMALATTRIBUTE MOV CX,0000;SCROLLFROMROW=00,COL=00 MOV DX,184FH;TOROW=18H,COL=4FH INT10H;INVOKEINTERRUPTTOCLEARSCREEN RETCLEAR ENDP;;THISSUBROUTINESETSTHECURSORATTHE;CENTEROFTHESCREENCURSORPROCMOVAH,02;SETCURSORFUNCTIONMOVBH,00;PAGE00MOVDH,12;CENTERROWMOVDL,39;CENTERCOLUMNINT10H;INVOKEINTERRUPTTO;SETCURSORPOSITIONRETCURSORENDP;;THISSUBROUTINEDISPLAYSASTRINGONTHE;SCREENDISPLAYPROC MOVAH,09;DISPLAYFUNCTION MOVDX,OFFSETMESSAGE;DXPOINTSTOOUTPUTBUFFER INT21H;INVOKEINTERRUPT;TODISPLAYSTRING RETDISPLAY ENDP

ENDMAIN4)10(0AH)號功能調(diào)用

調(diào)用格式:MOV DX,數(shù)據(jù)區(qū)的首偏移地址MOV AH,10INT 21H

該功能調(diào)用將從鍵盤接收的字符串送到內(nèi)存數(shù)據(jù)區(qū)。要求事先定義一個數(shù)據(jù)區(qū),數(shù)據(jù)區(qū)內(nèi)第一個字節(jié)指出數(shù)據(jù)區(qū)能容納的字符個數(shù),不能為零;第二個字節(jié)保留,DOS用做填寫實際輸入的字符個數(shù);從第三個字節(jié)開始存放從鍵盤上接收的字符串。實際輸入的字符數(shù)少于定義的字節(jié)數(shù),數(shù)據(jù)區(qū)內(nèi)其余字節(jié)填零;若多于定義的字節(jié)數(shù),則后來輸入的字符丟掉,且響鈴。調(diào)用時,要求DS:DX指向數(shù)據(jù)區(qū)首地址。例如:

例1:

ORG 0010HDATA1 DB 6,?,6DUP(FF);0010H=06,0012Hto;0017H=FF MOV AH,0AH;stringinputoptionofINT21H MOV DX,OFFSET DATA1;loadtheoffset;addressofbuffer INT 21H;invokeinterrupt21H001000110012001300140015001600170600FFFFFFFFFFFF

05CHINACR例2: DATA SEGMENT BUF DB50 ;數(shù)據(jù)區(qū)長度

DB?;DOS填入實際輸入的字符個數(shù)

DB50DUP(?);定義50個字節(jié)存儲空間 DATA ENDS CODE SEGMENT

MOV DX,OFFSETBUF MOV AH,10 INT 21H

CODE ENDS

2.常用系統(tǒng)功能調(diào)用應(yīng)用舉例例5.5利用DOS系統(tǒng)功能調(diào)用實現(xiàn)人機(jī)對話。下述程序可以在屏幕上顯示一行提示信息,然后接收用戶從鍵盤輸入的信息并將其存入內(nèi)存數(shù)據(jù)區(qū)。

DATA SEGMENTPARS DB100;定義輸入緩沖區(qū)

DB?

DB100DUP(?)MESG DB'WHATISYOURNAME?' ;要顯示的提示信息

DB‘$’;提示信息結(jié)束標(biāo)志 DATA ENDSDISP: MOV DX,OFFSETMESG MOV AH,09;利用9號功能調(diào)用顯示提示 INT 21HKEYBD: MOV DX,OFFSETPARS MOV AH,10;利用10號功能調(diào)用接收鍵盤輸入 INT 21H RETSTART ENDPCODE ENDS ENDBEGIN例5.6編寫匯編語言源程序,將鍵入的4位十進(jìn)制數(shù)(如5,則鍵入0005)以壓縮BCD數(shù)形式存入字變量SW中。該程序首先接收鍵入的4位十進(jìn)制數(shù),然后拼合為壓縮BCD數(shù),存入字變量SW。為了接收鍵入的4位十進(jìn)制數(shù),需要在數(shù)據(jù)段中定義一變量數(shù)據(jù)區(qū)。該數(shù)據(jù)區(qū)應(yīng)有7個字節(jié),其中第1字節(jié)定義為5,即可接收5個字符,第2字節(jié)預(yù)留給10號功能調(diào)用裝載實際鍵入的字符數(shù),第3字節(jié)到第7字節(jié)預(yù)留給10號功能調(diào)用裝載實際鍵入的字符,即4字節(jié)十進(jìn)制數(shù)的ASCII碼和1字節(jié)回車的ASCII碼。程序如下:

DATA SEGMENT

BUF DB5,0,5DUP(?) SW DW?DATA ENDSCODE SEGMENTBEGIN PROCFAR

ASSUMECS:CODE,DS:DATASTART: PUSH DS SUB AX,AX PUSHAX MOV AX,DATA MOV DS,AX

MOVDX,OFFSETBUF;10號功能調(diào)用,;鍵入4位十進(jìn)制數(shù) MOV AH,10 INT 21H MOV AX,WORD

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論