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

下載本文檔

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

文檔簡介

第四章

匯編語言程序設(shè)計(jì)2主要內(nèi)容匯編語言源程序的結(jié)構(gòu)匯編語言語句格式偽指令功能調(diào)用匯編語言程序設(shè)計(jì)4.1匯編語言的基本概念機(jī)器語言 用機(jī)器碼(二進(jìn)制碼)表示多種操作的程序設(shè)計(jì)語言,與機(jī)器密切相關(guān),可直接執(zhí)行,但難懂,檢查難;4.4.1計(jì)算機(jī)程序設(shè)計(jì)語言的分類匯編語言 用多種助記附表示多操作的語言,面向機(jī)器,但易懂,易檢查,機(jī)器不能識(shí)別高級(jí)語言

具有普適性的程序設(shè)計(jì)語言,功能強(qiáng)大,易編寫,易檢查,與機(jī)器無關(guān)。4.1.2匯編語言程序的一般概念匯編語言源程序 用匯編語言按一定格式編寫的程序,它不能直接執(zhí)行。源程序的屬性為ASM。目標(biāo)文件 將源程序經(jīng)匯編后轉(zhuǎn)換成的二進(jìn)制代碼的文件,屬性為OBJ執(zhí)行文件 經(jīng)連接后將目標(biāo)文件與庫文件或其它目標(biāo)文件連接在一起形成的可執(zhí)行的文件,屬性為EXE匯編 將源程序轉(zhuǎn)換成目標(biāo)文件的翻譯過程匯編程序 完成匯編工作的程序7匯編語言源程序匯編程序用助記符編寫匯編程序匯編語言源程序機(jī)器語言目標(biāo)程序源程序的編譯程序匯編程序的主要功能檢查源程序;測(cè)出源程序中的語法錯(cuò)誤,給出出錯(cuò)信息;產(chǎn)生目標(biāo)代碼程序,并給出列表文件(LST文件);展開宏指令;常用的匯編程序有小匯編ASM,宏匯編MASM,以及TASM,TASMX,TASM32等編輯建立ASM源程序;將ASM文件經(jīng)匯編(MASM)轉(zhuǎn)換成OBJ文件;將OBJ文件經(jīng)連接(LINK)轉(zhuǎn)變成EXE文件上機(jī)執(zhí)行。LINK連接編輯源程序PROGR.ASM文件PROGR.OBJ文件PROGR.EXE文件MASM匯編4.1.3上機(jī)的步驟匯編語言源程序結(jié)構(gòu)數(shù)據(jù)段名SEGMENT

…數(shù)據(jù)段名ENDS附加段名SEGMENT

…附加段名ENDS堆棧段名

SEGMENT…堆棧段名ENDS代碼段名

SEGMENT…代碼段名

ENDSEND例4.1編寫一個(gè)兩個(gè)字相加的程序

;*******定義數(shù)據(jù)段DSEG

SEGMENT

DATA1DW0F865HDATA2DW360CHDSEG

ENDS

;*******定義附加段

ESEG

SEGMENT

SUMDW2DUP(?)ESEG

ENDS

CSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:ESEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,ESEGMOVES,AXLEASI,SUMMOVAX,DATA1ADDAX,DATA2MOVES:[SI],AXHLTCSEGENDSENDSTART4.2匯編語言程序格式指令語句 能產(chǎn)生目標(biāo)代碼,CPU可以執(zhí)行,完成特定功能的語句,由CPU指令組成。匯編語言語句的類型指示語句(偽指令語句) 不產(chǎn)生目標(biāo)代碼,僅是為匯編程序作指示的語句。宏指令語句 是一個(gè)指令序列,在匯編時(shí),所有的宏指令語句都被展開為相應(yīng)的指令序列。4.2.1語句的格式語句可由4項(xiàng)組成,格式為:[名字]

助記符

[操作數(shù)] [;注釋][name]

operation

[operand][;commands]其中,[方括號(hào)項(xiàng)]為可選項(xiàng)。名字可為作名字的字符有:字母A~Z,數(shù)字0~9,字符?、·、@、_、$等數(shù)字不能放在名字之首在指令語句中,名字一般是標(biāo)號(hào)。標(biāo)號(hào):-是某指令代碼存放單元的符號(hào)地址,標(biāo)號(hào)后必須有一個(gè)冒號(hào):。標(biāo)號(hào)的屬性-段,偏移量,類型(FAR,NEAR)在偽指令語句中,名字通常是變量(名),段名,過程名等變量(名)-某個(gè)存儲(chǔ)器中數(shù)據(jù)單元或數(shù)據(jù)區(qū)的符號(hào)地址,它代表數(shù)據(jù)單元或數(shù)據(jù)區(qū)。變量有三種屬性:段,偏移量,類型(BYTE,WORD,DWORD,QWORD)操作數(shù)

指令操作的對(duì)象??勺鞑僮鲾?shù)的有:常量,寄存器,標(biāo)號(hào),變量和表達(dá)式。常量-如立即數(shù),直接尋址的地址,ASCⅡ碼字符串等寄存器-如AX,AH,DS,SP,DX等助記符

