微機(jī)原理與接口技術(shù)4章_第1頁
微機(jī)原理與接口技術(shù)4章_第2頁
微機(jī)原理與接口技術(shù)4章_第3頁
微機(jī)原理與接口技術(shù)4章_第4頁
微機(jī)原理與接口技術(shù)4章_第5頁
已閱讀5頁,還剩95頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

題詩寄汝非無意,莫負(fù)青春取自慚。

——于謙

第四章匯編語言程序設(shè)計(jì)

主要內(nèi)容匯編語言程序的結(jié)構(gòu)匯編語言語句類型和組成匯編語言程序設(shè)計(jì)4.1機(jī)器指令/匯編語言/高級語言1.機(jī)器指令:計(jì)算機(jī)能識別的代碼,機(jī)器指令是由二進(jìn)制數(shù)組成的。例如:

PUSHAX

機(jī)器指令為: 010100002.匯編語言:匯編語言是一種符號語言,用助記符表示操作碼,用符號或符號地址表示操作數(shù)或操作數(shù)地址,它與機(jī)器指令是一一對應(yīng)的。3.高級語言:面向過程(如C,FORTRAN)或?qū)ο?如C++,Java)的語言,不依賴于機(jī)器,因而有很好的通用性和可移植性.

匯編語言與高級語言的比較特征匯編語言高級語言目標(biāo)程序運(yùn)行時間短長程序運(yùn)行時占用的存儲空間小大直接訪問硬件的能力強(qiáng)弱程序可讀性和可維護(hù)性差強(qiáng)程序開發(fā)的復(fù)雜程序高低程序的可移植性差強(qiáng)對硬件環(huán)境和軟件的兼容性差強(qiáng)4.1機(jī)器指令/匯編語言/高級語言

文件名.ASM文件名.OBJ文件名.EXE匯編語言程序的開發(fā)過程匯編語言源程序

匯編目標(biāo)程序連接執(zhí)行/調(diào)試程序編輯程序EDIT.EXE匯編程序MASM.EXE連接程序LINK.EXEML文件名.ASM

4.2匯編語言源程序的結(jié)構(gòu)二、段定義語句與段尋址 一個完整的匯編源程序由3個段組成,堆棧段、數(shù)據(jù)段、代碼段。

段定義偽指令一般格式為:

段名SEGMENT[定位類型][組合類型][類別] …

段名ENDS 4.2匯編語言源程序的結(jié)構(gòu)段尋址ASSEMU語句提供。

格式:ASSUME段寄存器:段名[,段寄存器:段名,……]

由于ASSUME偽指令只指明某一個段名對應(yīng)于哪一個段寄存器,并沒有包含將段地址送入該寄存器的操作。因此要將真實(shí)段地址裝入段寄存器還需用匯編指令來實(shí)現(xiàn)。例如,

CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK

MOVAX,DATA;DATA段值送AX

MOVDS,AX;AX內(nèi)容送DS,DS才有實(shí)際段值

CODEENDS

4.2匯編語言源程序的結(jié)構(gòu)三、過程定義的偽指令PROC和ENDP

在程序設(shè)計(jì)中,可將具有一定功能的程序段看成為一個過程(相當(dāng)于一個子程序),它可以被別的程序調(diào)用。一個過程由偽指令PROC和ENDP來定義,其格式為:

過程名PROC[類型]

過程體

RET

過程名ENDP 4.2匯編語言源程序的結(jié)構(gòu)四、ORG偽指令

ORG偽指令規(guī)定了在某一段內(nèi),程序或數(shù)據(jù)代碼存放的起始偏移地址。

一般格式:ORG<表達(dá)式>

例如:DATASEGMENT ORG 2000H BUFFDB‘STRING’ DATAENDS

上述變量定義中,BUFF從DATA段偏移為2000H的單元開始存放。 4.2匯編語言源程序的結(jié)構(gòu)五、匯編程序結(jié)束偽指令END

該偽指令表示源程序的結(jié)束.令匯編程序停止匯編。因此,任何一個完整的源程序均應(yīng)有END指令。

