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

下載本文檔

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

文檔簡介

第五章匯編語言程序設計匯編語言是機器語言的符號表示,是用指令的助記符、符號地址、標號等書寫程序的語言。用匯編語言編寫的程序,叫匯編語言源程序,或簡稱源程序。只有將源程序翻譯成目標程序,才能在機器上運行,這種把匯編語言程序翻譯成機器語言程序的過程稱為匯編。

計算機完成匯編任務是由匯編程序〔MASM-MacroAssembler〕這樣一個軟件工具實現(xiàn)的,匯編程序加工的對象是匯編語言源程序,加工的結(jié)果是目標程序。匯編語言的一個實例

DATA SEGMENTA DW 123B DW 456SUM DW ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AXMOVAX,AADDAX,B MOVSUM,AXMOVAH,4CHINT21H CODE ENDSENDSTART 5.1匯編語言語法5.1.1匯編語言語句

指令性語句是能產(chǎn)生目標代碼,CPU可以執(zhí)行的能完成特定功能的語句。其格式為:

[標號:][前綴]指令助記符操作數(shù)[;注釋]

指示性語句,又叫偽指令是沒有對應的機器指令,不能執(zhí)行,只給匯編程序提供一種信息,用來定義變量,分配存儲單元,指示程序開始和結(jié)束等。其格式為:

[名字]偽指令 操作數(shù) [;注釋]

名字是給偽指令取的名稱,通常是變量名、段名、過程名、符號名等。兩種語句的區(qū)別:

在形式上:帶不帶冒號,是否可轉(zhuǎn)向它。

在本質(zhì)上:匯編時能否形成對應的機器碼。操作數(shù)〔數(shù)據(jù)項〕匯編語言中使用的操作數(shù)可以是常數(shù)、存放器、名字〔變量〕、標號或表達式1、常數(shù)1)數(shù)字常量用于偽指令中給變量賦值,或作為指令語句中的立即數(shù)、直接地址。2)字符串常量用單引號引起來的字符或字符串也代表常數(shù)。例:’A’,’BCDE’,匯編時被翻譯成對應的ASCII碼41H和42H,43H,44H,45H。3〕符號常量PORTEQU20HINAL,PORT

變量是內(nèi)存中的數(shù)據(jù)區(qū),在程序中作為存儲器操作數(shù)來使用。在除代碼段以外的其它段中定義。變量主要有三種屬性:①段地址—變量所在段的段地址②偏移地址—變量單元地址與段起始地址之間的位移量。③類型—有字節(jié)、字和雙字三種。2.變量3.標號標號是可執(zhí)行指令語句所存放單元的符號地址,可作為轉(zhuǎn)移指令的轉(zhuǎn)移地址。標號也有三種屬性:段地址總是在CS段存放器中,偏移地址概念與變量同,類型分NEAR和FAR兩種。NEAR—表示標號所在語句與轉(zhuǎn)移指令或調(diào)用指令在同一代碼段內(nèi),只需改變IP即可。FAR—標號所在語句與轉(zhuǎn)移指令或調(diào)用指令不在同一代碼段內(nèi)。4、存放器8位:AH,AL,BH,BL,CH,CL,DH,DL16位:AX,BX,CX,DX,SI,DI,BP,SP,DS,SS,ES,CS5、表達式數(shù)值表達式地址表達式5.1.2表達式中的各類運算符有+、-、*、/,以及MOD,其中MOD表示除法運算后得到的余數(shù)。例:19/7的商是2,19MOD7那么為5(余數(shù))算術(shù)運算符可以用于數(shù)字表達式,例:MOV AL,2*7 匯編時計算表達式形成指令為:MOV AL,0EH算術(shù)運算符也可以用于地址表達式,對地址運算的結(jié)果應有明確的物理意義,例兩個地址的乘或除無意義,而加或減那么可以,例:LEASI,SUM+3表示變量SUM的地址加上3得到的和作為新存儲器地址。(1)算術(shù)運算符邏輯運算符有AND、OR、XOR和NOT,它們只能用于數(shù)字表達式中。例:MOVCL,36HAND0FH匯編時形成指令:MOVCL,06H這些邏輯運算符也是8086/8088的指令助記符,但不會造成混亂,前者在匯編時進行,而后者在指令執(zhí)行時進行的。