分為指令助記符和偽指令助記符。表達(dá)式—是常數(shù)、寄存器、標(biāo)號(hào)、變量與一些操作符相組合的序列。有數(shù)字表達(dá)式和地址表達(dá)式兩種。數(shù)字表達(dá)式產(chǎn)生一個(gè)數(shù)值結(jié)果;地址表達(dá)式產(chǎn)生一個(gè)地址。;注釋項(xiàng)

它不會(huì)被匯編,其功能為增加源程序的可讀性;注釋前必須加分號(hào)‘;’算術(shù)操作符+(加)、-(減)、﹡(乘)、/(除)、MOD(模除,即兩個(gè)整數(shù)相除后取余數(shù))4.2.2操作符例4.1 MOVDX,BLOCK+(6-1)﹡2

該指令語句等價(jià)于

MOVDX,BLOCK+10邏輯運(yùn)算操作符AND(邏輯與)OR(邏輯或),XOR(邏輯異或)NOT(邏輯非)。它們只能用于數(shù)字表達(dá)式中關(guān)系運(yùn)算操作符EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)參與關(guān)系運(yùn)算操作的兩個(gè)操作數(shù)必須都同為數(shù)字或?yàn)橥欢蝺?nèi)的兩個(gè)存儲(chǔ)器地址。計(jì)算的結(jié)果應(yīng)為邏輯值:結(jié)果為真,表示為FFFFH結(jié)果為假,表示為0例4.5: MOVAX,

4EQ3 ;結(jié)果為假等價(jià)于 MOVAX,

0

MOVAX,4

NE

3 ;結(jié)果為真等價(jià)于

MOVAX,0FFFFH例4.6MOVBX,((PORT_VALLT5)AND20)OR((PORT_VALGE5)AND30)當(dāng)PORT_VAL﹤5時(shí),匯編結(jié)果為

MOVBX,30否則,匯編結(jié)果為:MOVBX,20分析運(yùn)算符

SEG,OFFESET,TYPE,SIZE,LENGTHSEG格式:SEG變量(名)功能:取變量所在段的段基址例4.7 MOVAX,SEGARRAY ;(AX)←ARRAY的段基址

MOVDS,AX

;(DS)←(AX)OFFSET格式:OFFSET變量/標(biāo)號(hào)功能:取變量或標(biāo)號(hào)的偏移地址例4.7 MOVDI,OFFSETDATA1;

;(DI)←DATA1的偏移地址TYPE格式:TYPE

變量/標(biāo)號(hào)功能:取變量或標(biāo)號(hào)的類型值表4.1TYPE類型值與類型的關(guān)系TYPE類型值存儲(chǔ)器操作數(shù)的類型124-1-2BYTEWORDDWORDNEARFAR例4.9:

VAR

DW? ;VAR為字變量ARRAY

DD10DUP(?) ;ARRAY為雙字變量STR

DB‘THISISTEST’ ;STR為字節(jié)變量

MOV AX,TYPE

VAR

;(AX)←2MOV BX,TYPE

ARRAY

;(BX)←4MOV CX,TYPE

STR

;(CX)←1例4.8

ARRAYDW1,2,3

: ADD SI,TYPE

ARRAY匯編后: ADD SI,2LENGTH

格式:LENGTH

變量(名) 功能:取重復(fù)定義(DUP)的復(fù)制次數(shù),若不是DUP定義,則取數(shù)值1。例4.9若:

FEES

DW100DUP(?)對(duì)于指令: MOVCX,LENGTH

FEES匯編后:

MOVCX,

100例4.10若:

ARRAY

DW1,2,3對(duì)于指令: MOVCX,LENGTH

ARRAY匯編后為: MOVCX,

1SIZE

格式:SIZE

變量(名) 功能:取LENGTH值與TYPE值的乘積例4.11

若有

FEES

DW100DUP(?)則

TYPE

FEES=2

LENGTH

FEES=100

SIZE

FEES =(LENGTH

FEES)×(TYPE

FEES) =100×2=200所以

MOVCX,SIZE

FEES匯編后:

MOVCX,

200PTR屬性運(yùn)算符格式:類型

PTR

表達(dá)式功能:對(duì)存儲(chǔ)單元賦予確定的類型綜合運(yùn)算符PTR,THIS,SHORT例4.12:

INC[BX]

;操作數(shù)的類型不明確可用PTR操作符對(duì)操作數(shù)明確定義:

INCWORD

PTR

[BX]

;字操作數(shù)TWO_BYTEDW

?可用以下語句對(duì)這兩個(gè)字節(jié)賦予另一種類型定義ONE_BYTEEQU

BYTE

PTRTWO_BYTEOTHER_BYTEEQU

BYTE

PTR(TWO_BYTE+1)OTHER_BYTE

EQU

BYTE

PTRONE_BYTE+1ONE_BYTE與TWO_BYTE

皆為符號(hào)地址它們的段和偏移量屬性相同,但類型屬性不同前者是BYTE類型,后者是WORD類型。例4.13

設(shè)已有數(shù)據(jù)定義如下THIS

運(yùn)算符 格式:名字EQU

THIS