一般格式:END[表達(dá)式]

其中表達(dá)式表示該匯編程序的啟動地址。例如:

ENDSTART;表明該程序的啟動地址為START。 4.2匯編語言源程序的結(jié)構(gòu);titleHelloWorldProgram(hello.asm)stackssegmentstack'stack' dw100hdup(?)stacksendsdatasegment;Containsallvariablesfortheprogrammsg db 'HelloWorld!',0Ah,0Dh,'$'dataends 4.2匯編語言源程序的結(jié)構(gòu)codesegment ;Containsallcodeassumecs:code,ds:data,ss:stacksorg100hmain proc mov ax,data mov ds,ax mov ax,0900h mov dx,offsetmsg int 21h mov ax,4C00h ;terminatetheprogramnormally int 21hmain endpcodeendsend main 4.3數(shù)據(jù)定義

3.3.1常量、變量和標(biāo)號(1)常量 二進(jìn)制:10111001B

十進(jìn)制:1234D或1234

八進(jìn)制:255Q或255O

十六進(jìn)制:3A5DH,第一位為字母時前面加數(shù)字0

字符串常數(shù):用單引號括起來的一個或多個字符組成一個 字符串常數(shù),例如:‘The’在內(nèi)存中以字符的 ASCII碼值存放,注意一個空格也是一個字符。 如‘The’,在內(nèi)存中是: 54H、68H、65H和20H。 4.3.1常量、變量和標(biāo)號(2)變量:

代表存放在某些存儲單元的數(shù)據(jù)。這些數(shù)據(jù)在程序運(yùn)行期間隨時可以修改。變量有三個屬性:段屬性、偏移屬性和類型屬性(所具有的字節(jié)數(shù))。(3)標(biāo)號標(biāo)號是一條指令的目標(biāo)代碼的符號地址,它常用作轉(zhuǎn)移指令(或子程序調(diào)用指令)的操作數(shù)。標(biāo)號有三個屬性:段屬性、偏移屬性和類型屬性。段屬性是該標(biāo)號的段地址,偏移屬性是該標(biāo)號的偏移地址,類型屬性是表示該標(biāo)號的范圍是本段(NEAR)或段間(FAR),或稱為近或遠(yuǎn)屬性。 4.3.2數(shù)據(jù)定義偽指令格式1:[變量名]偽指令名表達(dá)式1,表達(dá)式2,‥‥

這里偽指令可為DB,DW,DD,表達(dá)式有以下幾種情況:①數(shù)值表達(dá)式例:DA_BYTEDB50H,50,0caHDA_WORDDW0a3f1H,498dH A1 DD12345H;Memory:45H,23H,01H,00H 4.3.2數(shù)據(jù)定義偽指令格式1:[變量名]偽指令名表達(dá)式1,表達(dá)式2,‥‥

這里偽指令可為DB,DW,DD,表達(dá)式有以下幾種情況:②?表達(dá)式,不帶引號的?表示可預(yù)置任何內(nèi)容例:DA_BDB?,?;要求分配兩個字節(jié)單元

DA_WDW?,?;要求分配兩個字單元 4.3.2數(shù)據(jù)定義偽指令格式1:[變量名]偽指令名表達(dá)式1,表達(dá)式2,‥‥

這里偽指令可為DB,DW,DD,表達(dá)式有以下幾種情況:③字符串表達(dá)式數(shù)據(jù)項(xiàng)可以寫成字符串形式,但只能用DB、DW、DD定 義,而且DW、DD語句定義的串只允許包含兩個字符。

例:S1 DB‘ABCDEF’S2 DW‘AB’,‘CD’,‘EF’S3 DD‘AB’,‘CD’

這幾個變量在存儲器中存放情況如下:

S141HS242HS342H42H41H41H43H44H00H44H43H00H45H46H44H46H45H43H00H00H