例:ANDDX,PORTAND0FEH后一個邏輯運算符AND在匯編時進行,假設PORT為81H,那么匯編后表達式算出為80H。執(zhí)行前一個指令助記符AND時,將(DX)與80H相與,結(jié)果在DX中。(2)邏輯運算符PORTEQU81H共有6個,它們?yōu)椋篍Q(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)關(guān)系運算符的兩個操作數(shù)必須都是數(shù)字或者是同一段內(nèi)的兩個存儲器地址。關(guān)系為真,結(jié)果為0FFH或0FFFFH關(guān)系為假,結(jié)果為0例:MOVBX,PORTGE5假設PORT的值大于等于5,那么匯編后為:MOVBX,0FFFFH假設PORT的值小于5,那么匯編后為:MOVBX,0(3)關(guān)系運算符它可以把存儲器一些特征作為數(shù)值送回。這些操作符有OFFSET,SEG,TYPE,SIZE及LENGTH。OFFSET運算符用來取存儲單元的偏移量。例:MOVSI,OFFSETSTRI1;將變量STRI1的地址偏移量取到SI中。注意與MOVSI,STRI1的差異。但它與LEASI,STRI1等價。SEG運算符用來取存儲單元的段值。例: MOV AX,SEGSTRI1 ;將變量STRI1所 MOV DS,AX ;在段值取到DS中(4)數(shù)值返回運算符TYPE運算符用來取變量或標號的類型值存儲器單元類型對應值

DB(字節(jié))

1

DW(字)

2

DD(雙字)

4DQ(四字)8

DT(10字節(jié))10NEAR-1FAR-2LENGTH運算符返回DUP定義的數(shù)據(jù)占據(jù)的元素個數(shù),其它返回1。SIZE運算符返回DUP定義的數(shù)據(jù)占據(jù)的字節(jié)數(shù),其它返回TYPE值。(5)屬性運算符用來建立或改變已定義變量、內(nèi)存操作數(shù)或標號的類型屬性。運算符有:段操作符“:〞、PTR、SHORTMOV AX,ES:STRI1INCBYTEPTR[BX]

在源程序中使用一些約定的符號,這些符號用來告訴匯編程序應如何工作,這就是匯編控制指令,也稱偽指令。偽指令語句包含在源程序中,由匯編程序?qū)υ闯绦蜻M行匯編時解釋執(zhí)行。偽指令語句除了本身可以申請分配一局部存儲空間用作數(shù)據(jù)區(qū)和堆棧區(qū)外,不產(chǎn)生任何目標代碼。在將源程序翻譯成目標程序后,偽指令語句就不存在了。5.2.1符號定義偽指令符號定義偽指令有EQU、=、LABEL幾種。1.EQU偽指令使用格式為:名字EQU數(shù)值或字符序列EQU偽指令的功能是將數(shù)值或字符序列與一個指定的名字等價。如此能增加匯編程序可讀性。給程序的設計與維護帶來方便。下面的例子列舉了EQU偽指令的常見用法:5.28086匯編語言的偽指令語句 THREEEQU3 ;名字THREE與數(shù)值3等價SIXTHEQUTHREE*(17+THREE);SIXTH等價于3*(17+3)

PEQUES:[BX] ;P與ES:[BX]等價YEQUP[SI] ;Y與ES:[BX][SI]等價2.“=〞偽指令“=〞偽指令與EQU偽指令具有相同的功能,區(qū)別僅在于“=〞偽指令定義的符號允許重新定義,使用更靈活方便。例如: EMP=60 ;定義EMP等于常數(shù)60 EMP=79 ;重定義EMP等于常數(shù)79 EMP=EMP+1 ;又定義EMP等于常數(shù)805.2.2變量定義偽指令常用的變量定義偽指令有DB、DW、DD、DQ、DT,分別用來定義字節(jié),單字、雙字、四字及十字節(jié)類型變量。它們的根本應用格式如下:[變量名]{DB|DW|DD|DQ|DT}〈表達式〉其中,變量名是可選的,{}表示其中的偽操作命令必須選用一種,表達式有如下幾種應用形式:1.數(shù)值表達式這種形式定義的變量具有表達式給定的數(shù)值初值。例如:BETADW4*10H;變量BETA為字類型,初值為642.ASCII字符串

字符串必須用單引號括起來。DB偽指令為串中每一個字符分配一個字節(jié)單元,且自左至右按地址遞增的順序依次存放,字符個數(shù)不得超過255個。例如