類型 功能:給名字(變量或標(biāo)號(hào))指定類型,它的段,偏移地址與下一存儲(chǔ)單元相同。例4.14

FIRST_TYPEEQUTHIS

BYTE

WORD_TABLE

DW100DUP(?)FIRST_TYPE與WORD_TABLE的段,偏移地址均相同,但前者是BYTE類型,后者是WORD類型。例4.15

L1

EQUTHIS

FAR L: MOVCX,100L標(biāo)號(hào)與L1標(biāo)號(hào)的段、偏移地址一樣,但類型不同。L是NEAR類型,L1是FAR類型,允許其他段的轉(zhuǎn)移指令調(diào)用。SHORT短程運(yùn)算符 格式:SHORT

標(biāo)號(hào) 功能:指明標(biāo)號(hào)的類型為短標(biāo)號(hào),從標(biāo)號(hào)到引用標(biāo)號(hào)指令之間的距離是在:

-128~+127字節(jié)范圍內(nèi)例如:

JMPSHORT

TAG

TAG:

LOW、HIGH

字節(jié)分離運(yùn)算符 功能:分別得一個(gè)數(shù)值或地址表達(dá)式的低位和高位字節(jié)例4.16

STUFF

EQU

0ABCDH語句:

MOVAH,HIGH

STUFF

匯編后:

MOVAH,0ABH語句:

MOVAL,LOW

STUFF

匯編后: MOVAL,

0CDH4.3偽指令語句數(shù)據(jù)定義偽指令語句 功能:定義變量的類型,分配空間并賦初值 格式:[變量名]

DB/DW/DD

操作數(shù)

[,操作數(shù)…]

說明[變量名]是任選項(xiàng),代表某個(gè)數(shù)據(jù)單元的符號(hào)地址助記符DB、DW、DD

DB(Definebyte):定義變量的類型為BYTE,每個(gè)操作數(shù)占一個(gè)字節(jié)DW(Defineword):定義變量的類型為WORD,每個(gè)操作數(shù)占2個(gè)字節(jié),采用小端對(duì)準(zhǔn)方式存放DD(Definedoubleword):定義變量的類型為DWORD,每個(gè)操作數(shù)占4個(gè)字節(jié)操作數(shù)是常數(shù)或是常數(shù)表達(dá)式操作數(shù)字段的幾種形式例4.17 DATA_BYTE DB

10,4,10H DATA_WORD DW

100,100H,-5 DATA_DWD DD

3﹡20,0FFFDHDATA_BYTE是字節(jié)類型,其后每個(gè)操作數(shù)占一個(gè)字節(jié)單元。DATA_WORD

是字類型,其后每個(gè)操作數(shù)占兩個(gè)字節(jié)單元。DATA_DWD

是雙字類型,其后每個(gè)操作數(shù)占四個(gè)字節(jié)單元。操作數(shù)是字符串例4.18

MESSAGE

DB

‘HELLO’

AB

DB

‘AB’

BA

DW

‘AB’字符串必須用單引號(hào)‘’包封超過兩個(gè)字符的字符串只能用DB定義。操作數(shù)是?

只保留存儲(chǔ)空間,但不存儲(chǔ)數(shù)據(jù)例4.19

ABC

DB

0,?,?,?,0

DEF

DW

?,52,?操作數(shù)是復(fù)制操作符(duplicationoperator)‘DUP’例4.21

DUP操作可以嵌套,如以下兩語句等價(jià)。

ARY3 DB100DUP(0,2DUP(1,2),0,3)

ARY3 DB0,1,2,1,2,0,3,0,1,2,1,2,0,3,…100組

格式:重復(fù)次數(shù)

DUP

(復(fù)制內(nèi)容)例4.20

ARY1 DB2

DUP(0,3)

等價(jià)于 ARY1 DB0,3,0,3,

…… ARY2 DB50

DUP(1,

2DUP(3,4),0)等價(jià)于 ARY2 DB1,3,4,3,4,0,1,3,4,3,4,0,……50組操作數(shù)是已定義的變量或標(biāo)號(hào)例4.22 PAR1 DB1,2,3,4

PAR2 DB‘ABCD’

PAR3 DW0,1,?

DATA1 DB100DUP(?)

DATA2 DW200DUP(0)

PARM_TABLE DWPAR1 DWPAR2 DWPAR3

INTSEG_DATA DDDATA1 DDDATA2EQU

表達(dá)式賦值偽指令 格式:名字

EQU

表達(dá)式表達(dá)式可以是常數(shù)、符號(hào)、地址表達(dá)式、寄存器,指令等;表達(dá)式不允許重復(fù)定義符號(hào)定義的偽指令例4.23:CR

EQU256

;數(shù)賦于符號(hào)名DATA

EQUHIGHT+12;地址表達(dá)式賦予符號(hào)名LF

EQUASCⅡ_TABLE ;變量賦新符號(hào)名B

EQU[BP+8] ;變址方式引用賦于符號(hào)BCBD

EQUAAM ;CBD等價(jià)于指令A(yù)AM=

等號(hào)偽操作“=”與“EQU”的功能一樣,但“=”操作允許表達(dá)式重復(fù)定義例4.24