注意:定義多于兩個以上字符的字符串時,只能使 用DB偽指令,不能使用DW和DD等偽指令。 4.3.2數(shù)據(jù)定義偽指令格式2:[變量名]偽指令名表達(dá)式1DUP(表達(dá)式2)用于定義重復(fù)的數(shù)據(jù)或分配一數(shù)據(jù)塊空間. 例:D_B1

DB20HDUP(?);保留20H個字節(jié)

D_B2DB10HDUP(‘ABCD’);字符串‘ABCD’

重復(fù)10H次

D_W1DW10HDUP(4);字4重復(fù)10H次

4.3.3符號定義語句1.等值語句EQU

給符號定義一個值或別的符號名,或一條可執(zhí)行的指令。 例:NEW_PORTEQU32 COUNTEQUCX CBDEQUAAD

一個符號一經(jīng)EQU賦值后,不能重新再定義。2.等號(EqualSign)語句 與EQU類似,使用它能對符號進(jìn)行再定義。 例:B1=6;B1定義為6B1=10;B1重新定義為10

4.3.4匯編語言的表達(dá)式和運(yùn)算符綜合運(yùn)算符(1)定義符號名為新類型格式:﹤類型﹥PTR﹤符號名﹥

PTR的功能歸納如下:①保證運(yùn)算時操作數(shù)類型的匹配

例:F1 DB 16H,38H F2 DW 1234H,26ABH MOVAX,WORDPTRF1 ;AX=3816H MOVBL,BYTEPTRF2 ;BL=34H

4.3.4匯編語言的表達(dá)式和運(yùn)算符②通過PTR指明是字單元還是字節(jié)單元例:MOV BYTEPTR[BX],10H;[BX]為字節(jié)單元

MOV WORDPTR[SI],20H;[SI]為字單元

③用PTR來改變距離屬性例:JMP FARPTRLLOOP

;段間轉(zhuǎn)移

CALL DWORDPTR[BX]

;遠(yuǎn)程調(diào)用 問題:例1: FARDB23H,45H AAA:MOVAX,[FAR]例2:MOVBX,OFFSETVAR1 MOV[BX],7常量和變量的名字及標(biāo)號不能用宏匯編的保留字此程序段匯編時會出現(xiàn)"操作類型不明確"錯誤需要修改為:MOVBYTEPTR[BX],7;字節(jié)操作或MOVWORDPTR[BX],7;字操作匯編語言程序設(shè)計(jì)步驟

AssemblyLanguageProgrammingProcedure1.分析問題2.確定算法3.繪制程序流程圖4.內(nèi)存空間分配5.編寫代碼6.靜態(tài)檢查7.上機(jī)調(diào)試 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)電磁智能車分析問題根據(jù)已知條件、問題特點(diǎn)、問題中的規(guī)律并歸納出數(shù)學(xué)模型。1.陳述全面分析問題2.分解問題分析問題目的:在規(guī)定賽道內(nèi)跑完全程,用時最短輸入:電磁傳感器,測速計(jì)輸出:舵機(jī),驅(qū)動電機(jī)2.分解問題角度速度分析問題車在正中3.轉(zhuǎn)化成計(jì)算機(jī)能執(zhí)行的問題車右偏分析問題3.轉(zhuǎn)化成計(jì)算機(jī)能執(zhí)行的問題分析問題3.轉(zhuǎn)化成計(jì)算機(jī)能執(zhí)行的問題車左偏分析問題目的:控制方向輸入:電磁傳感器輸出:舵機(jī)3.轉(zhuǎn)化成計(jì)算機(jī)能執(zhí)行的問題確定算法判別標(biāo)準(zhǔn):算法(Algorithm):解題方案的準(zhǔn)確而完整的描述正確性、時間復(fù)雜度、空間復(fù)雜度、穩(wěn)定性波形中最小值:尋找以BUFFER為首地址的5個字節(jié)數(shù)據(jù)中最小的數(shù)。

~BUFFER22BUFFER+1127BUFFER+280BUFFER+310BUFFER+45