MSG1DB'msgtest'對于DW偽指令,可以給兩個字符組成的字符串分配兩個字節(jié)存儲單元,而且這兩個字符的存儲順序是前一個字符在高字節(jié),后一個字符在低字節(jié),每一個數(shù)據(jù)項不能多于兩個字符。例如:

MSG2DW'AB','cd','ef'3.地址表達式地址表達式的運算結(jié)果是一個地址,因此只能用DW或DD來定義。如果用DW定義,那么將原變量或標號的偏移地址定義為新變量;如果用DD來定義,那么將原變量或標號的偏移地址和段地址分別置入新變量的低位和高位字中。例如:AD1DDBETA1;變量的初值為BETA1的段地址和偏移地址AD2DWBETA2;變量的初值為BETA2的偏移地址4.?

問號表示所定義的變量未指定初值。例如:

BUFDW?;定義一個字變量BUF,初值為一隨機數(shù)5.〔n〕DUP〔表達式〕這種情況用于定義重復變量,DUP〔Duplication〕是重復數(shù)據(jù)操作符,n表示重復次數(shù),圓括號內(nèi)的表達式表示要重復的內(nèi)容。例如:TABDB100DUP〔0〕;從變量TAB開始有100個初值為零的字節(jié)元素

DUP操作符可以嵌套使用,即圓括號中的表達式又是一個帶DUP的表達式。例如:TABDW2DUP〔5DUP〔4〕,7〕表示變量TAB開始有12個字元素,這12個元素的初值構(gòu)成的數(shù)據(jù)序列為: 4,4,4,4,4,7,4,4,4,4,4,7共占24個字節(jié)單元。5.2.3程序分段定義偽指令1.SEGMENT和ENDS偽指令1〕語句格式利用SEGMENT和ENDS可把源程序模塊劃分成假設干個源程序段,它的格式為:〈段名〉SEGMENT[定位方式][組合方式][分類名] ;段內(nèi)所有語句〈段名〉ENDS其中,段名是為該段起的名字;定位方式、組合方式和分類名是可選的,選兩個以上時,書寫順序必須與格式中的順序一致。這三個可選操作數(shù)都是通過匯編給鏈接程序提供控制信息的。鏈接時,先處理組合方式,再處理定位方式,最后處理分類名。2〕組合方式源程序可以分成假設干個模塊單獨編制與匯編,每個模塊又可劃分假設干段,如果這些段都不太大卻又分別定義了不同的段名,那么當這些模塊鏈接起來并裝入機器運行時,由于程序段數(shù)可能大大超過當前立即可用的由段存放器確定的邏輯段數(shù)〔僅四個〕,使程序運行極為不便。為此,如果將不同模塊中相同性質(zhì)的段使用同樣的段名,那么連接這些模塊時就可以把同名的段按照指定的方式組合起來,既便于程序運行,又可以到達有效使用存儲空間之目的??晒┻x擇的組合方式有PUBLIC、STACK、AT、COMMON、MEMORY以及NONE共六種。①PUBLIC該段與其它模塊的同名段按先后出現(xiàn)的順序依次連接起來形成一個源程序段,共用一個段基址,運行時裝入同一個邏輯段。STACK與PUBLIC類型同樣處理,只是組合后的這個段專門用作堆棧段,并自動初始化SS和SP。注意,被鏈接的所有模塊中至少應該有一個STACK段,否那么LINK時會提示出錯。COMMON表示該段與其他模塊中被說明成COMMON的同名段共享相同的存儲區(qū),采用覆蓋方式存放,連接長度為各分段中最大長度。AT〈數(shù)值表達式〉表示該段應按絕對地址定位,段地址為數(shù)值表達式的值,偏移地址為0。MEMORY表示該段定位在所有其他段之上,即地址較大區(qū)域。NONE即不指定方式,表示該段與其它模塊中的段,不管段名是否相同,都不發(fā)生任何組合關(guān)系,鏈接時它將是一個獨立的段?!踩笔 ?〕定位方式定位方式通過匯編告知LINK程序如何將經(jīng)組合后的新段定位到存儲器中。定位方式有四種,即PARA、BYTE、WORD和PAGE方式。①PARA方式:規(guī)定段從16的整數(shù)倍地址〔指物理地址〕開始,它使得段間可能留有1到15個字節(jié)的間隙。這也是一種缺省方式。②BYTE方式:規(guī)定段可以從任何地址開始,它使本段與前面段間不留任何間隙。③WORD方式:規(guī)定段只能從偶地址開始,它使得段間可能留一個字節(jié)的間隙。④PAGE方式:規(guī)定段從256的整數(shù)倍地址開始,它使得段間可能留有1到255個字節(jié)的間隙。4〕分類名假設SEGMENT語句書寫了“分類名〞,那么進行鏈接裝配時,LINK程序把分類名相同的所有段(段名未必相同)放在連續(xù)的存儲區(qū)域內(nèi),但仍然是不同的段。分類名相同的各個段在鏈接時,先出現(xiàn)的在前,后出現(xiàn)的在后。2.ASSUME偽指令8086利用CS存放器為代碼段尋址,DS存放器為數(shù)據(jù)段尋址,SS存放器為堆棧段尋址…。然而SEGMENT和ENDS兩個偽指令并未告訴匯編程序,其所定義的段是哪一種段,而ASSUME偽指令可到達此種功能,它告訴匯編一種匹配假設,即哪個段存放器將為哪個段名尋址。 ASSUME<段存放器>:<段名>[,<段存放器>:<段名>]其中段名是程序中定義過的任何段名或組名。3.ORG偽指令該指令可用來設置段內(nèi)偏移地址。匯編程序開始對源程序的某段進行匯編時,其地址計數(shù)器的初值相對于段地址總是零。接著依次累計段內(nèi)語句匯編后生成目的代碼的字節(jié)數(shù)。ORG偽指令可修改計數(shù)器的內(nèi)容。格式為: ORG〈表達式〉它告知匯編,該指令后生成的目標代碼,從表達式提供的偏移地址開始存放。該指令的實際工作是把當前段的匯編程序地址計數(shù)器置成表達式所確定的值。下面是使用ORG偽指令的例子:DATASEGMENTORG100 XXDW10DUP〔?〕 ORG$+5

