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

下載本文檔

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

文檔簡介

第5章匯編語言程序設計

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

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

5.1匯編語言的基本概念

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

DATA SEGMENTA DW 123B DW 456SUM DW ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AXMOVAX,AADDAX,B MOVSUM,AX

MOVAH,4CHINT21H

CODEENDSENDSTART

5.1.1

匯編語言源程序結(jié)構(gòu)二、匯編語言語句

指令性語句是能產(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,PORT2、寄存器

80X86的寄存器可以作為指令的操作數(shù)。

8位AHALBHBLCHCLDHDL16位AXBXCXDXBPSPSIDICSDSSSES3、變量變量是內(nèi)存中的數(shù)據(jù),在程序中作為存儲器操作數(shù)來使用。在除代碼段以外的其它段中定義。變量主要有三種屬性:①段值—變量定義所在段的段地址②偏移量—變量單元地址與段起始地址之間的位移量。③類型—有字節(jié)、字和雙字三種。4、標號標號是可執(zhí)行指令語句所存放單元的符號地址,可作為轉(zhuǎn)移指令的轉(zhuǎn)移地址。

標號也有三種屬性:段值總是在CS段寄存器中,偏移量概念與變量同,類型分NEAR和FAR兩種。NEAR—表示標號所在語句與轉(zhuǎn)移指令或調(diào)用指令在同一代碼段內(nèi),只需改變IP即可。FAR—標號所在語句與轉(zhuǎn)移指令或調(diào)用指令不在同一碼段內(nèi)。

5、表達式

表達式由運算對象及運算符組成,運算對象可以是常數(shù)、寄存器、變量或標號。在匯編時由匯編程序?qū)λM行運算,得到的運算結(jié)果可以是一個常數(shù),也可以是一個存儲器的地址。表達式中的各類運算符如下:

有+、-、*、/,以及MOD,其中MOD表示除法運算后得到的余數(shù)。例:

19/7的商是2,19MOD7則為5(余數(shù))

算術(shù)運算符可以用于數(shù)字表達式,例:

MOVAL,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)邏輯運算符

共有6個,它們?yōu)椋?/p>

EQ(相等),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。

OFFSET運算符用來取存儲單元的偏移量。例:MOVSI,OFFSETSTRI1;將變量STRI1的地址偏移量

取到SI中。

注意與MOVSI,STRI1的差別。

但它與

LEASI,STRI1等價。

SEG運算符用來取存儲單元的段值。例:MOVAX,SEGSTRI1

;將變量STRI1所

MOVDS,AX

;在段值取到DS中(4)數(shù)值返回運算符(5)屬性運算符

用來建立或改變已定義變量、內(nèi)存操作數(shù)或標號的類型屬性。運算符有:段操作符“:”、PTR、THIS、SHORTMOVAX,ES:STRI1INCBYTEPTR[BX]

5.1.2匯編語言程序與DOS操作系統(tǒng)的接口1)標準方法EXP1PROC FARSTART:PUSHDS MOVAX,0 PUSH AX

RETEXP1ENDP2)非標準方法

MOVAX,4C00HINT21H

從START標號開始的三句為返回DOS設置返回地址,它相當于把DS:0000H壓棧.

連接程序為每一個用戶程序建立了一個程序段前綴區(qū),在前綴區(qū)開始處安排了一條INT20H,在過程結(jié)束時通過RET返回DOS。

在程序結(jié)尾處執(zhí)行功能號為4CH的DOS系統(tǒng)功能調(diào)用

在源程序中使用一些約定的符號,這些符號用來告訴匯編程序應如何工作,這就是匯編控制指令,也稱偽指令。偽指令語句包含在源程序中,由匯編程序?qū)υ闯绦蜻M行匯編時解釋執(zhí)行。偽指令語句除了本身可以申請分配一部分存儲空間用作數(shù)據(jù)區(qū)和堆棧區(qū)外,不產(chǎn)生任何目標代碼。在將源程序翻譯成目標程序后,偽指令語句就不存在了。5.2偽指令語句5.2.1數(shù)據(jù)定義偽指令