~確定算法方法時間復(fù)雜度空間復(fù)雜度穩(wěn)定性直接插入法O(n^2)O(1)√冒泡法O(n^2)O(1)√快速排序法O(nlog2n)O(log2n)×簡單選擇法O(n^2)O(1)×堆排序法O(nlog2n)O(1)×兩路歸并法O(nlog2n)O(n)√確定算法冒泡法—關(guān)鍵1)比較和交換2)每次循環(huán)從底部開始比較到底怎么冒?確定算法冒泡法第一次2212780105數(shù)據(jù)串BUFFER22BUFFER+1127BUFFER+280BUFFER+310BUFFER+45510第二次2212780510805第三次22127580101275第四次2251278010225繪制程序流程圖根據(jù)需求、算法,繪制正確、清晰的流程圖原始數(shù)據(jù)

BUFFER物理地址=DS×10H+BUFFER底字地址

SI,SI=BUFFER+4循環(huán)次數(shù)CX,CX=4每次取數(shù)

AL

~BUFFER22BUFFER+1127BUFFER+280BUFFER+310BUFFER+45

~內(nèi)存空間分配存儲空間分配:CS,DS,SS

寄存器選擇:編寫代碼按流程圖編程編寫代碼MOV [SI],[SI-1]MOV[SI-1],ALMOV BL,[SI-1]MOV [SI],BLMOV[SI-1],ALXCHGAL,[SI-1]MOV [SI],AL×關(guān)鍵:正確、簡短5SI=510交換:靜態(tài)檢查與流程圖一致指令清晰可讀語法和格式無誤實(shí)現(xiàn)功能上機(jī)調(diào)試錯誤種類:1.語法錯誤如:M0VAL,[SI];2.邏輯錯誤如:MOVAX,[SI];

~BUFFER22BUFFER+1127BUFFER+280BUFFER+310BUFFER+45

~小結(jié)“總以某種固定方式行事,人便能養(yǎng)成習(xí)慣。”亞里士多德1.分析問題2.確定算法3.繪制程序流程圖4.內(nèi)存空間分配5.編寫代碼6.靜態(tài)檢查7.上機(jī)調(diào)試《微型計(jì)算機(jī)原理及應(yīng)用》,許立梓編著,機(jī)械工業(yè)出版社,2003,pp.107-116.《微機(jī)原理及應(yīng)用》,陳繼紅編著,高等教育出版社,2011,第2版,pp.109-118.《微型計(jì)算機(jī)原理與接口技術(shù)》,馮博琴編著,清華大學(xué)出版社,2011,第3版,pp.145-48.《微型計(jì)算機(jī)技術(shù)及應(yīng)用》,戴梅萼編著,清華大學(xué)出版社,2008,第3版,pp.142-154.《微型計(jì)算機(jī)原理及應(yīng)用》,鄭學(xué)堅(jiān)編著,清華大學(xué)出版社,2001,第3版,pp.137-140.The80x86IBMPCandCompatibleComputers,MuhammadAliMazidi,JaniceGillispieMazidi,清華大學(xué)出版社,2004,第4版,pp.49-68.參考文獻(xiàn) 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)1、順序結(jié)構(gòu) 順序結(jié)構(gòu)程序設(shè)計(jì)是沒有分支,沒有循環(huán)的直線運(yùn)行程序,程序執(zhí)行按照IP內(nèi)容自動增加的順序進(jìn)行。

4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)1、順序結(jié)構(gòu)

例:用數(shù)據(jù)運(yùn)算指令對兩個16位數(shù)做加法,這兩個數(shù)從地址10050H開始連續(xù)存放,結(jié)果放在這兩個數(shù)之后。

分析題目:16位數(shù)相加,用加法指 令,本題可以不考慮進(jìn)位問題。確定算法:8086加法指令可以做字操 作,可以用不帶進(jìn)位的加法指 令;若用帶進(jìn)位加法指令,事 前先清除進(jìn)位。畫流程圖:見右.

開始

初始化被加數(shù)送AX

被加數(shù)+加數(shù)送AX

AX送(10054H)和(10055H)

