




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第五章 匯編語言程序設(shè)計5.1
匯編語言的基本概念匯編語言是機器語言的符號表示,是用指令的助記符、符號地址、標(biāo)號等書寫程序的語言。用匯編語言編寫的程序,叫匯編語言源程序,或簡稱源程序。只有將源程序翻譯成目標(biāo)程序,才能在機器上運行,這種把匯編語言程序翻譯成機器語言程序的過程稱為匯編?!鲇嬎銠C完成匯編任務(wù)是由匯編程序(MASM-Macro
Assembler)這樣一個軟件工具實現(xiàn)的,匯編程序加工的對象是匯編語言源程序,加工的結(jié)果是目標(biāo)程序。一、分段結(jié)構(gòu)匯編語言的一個實例DW
123DW
456DW
?ENDSDATA
SEGMENTABSUMDATACODESEGMENTASSUME
CS:CODE,DS:DATASTART:MOV
AX,DATAMOV
DS,AXMOV
AX,
AADD
AX,
BMOV
SUM,AXMOV
AH,
4CHINT
21HCODE
ENDSEND
START5.1.1
匯編語言源程序結(jié)構(gòu)二、匯編語言語句指令性語句是能產(chǎn)生目標(biāo)代碼,CPU可以執(zhí)行的能完成特定功能的語句。b其格式為:b
[標(biāo)號:][前綴]指令助記符操作數(shù)[;注釋]指示性語句,又叫偽指令是沒有對應(yīng)的機器指令,不能執(zhí)行,只給匯編程序提供一種信息,用來定義變量,分配存儲單元,指示程序開始和結(jié)束等。b其格式為:b
[名字]偽指令定義符操作數(shù)[;注釋]b名字是給偽指令取的名稱,通常是變量名、段名、過程名、符號名等。b兩種語句的區(qū)別:b在形式上:帶不帶冒號,是否可轉(zhuǎn)向它。
在本質(zhì)上:匯編時能否形成對應(yīng)的機器碼。b?三、操作數(shù)(數(shù)據(jù)項)匯編語言中使用的操作數(shù)可以是常數(shù)、寄存器、名字(變量)、標(biāo)號或表達式?1、常數(shù)1)數(shù)字常量用于偽指令中給變量賦值,或作為指令語句中的立即數(shù)、直接地址。b
2)字符串常量b
用單引號引起來的字符或字符串也代表常數(shù)。b例:’A’,’BCDE’,匯編時被翻譯成對應(yīng)的ASCII碼41H和42H,b
43H,44H,45H。b
3)符號常量b
PORT
EQU
20H2、寄存器80X86的寄存器可以作為指令的操作數(shù)。8位AH
AL
BH
BLCH
CL
DH
DL16位AX
BX
CX
DXBP
SP
SI
DI
CS
DS
SS
ES32位EAX
EBX
ECXEDX
EBP
ESP
ESI
EDIDS
ES
SS
CSFS
GS3、變量變量是內(nèi)存中的數(shù)據(jù)區(qū),在程序中作為存儲器操作數(shù)來使用。在除代碼段以外的其它段中定義。變量主要有三種屬性:①段
值—變量定義所在段的段地址②偏移量—變量單元地址與段起始地址之間的位移量。③類
型—主要有字節(jié)、字和雙字三種。4、標(biāo)號標(biāo)號是可執(zhí)行指令語句所存放單元的符號地址,可作為轉(zhuǎn)移指令的轉(zhuǎn)移地址。標(biāo)號也有三種屬性:段值總是在CS段寄存器中,偏移量概念與變量同,類型分NEAR和FAR兩種。NEAR—表示標(biāo)號所在語句與轉(zhuǎn)移指令或調(diào)用指令在同一代碼段內(nèi),只需改變IP即可。FAR—標(biāo)號所在語句與轉(zhuǎn)移指令或調(diào)用指令不在同一碼段內(nèi)?!觥觥?、表達式■表達式由運算對象及運算符組成,運算對象可以是常數(shù)、寄存器、變量或標(biāo)號。在匯編時由匯編程序?qū)λM行運算,得到的運算結(jié)果可以是一個常數(shù),也可以是一個存儲器的地址。表達式中的各類運算符如下:有+、-、*、/,以及MOD,其中MOD表示除法運算后得到的余數(shù)。例:■■■■■19/7的商是2,19
MOD
7則為5(余數(shù))算術(shù)運算符可以用于數(shù)字表達式,例:
MOV
AL,2*7匯編時計算表達式形成指令為:MOV
AL,0EH算術(shù)運算符也可以用于地址表達式,對地址運算的結(jié)果應(yīng)有明確的物理意義,例兩個地址的乘或除無意義,而加或減則可以,例:■LEA
SI,SUM+3表示變量SUM的地址加上3得到的和作為新存儲器地址。(1)算術(shù)運算符邏輯運算符有AND、OR、XOR和NOT,它們只能用于數(shù)字表達式中。例:MOV
CL,36H
AND
0FH匯編時形成指令:MOV
CL,06H這些邏輯運算符也是8086/8088的指令助記符,但不會造成混亂,前者在匯編時進行,而后者在指令執(zhí)行時進行的?!隼篈ND
DX,PORT
AND
0FEH后一個邏輯運算符AND在匯編時進行,若PORT為81H,則匯編后表達式算出為80H。執(zhí)行前一個指令助記符AND時,將(DX)與80H相與,結(jié)果在DX中。(2)邏輯運算符PORT
EQU
81H■■■共有6個,它們?yōu)椋篍Q(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)關(guān)系運算符的兩個操作數(shù)必須都是數(shù)字或者是同一段內(nèi)的兩個存儲器地址?!鲫P(guān)系為真,結(jié)果為0FFH或0FFFFH關(guān)系為假,結(jié)果為0例:MOV
BX,PORT
GE
5若PORT的值大于等于5,則匯編后為:MOV
BX,0FFFFH若PORT的值小于5,則匯編后為:MOV
BX,0(3)關(guān)系運算符■■它可以把存儲器一些特征作為數(shù)值送回。這些操作符有OFFSET,SEG,TYPE,SIZE及LENGTH。OFFSET運算符用來取存儲單元的偏移量。例:MOV
SI,OFFSET
STRI1;將變量STRI1的地址偏移量取到SI中?!觥鲎⒁馀cMOV
SI,STRI1的差別。但它與LEASI,STRI1等價。SEG運算符用來取存儲單元的段值。例:MOV
AX,SEG
STRI1;將變量STRI1所;在段值取到DS中MOV
DS,AX(4)數(shù)值返回運算符TYPE運算符用來取變量或標(biāo)號的類型值存儲器單元類型對應(yīng)值DB(字節(jié))1DW(字)2DD(雙字)4DQ(四字)8DT(10字節(jié))10NEAR-1FAR-2LENTH運算符返回DUP定義的數(shù)據(jù)占據(jù)的元素個數(shù),其它返回1。SIZE運算符返回DUP定義的數(shù)據(jù)占據(jù)的字節(jié)數(shù),其它返回TYPE值。(5)屬性運算符用來建立或改變已定義變量、內(nèi)存操作數(shù)或標(biāo)號的類型屬性。運算符有:段操作符“:”、PTR、THIS、SHORT、HIGH、LOW■MOV
AX,
ES:STRI1■■INC BYTE
PTR[BX]BUFB
EQU
THIS
BYTE;建立一個指定類型的地址操作數(shù)BUFW
DW
1234H,5678H;
BUFB與BUFW的偏移地址完全■■相同,但類型不同■(6)其它運算符■(
)、[]5.1.2匯編語言程序與DOS操作系統(tǒng)的接口1)標(biāo)準(zhǔn)方法EXP1 PROC
FARSTART:PUSH
DSMOV
AX,0PUSH
AXRETEXP1
ENDP2)非標(biāo)準(zhǔn)方法MOV
AX,4C00HINT
21H從START標(biāo)號開始的三句
為返回DOS設(shè)置返回地址,它相當(dāng)于把DS:0000H壓棧.連接程序為每一個用戶程序建立了一個程序段前綴區(qū),在前綴區(qū)開始處安排了一條
INT
20H,在過程結(jié)束時通過RET返回DOS。在程序結(jié)尾處執(zhí)行功能號為4CH的DOS系統(tǒng)功能調(diào)用在源程序中使用一些約定的符號,這些符號用
來告訴匯編程序應(yīng)如何工作,這就是匯編控制指令,也稱偽指令。偽指令語句包含在源程序中,由匯編程序?qū)υ?/p>
程序進行匯編時解釋執(zhí)行。偽指令語句除了本身可
以申請分配一部分存儲空間用作數(shù)據(jù)區(qū)和堆棧區(qū)外,不產(chǎn)生任何目標(biāo)代碼。在將源程序翻譯成目標(biāo)程序
后,偽指令語句就不存在了。5.2
偽指令語句5.2.1
數(shù)據(jù)定義偽指令常用的變量定義偽指令有DB、DW、DD、DQ、DT,分別用來定義字節(jié),單字、雙字、四字及十字節(jié)類型變量。它們的基本應(yīng)用格式如下:[變量名]{DB|DW|DD|DQ|DT}〈表達式〉其中,變量名是可選的,{}表示其中的偽操作命令必須選用一種,表達式有如下幾種應(yīng)用形式:1.數(shù)值表達式這種形式定義的變量具有表達式給定的數(shù)值初值。例如:ABC
DB
4*10H;變量ABC為字節(jié)類型,初值為64BET
DW
1234H;變量BET為字類型,低位地址存放34H,高位地址存放12H2.ASCII字符串字符串必須用單引號括起來。DB偽指令為串中每一個字符分配一個字節(jié)單元,且自左至右按地址遞增的順序依次存放,字符個數(shù)不得超過255個。例如MSG1
DB
"msgtest"對于DW偽指令,可以給兩個字符組成的字符串分配兩個字節(jié)存儲單元,而且這兩個字符的存儲順序是前一個字符在高字節(jié),后一個字符在低字節(jié)只取前兩個字符。每一個數(shù)據(jù)項不能多于兩個字符,若超過2個字符,只取前兩個字符。例如:MSG2
DW
"AB",‘123","ef"地址表達式地址表達式的運算結(jié)果是一個地址,因此只能用DW或DD來定義。如果用DW定義,則將原變量或標(biāo)號的偏移地址定義為新變量;如果用DD來定義,則將原變量或標(biāo)號的偏移地址和段地址分別置入新變量的低位和高位字中。例如:AD1
DD
BETA1;變量的初值為BETA1的段地址和偏移地址AD2
DW
BETA2;變量的初值為BETA2的偏移地址4.?問號表示所定義的變量未指定初值。例如:BUF
DW?;定義一個字變量BUF,初值為一隨機數(shù)5.<n>DUP<表達式>這種情況用于定義重復(fù)變量,DUP(Duplication)是重復(fù)數(shù)據(jù)操作符,n表示重復(fù)次數(shù),圓括號內(nèi)的表達式表示要重復(fù)的內(nèi)容。例如:TAB
DB
100
DUP(0);從變量TAB開始有100個初值為零的字節(jié)元素
DUP操作符可以嵌套使用,即圓括號中的表達式又是一個帶DUP的表達式。例如:TAB
DW
2
DUP(5
DUP(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、=、LABEL幾種。1. 等價偽指令EQU名字
EQU 表達式EQU偽指令的功能是將數(shù)值或字符序列與一個指定的名字等價。如此能增加匯編程序可讀性。給程序的設(shè)計與維護帶來方便。下面的例子列舉了EQU偽指令的常見用法:THREE
EQU
3 ;名字THREE與數(shù)值3等價SIXTH
EQU
THREE*(17+THREE);SIXTH等價于3*(17+3)P
EQU ES:[BX]
;P與ES:[BX]等價Y
EQU
P[SI] ;Y與ES:[BX][SI]等價2. 等號偽指令“=”“=”偽指令與EQU偽指令具有相同的功能,區(qū)別僅在于“=”偽指令定義的符號允許重新定義,使用更靈活方便。如:EMP=60 ;定義EMP等于常數(shù)60EMP=79EMP=EMP+1;重定義EMP等于常數(shù)79;又定義EMP等于常數(shù)803. 定義偽指令LABLE用來在某一變量或標(biāo)號的基礎(chǔ)上定義一個新的類型不同的變量或標(biāo)號。變量的類型有BYTE、WORD和DWORD;標(biāo)號的類型有NEAR和FAR。例如:VAR1VAR2LABEL
WORD
DB
20DUP(1)變量VAR1與VAR2具有相同的段基址和偏移量,但VAR2是字節(jié)型。5.2.3段定義偽指令1.SEGMENT和ENDS偽指令1)語句格式利用SEGMENT和ENDS可把源程序模塊劃分成若干個源程序段它的格式為:〈段名〉
SEGMENT[定位方式];段內(nèi)所有語句〈段名〉
ENDS[組合方式] [分類名]其中,段名是為該段起的名字;定位方式、組合方式和分類名是可選的,選兩個以上時,書寫順序必須與格式中的順序一致。這三個可選操作數(shù)都是通過匯編給鏈接程序提供控制信息的。鏈接時,先處理組合方式,再處理定位方式,最后處理分類名。2)組合方式源程序可以分成若干個模塊單獨編制與匯編,每個模塊又可劃分若干段,如果這些段都不太大卻又分別定義了不同的段名,則當(dāng)這些模塊鏈接起來并裝入機器運行時,由于程序段數(shù)可能大大超過當(dāng)前立即可用的由段寄存器確定的邏輯段數(shù)(僅四個),使程序運行極為不便。為此,如果將不同模塊中相同性質(zhì)的段使用同樣的段名,則連接這些模塊時就可以把同名的段按照指定的方式組合起來,既便于程序運行,又可以達到有效使用存儲空間之目的??晒┻x擇的組合方式有PUBLIC、STACK、AT、
COMMON、MEMORY以及NONE共六種。①PUBLIC
表示在滿足定位類型的前提下與其它模塊的同名段鄰接起來形成一個源程序段,共用一個段基址,運行時裝入同一個邏輯段。STACK
與PUBLIC類型同樣處理,只是組合后的這個段專門用作堆棧段,并自動初始化SS和SP。注意,被鏈接的所有模塊中至少應(yīng)該有一個STACK段,否則LINK時會提示出錯。COMMON
表示該段與其他模塊中被說明成COMMON的同名段共享相同的存儲區(qū)。AT〈數(shù)值表達式〉表示該段應(yīng)按絕對地址定位,段地址為數(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偽指令可達到此種功能,它告訴匯編一種匹配假設(shè),即哪個段寄存器將為哪個段名尋址。ASSUME <段寄存器>:<段名>[,<段寄存器>:<段名>]其中段名是程序中定義過的任何段名或組名。3.ORG偽指令該指令可用來設(shè)置段內(nèi)偏移地址。匯編程序開始對源程序
的某段進行匯編時,其地址計數(shù)器的初值相對于段地址總是零。接著依次累計段內(nèi)語句匯編后生成目的代碼的字節(jié)數(shù)。ORG偽指令可修改計數(shù)器的內(nèi)容。格式為:ORG 〈表達式〉它告知匯編,該指令后生成的目的代碼,從表達式提供的偏移地址開始存放。該指令的實際工作是把當(dāng)前段的匯編程序地址計數(shù)器置成表達式所確定的值。下面是使用ORG偽指令的例子:DATASEGMENTORG
100XX
DWORG
$+510
DUP(?)ORG
OFFSET
XX+256ARRAYB
DB
100 DUP(1,
-1)它表示該段的目的代碼從偏移地址100的位置開始產(chǎn)生,這是第一個ORG的功能。第二個ORG是為變量XX產(chǎn)生十個未初始化的字后,又跳過五個字節(jié),再繼續(xù)生成目的代碼。第三個ORG告知匯編字節(jié)變量ARRAYB從偏移地址356的位置開始存放。5.2.4
過程定義偽指令在程序設(shè)計中,常把具有一定功能的程序設(shè)計成一個子程序,子程序的使用不僅減少了目標(biāo)代碼的生成數(shù)量。而且便于實現(xiàn)程序的模塊化。匯編語言中,子程序通常以過程的形式編寫,通過使用過程定義偽指令PROC和ENDP來定義一個過程,然后再通過CALL指令實現(xiàn)調(diào)用。過程定義偽指令的格式如下:〈過程名〉
PROC [類型]RET〈過程名〉
ENDP過程名是為該過程起的名字,具有與語句標(biāo)號相同的屬性,即具有段地址、偏移地址和類型(NEAR和FAR)三個
屬性。5.2.5程序模塊的開始與結(jié)束偽指令NAME和END偽指令定義一個模塊需使用NAME和END兩條偽指令。指令格式如下:[NAME <模塊名>]END
[標(biāo)號]其中,模塊名是為該模塊起的名字,NAME語句行可缺省,缺省時該模塊的源程序文件名就是模塊名。匯編時,一個模塊就是一個匯編單位。匯編處理只進行到模塊結(jié)束語句END為止。如果該模塊是主模塊,END語句可以指出一個標(biāo)號,它表示該程序的啟動地址。一次被連接的各模塊中只能有一個是主模塊,即程序只能有一個啟動地址。5.3
宏指令語句宏指令是指程序員事先自定義的“指令”,這種指令是一組匯編語言語句序列的縮寫。此后在宏指令出現(xiàn)的地方,匯編程序自動把它們替換成相應(yīng)的語句序列。事實上,宏指令是“常用語句序列”的簡單代號。宏指令的使用過程是宏定義、宏調(diào)用、宏擴展。1.宏定義宏指令定義簡稱宏定義,它由四部分構(gòu)成:名字、開頭、宏體和結(jié)尾。其格式為:〈宏指令名〉
MACRO
[
[
形參
] [
,形參
]…]ENDM其中宏指令名是為該宏定義起的名字,可以象指令助記符一樣出現(xiàn)在源程序中。形參:僅用于宏定義內(nèi)部。形參間用逗號、也可用空格隔開。形參如同函數(shù)中的變量,在宏指令被調(diào)用時,其內(nèi)部形參位置將被相應(yīng)的實參所取代。形參為可選項,形參的使用使宏指令更加靈活。宏定義必須由偽指令MACRO開始,ENDM結(jié)束,MACRO和ENDM間的程序段稱為宏體。2.宏調(diào)用經(jīng)過宏定義,在源程序中任意位置可以直接引用宏指令名,構(gòu)成宏指令語句。宏指令名的引用就是宏調(diào)用,它要求匯編程序把定義的宏體目標(biāo)代碼拷貝到調(diào)用點。如果定義是帶參數(shù)的,就用宏調(diào)用時的實際參數(shù)替代形式參數(shù),其位置一一對應(yīng)。宏調(diào)用格式如下:〈宏指令名〉
[
[
實參
] [
,實參
]…]格式中的實參可以是數(shù)字、字符串、符號名。兩個以上的實參用逗號或空格隔開,它們在順序、屬性和類型上要同形參保持一致,否則將出現(xiàn)意想不到的錯誤。另外,也允許實參是帶間隔符的字符串,為不引起混淆,可帶上尖括號,匯編會將尖括號的內(nèi)容視為一個實參。實參的數(shù)目可以和形參的數(shù)目不一致。當(dāng)實參多于形參時,忽略多余的參數(shù);而當(dāng)實參少于形參時,剩余的形參處理為空白。3.宏擴展當(dāng)匯編程序掃描到源程序中的宏調(diào)用時,就把對應(yīng)宏定義的宏體指令序列插入到宏調(diào)用所在處,用實參替代形參,并在插入的每條指令前面加上一個“+”號,這一過程就稱為宏擴展。例:設(shè)三個參數(shù),將移位方向,被移位的對象及移位次數(shù)均設(shè)為參數(shù)。宏定義:MACRO
CN,R,SDCL,CNR,CLSHIFTMOVS&SDENDM當(dāng)參數(shù)為助記符的一部分時,用&將參數(shù)標(biāo)注出來,以便替換。宏調(diào)用:宏展開:SHIFT+
MOV+
SHL4,AX,HLCL,
4AX,
CL;將AX左移4次宏指令與子程序比較相同點:1)都是具有獨立功能的一段程序。2)都是可以被程序多次調(diào)用的程序段,并且調(diào)用前必須由設(shè)計者按一定格式設(shè)計。不同點:1)子程序由CALL調(diào)用、RET返回,匯編后子 程序只占有一個程序段,較為節(jié)省內(nèi)存;宏指令每一次宏展開時宏體都占一個程序段,調(diào)用次數(shù)越多,占用內(nèi)存越多,從內(nèi)存空間開銷來說,子程序優(yōu)于宏指令。2)宏調(diào)用時不需要保護和恢復(fù)斷點、現(xiàn)場,執(zhí)行時間較短。訪問的程序較長、訪問次數(shù)不是太多時訪問的程序較短、訪問次數(shù)較多時子程序宏指令■BIOS中斷調(diào)用:在存儲器系統(tǒng)中,內(nèi)存高端8KB的ROM中存放有基本輸入/輸出系統(tǒng)(BasicInput/Output
System,BIOS)例行程序。主要提供系統(tǒng)自檢及初始化、系統(tǒng)服務(wù)和硬件中斷處理等功能模塊。可以通過軟中斷指令
INT
n訪問(10H~1AH、40H)?!鯠OS系統(tǒng)功能調(diào)用:是微機的磁盤操作系統(tǒng)DOS(DiskOperating
System)為用戶提供的一組例行子程序,它與BIOS中斷執(zhí)行同樣的功能,而且操作更簡易,對硬件的依賴更少一些,使用軟中斷指令
INT
21H完成各項功能的調(diào)用。5.4
DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用主要功能:1)磁盤的讀/寫以及控制管理2)內(nèi)存管理3)基本的輸入輸出管理(鍵盤、顯示器、打印機等)另外還有時間、日期管理調(diào)用方法:1)系統(tǒng)功能號送到AH寄存器中入口參數(shù)送到指定寄存器中用INT
21H指令執(zhí)行功能調(diào)用有些系統(tǒng)功能調(diào)用比較簡單,不需要設(shè)置入口參數(shù)或者沒有出口參數(shù),則只需安排后兩個語句,調(diào)用返回完成時,系統(tǒng)將出口參數(shù)送到指定的寄存器中,或送屏幕顯示出來。一、鍵盤功能調(diào)用例:交互程序需用戶對一個提示做應(yīng)答時,需單字符輸入。GET_KEY:
MOV
AH,
1 CMP
AL,
‘N’INT
21H
JE
NOCMP
AL,
‘Y’ JNE
GET_KEYJE
YESAH功能返回參數(shù)01H從鍵盤輸入一個字符并回顯在屏幕上AL=字符07H從鍵盤輸入一個字符不回顯AL=字符0AH輸入字符到緩沖區(qū)DS:DX=緩沖區(qū)首地址從鍵盤輸入字符串。這是0AH號系統(tǒng)功能調(diào)用,要求預(yù)先定義一個輸入緩沖區(qū),將DS:DX指向緩沖區(qū),該區(qū)的第一個字節(jié)指出能容納的最大字符個數(shù);第二個字節(jié)存放實際輸入的字符個數(shù),由系統(tǒng)最后填入;從第三個字節(jié)開始存放從鍵盤接受的字符,直到ENTER鍵結(jié)束。定義緩沖區(qū):BUFF
DB
100DB
?;存放100字節(jié)的緩沖區(qū);系統(tǒng)輸入實際輸入字節(jié)數(shù)DB100DUP(?);存放輸入字符系統(tǒng)功能調(diào)用:MOV
DX,
OFFSET
BUFFMOV
AH,
0AHINT
21H二、顯示功能調(diào)用AH02H09H功能顯示一個字符顯示字符串調(diào)用參數(shù)DL=字符DS:DX=字符串首地址例:顯示一個單字符MOV
DL,
ALMOV
AH,
2INT
21H字符串輸出。9號功能調(diào)用,將指定的內(nèi)存緩沖區(qū)中的字符串從屏幕顯示輸出。要求DS:DX指向串地址首址,并且字符串必須以‘$’字符為結(jié)束符。例:在屏幕上顯示‘HOWDOYOUDO?’字符串,且光標(biāo)換行。DATA
SEGMENTCR EQU
ODHLF EQU
0AH"HOW
DO
YOU
DO?",CR,LF,"$"MES
DBENDSSEGMENTDATACODEASSUME
CS:CODE,
DS:DATA;9號功能調(diào)用;返DOSMAIN:
MOV
AX,
DATAMOV
DS,
AXMOV
DX,OFFSET
MES
;DS:DX指向字符串MES
MOVINTMOVINTAH,
921HAH,4CH21HCODE
ENDSENDMAIN三、打印功能例:打印一個字符串TEXT
DB
‘HELLO!’…
…MOV
CX,
6MOV
BX,
0NEXT:
MOV
AH,
5MOV
DL,
TEXT[BX]INT
21HINC
BX
LOOP
NEXT…
…AH功能調(diào)用參數(shù)05H打印一個字符DL=字符5.5
匯編語言程序設(shè)計舉例匯編語言程序設(shè)計的基本步驟如下:①分析問題,抽象出描述問題的數(shù)學(xué)模型,確定解決問題的合適算法;②繪制抽象流程圖或?qū)懗龀橄蟛襟E,可以從粗到細(xì)把算法逐步地具體化;③分配存儲空間及工作單元,根據(jù)框圖編寫程序;④靜態(tài)檢查源程序;⑤上機調(diào)試程序,按設(shè)計要求對程序運行正確性作全面測試。5.5.1
順序程序設(shè)計【例順5.序1】程求序兩,個又?jǐn)?shù)叫的直平線均運值行。程這序兩。個這數(shù)種分程別序存的放形在式X最單簡單元,和計Y單算元機中執(zhí),行而程平序均的值方放式在是Z指單令元逐中條。依次被執(zhí)行,不進行判斷和跳轉(zhuǎn),直到程序結(jié)束。DATA
SEGMENTX
DB
5FHY
DB
57HZ
DB
?DATA
ENDSSTAC
SEGMENT
STACK
‘STACK’DW
20H
DUP(?)TOP
LABEL
WORDSTAC
ENDSCODE
SEGMENTMAIN
PROC
FARASSUME
CS:CODE,DS:DATA,SS:STAC·START:
PUSH
DS·MOVAX,
0·PUSHAX·MOVAX,
DATA·MOVDS,
AX·MOVAX,
STAC·MOVSS,AX·TOPMOVSP,OFFSETMOV
AL,
X·ADDAL,Y·MOVAH,0·ADCAH,AH·SHRAX,1·····MOV
RETMAIN
ENDP
CODE
ENDSEND
STARTZ,
AL■【例5.2】:假設(shè)多項式:■編制一個程序,計算自變量X=6時,函數(shù)f(x)的值?!鏊惴ǎ喝绮捎么梅ǎ苯佑嬎愣囗検降闹?,則至少要做6次乘法和3次加減法,并且要使用較多的寄存器暫存中間結(jié)果,所以可采用秦九韶算法,把
f(x)變形為秦九韶算法適用多項式的求值問題,把n次多項式的求值問題轉(zhuǎn)化成求n個一次多項式的值的問題。ASSUME
CS:CODE,DS:DATA,
SS:SSEGSTART:
MOV
AX,
DATAMOV
DS,
AXMOV
AX,
5MUL
XADD
AX,
4MUL
XSSEG
SEGMENT
STACKSUBAX,
3DB
1024
DUP
(0)MULXSSEG
ENDSADDAX
,
21DATA
SEGMENTMOVRES,
AXX
DW
6MOVAX
,
4C00HRES
DW
?INT21HDATA
ENDSCODEENDSCODE
SEGMENTENDSTART順序程序的設(shè)計和運行都是比較簡單的,但是實際應(yīng)用中往往需要根據(jù)不同的情況和條件作出不同的處理,順序程序是無法實現(xiàn)的,因此可以采用分支程序來完成。分支程序就是根據(jù)不同的情況或條件執(zhí)行不同功能的程序,它具有判斷和轉(zhuǎn)移功能,在程序中利用條件轉(zhuǎn)移指令對運算結(jié)果的狀態(tài)標(biāo)志進行判斷,以實現(xiàn)轉(zhuǎn)移功能。分支程序常用的結(jié)構(gòu)形式有兩種:一種是簡單分支結(jié)構(gòu),另一種是多分支結(jié)構(gòu)。5.5.2分支程序設(shè)計1、簡單分支程序設(shè)計兩個分支條件?YN條件1?N三個分支YY條件2?N■【例5.3】已知VAR單元內(nèi)有一自變量X,請按如下條件編出求函數(shù)值Y并將它存入FUNC單元的程序?!鯵=1
X>00
X=0-1
X<0算法:這是一個三分支歸一的條件轉(zhuǎn)移問題。由題意可知,自變量X是個帶符號數(shù),故可采用與零比較和條件轉(zhuǎn)移
指令來做。LOOP2:
MOV
AL
,
00HEXIT■■AH
,4CH21HCODE:
MOV
FUNC
,
ALMOVINTENDSEND■STARTFUNC
AL■■■■DATA
SEGMENTVAR
DB
-25FUNC
DB ?DATA
ENDS開始■CODE
SEGMENT■■ASSUME
CS:CODE
,
DS:DATASTART:
MOV
AX
,
DATAAL
X■■MOV
DS
,
AX
MOV
AL
,
VARAL≥0?Y■■■■CMP
AL
,
0JGE
LOOP1MOV
AL
,0FFHJMP
EXITNAL=0?NY■■LOOP1:JE
LOOP2MOV
AL
,
01HAL
-1AL
1AL0■JMP
EXIT結(jié)束【例5.4】已知在內(nèi)存中,有一個字節(jié)單元NUM存有帶符號數(shù)據(jù),計算出它的絕對值后并放入RESULT單元中。可知,一個正數(shù)的絕對值是它本身,而一個負(fù)數(shù)的絕對值是它的相反數(shù)。如要計算一個數(shù)的相反數(shù),就要完成減法運算,即用零減去這個數(shù)。而8086系統(tǒng)有專用的求反指令NEG。X
→ALY開始分析:根據(jù)數(shù)學(xué)中絕對值的概念結(jié)束AL≥0?N將AL中的內(nèi)容求補AL
→RESULTDATASEGMENT
XDATA
CODEDB
-25RESULT
DB
?ENDS
SEGMENTASSUME
CS:CODE,DS:DATASTART:
MOVMOV
MOVTESTJZNEGAX,
DATADS,
AXAL,
X
AL,
80HNEXTAL;初始化;X取到AL中;測試AL正負(fù);為正轉(zhuǎn)NEXT;否則AL求補;送結(jié)果RESULT,ALNEXT:
MOVMOVINTAH,
4CH21H;返回DOSCODEENDS
ENDSTART;匯編結(jié)束條件?N=0N=nN=2N=1這種方法常用于多路分支的情況,每路分支起始地址可定義為SUB0、SUB1…。并把這些起始地址組成一個表,稱為跳
轉(zhuǎn)表,表內(nèi)每兩個字節(jié)存放一個入口地址的偏移量,然后根據(jù)有規(guī)律的索引值,采用寄存器間接尋址方式,執(zhí)行無條件轉(zhuǎn)移指令,即可轉(zhuǎn)向不同的分支進行處理,最后匯合到出口處。2、多分支程序設(shè)計■【例5.5】利用匯編語言編制多分支(散轉(zhuǎn))程序,完成如下結(jié)構(gòu)程序設(shè)計。INDEX=0INDEX=1INDEX=2INDEX=3INDEX=4F=2XF=Y-X/2F=2YF=Y/2F=100■算法:首先將5個分支的起始地址組成一個數(shù)據(jù)表存在數(shù)據(jù)段中,并使BX指向數(shù)據(jù)表起始位置;由于數(shù)據(jù)
表中每一項占兩個字節(jié)寬度,因此使用寄存器間接跳轉(zhuǎn)指令前應(yīng)先將索引值乘2再與BX相加。開始BX
分支表首址SI
[INDEX]×2按INDEX轉(zhuǎn)移=0=1=2=3=4F2XFY-X/2F2YFY/2F100返回DOS結(jié)束DATA
SEGMENTINDEX
DB ?SUB1:
MOVAL
,
XX
DB ?SARAL
,
1Y
DB ?MOVAH
,
YTABLE
DWSUBAH
,
ALSUB0,SUB1,SUB2JMPEXITSUB3,SUB4SUB2:
MOVAL
,YRESULT
DB ?SHLAL
,
1DATA
ENDSMOVRESULT
,CODE
SEGMENTALASSUME
CS:CODE
,JMPEXITDS:DATASUB3:
MOVAL
,YSTART:MOV
AX
,
DATASARAL
,
1MOV
DS
,
AXMOVRESULT
,
MOV
BX
,
OFFSETTABLEALJMPEXITMOVSI
,
INDEXSUB4:
MOV
RESULT
,ADDSI
,
SIEXIT
:
MOVAH
,4CHJMPWORD
PTRINT21H[BX+SI]CODE
ENDSSUB0:
MOVAL
,
XENDSTART100■結(jié)論:不論哪一種分支形式,它的運行方向是向前的,在某一種確定條件下,只能執(zhí)行多個分支中的一個分支。程序的控制流向不能再回到進入此結(jié)構(gòu)的入口,因此也把這樣的程序結(jié)構(gòu)稱之為“開式結(jié)構(gòu)”?!鰡栴}:在實際應(yīng)用中還經(jīng)常會遇到一些具有相同或類似的操作需要重復(fù)執(zhí)行多次的問題,對于這樣的問題該如何解決?在程序中,往往要求某一段程序重復(fù)執(zhí)行多次,這時候就可以利用循環(huán)程序結(jié)構(gòu)。這里把能按一定規(guī)律,多次重復(fù)執(zhí)行的一串語句,叫作循環(huán)程序。1、循環(huán)程序的組成一個循環(huán)結(jié)構(gòu)由以下幾部分組成:循環(huán)初始化部分:這是為了保證循環(huán)程序能正常進行循環(huán)操作而必須做的準(zhǔn)備工作。循環(huán)初值分兩類:一類是循環(huán)工作部分的初值,別一類是控制循環(huán)結(jié)束條件的初值。循環(huán)工作部分:即需要重復(fù)執(zhí)行的程序段,這是循環(huán)的中心,即循環(huán)體。循環(huán)參數(shù)修改部分:按一定規(guī)律修改操作數(shù)地址及控制變量,以便每次執(zhí)行循環(huán)體時得到新的數(shù)據(jù)。循環(huán)控制部分:用來保證循環(huán)程序按規(guī)定的次數(shù)或特定條件正常循環(huán)。循環(huán)結(jié)束部分:主要用來分析和存放程序的結(jié)果。5.5.3循環(huán)程序設(shè)計2、循環(huán)結(jié)構(gòu)處理部分未結(jié)束直到型循環(huán)(先執(zhí)行后判斷結(jié)構(gòu))控制部分結(jié)束處理初始化部分修改部分處理部分當(dāng)型循環(huán)(先判斷后執(zhí)行結(jié)構(gòu))控制部分未結(jié)束結(jié)束處理初始化部分修改部分·
【例5.6】在xx單元開始的連續(xù)單元中存放有30個無符號數(shù),從中找出中最大者送yy單元。開始
AL←[xx],BX←xx,CX←29BX←BX+1CX←CX-1結(jié)束YCX=0?Yyy←ALAL≥
[BX]?NAL,[BX]中的數(shù)交換N·····················DATASEGMENTxx
DB
49,38,65,12,97,13,55,27,28,85…yy
DB ?ENDS
SEGMENTASSUME
CS:CODE,
DS:DATADATA
CODESTART:
MOVMOV
LEAMOV
MOVLOOP1:
INCCMPJAEAX,
DATADS,
AXBX,
xxAL,
[BX]CX,
29BXAL,
[BX]NEXTXCHG
AL,
[BX]NEXT:
LOOP
LOOP1MOV
yy,
ALMOV
AH,
4CHINT
21HCODEENDSEND
START【例5.7】在ADDR開始的單元中存放著一個字,將字中1的個數(shù)存入COUNT單元中。算法:要測出1的個數(shù)就應(yīng)逐位比較,可根據(jù)最高有效位是否為1來計數(shù),然后用移位的方法把各位數(shù)逐次移到最高位去??梢杂脺y試字是否為0來作為結(jié)束條件,這樣可縮短程序的執(zhí)行時間,對不同的字循環(huán)次數(shù)不同,采用當(dāng)型循環(huán)結(jié)構(gòu)。CX=0字邏輯左移1位字=0?NYNCOUNT←CX字為負(fù)?YCX←CX+1開始N結(jié)束SEGMENTDATA
ADDR
DW76A3HCOUNT
DW ?DATA
CODEENDS
SEGMENTASSUMESTART:
MOVCS:CODE
,
DS:DATAAX
,
DATAMOV
DS
,
AX
MOV
CX
,
0MOV
AX
,
ADDRREPEAT:TEST
AX
,
0FFFFHJZ
EXITJNS
SHIFTINC
CX
SHL
AX
,
1SHIFT:JMP
REPEATMOV
COUNT
,
CXEXIT:MOV
AH
,
4CHINT
21HENDSENDSCODESTART【例5.8】軟件延時。利用每一條指令的執(zhí)行時間(用n個T表示)來構(gòu)成規(guī)定時間的延時。本例通過適當(dāng)設(shè)置BL的內(nèi)容,來實現(xiàn)1s的延時。分析:采用雙重循環(huán)實現(xiàn)延時,內(nèi)循環(huán)構(gòu)成基本延時單元10ms,外循環(huán)完成100*10ms的操作。SOFTDLY
PROCMOV
BL,
100DELAY:
MOV
CX,
2801;延時100*10ms=1s,4T;4T;延時10ms,內(nèi)循環(huán),(17/5)TWAIT:LOOP
WAITDEC
BLJNZ
DELAY;2T;外循環(huán),延時1s,16/4TRETSOFTDLY
ENDP主頻為4.77MHz,T=1/4.77M≈210ns,則內(nèi)、外循環(huán)的延時時間:T內(nèi)=[17(n-1)+5+4]*T≈10ms,n=2801T外=4T+BL*
T內(nèi)+BL*2T+(BL-1)*16T+4T≈1s結(jié)論:
對于循環(huán)次數(shù)是未知的情況,可采用當(dāng)型循環(huán)結(jié)構(gòu)也可采用直到型循環(huán)結(jié)構(gòu),根據(jù)具體情況來確定循環(huán)控制結(jié)束條件。
對于循環(huán)次數(shù)是已知的情況,一般采用直到型循環(huán)結(jié)構(gòu),用計數(shù)法來控制循環(huán);但有些情況為縮短程序的執(zhí)行時間,也可選擇適當(dāng)?shù)难h(huán)控制條件,采用當(dāng)型循環(huán)結(jié)構(gòu)。?■■■循環(huán)程序結(jié)構(gòu)解決了同一程序中某個程序段需要按規(guī)律連續(xù)重復(fù)執(zhí)行問題。在實用中,還常常遇到功能完全相同的程序段,或不在同一程序模塊,或雖在同一程序模塊且需要重復(fù)執(zhí)行,但不是連續(xù)重復(fù)執(zhí)行。對于這種非連續(xù)多次重復(fù)的功能程序段,為避免編制程序的重復(fù)勞動,節(jié)省存儲空間,往往把程序段獨立出來,附加少量額外語句,將其編制成公用子程序,供程序其他地方需要時調(diào)用。這種程序設(shè)計方法稱之為子程序設(shè)計。子程序一般由以下部分組成:
①保存子程序運行時將被破壞的寄存器的內(nèi)容-保存現(xiàn)場。②依入口參數(shù)從指定位置取要加工處理的信息。③對信息進行處理。④依出口參數(shù)向指定位置送經(jīng)加工處理后的結(jié)果信息。⑤返回調(diào)用程序。5.5.4子程序設(shè)計■注意:1、使用RET時,有一種帶有參數(shù)的返回指令RET
OP
;(SP+OP)
IP■為丟棄已用過的傳遞參數(shù),是16位尋址方式,OP為參數(shù)個數(shù)的2倍。2、現(xiàn)場(寄存器內(nèi)容)的保護和恢復(fù)⑴對發(fā)生沖突的寄存器內(nèi)容要進行保護和恢復(fù);⑵進行主程序和過程間傳遞參數(shù)的寄存器內(nèi)容不進行保護和恢復(fù)。3、主程序和過程間的參數(shù)傳遞入口參數(shù):過程所需的初始數(shù)據(jù);出口參數(shù):回送給主程序的結(jié)果;參數(shù)傳遞:入口參數(shù)的傳遞和出口參數(shù)的送出,可以通過寄存器、存儲單元和堆棧區(qū)域進行傳遞。■■■CODE
SEGMENTSOFTDLYPROCMOV
BL,
100MOV
CX,
2801LOOP
WAIT;延時100*10ms=1s,4T;4T;延時10ms,內(nèi)循環(huán),(17/5)TDEC
BL
;2TJNZ
DELAY
;外循環(huán),延時1s,16/4TRETENDPDELAY:WAIT:SOFTDLY■CALL
DELAY100■■CODE
ENDSENDSTART【例5.9】:編寫一軟件延時子程序,延時時間為1s。(無參數(shù)傳遞)PROADD
PROCPUSHREG;宏調(diào)用保護現(xiàn)場LEAMOVXORMOVSI
,
ARY
CX
,
COUNT
AX
,
AXDX
,
AX■AGAIN:
ADD
AX
,
[SI]JNC
NEXTINC
DX■NEXT:
ADD
SI
,
2LOOP
AGAINMOV
SUM
,
AXMOV
[SUM+2]
,
DXPOPREG;宏調(diào)用恢復(fù)現(xiàn)場RETPROADD
ENDPMOV
AH
,
4CHINT
21HCODE
ENDSEND【例5.10】在某一程序中,許對N個元素的數(shù)組求和。(帶參數(shù)傳遞)DATA
SEGMENTARY
DW
100
DUP
(?)COUNTDW?;存數(shù)組長SUMDW2
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建省事業(yè)單位二零二五年度勞動合同解除條件及程序
- 涉外科技咨詢設(shè)計合同
- 房屋租賃合同標(biāo)準(zhǔn)版范文(4篇)
- 標(biāo)準(zhǔn)合同圖書發(fā)行管理網(wǎng)絡(luò)系統(tǒng)集成合同6篇
- 農(nóng)村承包蟹塘合同書5篇
- Unit12 Review(教學(xué)設(shè)計)-2023-2024學(xué)年北師大版(一起)英語四年級下冊
- Unit 1 School Subjects Lesson 3(教學(xué)設(shè)計)-2023-2024學(xué)年人教新起點版英語三年級下冊
- Starter Section 12 Our Colourful World 教學(xué)設(shè)計 -2024-2025學(xué)年北師大版(2024)初中英語七年級上冊
- 《主題三 我為校園做標(biāo)識》(教學(xué)設(shè)計)-2023-2024學(xué)年三年級下冊綜合實踐活動遼師大版
- 北京市房屋租賃合同(33篇)
- 電工(高級技師)理論知識試題庫+參考答案
- 滬教版小學(xué)五年級數(shù)學(xué)上冊教案 全冊
- 《新時代大學(xué)生勞動教育與實踐》全套教學(xué)課件
- 《鐵路軌道維護》課件-道岔起道作業(yè)
- 煤礦班隊長培訓(xùn)
- 精神病物理治療
- 北京化工大學(xué)《電路與模擬電子技術(shù)》2021-2022學(xué)年第一學(xué)期期末試卷
- 如何發(fā)現(xiàn)腎臟病
- GB/T 44537-2024精細(xì)陶瓷室溫斷裂韌性試驗方法表面裂紋彎曲梁(SCF)法
- 證券分析(第6版)下部
- JJF(京) 124-2024 智能電表電動自行車充電辨識模組校準(zhǔn)規(guī)范
評論
0/150
提交評論