ORGOFFSETXX+256ARRAYBDB100DUP(1,-1)它表示該段的目的代碼從偏移地址100的位置開始產(chǎn)生,這是第一個ORG的功能。第二個ORG是為變量XX產(chǎn)生十個未初始化的字后,又跳過五個字節(jié),再繼續(xù)生成目的代碼。第三個ORG告知匯編字節(jié)變量ARRAYB從偏移地址356的位置開始存放。過程定義偽指令在程序設計中,常把具有一定功能的程序設計成一個子程序,子程序的使用不僅減少了目標代碼的生成數(shù)量。而且便于實現(xiàn)程序的模塊化。匯編語言中,子程序通常以過程的形式編寫,通過使用過程定義偽指令PROC和ENDP來定義一個過程,然后再通過CALL指令實現(xiàn)調(diào)用。過程定義偽指令的格式如下: 〈過程名〉PROC[類型]

RET 〈過程名〉ENDP過程名是為該過程起的名字,具有與語句標號相同的屬性,即具有段地址、偏移地址和類型〔NEAR和FAR〕三個屬性。程序模塊的開始與結(jié)束偽指令NAME和END偽指令定義一個模塊需使用NAME和END兩條偽指令。指令格式如下:

[NAME<模塊名>]

END[標號]其中,模塊名是為該模塊起的名字,NAME語句行可缺省,缺省時該模塊的源程序文件名就是模塊名。匯編時,一個模塊就是一個匯編單位。匯編處理只進行到模塊結(jié)束語句END為止。如果該模塊是主模塊,END語句可以指出一個標號,它表示該程序的啟動地址。一次被連接的各模塊中只能有一個是主模塊,即程序只能有一個啟動地址。BIOS中斷調(diào)用:在存儲器系統(tǒng)中,內(nèi)存高端8KB的ROM中存放有根本輸入/輸出系統(tǒng)(BasicInput/OutputSystem,BIOS)例行程序。主要提供系統(tǒng)自檢及初始化、系統(tǒng)效勞和硬件中斷處理等功能模塊??梢酝ㄟ^軟中斷指令I(lǐng)NTn訪問。DOS系統(tǒng)功能調(diào)用:是微機的磁盤操作系統(tǒng)DOS(DiskOperatingSystem)為用戶提供的一組例行子程序,它與BIOS中斷執(zhí)行同樣的功能,而且操作更簡易,對硬件的依賴更少一些,使用軟中斷指令I(lǐng)NT21H軟中斷所完成的各項功能。5.3BIOS和DOS系統(tǒng)功能調(diào)用主要功能:1〕磁盤的讀/寫以及控制管理2〕內(nèi)存管理3〕根本的輸入輸出管理〔鍵盤、顯示器、打印機等〕另外還有時間、日期管理調(diào)用方法:1)系統(tǒng)功能號送到AH存放器中2)入口參數(shù)送到指定存放器中3)用INT21H指令執(zhí)行功能調(diào)用有些系統(tǒng)功能調(diào)用比較簡單,不需要設置入口參數(shù)或者沒有出口參數(shù),那么只需安排后兩個語句,調(diào)用返回完成時,系統(tǒng)將出口參數(shù)送到指定的存放器中,或送屏幕顯示出來。一、鍵盤功能調(diào)用例:交互程序需用戶對一個提示做應答時,需單字符輸入。GET_KEY:MOVAH,1CMPAL,‘N’INT21HJENOCMPAL,‘Y’JNEGET_KEYJEYES