結(jié)束 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)內(nèi)存空間分配:內(nèi)存地址內(nèi)容10050H被加數(shù)低8位10051H被加數(shù)高8位10052H加數(shù)低8位10053H加數(shù)高8位10054H和數(shù)低8位10055H和數(shù)低8位編寫程序:mov ax,1000h;初始化mov ds,axmov si,50hmov di,52hmov bx,54hclc ;清除進(jìn)位mov ax,[si]adc ax,[di];帶進(jìn)位加法mov [bx],axhlt分支程序設(shè)計(jì)BranchProgramming1.兩路分支

2.多路分支如何做得更完美?實(shí)現(xiàn)決策最關(guān)鍵是什么?回顧--標(biāo)志寄存器標(biāo)志位分布輔助進(jìn)位標(biāo)志位溢出標(biāo)志位符號標(biāo)志位零標(biāo)志位奇偶標(biāo)志位進(jìn)位標(biāo)志位兩路分支兩路分支程序組成產(chǎn)生條件測試條件分支程序就是利用轉(zhuǎn)移指令,控制計(jì)算機(jī)執(zhí)行某段程序或不執(zhí)行某段程序。1.產(chǎn)生條件1.產(chǎn)生條件AL=20H(測試最高位)ANDAL,80HAL=00HMOVAH,AL;ANDAH,80H;00100000&1000000000000000

SFTESTAL,80H

AL=20H2.測試條件條件轉(zhuǎn)移指令----------------Jc無條件轉(zhuǎn)移指令-------------JMP如何選擇?JMPNEARBPA1JMPNEARBPA2BPA_TABLE例題:開關(guān)判斷程序。

無條件轉(zhuǎn)移指令---JMP設(shè)開關(guān)狀態(tài)已送入寄存器AL,程序如下:MOVAH,0MOVBL,ALADDAL,ALADDAL,BLMOVBX,OFFSETBRA_TAB;求BRA_TAB為表首ADDBX,AXJMPBX;求AL×3,即位移量給AX無條件轉(zhuǎn)移指令---JMP

內(nèi)存中有一個8位帶符號數(shù),求其絕對值,并將結(jié)果放回原處。答:先畫出程序流程圖條件轉(zhuǎn)移指令----Jc…MOVAL,[SI]TESTAL,80H;判斷符號位(產(chǎn)生條件)JNSDONE;SF=0,轉(zhuǎn)移到DONENEGAL;SF=1,AL<0,AL求補(bǔ)DONE:MOV[SI],AL;絕對值送回原內(nèi)存單元…還可以用什么指令實(shí)現(xiàn)?條件轉(zhuǎn)移指令----Jc關(guān)鍵:如何按照條件對多分支進(jìn)行判斷!1.相異性條件:所有條件中只有一個條件成立。K0K1000110111.相異性條件K0K1000110112.相容性條件:這些條件中可能有兩個以上甚至所有條件都成立。例如:統(tǒng)計(jì)優(yōu)、良、中、及格、不及格學(xué)生人數(shù)。注意:條件判定的次序思考題要求把內(nèi)存中的一數(shù)據(jù)區(qū)傳送到另一存儲區(qū)?!?.源數(shù)據(jù)塊與目的數(shù)據(jù)塊無重疊區(qū)例如:Destination…SourceDestination2.源數(shù)據(jù)塊的尾部與目的數(shù)據(jù)塊的頭部重疊重疊區(qū)SourceDestination3.源數(shù)據(jù)塊的頭部與目的數(shù)據(jù)塊的尾部重疊重疊區(qū)SourceDestination例如:DestinationSourceDestination傳送數(shù)據(jù)應(yīng)從數(shù)據(jù)塊的尾部開始傳送傳送數(shù)據(jù)應(yīng)從數(shù)據(jù)塊的頭部開始傳送Source34H12H02H例如:34H12H02H34H12H02HSource分析:可能有3種情況小結(jié)實(shí)現(xiàn)分支程序的關(guān)鍵:判別條件的設(shè)定正確運(yùn)用轉(zhuǎn)移指令《道德經(jīng)》第四十二章“道生一,一生二,二生三,三生萬物。萬物負(fù)陰而抱陽,沖氣以為和?!薄段⑿陀?jì)算機(jī)原理及應(yīng)用》,許立梓編著,機(jī)械工業(yè)出版社,2003,第4版,pp.116-118.《微機(jī)原理及應(yīng)用》,陳繼紅編著,高等教育出版社,2011,第2版,pp.118-123.《微型計(jì)算機(jī)原理與接口技術(shù)》,馮博琴編著,清華大學(xué)出版社,2011,第3版,pp.168-186.《微型計(jì)算機(jī)原理及應(yīng)用》,鄭學(xué)堅(jiān)編著,清華大學(xué)出版社,2001,第3版,pp.140-143.電子發(fā)燒友論壇:/forum.php.