常用的變量定義偽指令有DB、DW、DD、DQ、DT,分別用來定義字節(jié),單字、雙字、四字及十字節(jié)類型變量。它們的基本應用格式如下:[變量名]{DB|DW|DD|DQ|DT}〈表達式〉

其中,變量名是可選的,{}表示其中的偽操作命令必須選用一種,表達式有如下幾種應用形式:

1.數(shù)值表達式這種形式定義的變量具有表達式給定的數(shù)值初值。例如:ABCDB

4*10H;變量ABC為字節(jié)類型,初值為64

BETDW1234H;變量BET為字類型,低位地址存放

34H,高位地址存放12H2.ASCII字符串

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

MSG1DB‘123456'

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

MSG2DW'AB',‘123','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.2符號定義偽指令

符號定義偽指令有EQU、=。1.等價偽指令EQU

使用格式為:名字EQU表達式

EQU偽指令的功能是將數(shù)值或字符序列與一個指定的名字等價。如此能增加匯編程序可讀性,給程序的設計與維護帶來方便。下面的例子列舉了EQU偽指令的常見用法:

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.3段定義偽指令1.SEGMENT和ENDS偽指令1)語句格式利用SEGMENT和ENDS可把源程序模塊劃分成若干個源程序段,它的格式為:

〈段名〉SEGMENT[定位方式][組合方式][分類名]

;段內(nèi)所有語句

〈段名〉ENDS

其中,段名是為該段起的名字;定位方式、組合方式和分類名是可選的,選兩個以上時,書寫順序必須與格式中的順序一致。這三個可選操作數(shù)都是通過匯編給鏈接程序提供控制信息的。鏈接時,先處理組合方式,再處理定位方式,最后處理分類名。2)定位方式

定位方式通過匯編告知LINK程序如何將經(jīng)組合后的新段定位到存儲器中。定位方式有四種,即BYTE、WORD、PARA和PAGE方式。①BYTE方式:規(guī)定段可以從任何地址開始,它使本段與前面段間不留任何間隙。②WORD方式:規(guī)定段只能從偶地址開始,它使得段間可能留一個字節(jié)的間隙。③PARA方式:規(guī)定段從16的整數(shù)倍地址(指物理地址)開始,它使得段間可能留有1到15個字節(jié)的間隙。這也是一種缺省方式。④PAGE方式:規(guī)定段從256的整數(shù)倍地址開始,它使得段間可能留有1到255個字節(jié)的間隙。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

它表示該段的目的代碼從偏移地址100的位置開始產(chǎn)生,這是第一個ORG的功能。第二個ORG是為變量XX產(chǎn)生十個未初始化的字后,又跳過五個字節(jié),再繼續(xù)生成目的代碼。5.2.4過程定義偽指令

在程序設計中,常把具有一定功能的程序設計成一個子程序,子程序的使用不僅減少了目標代碼的生成數(shù)量。而且便于實現(xiàn)程序的模塊化。匯編語言中,子程序通常以過程的形式編寫,通過使用過程定義偽指令PROC和ENDP來定義一個過程,然后再通過CALL指令實現(xiàn)調(diào)用。過程定義偽指令的格式如下:

〈過程名〉PROC[類型]

RET 〈過程名〉ENDP

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

[NAME<模塊名>]

END[標號]

其中,模塊名是為該模塊起的名字,NAME語句行可缺省,缺省時該模塊的源程序文件名就是模塊名。匯編時,一個模塊就是一個匯編單位。匯編處理只進行到模塊結(jié)束語句END為止。如果該模塊是主模塊,END語句可以指出一個標號,它表示該程序的啟動地址。一次被連接的各模塊中只能有一個是主模塊,即程序只能有一個啟動地址。DOS系統(tǒng)功能調(diào)用:是微機的磁盤操作系統(tǒng)DOS(DiskOperatingSystem)為用戶提供的一組例行子程序,操作更簡易,對硬件的依賴更少一些,使用軟中斷指令I(lǐng)NT21H軟中斷所完成的各項功能。5.3DOS系統(tǒng)功能調(diào)用主要功能:1)磁盤的讀/寫以及控制管理

2)內(nèi)存管理

3)基本的輸入輸出管理(鍵盤、顯示器、打印機等)另外還有時間、日期管理調(diào)用方法:1)入口參數(shù)送到指定寄存器中