COUNT=10

MOVCX,

COUNT ;(CX)←10

COUNT

=

COUNT-1 MOVBX,COUNT ;(BX)←9

LABLE

類型定義偽指令 格式:名字

LABLE

類型 功能:對(duì)名字(標(biāo)號(hào)或變量)的類型定義,它的段地址和偏移地址與下一個(gè)存儲(chǔ)器單元的相同。變量類型:BYTE、WORD、DWORD標(biāo)號(hào)類型:NEAR、FAR例4.25

AGAINF

LABLE

FAR

AGAIN: PUSH AXAGAIN的類型為NEAR,允許在本段內(nèi)調(diào)用;AGAINF的類型為FAR,允許被其他段調(diào)用;AGAIN與AGAINF的段、偏移屬性均相同。SEGMENT/ENDS段定義偽指令格式:段名

SEGMENT[定位類型][組合類型][‘類別’](段體)段名

ENDS功能:

定義一個(gè)邏輯段并賦予一個(gè)段名。

“SEGMENT”位于邏輯段的開始,指示邏輯段起始“ENDS”位于邏輯段的結(jié)尾,指示邏輯段的結(jié)束二者前的段名必須一致BYTE:字節(jié)邊界,即從任意邊界開始WORD:字邊界,即本段的起始地址必須是偶數(shù)PARA:節(jié)(Paragraph)的邊界開始,16個(gè)字節(jié)為一個(gè)節(jié),節(jié)邊界的地址應(yīng)為××××0HPAGE:頁(Page)邊界,256個(gè)字節(jié)為一頁,頁邊界起始地址應(yīng)為×××00H若省略[定位類型],則默認(rèn)其為PARA定位類型-對(duì)本邏輯段邊界定位例4.28SEGMENT偽操作的定位類型應(yīng)用舉例STACK

SEGMENT

STACK

;STACK段,PARA邊界

DB100DUP(?) ;長度為100字節(jié)STACK

ENDS

;STACK段結(jié)束DATA1

SEGMINT

BYTE

;DATA1段,

BYTE邊界STRING DB‘thisisanexample!’ ;定義字符串DATA1

ENDS

;DATA1段結(jié)束DATA2

SEGMINT

WORD

;DATA2段,WORD邊界BUFFER DW40DUP(0) ;長度為40個(gè)字

DATA2

ENDS

;DATA2段結(jié)束CODE1

SEGMINT

PAGE

;CODE1段,PAGE邊界

:CODE1

ENDS

;CODE1段結(jié)束CODE2

SEGMENT

;CODE2段,PAGE邊界

:START: MOVAX,STACK MOVSS,AX:CODE2

ENDS

;CODE2段結(jié)束

ENDSTART

;源程序結(jié)束本例的源程序中共有五個(gè)邏輯段,段名和定位類型分別為:STACK段,

PARA邊界:段長度為100個(gè)字節(jié)(64H)DATA1段,BYTE邊界:段長度為19個(gè)字節(jié)(13H)DATA2段,WORD邊界:段長度為80個(gè)字節(jié)(50H)CODE1段,PAGE邊界:段占用13個(gè)字節(jié)(0DH)CODE2段,PARA邊界:段占用52個(gè)字節(jié)(34H)表4.2例4.28各邏輯的起始地址和結(jié)束地址段名定位類型字節(jié)數(shù)起始地址結(jié)束地址STACKPARA100(64H)00000H00063HDATA1BYTE19(13H)00064H00076HDATA2WORD80(50H)00078H000C7HCODE1PAGE13(ODH)00100H0010CHCODE2PARA52(34H)00110H00143H例4.29

假設(shè)一個(gè)主程序中有五個(gè)邏輯段,段名和類別為: STK1段 ——‘STACK’

CODE1段 ——無

DATA1段 ——‘BUFFER’ DATA2段 ——‘TABLE’

DATA3段 ——‘BUFFER’一個(gè)子程序,有四個(gè)邏輯段,段名和類型分別為:

DATA4段 ——‘TABLE’

DATA5段 ——‘BUFFER’

STK2段 ——‘STACK’ CODE2段 ——無當(dāng)將主程序和子程序進(jìn)行連接時(shí),兩個(gè)程序模塊中各邏輯段裝入內(nèi)存的順序見圖4.5

DATA3‘BUFFER’DATA2‘TABLE’

DATA1‘BUFFER’

CODE1無STK1‘STACK段名類別名主程序STK1DATA3DATA5DATA2DATA4CODE1CODE2DATA1STK2

‘STACK’無類別名‘BUFFER’

‘TABLE’

子程序段名類別名DATA4‘TABLE’

DATA5‘BUFFER’STK2‘STACK’

CODE2無圖4.5邏輯段按類別裝入內(nèi)存示意ASSUME段分配偽指令

格式:

ASSUME

段寄存器名:段名[,段寄存器名:段名,…]