參考文獻(xiàn) 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)3、循環(huán)結(jié)構(gòu) 組成:循環(huán)初始化部分。地址指針、循環(huán)次數(shù)及某標(biāo)志的設(shè)置,相關(guān)寄存器的清零等操作。循環(huán)體。是要求重復(fù)執(zhí)行的程序段部分,對應(yīng)于要求重復(fù)執(zhí)行的操作。循環(huán)控制部分。由該部分修改并判斷控制循環(huán)的條件是否滿足。以決定是否繼續(xù)循環(huán)。循環(huán)結(jié)束部分。如保存循環(huán)運(yùn)行結(jié)果等。 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)

循環(huán)程序有兩種結(jié)構(gòu)形式,DO—WHILE結(jié)構(gòu),DO—UNTIL結(jié)構(gòu)。DO-WHILEDO-UNTIL

例:用循環(huán)結(jié)構(gòu)編寫程序完成:

DATA SEGMENT BUFFER DW a1,a2,…,a10 ;原始10個數(shù)據(jù)

SUM DW ? ;存放和數(shù)

DATA ENDS

CODE SEGMENT ASSUMECS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,0 ;AX中為和數(shù),初始為0 MOV DI,OFFSETSUM ;存放結(jié)果地址送DI MOV BX,OFFSETBUFFER

;數(shù)據(jù)緩沖區(qū)首地址送BX

4.3.5基本結(jié)構(gòu)程序設(shè)計(jì) 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì) MOV CX,10 ;循環(huán)次數(shù)送CXLOP:ADD AX,[BX] ;累加

INC BX ;修改數(shù)據(jù)緩沖區(qū)地址

INC BX DEC CX ;次數(shù)減1 JNZ LOP ;到10次了嗎?不到,轉(zhuǎn)LOP MOV [DI],AX ;到10次,存放結(jié)果和

MOV AX,4C00H ;返回DOS INT 21HCODE ENDS END START 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)例:給定一串16位數(shù),找出大于零、等于零和小于零的個數(shù),并緊跟著原串存放。

分析:這是一個統(tǒng)計(jì)問題,須設(shè)定三個計(jì)數(shù)器分別統(tǒng)計(jì)三種情況下的結(jié)果。程序如下:DATA SEGMENT BUFFDWX1,X2,X3,……,Xn COUNTEQU$-BUFF;此時,COUNT的值為BUFF所占的字節(jié)數(shù)

PLUSEDB?

ZERODB?

MINUSDB?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,ES:DATABEGIN:MOV AX,DATA MOV DS,AX MOV CX,COUNT SHR CX,1;相當(dāng)于除2,正好為BUFF中的數(shù)據(jù)個數(shù) MOV DX,0;設(shè)定計(jì)數(shù)器初值

MOV AH,0;設(shè)定計(jì)數(shù)器初值

LEA BX,BUFFAGAIN: CMP WORDPTR[BX],0 JAE PLU;大于等于0,則轉(zhuǎn)PIU INC AH;<0,則統(tǒng)計(jì)

JMP NEXTPLU: JZ ZER;=0,則轉(zhuǎn)ZER INC DL;>0,則統(tǒng)計(jì)