2)系統(tǒng)功能號送到AH寄存器中

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:MOVDL,TEXT[BX]MOVAH,5INT21HINCBXLOOPNEXT

……AH功能調(diào)用參數(shù)

05H打印一個字符DL=字符5.5匯編語言程序設計舉例匯編語言程序設計的基本步驟如下:

①分析問題,抽象出描述問題的數(shù)學模型,確定解決問題的合適算法;②繪制抽象流程圖或?qū)懗龀橄蟛襟E,可以從粗到細把算法逐步地具體化;③分配存儲空間及工作單元,根據(jù)框圖編寫程序;④靜態(tài)檢查源程序;⑤上機調(diào)試程序,按設計要求對程序運行正確性作全面測試。5.5.1順序程序設計

這種程序的形式最簡單,計算機執(zhí)行程序的方式是指令逐條依次被執(zhí)行,不進行判斷和跳轉(zhuǎn),直到程序結(jié)束。例:求兩個數(shù)的平均值。這兩個數(shù)分別存放在X單元和Y單元中,而平均值放在Z單元中。DATASEGMENT X DB5FH Y DB57H Z DB?DATAENDSSTACSEGMENTDW20HDUP(?) TOPLABELWORDSTACENDS

CODESEGMENT

MAINPROCFAR

ASSUMECS:CODE,DS:DATA,SS:STAC

START:PUSHDS MOVAX,0 PUSHAX

MOVAX,DATA MOVDS,AX MOVAX,STAC MOVSS,AX MOVSP,OFFSETTOP

MOVAL,X ADDAL,Y MOVAH,0 ADCAH,AH SHRAX,1 MOVZ,AL

RET

MAINENDPCODE ENDS

ENDSTART例:假設多項式:編制一個程序,計算自變量X=6時,函數(shù)f(x)的值。算法:如采用代用法,直接計算多項式的值,則至少要做6次乘法和3次加減法,并且要使用較多的寄存器暫存中間結(jié)果,所以可采用秦九韶算法,把f(x)變形為

秦九韶算法適用多項式的求值問題,把n次多項式的求值問題轉(zhuǎn)化成求n個一次多項式的值的問題。SSEGSEGMENTSTACKDB1024DUP(0)SSEGENDSDATASEGMENTXDW6RESDW?DATAENDSCODESEGMENT

ASSUMECS:CODE,DS:DATA,SS:SSEGSTART:MOVAX,DATAMOVDS,AXMOVAX,5MULXADDAX,4MULXSUBAX,3MULXADDAX,21MOVRES,AXMOVAX,4C00HINT21HCODEENDS

ENDSTART

順序程序的設計和運行都是比較簡單的,但是實際應用中往往需要根據(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)。5.5.2分支程序設計1、簡單分支程序設計雙分支條件?YN單分支

條件?YN三分支條件1?條件2?YYNN例:已知在內(nèi)存中,有一個字節(jié)單元X存有帶符號數(shù)據(jù),計算出它的絕對值后并放入RES單元中。分析:根據(jù)數(shù)學中絕對值的概念可知,一個正數(shù)的絕對值是它本身,而一個負數(shù)的絕對值是它的相反數(shù)。如要計算一個數(shù)的相反數(shù),就要完成減法運算,即用零減去這個數(shù)。而8086系統(tǒng)有專用的求補指令NEG。

X→ALAL≥0?YN

開始

結(jié)束將AL中的內(nèi)容求補AL→RES

DATASEGMENTXDB-25RESDB?

DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX ;初始化

MOVAL,X ;X取到AL中

TESTAL,80H ;測試AL正負

JZ NEXT

;為正轉(zhuǎn)NEXTNEG AL ;否則AL求補

NEXT:MOVRES,AL ;送結(jié)果

MOVAH,4CHINT 21H ;返回DOSCODEENDSEND 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é)束

條件?N=0N=nN=2N=1

這種方法常用于多路分支的情況,每路分支起始地址可定義為SUB0、SUB1…。并把這些起始地址組成一個表,稱為跳轉(zhuǎn)表,表內(nèi)每兩個字節(jié)存放一個入口地址的偏移量,然后根據(jù)有規(guī)律的索引值,采用寄存器間接尋址方式,執(zhí)行無條件轉(zhuǎn)移指令,即可轉(zhuǎn)向不同的分支進行處理,最后匯合到出口處。2、多分支程序設計例:利用匯編語言編制多分支(散轉(zhuǎn))程序,完成如下結(jié)構(gòu)程序設計。