AH功能返回參數(shù)

01H從鍵盤輸入一個字符并回顯在屏幕上AL=字符07H從鍵盤輸入一個字符不回顯AL=字符0AH輸入字符到緩沖區(qū)DS:DX=緩沖區(qū)首地址

從鍵盤輸入字符串。這是0AH號系統(tǒng)功能調(diào)用,要求預先定義一個輸入緩沖區(qū),將DS:DX指向緩沖區(qū),該區(qū)的第一個字節(jié)指出能容納的最大字符個數(shù);第二個字節(jié)存放實際輸入的字符個數(shù),由系統(tǒng)最后填入;從第三個字節(jié)開始存放從鍵盤接受的字符,直到ENTER鍵結(jié)束。定義緩沖區(qū):

BUFFDB100;存放100字節(jié)的緩沖區(qū) DB?;系統(tǒng)輸入實際輸入字節(jié)數(shù) DB100DUP(?);存放輸入字符系統(tǒng)功能調(diào)用:MOVDX,OFFSETBUFFMOVAH,0AHINT21H二、顯示功能調(diào)用AH功能調(diào)用參數(shù)02H顯示一個字符DL=字符09H顯示字符串DS:DX=字符串首地址例:顯示一個單字符MOVDL,ALMOV AH,2INT 21H

字符串輸出。9號功能調(diào)用,將指定的內(nèi)存緩沖區(qū)中的字符串從屏幕顯示輸出。要求DS:DX指向串地址首址,并且字符串必須以‘$’字符為結(jié)束符。例:在屏幕上顯示‘HOWDOYOUDO?’字符串,且光標換行。DATASEGMENT CR EQUODH LF EQU0AH MES DB'HOWDOYOUDO?',CR,LF,'$'DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATAMAIN:MOV AX,DATA MOVDS,AX MOV DX,OFFSETMES;DS:DX指向字符串MES MOV AH,9 ;9號功能調(diào)用 INT 21H MOV AH,4CH ;返DOS INT 21HCODEENDS ENDMAIN

三、打印功能例:打印一個字符串TEXTDB‘HELLO!’……MOVCX,6MOVBX,0NEXT:MOVAH,5MOVDL,TEXT[BX]INT21HINCBXLOOPNEXT……AH功能調(diào)用參數(shù)05H打印一個字符DL=字符5.4匯編語言程序設計方法匯編語言程序設計的根本方法一個好的程序,不僅應滿足設計要求,實現(xiàn)預定功能,還應滿足:①結(jié)構(gòu)模塊化、簡明、易讀、易調(diào)試、易維護〔指修改與擴充〕;②執(zhí)行速度快;③占用存儲空間少。執(zhí)行速度和占用存儲空間兩者有時是相矛盾的,這兩個指標往往不能同時滿足,在許多情況下要加以權(quán)衡,看哪一個指標對于我們的程序要求更重要。對于較大的程序,如何使程序模塊化,易讀、易調(diào)試和易維護,那么顯得更加重要。在開發(fā)大型程序方面,保證代碼正確性,有時比追求代碼技巧性顯得更為實用。匯編語言程序設計的根本步驟如下:①分析問題,抽象出描述問題的數(shù)學模型,確定解決問題的適宜算法;②繪制抽象流程圖或?qū)懗龀橄蟛襟E,可以從粗到細把算法逐步地具體化;③分配存儲空間及工作單元,根據(jù)框圖編寫程序;④靜態(tài)檢查源程序;⑤上機調(diào)試程序,按設計要求對程序運行正確性作全面測試。匯編語言程序與DOS操作系統(tǒng)的接口1〕標準方法EXP1PROC FARSTART:PUSHDS MOVAX,0 PUSH AX