JMP NEXTZER: INC DH;=0,則統(tǒng)計(jì)NEXT: INC BX INC BX LOOP AGAIN MOV PLUS,DL MOV ZERO,DH MOV MINUS,AH MOV AX,4C00H

INT 21HCODE ENDS END BEGIN 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)4、子程序 通過把一些固定的、經(jīng)常使用的功能做成子程序的形式,可以使源程序及目標(biāo)程序大大縮短,提高程序設(shè)計(jì)的效率和可靠性。

注意子程序的入口參數(shù)和出口參數(shù)!

入口參數(shù)是由主程序傳給子程序的參數(shù),而出口參數(shù)是子程序運(yùn)算完傳給主程序的結(jié)果。子程序所使用的寄存器和存儲單元往往需要保護(hù),以免影響返回后主程序的運(yùn)行。 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)參數(shù)傳遞一般有三種方法實(shí)現(xiàn)。(1)利用寄存器。這是一種最常見方法,把所需傳遞的參數(shù)直 接放在主程序的寄存器中傳遞給子程序。(2)利用存儲單元。這種參數(shù)傳遞方法,把所需傳遞的參數(shù)直 接放在一個數(shù)據(jù)區(qū)中。(3)利用堆棧。這種方法將參數(shù)壓入堆棧,在子程序運(yùn)行時從 堆棧中取參數(shù)。 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)例:兩個6字節(jié)數(shù)相加。分析:將一個字節(jié)相加的程序段設(shè)計(jì)為子程序。主程序分6次 調(diào)用該子程序,但每次調(diào)用的參數(shù)不同。DATA SEGMENTADD1 DB FEH,86H,7CH,35H,68H,77HADD2 DB 45H,BCH,7DH,6AH,87H,90HSUM DB6DUP(0)COUNT DB 6DATA ENDSSTACK SEGMENT DB 100DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)MADD: MOV AX,DATA MOV DS,AX MOV SI,OFFSET ADD1 MOV DI,OFFSETADD2 MOV BX,OFFSETSUM MOV CX,COUNT;循環(huán)初值為6 CLCAGAIN: CALL SUBADD;調(diào)用子程序

LOOPAGAIN;循環(huán)調(diào)用6次

MOV AX,4C00H INT 21H 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì);子程序入口參數(shù):SI,DI,BX。出口參數(shù):SI,DI,BXSUBADD PROC;完成一個字節(jié)相加

MOV AL,[SI];SI是一個源操作數(shù)指針

ADC AL,[DI];DI是另一個操作數(shù)指針

MOV [BX],AL;BX是結(jié)果操作數(shù)指針

INC SI INC DI INC BX RETSUBADD ENDPCODE ENDS ENDMADD 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)例:把內(nèi)存中的字變量NUMBER的值,轉(zhuǎn)換為4個ASCII碼表示的十六進(jìn)制數(shù)碼串,串的起始地址為STRING。分析:把內(nèi)存中的字變量NUMBER的值,轉(zhuǎn)換為4個ASCII碼表示的十六進(jìn)制數(shù)碼串的工作設(shè)計(jì)成一個子程序,在這個子程序中再調(diào)用另一個子程序,由它完成從BCD碼到ASCII碼的轉(zhuǎn)換。DATA SEGMENTORG100HNUMBER DW 25AFHSTRING DB 4DUP(?),0DH,0AH,‘$’DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATABEGIN: MOV AX,DATA MOV DS,AX MOV ES,AX LEA BX,STRING PUSH BX;將參數(shù)(結(jié)果地址指針)壓入堆棧

PUSH NUMBER;將源數(shù)據(jù)壓入堆棧

CALL BINHEX;調(diào)用子程序 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì) LEA DX,STRING MOV AH,9 INT 21H MOV AX,4C00H INT 21HBINHEX PROC PUSH BP MOV BP,SP PUSH AX PUSH DI PUSH CX PUSH DX PUSHF;以上為保護(hù)現(xiàn)場