INDEX=0→F=2X

INDEX=1→F=Y-X/2

INDEX=2→F=2Y

INDEX=3→F=Y/2

INDEX=4→F=100算法:首先將5個分支的起始地址組成一個數(shù)據(jù)表存在數(shù)據(jù)段中,并使BX指向數(shù)據(jù)表起始位置;由于數(shù)據(jù)表中每一項占兩個字節(jié)寬度,因此使用寄存器間接跳轉(zhuǎn)指令前應先將索引值乘2再與BX相加。BX分支表首址

SI[INDEX]×2按INDEX轉(zhuǎn)移FY-X/2F2YF100F2X=0=4=2=1開始FY/2=3返回DOS結(jié)束DATA

SEGMENTINDEXDB?XDB?YDB?

TABLEDWSUB0,SUB1,SUB2SUB3,SUB4RESULTDB?DATA

ENDSCODE

SEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABLEMOVSI,INDEXADDSI,SI

JMPWORDPTR[BX+SI]SUB0:MOVAL,XSHLAL,1MOVRESULT,ALJMPEXITSUB1:MOVAL,XSARAL,1MOVAH,YSUBAH,ALMOVRESULT,AHJMPEXITSUB2:MOVAL,YSHLAL,1MOVRESULT,ALJMPEXITSUB3:MOVAL,YSARAL,1MOVRESULT,ALJMPEXITSUB4:MOVRESULT,100EXIT:MOVAH,4CHINT21HCODE

ENDSENDSTART結(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é)果。

5.5.3循環(huán)程序設計2、循環(huán)結(jié)構(gòu)處理部分未結(jié)束直到型循環(huán)(先執(zhí)行后判斷結(jié)構(gòu))控制部分結(jié)束處理初始化部分修改部分處理部分未結(jié)束當型循環(huán)(先判斷后執(zhí)行結(jié)構(gòu))控制部分結(jié)束處理初始化部分修改部分

開始AL←[xx],BX←xx,CX←29BX←BX+1AL≥[BX]?AL,[BX]中的數(shù)交換

CX←CX-1CX=0?yy←AL

結(jié)束YYNN例:在xx單元開始的連續(xù)單元中存放有30個無符號數(shù),從中找出中最大者送yy單元。

DATA SEGMENT xxDB49,38,65,12,97,13,55,27,28,85… yyDB? DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX

LEA BX,xx MOVAL,[BX] MOVCX,29 LOOP1:INCBX CMP AL,[BX] JAENEXT XCHGAL,[BX] NEXT:LOOPLOOP1 MOVyy,AL MOVAH,4CH INT21H CODE ENDS ENDSTART例:在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,4CHINC21HCODEENDS

ENDSTART例:軟件延時。利用每一條指令的執(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;4TDELAY:MOVCX,2801;4TWAIT:LOOPWAIT;內(nèi)循環(huán)延時10ms,(17/5)T DECBL;2T JNZDELAY;外循環(huán),延時1s,16/4T RET

SOFTDLYENDP

主頻為4.77MHz,T=1/4.77M≈210ns,則內(nèi)、外循環(huán)的延時時間:

T內(nèi)=[17(n-1)+5+4]×T≈10ms,n=2801T外=100×(T內(nèi)+18T)≈1s

結(jié)論:對于循環(huán)次數(shù)是未知的情況,通常采用當型循環(huán)結(jié)構(gòu),根據(jù)具體情況來確定循環(huán)控制結(jié)束條件。對于循環(huán)次數(shù)是已知的情況,一般采用直到型循環(huán)結(jié)構(gòu),用計數(shù)法來控制循環(huán);但有些情況為縮短程序的執(zhí)行時間,也可選擇適當?shù)难h(huán)控制條件,采用當型循環(huán)結(jié)構(gòu)。