功能:指示匯編程序源程序的邏輯段與段寄存器的關(guān)系;段寄存器名必須是CS、DS、ES和SS之一,而段名則是由SEGMENT所定義;ASSUMENOTHING的格式可取消前面由ASSUME所指定的段寄存器設(shè)置;ASSUME語句通常位于可執(zhí)行代碼段中緊接段定義語句之后;ASSUME僅指示邏輯段與段寄存器的關(guān)系,但并不對(duì)段寄存器賦值。例4.30定義各邏輯段之例

data1

segment

data1

ends;**********************

data2

segment

data2

ends

通常給段寄存器賦值語句為:

movax,段名

mov

段寄存器,axcode

segment

assume

cs:code,

ds:data1,es:data2start:

movax,data1

mov

ds

,ax

movax,data2

mov

es

,ax

code

ends

end

startPROC/ENDP過程定義偽指令

格式: 過程名

PROC

[NEAR/FAR]

(過程體) RET

過程名

ENDP

功能:定義一個(gè)過程并賦予一個(gè)名字定義該過程的類型(NEAR或者FAR)若沒有指明類型,則默認(rèn)為NEAR過程;ENDP標(biāo)志過程結(jié)束,PROC與ENDP前的過程名必須一致;調(diào)用指令CALL,位于調(diào)用程序中;返回指令RET,處于過程內(nèi)部,作為過程的出口;過程的定義和調(diào)用均可嵌套。例4.31

name1

procfar

call

name2

ret

name2

procnear

ret

name2

endp

name1

endpname1、

name2是兩個(gè)過程name1本身是一個(gè)可以被調(diào)用的過程,而它也可以再調(diào)用其他的過程。其它偽指令NAME模塊開始偽指令 格式:NAME

module_name

功能:給匯編后得到的目標(biāo)程序指定一個(gè)模塊名指示模塊的開始,供連接時(shí)用。TITLE偽指令 格式:TITLEtext

功能:指定每一頁上打印的標(biāo)題若程序沒有使用NAME偽操作,則匯編程序?qū)⒂胻ext中的前6個(gè)字符作為模塊名。END結(jié)束偽指令

格式:END

[label:]

功能:源程序到此結(jié)束,指示匯編程序停止匯編Label為代碼段中的一條指令語句的標(biāo)號(hào)僅有一個(gè)程序時(shí)必須加Label當(dāng)多個(gè)模塊連接,則只有主程序的END使用Label例4.32

偽操作示意titleabsolt;

data_seg

segment

;definedatasegmentoper1 dw12oper2 dw230result dw?data_seg

ends;

code_seg

segment

;definecodesegment

assume

cs:code_seg,ds:data_seg

start:

movax,

data_seg

;datareasegmentaddr

mov

ds,ax

;intoDSregister;mainpartofprogramgoeshere

movax,oper1 addax,oper2

jgestore

negaxstore: movresult,ax

hltcode_seg

ends

;endofcodesegment;

end

start4.4匯編語言源程序設(shè)計(jì)的基本方法匯編語言程序設(shè)計(jì)的步驟匯編語言程序設(shè)計(jì)的基本過程建立數(shù)學(xué)模型確定算法和處理方案畫流程圖編制程序上機(jī)調(diào)試,試執(zhí)行并分析結(jié)果整理資料,投入運(yùn)行程序流程圖符號(hào)起始:功能:判斷:子過程:程序由一些基本結(jié)構(gòu)組成,它包括:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)大型復(fù)雜程序應(yīng)按其功能分解成若干個(gè)功能模塊程序,并把這些模塊按層次關(guān)系進(jìn)行組裝程序的結(jié)構(gòu)化設(shè)計(jì)(1969年,荷蘭學(xué)者E.W.Digkstra等人提出)順序結(jié)構(gòu)程序 按語句實(shí)現(xiàn)的先后次序執(zhí)行一系列操作分支結(jié)構(gòu)程序 可分為:兩分支結(jié)構(gòu)(相當(dāng)于高級(jí)語言中的IF-THEN-ELSE語句)多分支結(jié)構(gòu)(相當(dāng)于高級(jí)語言中的CASE語句)IF-THEN-ELSE結(jié)構(gòu)判定條件程序1YN判定條件程序1CASE結(jié)構(gòu)程序2程序2程序n…例4.34給定以下符號(hào)函數(shù):并設(shè)任意給定的x值存放在x單元中,y存放于y單元,根據(jù)x值確定函數(shù)y的值通常用條件轉(zhuǎn)移指令來產(chǎn)生分枝y=1,當(dāng)x>00,當(dāng)x=0-1,當(dāng)x<0開始AL≥0?y←-1AL=0?y←0y←1AL←x結(jié)束a.例4.34的流程圖YNYNdatax segmentx db-25y db?datax endscodex segmentmain proc far

assumecs:codex,dx:dataxstart:

push ds

mov ax,0 push ax

mov ax,datax

mov

ds,dx

mov al,x ;(AL)←

x

b.編寫程序如下

cmp al,0

jge

loop1

mov al,0ffh ;x<0時(shí)

mov y,al ;y←(-1)的補(bǔ)碼

retloop1:

je

loop2

;x>0時(shí)

mov al,1 ;y←1

mov y,al

retloop2:

mov al,0 ;x=0時(shí)

mov y,al ;y←0

retmain endpcodex ends