RETEXP1ENDP2〕非標準方法MOVAH,4CHINT21H

從START標號開始的三句為返回DOS設置返回地址,它相當于把DS:0000H壓棧.連接程序為每一個用戶程序建立了一個程序段前綴區(qū),在前綴區(qū)開始處安排了一條INT20H,在過程結(jié)束時通過RET返回DOS。

在程序結(jié)尾處執(zhí)行功能號為4CH的DOS系統(tǒng)功能調(diào)用一、順序程序設計順序程序,又叫直線運行程序。這種程序的形式最簡單,計算機執(zhí)行程序的方式是指令逐條依次被執(zhí)行,不進行判斷和跳轉(zhuǎn),直到程序結(jié)束。例:編程計算Z=(x2-3y)/2。設x、y為單字節(jié)正整數(shù),結(jié)果Z用兩個字節(jié)來存放。

計算X﹡X開始結(jié)束計算3﹡Y計算(X2-3Y)/2→ZDATA SEGMENTXDB25YDB32ZDW?DATA ENDSCODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DS MOVDS,AX MOVAL,X MULAL;X^2 MOVBL,Y ADD BL,BL ADD BL,Y;3Y SUBAX,BX;X^2-3Y SHR AX,1;(X^2-3Y)/2 MOVZ,AX;存結(jié)果MOVAH,4CH;返回DOSINT21HCODEENDS

END

STATR;匯編結(jié)束順序程序的設計和運行都是比較簡單的,但是實際應用中往往需要根據(jù)不同的情況和條件作出不同的處理,順序程序是無法實現(xiàn)的,因此可以采用分支程序來完成。分支程序就是根據(jù)不同的情況或條件執(zhí)行不同功能的程序,它具有判斷和轉(zhuǎn)移功能,在程序中利用條件轉(zhuǎn)移指令對運算結(jié)果的狀態(tài)標志進行判斷,以實現(xiàn)轉(zhuǎn)移功能。分支程序常用的結(jié)構(gòu)形式有兩種:一種是簡單分支結(jié)構(gòu),另一種是多分支結(jié)構(gòu)。二、分支程序設計1、簡單分支程序設計雙分支條件?YN單分支條件?YN條件1?條件2?三個分支YYNN例:在內(nèi)存中,有一個字節(jié)單元NUM存有帶符號數(shù)據(jù),計算出它的絕對值后并放入RESULT單元中。分析:根據(jù)數(shù)學中絕對值的概念可知,一個正數(shù)的絕對值是它本身,而一個負數(shù)的絕對值是它的相反數(shù)。如要計算一個數(shù)的相反數(shù),就要完成減法運算,即用零減去這個數(shù)。而8086系統(tǒng)有專用的求反指令NEG。X→ALAL≥0?YN開始結(jié)束將AL中的內(nèi)容求補AL→RESULTDATASEGMENTXDB-25RESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX ;初始化MOVAL,X ;X取到AL中TESTAL,80H ;測試AL正負JZ NEXT ;為正轉(zhuǎn)NEXTNEG AL ;否那么AL求補NEXT:MOVRESULT,AL ;送結(jié)果MOVAH,4CHINT 21H ;返回DOSCODE ENDSEND START ;匯編結(jié)束例:VAR單元內(nèi)有一自變量X,請按如下條件編出求函數(shù)值Y并將它存入FUNC單元的程序。Y=X>00X=0-1X<0算法:這是一個三分支歸一的條件轉(zhuǎn)移問題。由題意可知,自變量X是個帶符號數(shù),故可采用與零比較和條件轉(zhuǎn)移指令來做。DATASEGMENTVARDB-25FUNCDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,VARCMPAL,0

JGE

LOOP1MOVAL,0FFHJMPEXITLOOP1:JELOOP2MOVAL,01H

JMPEXIT

LOOP2:MOVAL,00HEXIT:MOVFUNC,ALMOVAH,4CHINT21HCODEENDSENDSTART