循環(huán)程序結(jié)構(gòu)解決了同一程序中某個程序段需要按規(guī)律連續(xù)重復執(zhí)行問題。在實用中,還常常遇到功能完全相同的程序段,或不在同一程序模塊,或雖在同一程序模塊且需要重復執(zhí)行,但不是連續(xù)重復執(zhí)行。對于這種非連續(xù)多次重復的功能程序段,為避免編制程序的重復勞動,節(jié)省存儲空間,往往把程序段獨立出來,附加少量額外語句,將其編制成公用子程序,供程序其他地方需要時調(diào)用。這種程序設計方法稱之為子程序設計。子程序一般由以下部分組成:①保存子程序運行時將被破壞的寄存器的內(nèi)容-保存現(xiàn)場。②依入口參數(shù)從指定位置取要加工處理的信息。③對信息進行處理。④依出口參數(shù)向指定位置送經(jīng)加工處理后的結(jié)果信息。⑤返回調(diào)用程序。5.5.4子程序設計注意:

1、使用RET時,有一種帶有參數(shù)的返回指令

RETOP;(SP+OP)IP

為丟棄已用過的傳遞參數(shù),是16位尋址方式,OP為參數(shù)個數(shù)的2倍。

2、現(xiàn)場(寄存器內(nèi)容)的保護和恢復⑴對發(fā)生沖突的寄存器內(nèi)容要進行保護和恢復;⑵進行主程序和過程間傳遞參數(shù)的寄存器內(nèi)容不進行保護和恢復。

3、主程序和過程間的參數(shù)傳遞入口參數(shù):過程所需的初始數(shù)據(jù);出口參數(shù):回送給主程序的結(jié)果;參數(shù)傳遞:入口參數(shù)的傳遞和出口參數(shù)的送出,可以通過寄存器、存儲單元和堆棧區(qū)域進行傳遞。

CODESEGMENT

SOFTDLYPROC

MOVBL,100;延時100*10ms=1s,4T

DELAY:MOVCX,2801;4TWAIT:LOOPWAIT;延時10ms,內(nèi)循環(huán),(17/5)T

DECBL;2T JNZDELAY;外循環(huán),延時1s,16/4T RET

SOFTDLYENDPCALLDELAY100CODEENDSENDSTART

例:編寫一軟件延時子程序,延時時間為1s。(無參數(shù)傳遞)

PROADDPROC

PUSHREG;宏調(diào)用保護現(xiàn)場

LEASI,ARYMOVCX,COUNTXORAX,AXMOVDX,AXAGAIN:ADDAX,[SI]JNCNEXTINCDXNEXT:ADDSI,2LOOPAGAINMOVSUM,AXMOV[SUM+2],DX

POPREG;宏調(diào)用恢復現(xiàn)場

RETPROADDENDPMOVAH,4CHINT21HCODEENDSEND例:在某一程序中,許對N個元素的數(shù)組求和。(帶參數(shù)傳遞)DATA SEGMENTARY DW 100DUP(?)COUNT DW ?;存數(shù)組長SUM DW 2DUP(?)DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATABEGIN:MOV AX,DATA MOV DS,AX

CALLPROADD

計算機經(jīng)常要處理字符,常用的字符編碼是ASCII碼。在使用ASCII碼字符時,要注意以下幾點:1)ASCII碼的數(shù)字和字符形成一個有序序列。例如數(shù)字0~9的ASCII碼為30H~39H,大寫字母A~Z的ASCII碼為41H~5AH等。2)一些廣泛使用的控制字符如下:①0AH換行(LF)②0DH回車(CR)5.4.5字符串處理程序設計

串長度初值為0=CR?YN

開始

返回

取串元素

串長度加1

存串長度例:從頭搜索字符串的結(jié)束標志(CR),統(tǒng)計搜索的字符個數(shù)。

DATA SEGMENTSTRINGDB'ABCDUVWXYZ',0DHLLDB?CREQU0DHDATA ENDSSTACKSEGMENT DB100DUP(?)STACKENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDS MOVAX,0 PUSHAX MOVAX,DATA

MOVDS,AX

MOVES,AXLEADI,STRING;設串的地址指針

MOVDL,0;置串長度初值為0 MOVAL,CR;串結(jié)束標志→ALAN:SCASB;搜索串

溫馨提示

  • 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

提交評論