endstart

例4.35設(shè)有首地址為array的字?jǐn)?shù)組,已按升序排好,數(shù)組長度為n=15,且數(shù)據(jù)段與附加段占同一個(gè)段。在該書組中查找數(shù)number(如83),若找到它,則從數(shù)組中將其刪掉;若找不到,則把它插入正確位置,且變化后的數(shù)組長度在DX中。編程如下:data segment

dw?n

dw15number

dw83array

dw5,10,17,…,150data endscode segmentmain procfar assumecs:code,ds:data,es:datastart:

push ds

mov ax,0push ax

push es

mov ax,data

mov

ds,ax

mov

es,ax

mov ax,number

;(AX)←待查數(shù)

mov

dx,n

;初始化DX

mov

cx,n

;設(shè)置計(jì)數(shù)器CX

mov

di,offsetarray

;建立指針

cld

;增量方向

repne

scasw

;串掃描查找

je

delete

dec

dx

mov

si,dx

add si,dxtt3:

cmp ax,array[si]

jl

tt1

mov

array[si+2],ax ;若未查到,將此數(shù)

jmp

tt2

;插入正確位置tt1:

mov

bx,array[si]

mov

array[si+2],bx sub si,2

jmp

tt3

tt2: add dx,2 ;修改數(shù)組長度

jmp

fandelete:

jcxz

nextloopt:

mov

bx,[di] ;若查到,從數(shù)組中

mov [di-2],bx

;刪除此數(shù)

add di,2 loop looptnext:

dec

dx

;修改數(shù)組長度fan: pop es

retmain endp

code ends

end start循環(huán)程序通常由三部分組成設(shè)置初始狀態(tài)

設(shè)置循環(huán)次數(shù)、準(zhǔn)備工作寄存器、設(shè)置數(shù)據(jù)指針等循環(huán)體 循環(huán)工作的主體,由循環(huán)的工作部分和修改部分組成循環(huán)控制 循環(huán)條件控制與判斷,控制循環(huán)運(yùn)行和結(jié)束。循環(huán)程序設(shè)計(jì)循環(huán)程序可以有兩種循環(huán)結(jié)構(gòu)形式:DO_UNTIL結(jié)構(gòu) 先執(zhí)行循環(huán)體,然后再判斷控制退出條件,不滿足就繼續(xù)執(zhí)行循環(huán)體,滿足條件則退出循環(huán)。DO_WHILE結(jié)構(gòu) 把循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷條件,滿足條件就執(zhí)行循環(huán)體,否則則退出循環(huán)。循環(huán)初始狀態(tài)循環(huán)控制條件循環(huán)體循環(huán)初始狀態(tài)循環(huán)體循環(huán)控制條件YNNYDO_WHILE結(jié)構(gòu)DO_UNTIL結(jié)構(gòu)例4.36

從xx單元開始的30個(gè)連續(xù)單元中存放有30個(gè)無符號(hào)數(shù),從中找出最大者送入yy單元。編程如下:datasp segmentxx db73,59,61,45,81,107,14,64,54 db3,17,9,33,55,79,115,78,132 db234,37,76,43,98,251,9,0,62 db9,145,54yy db?dataspends;﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡codesp segment assumecs:codesp,ds:dataspmain procfarstart:

pushds

movax,0 pushax

movax,datasp

mov

ds,ax

moval,xx

mov

bx,offsetxx

mov

cx,29Loop1: incbx開始AL←XX,CX←29BX←XX的有效地址BX←BX+1AL≥[BX]CX←CX-1YY

←ALCX=0?AL,[BX]數(shù)據(jù)交換結(jié)束YNYN

cmp al,[bx]

jae

loop2;jae:大于等于轉(zhuǎn)移

xchg al,[bx]Loop2:

dec

cx

jnz

loop1

mov

yy,al

retmain endpcodesp ends

endstart子程序的設(shè)計(jì)子程序的定義 定義格式:

PROCEDURENAMEPROC[ATTRIBUTE]

(過程體)

PROCEDURENAMEENDP[ATTRIBUTE]是可選項(xiàng),指示類型屬性NEAR類型,則過程的調(diào)用(call)和返回(ret)是本段內(nèi)進(jìn)行FAR類型,則過程的調(diào)用和返回就是段間進(jìn)行若未用ATTRIBUTE定義,默認(rèn)為NEAR類型CALL(過程調(diào)用)指令段內(nèi)直接調(diào)用格式: CALL

near_proc操作: SP←SP-2; [SP+1,SP]←IP; IP←IP+disp16near_proc為目標(biāo)地址,它是一個(gè)近過程名(段內(nèi)的過程),相對(duì)轉(zhuǎn)移范圍是+32K。段間直接調(diào)用格式:CALL

far_proc操作:

SP←SP-2;[SP+1,SP]←CS;

CS←SEG

far_proc;SP←SP-2;

[SP+1,SP]←IP;CS←OFFSET

far_procfar_proc是一個(gè)遠(yuǎn)程過程名(其它代碼段的過程)SEG和OFFSET是運(yùn)算符,功能為取得過程的段基址和偏移地址。