ALXAL≥0?AL=0?AL-1AL1AL0FUNCALYYNN開始結(jié)束結(jié)論:不管哪一種分支形式,它的運行方向是向前的,在某一種確定條件下,只能執(zhí)行多個分支中的一個分支。程序的控制流向不能再回到進入此結(jié)構(gòu)的入口,因此也把這樣的程序結(jié)構(gòu)稱之為“開式結(jié)構(gòu)〞。問題:在實際應用中還經(jīng)常會遇到一些具有相同或類似的操作需要重復執(zhí)行屢次的問題,對于這樣的問題該如何解決?在程序中,往往要求某一段程序重復執(zhí)行屢次,這時候就可以利用循環(huán)程序結(jié)構(gòu)。這里把能按一定規(guī)律,屢次重復執(zhí)行的一串語句,叫作循環(huán)程序。1、循環(huán)程序的組成一個循環(huán)結(jié)構(gòu)由以下幾局部組成:(1)循環(huán)初始化局部:這是為了保證循環(huán)程序能正常進行循環(huán)操作而必須做的準備工作。循環(huán)初值分兩類:一類是循環(huán)工作局部的初值,另一類是控制循環(huán)結(jié)束條件的初值。(2)循環(huán)工作局部:即需要重復執(zhí)行的程序段,這是循環(huán)的中心,即循環(huán)體。(3)循環(huán)參數(shù)修改局部:按一定規(guī)律修改操作數(shù)地址及控制變量,以便每次執(zhí)行循環(huán)體時得到新的數(shù)據(jù)。(4)循環(huán)控制局部:用來保證循環(huán)程序按規(guī)定的次數(shù)或特定條件正常循環(huán)。(5)循環(huán)結(jié)束局部:主要用來分析和存放程序的結(jié)果。三、循環(huán)程序設計2、循環(huán)結(jié)構(gòu)處理部分未結(jié)束直到型循環(huán)(先執(zhí)行后判斷結(jié)構(gòu))控制部分結(jié)束處理初始化部分修改部分處理部分未結(jié)束當型循環(huán)(先判斷后執(zhí)行結(jié)構(gòu))控制部分結(jié)束處理初始化部分修改部分例:編寫程序完成求1+2+3+…N的累加和,直到累加和超過1000為止。統(tǒng)計被累加的自然數(shù)個數(shù)送CN單元,并把累加和送SUM單元。

初始化0→AX,0→BXAX≤1000?BX→CN,AX→SUMYNN開始結(jié)束BX+1→BXAX+BX→AXDATASEGMENT SUMDW? CNDW?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX ;初始化 MOVAX,0 ;0送AXMOV BX,0 ;0送BXLP:INC BX ;BX加1 ADD AX,BX ;求累加和 CMP AX,1000;比較 JBE LP ;≤1000轉(zhuǎn) MOV SUM,AX MOV CN,BX ;送結(jié)果 MOV AH,4CH INT 21H ;返回DOSCODEENDS END START ;匯編結(jié)束例:在ADDR開始的單元中存放著一個字,將字中1的個數(shù)存入COUNT單元中。算法:要測出1的個數(shù)就應逐位比較,可根據(jù)最高有效位是否為1來計數(shù),然后用移位的方法把各位數(shù)逐次移到最高位去??梢杂脺y試字是否為0來作為結(jié)束條件,這樣可縮短程序的執(zhí)行時間,對不同的字循環(huán)次數(shù)不同,因此采用當型循環(huán)結(jié)構(gòu)。CX=0字=0?字為負?CX←CX+1COUNT←CX字邏輯左移1位NYN開始YN結(jié)束DATASEGMENTADDRDW76A3HCOUNTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA

START:

MOVAX,DATAMOVDS,AXMOVCX,0MOVAX,ADDRREPEAT:TESTAX,0FFFFHJZEXITJNSSHIFTINCCXSHIFT:SHLAX,1JMPREPEAT

EXIT:MOVCOUNT,CX

MOVAH,4CHINC21HCODEENDSENDSSTART例:軟件延時。利用每一條指令的執(zhí)行時間(用n個T表示)來構(gòu)成規(guī)定時間的延時。本例通過適當設置BL的內(nèi)容,來實現(xiàn)1s的延時。分析:采用雙重循環(huán)實現(xiàn)延時,內(nèi)循環(huán)構(gòu)成根本延時單元10ms,外循環(huán)完成100*10ms的操作。SOFTDLYPROC MOVBL,100;延時100*10ms=1s,4TDELAY:MOVCX,2801;4TWAIT:LOOPWAIT;延時10ms,內(nèi)循環(huán),(17/5)T DECBL;2T JNZDELAY

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論