版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 三副考試必對(duì)題目及答案
- 運(yùn)輸公司安全制度
- 車輛排土?xí)r,嚴(yán)格執(zhí)行車廂二次舉升制度
- 財(cái)務(wù)報(bào)賬會(huì)審會(huì)簽制度
- 試述取得時(shí)效制度
- 血透重點(diǎn)環(huán)節(jié)核查制度
- 2025年濟(jì)南人事中心考試及答案
- 2025年大渡崗鄉(xiāng)事業(yè)單位考試及答案
- 2025年-北京舞蹈學(xué)院招聘筆試及答案
- 2025年黃州人事考試及答案
- 緬甸礦產(chǎn)資源分布情況
- 建設(shè)方承包方和勞務(wù)公司三方代發(fā)協(xié)議模板
- 產(chǎn)前篩查培訓(xùn)課件
- 交期縮短計(jì)劃控制程序
- 神經(jīng)指南:腦血管造影術(shù)操作規(guī)范中國專家共識(shí)
- 物理必修一綜合測(cè)試題
- 文化區(qū)發(fā)展策略研究-以香港西九龍文化區(qū)和牛棚藝術(shù)村為例
- 廣東二甲以上醫(yī)院 共152家
- 電力溫控行業(yè)研究報(bào)告
- GB/T 4358-1995重要用途碳素彈簧鋼絲
- GB/T 35263-2017紡織品接觸瞬間涼感性能的檢測(cè)和評(píng)價(jià)
評(píng)論
0/150
提交評(píng)論