




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章匯編語(yǔ)言程序設(shè)計(jì)4.3偽指令4.4宏指令4.5系統(tǒng)功能調(diào)用4.6匯編語(yǔ)言程序設(shè)計(jì)舉例4.7匯編語(yǔ)言程序上機(jī)過(guò)程4.8調(diào)試程序DEBUG的使用4.2匯編語(yǔ)言基本語(yǔ)法4.1匯編語(yǔ)言程序基本格式4.1.1匯編語(yǔ)言概述
機(jī)器語(yǔ)言:是計(jì)算機(jī)能直接識(shí)別和執(zhí)行的語(yǔ)言,用一串“0”、“1”數(shù)字代碼表示。匯編語(yǔ)言:是一種符號(hào)語(yǔ)言,用某種容易記憶的英文縮寫去表示機(jī)器指令操作碼(指令助記符),用人們熟悉的數(shù)碼及數(shù)學(xué)符號(hào)等表示操作數(shù)、地址。算法語(yǔ)言:是一種規(guī)定了書寫程序的一系列語(yǔ)句和語(yǔ)法規(guī)則的、更接近于數(shù)學(xué)語(yǔ)言的程序設(shè)計(jì)語(yǔ)言。用它編寫的程序更直觀簡(jiǎn)練。4.1匯編語(yǔ)言程序基本格式4.1.2匯編語(yǔ)言源程序和匯編程序1.源程序
用匯編語(yǔ)言編寫的程序稱為匯編語(yǔ)言源程序,或簡(jiǎn)稱為源程序2.匯編程序把匯編語(yǔ)言書寫的程序翻譯成與之等價(jià)的機(jī)器語(yǔ)言程序的翻譯程序稱為匯編程序。匯編程序輸入的是用匯編語(yǔ)言書寫的源程序,輸出的是用機(jī)器語(yǔ)言表示的目標(biāo)程序。3.匯編語(yǔ)言程序的建立及匯編過(guò)程圖MyProg.ASM匯編程序編輯程序MyProg.OBJ連接程序MyProg.EXE1.執(zhí)行速度快2.程序短小3.可以直接控制硬件4.可以方便地編譯5.輔助計(jì)算機(jī)工作者掌握計(jì)算機(jī)體系結(jié)構(gòu)4.1.3匯編語(yǔ)言的特點(diǎn)
匯編語(yǔ)言源程序采用分段框架結(jié)構(gòu),一般一個(gè)完整的源程序由3個(gè)程序段組成,即代碼段、數(shù)據(jù)段、堆棧段。4.1.4一般匯編語(yǔ)言程序的結(jié)構(gòu)形式
完整段定義的程序結(jié)構(gòu)
自定義的段名稱 SEGMENT
自定義的段名稱 ENDS
此外,必須明確段和段寄存器的關(guān)系,可用以下偽操作來(lái)實(shí)現(xiàn),其格式為ASSUME<段寄存器名>:段名[,<段寄存器名>:段名,...]其中,段寄存器名必須是CS、DS、ES和SS…例如,下面是一個(gè)較為完整的匯編源程序段定義。DATA_SEG1SEGMENT DATA_SEG1ENDSDATA_SEG2SEGMENT
DATA_SEG2ENDSCODE_SEG SEGMENT
;定義代碼段
ASSUMECS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2START:
CODE_SEG ENDS
;代碼段定義結(jié)束
END START
;源程序結(jié)束……4.1.4一般匯編語(yǔ)言程序的結(jié)構(gòu)形式4.2.1常量、變量與標(biāo)號(hào)1.常量
即在程序運(yùn)行過(guò)程中不變的量。包括:數(shù)值常量字符串常量符號(hào)常量
4.2匯編語(yǔ)言基本語(yǔ)法(1)變量定義在數(shù)據(jù)段、附加數(shù)據(jù)段或堆棧段中用變量定義偽指令定義,后面不跟冒號(hào)。也可以用LABEL或EQU偽操作來(lái)定義。同一個(gè)程序中,同樣變量的定義只允許出現(xiàn)一次,否則匯編程序會(huì)指示出錯(cuò)。(2)變量屬性
段屬性:定義變量的段起始地址,此值必須在一個(gè)段寄存器中。
偏移屬性:變量的偏移地址,是從段的起始地址到定義變量的位置之間的字節(jié)數(shù)。
類型屬性:即定義該變量所保留的字節(jié)數(shù)。2.變量(1)標(biāo)號(hào)定義標(biāo)號(hào)在代碼段中定義,后面跟著冒號(hào);也可以用
LABEL或EQU偽操作來(lái)定義。此外,它還可以作為過(guò)程名定義。(2)變量屬性
段屬性:定義標(biāo)號(hào)的段起始地址,此值必須在一個(gè)段寄存器中,而標(biāo)號(hào)的段則總是在CS寄存器中。
偏移屬性:標(biāo)號(hào)的偏移地址是從段起始地址到定義標(biāo)號(hào)的位置之間的字節(jié)數(shù)。
類型屬性:用來(lái)指出該標(biāo)號(hào)是在本段內(nèi)引用還是在其他段中引用的。有NEAR近屬性和FAR遠(yuǎn)屬性。3.標(biāo)號(hào)4.2.2運(yùn)算符與表達(dá)式1.運(yùn)算符2.表達(dá)式是由數(shù)字、算符、括號(hào)、變量等以能求得數(shù)值的有意義排列方法所得的組合。算術(shù)運(yùn)算符有:+、-、*、/、MOD邏輯運(yùn)算符有:AND、OR、XOR、NOT關(guān)系運(yùn)算符有:EQ、LT、LE、GT、GENE取值運(yùn)算符:SEG、OFFSET、TYPE、LENGTH、SIZE合成運(yùn)算符:PTR、THIS4.3偽指令1.數(shù)據(jù)定義偽指令
字節(jié)變量定義語(yǔ)句格式:[變量名]DBEXP[,EXP]例如:
VarADB101B,7,D,0FH,-1 DB2*56,INPUT$,?,A,B
VarBDB1,2,3,4,5,6,7
VarCDB1,2,3,4,5,6,7,8見內(nèi)存分配圖07H05H44H0FHFFH49H70H4EH50H55H24H54H–41H42H02H01H03H04H05H07H06H31H32H33H35H34H36H37H38HVarAVarBVarC1.數(shù)據(jù)定義偽指令
字變量定義語(yǔ)句形式:[變量名]DWEXP[,EXP]
雙字變量定義語(yǔ)句形式:[變量名]DDEXP[,EXP]
三字變量定義語(yǔ)句形式:[變量名]DFEXP[,EXP]
四字變量定義語(yǔ)句形式:[變量名]DQEXP[,EXP]
十字節(jié)變量定義語(yǔ)句形式:[變量名]DTEXP[,EXP]格式:重復(fù)次數(shù) DUP(EXP[,EXP])
其中重復(fù)次數(shù)取非零正整數(shù),EXP可以是常數(shù)表達(dá)式、字符串以及“?”。例如:
b DB 100DUP(?) d DD 4DUP(160),90DUP(A5) t DT 7,10DUP(56)2.重復(fù)子句定義語(yǔ)句3.符號(hào)定義偽指令
賦值等價(jià)語(yǔ)句格式:名字=EXP
功能:匯編時(shí)該名字用表達(dá)式的值取代,類似與高級(jí)語(yǔ)言的符號(hào)數(shù)。允許重新定義。例如:
lab=la-lb price=30
price=403.符號(hào)定義偽指令
數(shù)值等價(jià)語(yǔ)句形式: 名字
EQU
EXP
功能:該語(yǔ)句與賦值等價(jià)語(yǔ)句功能一樣,唯一的區(qū)別是,用EQU定義的名字不允許再定義。例如:
lab EQU la-lb price EQU 30
price EQU 40 ;錯(cuò)誤的定義3.符號(hào)定義偽指令
定義符號(hào)名偽指令形式: 名字
LABLE類型功能:定義跟在這個(gè)定義語(yǔ)句后面的變量或者標(biāo)號(hào)的數(shù)據(jù)類型或?qū)傩浴?/p>
解除定義偽指令格式:PURGE<符號(hào)1,符號(hào)2,…,符號(hào)N>
功能:解除指定符號(hào)的定義。解除符號(hào)定義后,可用EQU重新進(jìn)行定義。如:
Y1 EQU 7 ;定義Y1的值為7 PURGE Y1 ;解除Y1的定義
Y1 EQU 36 ;重新定義Y1的值為364.段定義和段說(shuō)明偽指令
格式:
段名SEGMENT[定位類型][組合類型][‘類別’]
ASSUME
段寄存器:段名[,段寄存器:段名……]┇
段名ENDS
其中:SEGMENT表示定義段的開始的偽指令;
END表示定義段的結(jié)束的偽指令;
ASSUME表示說(shuō)明所定義的段和哪個(gè)段寄存器之間的關(guān)系;
SEGMENT后面定義段的各種屬性見后頁(yè)。
用于規(guī)定段的起始地址要求,即指定該段起點(diǎn)的邊界類型,有5種可選類型,默認(rèn)方式為PARA。
PARA(節(jié)):段起始地址從段邊界開始(必為16的倍數(shù)),段起始單元20位地址的最低4位二進(jìn)制位必為0。
BYTE(字節(jié)):段起始地址從字節(jié)邊界開始,即該段可以從任何單元開始。
WORD(字):段起始地址從字邊界開始(必為偶數(shù)),段起始單元20位地址的最低1位二進(jìn)制位必為0。
DWORD(雙節(jié)):段起始地址從雙字邊界開始(必為4的倍數(shù)),段起始單元20位地址的最低2位二進(jìn)制位必為0,一般用于80386的32位段中。
PAGE(頁(yè)):段起始地址從頁(yè)邊界開始(必為256的倍數(shù)),段起始單元20位地址的最低8位二進(jìn)制位必為0。①定位類型
用于告訴LINK程序本段與其他模塊中同名段的組合連接關(guān)系,有五種可選組合類型:
PUBLIC:LINK程序?qū)⒉煌K中具有該類型且段名相同的段連接到同一個(gè)物理段中,使它們公用一個(gè)段地址。
STACK:與PUBLIC同樣處理,只是連接后的段為堆棧段。
COMMON:產(chǎn)生一個(gè)覆蓋段。LINK程序?yàn)樵擃愋偷耐沃付ㄏ嗤亩蔚刂贰6蔚拈L(zhǎng)度取決于最長(zhǎng)的COMMON段的長(zhǎng)度。段的內(nèi)容為所連接的最后一個(gè)模塊中的內(nèi)容及其沒(méi)有覆蓋到的前面COMMON段的部分內(nèi)容。
MEMORY:LINK程序不單獨(dú)區(qū)分MEMORY類型,它把MEMORY與PUBLIC類型同等對(duì)待。
AT表達(dá)式:LINK程序?qū)⒕哂蠥T類型的段裝在表達(dá)式值所指定的段地址邊界上。在保護(hù)方式中,AT類型無(wú)意義。②組合類型
用于控制段的存放次序。它可以是任何合法的名稱,但必須用單引號(hào)括起來(lái)。LINK程序只使同類別段發(fā)生關(guān)系,并將它們存放在連續(xù)的存儲(chǔ)空間中。若‘類別’選擇項(xiàng)缺省,則表明該段類別為空。③類別5.地址計(jì)數(shù)器偽指令--$用法一:表示指令的首地址例:JNE$+6
其轉(zhuǎn)向地址是JNE指令的首地址加上6。注意:在這里,$+6必須是另一條指令的首地址,否則,匯編程序?qū)⒅甘境鲥e(cuò)信息。用法二:當(dāng)$用在偽操作的參數(shù)字段時(shí),則它所表示的是地址計(jì)數(shù)器的當(dāng)前值。例:ARRAYDW1,2,$+4,3,4,$+4
如匯編時(shí)ARRAY分配的偏移地址為0074,則結(jié)果如右圖所示。結(jié)論:
ARRAY數(shù)組中的兩個(gè)$+4得到的結(jié)果是不同的,這是由于$的值是在不斷變化的緣故。當(dāng)在指令中用到$時(shí),它只代表該指令的首地址,而與$本身所在的字節(jié)無(wú)關(guān)。例:$用法示例。ORG偽指令格式:ORG
EXP其中:EXP是一個(gè)常量表達(dá)式或一個(gè)標(biāo)號(hào)。功能:把代碼或數(shù)據(jù)定位于當(dāng)前段指定的偏移地址處。6.對(duì)準(zhǔn)偽指令EVEN偽指令格式:EVEN功能:使其后面的變量或者指令開始于偶地址。ALIGN偽指令格式:ALIGNEXP其中,EXP必須是2的冪。功能:使其后面的數(shù)組邊界是從4的倍數(shù)開始。
格式:TITLE
文本其中,文本是用戶給出的字符串,要求長(zhǎng)度不超過(guò)6個(gè)字符。功能:在打印列表文件的時(shí)候,可以在每一頁(yè)開頭打印出此標(biāo)題。7.程序標(biāo)題偽指令
8086/8088指令系統(tǒng)中,有一種軟中斷指令I(lǐng)NTn。每執(zhí)行一條軟中斷指令,就調(diào)用一個(gè)相應(yīng)的中斷服務(wù)程序。
當(dāng)n=5~1FH時(shí),調(diào)用BIOS中的服務(wù)程序,一般稱作系統(tǒng)中斷調(diào)用;
當(dāng)n=20~3FH時(shí),調(diào)用DOS中的服務(wù)程序,稱作功能調(diào)用。其中,INT21H是一個(gè)具有調(diào)用多種功能的服務(wù)程序的軟中斷指令,故稱其為DOS系統(tǒng)功能調(diào)用。4.4系統(tǒng)功能調(diào)用格式:INTn其中:n是中斷類型碼(INT20H~I(xiàn)NT27H),區(qū)分不同的中斷功能;不同的中斷類型碼中,又包含了若干子功能,給這些子功能又分配了不同的子功能號(hào)。方法:(1)設(shè)置分功能號(hào);給指定寄存器(通常為AH)送入分功能號(hào)。(2)設(shè)置入口參數(shù);給寄存器填寫相應(yīng)參數(shù)的內(nèi)容(某些調(diào)用無(wú)參數(shù))。(3)使用中斷語(yǔ)句INTn;執(zhí)行調(diào)用的功能,其中n為中斷號(hào)。(4)分析出口參數(shù);有些功能可以不用這一步。1.DOS功能調(diào)用方法軟中斷功能入口參數(shù)出口參數(shù)INT20H程序正常退出
INT21H系統(tǒng)功能調(diào)用AH=功能號(hào)功能調(diào)用相應(yīng)的入口參數(shù)功能調(diào)用相應(yīng)的出口參數(shù)INT22H結(jié)束退出
INT23HCTRL+BREAK退出
INT24H出錯(cuò)退出
INT25H讀盤CX=讀出扇區(qū)數(shù)DX=起始邏輯扇區(qū)DS:BX=緩沖區(qū)地址AL=盤號(hào)CF=1出錯(cuò)INT26H寫盤CX=寫扇區(qū)數(shù)DX=起始邏輯扇區(qū)DS:BX=緩沖區(qū)地址AL=盤號(hào)CF=1出錯(cuò)INT27H駐留退出
INT28H~I(xiàn)NT2FHDOS專用
2.常用DOS軟中斷3.DOS系統(tǒng)功能調(diào)用(INT21H)AH=功能入口參數(shù)出口參數(shù)1鍵盤輸入并回顯AL=輸入字符2輸出顯示DL=輸出字符7鍵盤輸入無(wú)回顯AL=輸入字符9顯示字符串DS:DX=串地址0AH鍵盤輸入到緩沖區(qū)DS:DX=緩沖區(qū)首地址DS:(DX+1)=實(shí)際字符數(shù)0BH檢查是否有字符鍵入AL=00無(wú)AL=FF有2AH取日期CX=年DH:DL=月:日2BH設(shè)置日期CX=年DH:DL=月:日AL=00成功AL=FF無(wú)效2CH取時(shí)間CH:CL=時(shí):分DH:DL=秒:1/100秒2DH設(shè)置時(shí)間CH:CL=時(shí):分DH:DL=秒:1/100秒AL=00成功AL=FF無(wú)效4CH返回DOS(AL=返回碼)0AH號(hào)功能——鍵入字符串??梢越邮真I入的字符串將其存入內(nèi)存中用戶定義的緩沖區(qū)。緩沖區(qū)結(jié)構(gòu)如圖所示。緩沖區(qū)第一字節(jié)為用戶定義的最大鍵入字符數(shù),若用戶鍵入的字符數(shù)
(包括回車符)大于此數(shù),則機(jī)器鈴響且光標(biāo)不再右移,直到鍵入回車符為止。緩沖區(qū)第二字節(jié)為實(shí)際鍵入的字符數(shù)
(不包括回車符),由DOS自動(dòng)填入。從第三字節(jié)開始存放鍵入的字符,顯然,緩沖區(qū)的大小等于最大字符數(shù)加24.0AH號(hào)分功能宏指令概念是程序員事先定義的特定的“指令”,這種“指令”是一組在程序中可能會(huì)重復(fù)出現(xiàn)的程序指令塊的縮寫和替代。即是源程序中的一段具有獨(dú)立功能的程序代碼。宏指令定義以后,凡在宏指令出現(xiàn)的地方,宏匯編程序總是自動(dòng)地把它們替換成對(duì)應(yīng)的程序指令塊。宏指令有時(shí)也稱為宏,包含有宏定義和宏調(diào)用。4.5宏定義由開始偽指令MACRO、宏指令體、宏指令定義結(jié)束偽指令
ENDM組成。格式如下:宏指令名MACRO[形式參數(shù)1,形式參數(shù)2,…,形式參數(shù)N]
;宏指令體(宏體)
ENDM特點(diǎn):定義一次,多次調(diào)用,調(diào)用時(shí)只要使用一個(gè)宏指令語(yǔ)句。4.5.1宏指令定義
宏指令一旦定義后,就可以用宏指令名字(宏名)來(lái)調(diào)用(或引用)。宏調(diào)用的格式為:
宏指令名[實(shí)際參數(shù)1,實(shí)際參數(shù)2,…,實(shí)際參數(shù)N]其中:※實(shí)際參數(shù)的類型和順序要與形式參數(shù)的類型和順序保持一致,宏調(diào)用時(shí)將一一對(duì)應(yīng)地替換宏指令體中的形式參數(shù)?!曛噶钫{(diào)用時(shí),實(shí)際參數(shù)的數(shù)目并不一定要和形式參數(shù)的數(shù)目一致,當(dāng)實(shí)參個(gè)數(shù)多于形參的個(gè)數(shù)時(shí),忽略多余的實(shí)參;當(dāng)實(shí)參個(gè)數(shù)少于形參個(gè)數(shù)時(shí),多余的形參用空串代替。4.5.2宏調(diào)用LFMACRO ;定義一條換行宏指令LF
MOV DL,10 MOV AH,2 INT21H ENDM
CR MACRO ;定義一條回車宏指令CR MOV DL,13 MOV AH,2 INT 21H ENDMINOUTMACROX,Y;定義一條輸入/輸出宏指令
MOV AH,XLEADX,YINT 21HENDM例:有參和無(wú)參宏應(yīng)用DATAS SEGMENTINPUT DB 'PLEASEINPUTANYCHARACTERS:’,'$'KEYBUFDB 10,11DUP(?),13,10,'$'DATAS ENDSCODES SEGMENT ASSUMECS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX
INOUT
9,INPUT
LF
CR
INOUT
10,KEYBUF
LF CR
INOUT
9,KEYBUF+2
MOVAH,4CHINT21HCODES ENDS END START什么是宏展開?
匯編程序不對(duì)宏指令的定義進(jìn)行匯編,只有在程序中引用的時(shí)候,匯編程序才把對(duì)應(yīng)的宏指令體調(diào)出進(jìn)行匯編處理
(語(yǔ)法檢查和代碼塊的插入),這個(gè)過(guò)程稱宏展開(或宏擴(kuò)展)。
參數(shù)替換
宏指令調(diào)用后,在宏指令調(diào)用處產(chǎn)生用實(shí)參替換形參的宏體指令語(yǔ)句。例如,上述INOUT宏指令調(diào)用后,宏展開后的語(yǔ)句如下4.5.2宏展開
+MOV AH,9+LEA DX,INPUT+INT 21H+MOV DL,10+MOV AH,2+INT 21H+MOV DL,13+MOV AH,2+INT 21H+MOV AH,10+LEA DX,KEYBUF+INT 21H+MOV AH,9+LEA DX,KEYBUF+2
+INT 21HINOUT
9,INPUT
LFCRINOUT10,KEYBUFINOUT9,KEYBUF+2
雖然匯編語(yǔ)言屬于非結(jié)構(gòu)化的語(yǔ)言,但是用其編程的時(shí)候也應(yīng)該編制出邏輯上是結(jié)構(gòu)化的程序,即整個(gè)程序包含以下三種基本結(jié)構(gòu):順序選擇循環(huán)4.6匯編語(yǔ)言程序設(shè)計(jì)舉例DATA SEGMENTD1 DB 4CH D2 DB 25H SUM DW ? DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AL,D1 MUL D2MOV SUM,AXMOVAH,4CHINT21HCODEENDS ENDSTART...CODE ENDSEND START例:兩個(gè)存儲(chǔ)單元的字節(jié)數(shù)據(jù)相乘,結(jié)果存放到另一存儲(chǔ)單元中。4.6.1順序結(jié)構(gòu)程序設(shè)計(jì)4.6.2分支結(jié)構(gòu)程序設(shè)計(jì)1.分支程序的結(jié)構(gòu)不完全的雙分支結(jié)構(gòu)和完全的雙分支結(jié)構(gòu),如圖所示。圖分支程序的一般結(jié)構(gòu)(a)不完全的雙分支結(jié)構(gòu);(b)完全的雙分支結(jié)構(gòu)⑴利用比較轉(zhuǎn)移指令實(shí)現(xiàn)分支程序的分支一般用條件轉(zhuǎn)移指令來(lái)產(chǎn)生,連續(xù)地使用條件轉(zhuǎn)移指令可使程序產(chǎn)生多個(gè)不同的分支。用于比較、判斷的指令有:比較指令CMP、串比較指令CMPS、串搜索指令SCAS。用于實(shí)現(xiàn)轉(zhuǎn)移的指令有:無(wú)條件轉(zhuǎn)移指令JMP和各種類型的條件轉(zhuǎn)移指令。注意:非結(jié)構(gòu)化的程序是順序執(zhí)行的,所以無(wú)條件轉(zhuǎn)移指令是不能忽略的。2.分支結(jié)構(gòu)設(shè)計(jì)方法MOVAL,XCMPAL,0JGEL1INCCNT1L1:JGL2INCCNT2L2:INCCNT3L3:…
MOVAL,XCMPAL,0JGEL1INCCNT1
JMPL3L1:JGL2INCCNT2
JMPL3L2:INCCNT3L3:…JMPL3JMPL3
例:統(tǒng)計(jì)一個(gè)數(shù)是正數(shù)、0還是負(fù)數(shù),并分別將結(jié)論統(tǒng)計(jì)在CNT1、CNT2和CNT3變量中。其流程圖如圖所示。⑵利用跳表實(shí)現(xiàn)分支這種方法主要用于分支較多的情況,即實(shí)現(xiàn)CASE結(jié)構(gòu)的時(shí)候用跳表法。對(duì)于分支比較少的情況IF_THEN_ELSE結(jié)構(gòu)是最簡(jiǎn)便可行的,但對(duì)于分支很多的情況,再使用IF_THEN_ELSE結(jié)構(gòu)實(shí)現(xiàn)程序就會(huì)變得十分冗長(zhǎng)。2.分支結(jié)構(gòu)設(shè)計(jì)方法
實(shí)現(xiàn)時(shí)需要兩個(gè)步驟:第一是構(gòu)造跳轉(zhuǎn)表;第二是使用跳轉(zhuǎn)地址、轉(zhuǎn)移指令或關(guān)鍵字實(shí)現(xiàn)分支。例某工廠有8種產(chǎn)品的加工程序R0到R7分別存放在以SBR0,SBR1,…,SBR7為首地址的內(nèi)存中。而這8個(gè)首地址偏移量連續(xù)存放在以BASE為首址的跳轉(zhuǎn)表內(nèi)。設(shè)這8種產(chǎn)品的編號(hào)分別為0,1,…,7。若現(xiàn)在已知目前要加工的產(chǎn)品編號(hào),應(yīng)如何編制一段程序,利用“跳轉(zhuǎn)表”的方法自動(dòng)轉(zhuǎn)入該種產(chǎn)品的加工程序?分兩個(gè)方面來(lái)討論:
(1)如何構(gòu)成跳轉(zhuǎn)表?
(2)如何根據(jù)已知的編號(hào)從表中查出該種產(chǎn)品加工程序的入口地址。跳表法舉例①構(gòu)建跳轉(zhuǎn)表BASE,如圖所示。表開始的第一個(gè)單元的地址稱作表基地址(或表首地址)。SBR0的地址SBR1的地址SBR2的地址SBR7的地址............BASEBASE+2BASE+4BASE+14跳轉(zhuǎn)表...SBR0SBR1...跳表法舉例②使用表。根據(jù)上述分析,已知:表項(xiàng)地址=表基地址+偏移量跳表法舉例DATASEGMENTBASEDWSBR0,SBR1,SBR2,SBR3 DWSBR4,SBR5,SBR6,SBR7DATAENDSSTACKSEGMENTSTACK'STACK'DB100DUP(?)STACKENDS
COSEGSEGMENT ASSUME CS∶COSEG,DS∶DATA,SS∶STACK跳表法舉例③完整程序:START:MOV AX,DATAMOV DS,AXMOVAH,1INT21HSUBAL,30HMOV AH,0ADD AL,AL MOV BX,OFFSETBASEADD BX,AXMOVAX,[BX]
CALLAX
MOVAH,4CHINT21HCOSEGENDSENDSTART 跳表法舉例4.6.3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)1.循環(huán)程序的組成部分
(1)初始化部分:為循環(huán)做準(zhǔn)備工作,包括建立指針,置計(jì)數(shù)器,設(shè)置其他變量的初始值等;
(2)循環(huán)體:完成循環(huán)的基本操作,是循環(huán)程序的核心部分;
(3)修改部分:修改操作數(shù)地址等,為下次循環(huán)做準(zhǔn)備;
(4)控制部分:修改計(jì)數(shù)器,查看循環(huán)控制條件,進(jìn)行循環(huán)控制。①“先執(zhí)行,后判斷”的直到型循環(huán)2.循環(huán)程序的基本結(jié)構(gòu)形式DATASEGMENTD1DB-1,-3,5,6,9,…RSDW? DATAENDSCODESEGMENTASSUMECS∶CODE,DS∶DATASTART:MOV AX,DATA MOV DS,AX MOV BX,OFFSETD1 MOV CX,10 MOV DX,0LOP1:MOVAX,[BX] CMPAX,0 JGEJUS INCDXJUS:INC BXDECCX JNE LOP1 MOVRS,DX MOVAH,4CHINT21HCODEENDSENDSTART例試編制一個(gè)程序統(tǒng)計(jì)一個(gè)數(shù)據(jù)塊中負(fù)元素的個(gè)數(shù)。②“先判斷,后執(zhí)行”的當(dāng)型循環(huán)結(jié)構(gòu)2.循環(huán)程序的基本結(jié)構(gòu)形式
用計(jì)數(shù)法控制循環(huán)使用條件:計(jì)數(shù)次數(shù)已知。使用形式:正或倒計(jì)數(shù)法。按條件控制循環(huán)使用條件:循環(huán)次數(shù)與某些條件有關(guān),條件可以檢測(cè)。使用形式:檢測(cè)、比較、判斷。用邏輯尺控制循環(huán)用戶輸入的一串代碼,稱為邏輯尺,作為分支的依據(jù)。3.循環(huán)控制方法
條件法控制循環(huán)舉例
例:編程統(tǒng)計(jì)AX寄存器中1的個(gè)數(shù),并將結(jié)果存入SUM單元。分析:要統(tǒng)計(jì)二進(jìn)制數(shù)中1的個(gè)數(shù),最方便的方法是將這個(gè)數(shù)的各位依次移入CF標(biāo)志,通過(guò)檢測(cè)CF的值來(lái)判斷該位是否為1,依此統(tǒng)計(jì)所含1的個(gè)數(shù)。MOVBL,0AGAIN:ORAX,AXJZEXITSHLAX,1JNCNEXTINCBLNEXT:JMPAGAINEXIT:MOVSUM,BL
計(jì)數(shù)法控制循環(huán)舉例
例:在首地址為BUFF的內(nèi)存緩沖區(qū)中,存放著20H個(gè)帶符號(hào)字?jǐn)?shù)據(jù)。編制程序找出其中的最小值,并將最小值存入MIN單元。程序段如下:
LEASI,BUFF ;設(shè)地址指針
MOVCX,20H ;CX←循環(huán)次數(shù)
MOVAX,[SI] ;AX←第一個(gè)數(shù)據(jù)
ADDSI,2 ;SI指向第二個(gè)數(shù)
DECCX
AGAIN:CMPAX,[SI]JLENEXT ;小于或等于時(shí)轉(zhuǎn)移
MOVAX,[SI]NEXT:ADDSI,2;修改地址指針指向下一個(gè)數(shù)
LOOPAGAIN MOVMIN,AX雙重循環(huán)程序的一般結(jié)構(gòu)如右圖所示。注意:千萬(wàn)不要使循環(huán)返回到初始化部分,否則會(huì)出現(xiàn)死循環(huán)。例編制計(jì)算矩陣向量相乘的程序。4.雙重循環(huán)設(shè)計(jì)例編制計(jì)算矩陣向量相乘的程序。多重循環(huán)舉例計(jì)算公式為將公式展開為:ADBa11,a12,a13,a14DBa21,a22,a23,a24DBa31,a32,a33,a34DBa41,a42,a43,a44BDBb1,b2,b3,b4CDW4DUP(?)多重循環(huán)舉例所以可以將數(shù)據(jù)結(jié)構(gòu)定義成:程序描述如下:DATASEGMENTADB1,0,2,3 DB0,1,1,0 DB3,0,1,0 DB4,2,0,1BDB0,1,1,0CDW4DUP(?)DATAENDSSTACKSEGMENTPARASTACK'STACK'STAPN DB100DUP(?)STACKENDS多重循環(huán)舉例CODESEGMENTASSUMECS:CODE,
DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVSI,0MOVBX,0MOVCX,4LOOP1:PUSHCX MOVDI,0 MOVWORDPTRC[BX],0 MOVCX,4LOOP2:MOVAH,0 MOVAL,A[SI] MULB[DI] ADDC[BX],AXINC SI INC DI LOOPLOOP2 ADDBX,2POPCX LOOPLOOP1 MOVAH,4CH INT 21HCODEENDS END START多重循環(huán)舉例1.子程序定義語(yǔ)法格式:
<子程序名>PROC Attribute
RET
<子程序名>ENDP其中:子程序名為名字,它又是子程序入口的符號(hào)地址;
PROC和ENDP分別是定義子程序開始和結(jié)束的偽指令;屬性(Attribute)是指類型屬性,它可以是NEAR或FAR?!?.6.4子程序設(shè)計(jì)2.
調(diào)用程序和子程序的定義格式MAINPROC FARMAIN PROC FAR
CALLSUBR1CALL SUBR1 RETRETMAINENDPSUBR1PROC NEARSUBR1 PROCNEAR RETRETSUBR1ENDPSUBR1 ENDP
MAIN ENDP………………注:子程序定義可以嵌套,一個(gè)子程序定義中可以包括多個(gè)子程序定義。
子程序的調(diào)用CALL
匯編語(yǔ)言中子程序的調(diào)用需要用CALL指令完成。返回RET
返回指令RET主要用于子程序中邏輯上的最后一句話。3.
子程序的調(diào)用和返回
現(xiàn)場(chǎng)保護(hù)與現(xiàn)場(chǎng)恢復(fù)的概念:進(jìn)入子程序后,把子程序所需要使用的寄存器內(nèi)容進(jìn)行保存,此過(guò)程稱作現(xiàn)場(chǎng)保護(hù);退出子程序前把寄存器內(nèi)容恢復(fù)原狀,此過(guò)程稱作現(xiàn)場(chǎng)恢復(fù)?,F(xiàn)場(chǎng)保護(hù)與恢復(fù)的原因:寄存器沖突如果主程序在調(diào)用子程序之前的某個(gè)寄存器內(nèi)容在從子程序返回后還有用,而子程序又恰好使用了同一個(gè)寄存器?,F(xiàn)場(chǎng)保護(hù)與現(xiàn)場(chǎng)恢復(fù)的方法:分別使用壓棧和彈出指令實(shí)現(xiàn)。4.
現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)SUBT PROC
PUSH AX ;現(xiàn)場(chǎng)保護(hù)
PUSH BX PUSH CX PUSH DX<子程序體>
POP DX;現(xiàn)場(chǎng)恢復(fù)
POP CX POP BX POP AX RETSUBT ENDP…
現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)基本形式
主程序調(diào)用子程序,子程序還可以調(diào)用其他子程序,這就是子程序的嵌套調(diào)用,子程序可以多重嵌套調(diào)用。例:設(shè)從BUF開始存放若干無(wú)符號(hào)字節(jié)數(shù)據(jù),找出其中的最小值并以十六進(jìn)制形式輸出。本題用子程序SEARCH來(lái)求最小數(shù)字節(jié)數(shù)并輸出,再調(diào)用一個(gè)子程序輸出1位十六進(jìn)制數(shù)。(程序見后頁(yè))5.子程序調(diào)用嵌套DATA SEGMENT BUF DB23,25,13,100,
DB123,78,90,110 CNT EQU$-BUF DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,CNT-1 MOV SI,OFFSETBUF
CALL SEARCH MOV AH,4CH INT 21HSEARCHPROCNEAR
MOV BL,[SI] SEAR1:INC SI CMP BL,[SI] JBE SEAR2 MOV BL,[SI]
SEAR2:DEC CX JNZ SEAR1 MOV DL,BL MOV CL,4 SHR DL,CL
CALL DISP
MOV DL,BL AND DL,0FH
CALL DISP
RETSEARCHENDPDISP PROC NEAR CMP DL,9 JBE DISP1 ADD DL,7DISP1: ADD DL,30H MOV AH,2 INT 21H RETDISP ENDPCODE ENDS END START
宏和子程序都是為了簡(jiǎn)化源程序的編寫,提高程序的可維護(hù)性,但是它們二者之間存在著以下本質(zhì)的區(qū)別:1.匯編程序?qū)晖ㄟ^(guò)宏展開來(lái)加入其定義體,宏調(diào)用多少次,就相應(yīng)展開多少次,所以,調(diào)用宏不會(huì)縮短目標(biāo)程序;
子程序代碼不論調(diào)用多少次,其在目標(biāo)程序中只出現(xiàn)一次因此,可簡(jiǎn)化相應(yīng)的目標(biāo)程序,從而節(jié)省存儲(chǔ)空間。2.宏引用時(shí),參數(shù)是通過(guò)“實(shí)參”替換“形參”的方式來(lái)實(shí)現(xiàn)傳遞的,參數(shù)形式靈活多樣;
子程序調(diào)用時(shí),參數(shù)是通過(guò)寄存器、堆棧或約定存儲(chǔ)單元進(jìn)行傳遞的;3.利用宏調(diào)用語(yǔ)句執(zhí)行重復(fù)語(yǔ)句,不會(huì)有額外的時(shí)間開銷;
用子程序執(zhí)行重復(fù)語(yǔ)句,子程序的調(diào)用和返回均需要時(shí)間;6.子程序與宏的區(qū)別4.7匯編語(yǔ)言程序上機(jī)過(guò)程4.8調(diào)試程序DEBUG的使用DEBUG是一個(gè)功能強(qiáng)大的調(diào)試工具。它不僅可以直接裝入、啟動(dòng)運(yùn)行匯編語(yǔ)言程序,還可以根據(jù)程序的運(yùn)行過(guò)程,修改程序錯(cuò)誤,甚至可以直接檢查和修改內(nèi)存單元和寄存器,在運(yùn)行過(guò)程中對(duì)程序進(jìn)行調(diào)試。1.如何運(yùn)行DEBUG
在DOS提示符下直接鍵入DEBUG,后敲回車,屏幕的下一行出現(xiàn)“-”,表示調(diào)試程序已經(jīng)啟動(dòng)。例:C>DEBUG↙
﹣2.常用DEBUG命令
反匯編命令U:從當(dāng)前IP處開始
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年房屋終止合同協(xié)議書模板
- 六年級(jí)下冊(cè)數(shù)學(xué)教案-數(shù)學(xué)好玩2《神奇的莫比烏斯帶》 |北師大版
- 2024-2025學(xué)年六年級(jí)下學(xué)期數(shù)學(xué)第二單元圓柱和圓錐的綜合復(fù)習(xí)(教案 )
- 五金廠的勞動(dòng)合同(2025年版)
- 二年級(jí)上冊(cè)數(shù)學(xué)教案-3.2 兒童樂(lè)園-北師大版
- (高清版)DB45∕T 838-2021 三江侗族自治縣侗族百家宴服務(wù)規(guī)范
- 2025年湖南工藝美術(shù)職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)一套
- 【單元測(cè)試】部編版語(yǔ)文三年級(jí)上冊(cè)第六單元分層訓(xùn)練B卷(提升篇)-(含解析)
- 2024年海洋石油修井機(jī)項(xiàng)目投資申請(qǐng)報(bào)告代可行性研究報(bào)告
- 2024年年物流倉(cāng)儲(chǔ)項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 部編版語(yǔ)文三年級(jí)下冊(cè)綜合性閱讀-理解人物情感-課件-(共32張課件).課件
- 2024年中國(guó)甜瓜市場(chǎng)調(diào)查研究報(bào)告
- (中級(jí))航空油料特設(shè)維修員(四級(jí))理論考試題庫(kù)-上(單選題)
- 部編人教版六年級(jí)道德與法治下冊(cè)全冊(cè)完整版課件
- 電動(dòng)車輛動(dòng)力電池系統(tǒng)及應(yīng)用技術(shù) 第3版 課件全套 王震坡 第1-11章 動(dòng)力電池及其驅(qū)動(dòng)的電動(dòng)車輛- 動(dòng)力電池充電方法與基礎(chǔ)設(shè)施
- 【獨(dú)立儲(chǔ)能】山西省獨(dú)立儲(chǔ)能政策及收益分析-中國(guó)能建
- (正式版)CB∕T 4550-2024 船舶行業(yè)企業(yè)安全設(shè)備設(shè)施管理規(guī)定
- 新入職員工廉政談話
- JB∕T 9006-2013 起重機(jī) 卷筒標(biāo)準(zhǔn)規(guī)范
- 2024內(nèi)蒙古中考數(shù)學(xué)二輪專題復(fù)習(xí) 二次函數(shù)與幾何綜合題 類型二 面積問(wèn)題(課件)
- 太平洋保險(xiǎn)計(jì)劃書模板
評(píng)論
0/150
提交評(píng)論