MOV AX,[BP+4];取出NUMBER MOV DI,[BP+6];取出STRING的偏移地址

ADD DI,LENGTHSTRING-1;使DI指向轉(zhuǎn)換數(shù)據(jù)

MOV DX,AX;保護(hù)原始數(shù)據(jù)

MOV CX,4AGAIN:AND AX,0FH;取低4位

CALL HEXD;調(diào)子程序

STD STOSB;保護(hù)轉(zhuǎn)換數(shù)據(jù)

PUSH CX;保護(hù)CX的值

MOV CL,4 SHR DX,CL MOV AX,DX POP CX LOOP AGAIN POPF POP DX POP CX POP DI POP AX POP BP RET 4BINHEXENDP;將AL中的BCD碼轉(zhuǎn)換成ASCII碼HEXD PROC CMP AL,0AH JL ADDZ;小寫字母轉(zhuǎn)換成ASCII碼

ADD AL,’a’-‘0’-0AHADDZ: ADD AL,‘0’ RETHEXD ENDPCODE ENDS END BEGIN 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì) 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)例:數(shù)的階乘1,n=0按照階乘的定義n!=n*(n-1)!,n>0這是一個遞歸定義式,可采用子程序的的遞歸調(diào)用形式。;計(jì)算N!結(jié)果在result中Data segmentN dw ?Resultdw ?Data ends 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì)Stack_segsegmentstack‘stack’ dw 128dup(?)Stack_segendsCode segmentMain proc far assumecs:code,ds:data,ss:stack_segStart:pushds ;保存原數(shù)據(jù)段

sub ax,ax pushax movax,data movds,ax 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì);程序主要部分

movbx,Npushbx ;保存Ncallfact;調(diào)用求N!子程序

popresult;結(jié)果在result中

retMain endp;子程序,求N!fact proc near push ax push bp mov bp,sp mov ax,[bp+6];取N cmp ax,0 4.3.5基本結(jié)構(gòu)程序設(shè)計(jì) jne fact1;ax不等于零,轉(zhuǎn)fact1 inc ax;ax=0,0!=1 jmp exitfact1: dec ax;ax=N-1 pushax call fact;遞歸調(diào)用

pop ax;ax=(N-1)! mul wordptr[bp+6];(N-1)!*Nexit: mov[bp+6],ax popbp popax retfact endpcode ends end start 4.3.6DOS功能調(diào)用前面一些程序的運(yùn)行結(jié)果,或是保留在寄存器中,或是保留在存儲器中,不能方便直觀的看到。要了解運(yùn)算的結(jié)果,應(yīng)在顯示器上輸出,方便的方法是調(diào)用操作系統(tǒng)中的I/O子程序,操作系統(tǒng)的核心是許多有關(guān)I/O驅(qū)動,磁盤讀寫以及文件管理等子程序。這些子程序都編了號,調(diào)用時把子程序號(或稱系統(tǒng)功能調(diào)用號)送到INT21H。 4.3.6DOS功能調(diào)用通常按照如下4個步驟進(jìn)行:⑴在AH寄存器中設(shè)置系統(tǒng)功能調(diào)用號⑵在指定寄存器中設(shè)置入口參數(shù)⑶執(zhí)行指令I(lǐng)NT21H實(shí)現(xiàn)中斷服務(wù)程序的功能調(diào)用⑷根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況 4.3.6DOS功能調(diào)用1.向顯示器輸出一個字符(2號功能調(diào)用) 功能號:AH=02H入口參數(shù):DL=字符的ASCII碼功能:在顯示器當(dāng)前光標(biāo)位置顯示給定的字符,光標(biāo)右移一個字符位置。如按Ctrl-Break或Ctrl-C則退出;在當(dāng)前顯示器光標(biāo)位置顯示一個問號movah,02h ;設(shè)置功能號:ah←02hmovdl,'?' ;提供入口參數(shù):dl←'?'int21h ;DOS功能調(diào)用:顯示 4.3.6DOS功能調(diào)用2.顯示字符串(9

溫馨提示

  • 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

提交評論