RET(Return)過程返回格式:RET操作:

NEAR返回: IP←[SP+1,SP]; SP←SP+2FAR返回: IP←[SP+1,SP]; SP←SP+2; CS←[SP+1,SP];

SP←SP+2例4.37調(diào)用程序和子程序在同一代碼段中。MAIN

PROC FAR

;定義主過程為FAR類型

;它視為DOS調(diào)用的子程序

CALLSUBR1

RETMAIN ENDPSUBR1 PROC NEAR

RETSUBR1 ENDPMAIN PROC FAR

;定義主過程為FAR類型,指示

;為DOS調(diào)用的子程序

CALL

SUBR1

RETSUBR1 PROC NEAR

RETSUBR1

ENDPMAIN ENDP過程定義可以嵌套,例4.37可用以下形式:例4.38調(diào)用程序和子程序不在同一代碼段。segx segment

surt

procfar

retsurt

endp

call

surt

segx endssegy segment

call

subt

segy ends子程序的設(shè)計(jì)和使用正確選擇過程的屬性正確使用堆棧寄存器的保護(hù)與恢復(fù)寄存器傳送地址表傳遞參數(shù)地址通過堆棧傳遞參數(shù)調(diào)用程序與子程序之間的參數(shù)傳遞主要有三種方式例4.39把一個(gè)2位壓縮的BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)。程序編寫如下:data_bin segmentbcd_in db? ;存放bcd值value db? ;存放二進(jìn)制值data_bin endscode segment assumecs:code;ds:data_binmain procfar

pushds

movax,0 pushax

movax,data_bin

mov

ds,ax

moval,bcd_in

;待轉(zhuǎn)換的BCD碼 call bcd_binary

;送入al寄存器

mov

value,al

retmain endpbcd_binary

procnear

pushf

;保存狀態(tài)字

push bx

;保護(hù)bx和cx push cx

mov ah,al ;BCD數(shù)送入ah and ah,0fh ;分離BCD數(shù)的低位數(shù)

mov

bl,ah and al,0f0h ;分離BCD數(shù)的高位數(shù)

mov

cl,04h

;把BCD數(shù)高位數(shù)字

ror al,cl

;循環(huán)右移,移到低位

mov

bh,0ah

;將轉(zhuǎn)換因子10送入bh

mul

bh

;BCD數(shù)的高位數(shù)字乘0ah add al,bl

;乘積與BCD數(shù)的低位數(shù)

;相加,結(jié)果送入al中

pop cx

;恢復(fù)被保護(hù)的寄存器

pop bx

popf

retbcd_binary

endpcode ends

endmain4.4DOS系統(tǒng)功能 DOS系統(tǒng)功能調(diào)用是微機(jī)的磁盤操作系統(tǒng)為用戶提供的一組例行子程序,分為4個(gè)方面:磁盤的讀/寫及控制管理內(nèi)存管理基本輸入/輸出管理時(shí)間、日期等子程序DOS系統(tǒng)功能調(diào)用所有的系統(tǒng)功能子程序按順序編號(hào),稱之為功能號(hào)DOS功能調(diào)用方法子程序的入口參數(shù)送相應(yīng)的寄存器;功能號(hào)送AH寄存器;發(fā)中斷請(qǐng)求:INT21H(系統(tǒng)功能調(diào)用指令)例4.40顯示字符串:‘Goodmorning!’MSG DB‘Goodmorning!’,‘$’

MOV DX,OFFSET

MSG MOV AH,9

INT 21H例4.41退回到DOS

MOV AH

,4CH

INT 21H表4.2DOS鍵盤功能調(diào)用(INT21H)AL=字符從鍵盤輸入一個(gè)字符并回顯在屏幕上1AL=鍵盤功能號(hào)(1,6,7,8,A)清鍵盤緩沖區(qū),并調(diào)用一種鍵盤功能CAL=0FFH(有鍵入)AL=00H(無鍵入)讀鍵盤狀態(tài)BDS:DX=緩沖區(qū)首址輸入字符串到緩沖區(qū)AAL=字符從鍵盤輸入一個(gè)字符,不回顯,檢測(cè)Ctrl_Break8AL=字符從鍵盤輸入一個(gè)字符,不回顯7AL=字符(若準(zhǔn)備好)AL=0(未準(zhǔn)備好)DL=0FFH讀鍵盤字符6功能返回參數(shù)調(diào)用參數(shù)AH例4.42程序顯示一串信息,要求回答Y或N,回答Y,程序轉(zhuǎn)標(biāo)號(hào)為YES程序段,而N使程序轉(zhuǎn)標(biāo)號(hào)為NO程序段。編程如下:gat_key:mov ah,1

;readakeywithint 21h

;echocmp al,‘y’ ;isity?je

yes

;ifso,jumptoyescmp al,‘n’ ;isitn?je

no

;ifso,jumptonojne

get_key

;otherwise,

;waitforyorn例4.43要求程序在按下Return鍵后才繼續(xù)運(yùn)行。程序段為:WAIT_HERE:

MOV AH,7

;WaitforenterINT 21HCMP AL,0DH

;ASCIIcodeofJNE

WAIT_HERE ;Return0AH號(hào)功能說明0AH號(hào)功能是從鍵盤接收一串字符送入內(nèi)存緩沖區(qū)其緩沖區(qū)的格式為:第一字節(jié):保存最大字符數(shù),由用戶給出;第二字節(jié):實(shí)際輸入字符數(shù),由功能A自動(dòng)填入;第三字節(jié)開始:字符串按字節(jié)順序填入;結(jié)束字符是回車符(Return)0DH,它也占用一個(gè)字節(jié),故緩沖區(qū)空間至少應(yīng)為最大字符數(shù)加3。例如緩沖區(qū)為10個(gè)字節(jié),若鍵盤輸入字符串‘Hello!

’,則存儲(chǔ)示意為:0D!olleH610例4.44設(shè)置一個(gè)緩沖區(qū),并接收字符串‘Hello’.;字符串緩沖區(qū)定義如下:MAXLEN DB10ACTLEN DB?STRING DB10DUP(?);輸入字符串的指令如下:MOV AX,SEG

STRING

;InitializeDSMOV DS,AXLEA DX,

MAXLEN

;MakeDXpoint ;tobufferMOV AH,0AH

;InputthestringINT 21H例4.45清除鍵盤緩沖區(qū),然后執(zhí)行8號(hào)功能。 MOVAH,0CH MOVAL,08H INT21H例4.46檢驗(yàn)鍵盤是否按下,只要任意鍵按下,程序就退出循環(huán)并返回。SOUNDER:… ;soundthetoneMOV AH,0BH

;getkeyboardstatusINT 21H

;callDOSINC AL ;ifalnot0ffh,thenJNZ SOUNDER ;nokeypressed

RET

;keypressedreturn表4.3DOS顯示功能調(diào)用(INT21H)光標(biāo)跟隨字符移動(dòng)DL=字符顯示一個(gè)字符2字符串必須以$結(jié)束,光標(biāo)跟隨字符移動(dòng)DS:DX=串地址顯示字符串9光標(biāo)跟隨字符移動(dòng)DL=字符顯示一個(gè)字符6功能說明調(diào)用參數(shù)AHDATA SEGMENT

MESSAGEDB‘HOWDOYOUDO?’,0DH,0AH,‘$’DATA ENDSCODESEGMENT

MOVAX,DATA

MOVDS,AXMOVDX,OFFSETMESSAGE

MOVAH,9

INT21H

例4.47在屏幕上顯示一個(gè)字符串。例4.48利用DOS系統(tǒng)功能調(diào)用實(shí)現(xiàn)人機(jī)對(duì)話。data segmentpars db100 db? db100dup(?)mesg db‘whatisyourname?’ db0dh,0ah,‘$’data endsstack

segmentparastack‘stack’ db100dup(?)stack endscode segmet assumecs:code,ds:data,ss:stackstart procfar

push ds

mov ax,0 push ax

mov ax,data

mov

ds,axdisp:

mov

dx,offset

mesg

mov ah,09;9號(hào)功能顯示提示信息

int 21hkeybd:

mov

dx,offset

pars

mov ah,10

;10號(hào)功能輸入字符串

int21h

retstart endpcode segment

endstart

BIOS功能調(diào)用BIOS(Basicinput/outputsystem)是駐留在系統(tǒng)板上ROM中的一組例行程序BIOS提供了系統(tǒng)加電自檢,引導(dǎo)裝入和對(duì)主要I/O設(shè)備(如鍵盤,顯示器,磁盤,打印機(jī),異步串行通信接口等)的處理程序。BIOS的功能可通過中斷指令I(lǐng)NT直接調(diào)用,調(diào)用格式為:設(shè)置入口參數(shù);功能號(hào)送AH寄存器;發(fā)中斷請(qǐng)求:INTN(N為中斷類型號(hào))例4.49清除左上角(0,0),右下角(24,39)的窗口,初始化為反相顯示,該窗口相當(dāng)于全屏幕的左半部分。mov ah,7

;scrolldownwardfunctionmov al,0

;codetoblankscreenmov

bh,70h

;reversevideoattributemov

ch,0

;upperleftrowmov

cl,0

;upperleftcolumnmov dh,24

;lowerrightrowmov dl,39

;lowerrightcolumint 10h

;videoromcall4.4匯編程序的模塊化設(shè)計(jì)模塊能獨(dú)立匯編的一個(gè)邏輯段,或者是能獨(dú)立匯編的幾個(gè)邏輯段的集合在模塊化程序中,只允許有一個(gè)主模塊,其他均為子模塊子模塊用“END”作為結(jié)束語句主模塊用“END

啟動(dòng)指令標(biāo)號(hào)”作為源程序的結(jié)束語句。模塊的連接是由段定義偽操作“SEGMENT”的組合類型及類別的定義來確定。它分為:多個(gè)模塊組合時(shí)的連接情況PUBLICCOMMONSTACKMEMORY外部符號(hào):在某模塊中定義,而在另一模塊中引用的符號(hào)外部符號(hào)定義偽操作PUBLIC格式:PUBLIC

符號(hào)

[,…]功能:說明本模塊

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論