版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 匯編語言是面向機器的編程語言,不同的匯編語言是面向機器的編程語言,不同的CPU有著不同的匯編語言。有著不同的匯編語言。匯編語言源程序匯編程序目標程序(機器語言)匯編 一條完整的匯編語言語句由以下幾部分組成:一條完整的匯編語言語句由以下幾部分組成:、,這些都稱為,這些都稱為標記。標記。DA1:MOV AX,100H;數(shù)據(jù)傳送數(shù)據(jù)傳送 標識符是為了程序便于理解和書寫所使用的一些標識符是為了程序便于理解和書寫所使用的一些字符,常作為一段程序或數(shù)據(jù)塊的開頭,用來指出后字符,常作為一段程序或數(shù)據(jù)塊的開頭,用來指出后面緊跟的指令或數(shù)據(jù)的地址??捎糜谥赋鲛D(zhuǎn)移指令的面緊跟的指令或數(shù)據(jù)的地址??捎糜谥赋鲛D(zhuǎn)移指
2、令的目標地址。目標地址。 DA1:MOV AX,100 ADD AX,1 JNZ DA1 保留字是匯編語言中預先保留下來具有特定意義保留字是匯編語言中預先保留下來具有特定意義的符號,只能作為固定用途。的符號,只能作為固定用途。 8086的的、都是保留字。保都是保留字。保留字不能用于標識符。留字不能用于標識符。 界符對一個程序或一條指令的兩個部分起分隔作界符對一個程序或一條指令的兩個部分起分隔作用。用。 常數(shù)是指令中出現(xiàn)的固定值,如立即數(shù)尋址中的立即數(shù),常數(shù)是指令中出現(xiàn)的固定值,如立即數(shù)尋址中的立即數(shù),直接尋址時的地址。直接尋址時的地址。常數(shù)可以分數(shù)值常數(shù)和字符串常數(shù)兩類。常數(shù)可以分數(shù)值常數(shù)和字
3、符串常數(shù)兩類。 按其進制的不同,可有二進制數(shù)、八進制數(shù)、十進制數(shù)、十六進制數(shù)等幾種不同的表示形式,匯編語言中采用不同的后綴加以區(qū)分。:表示二進制數(shù)。例如,10100101B。:表示十進制數(shù)。例如,278D或278。:表示八進制數(shù)。例如,567Q,263Q。:表示十六進制數(shù)。例如,9AH,5678H。 是由單引號括起來的一串字符。 12345 要指出的是,此處的12345其值并非是十進制數(shù)12345,而是代表它們所對應(yīng)的ASC碼,即31H,32H,33H,34H,35H。 8086系統(tǒng)規(guī)定。對于16進制數(shù),如果以AF開頭,必須在前面加0。MOV AX,0FFFFH 在匯編語言程序中為了便于理解和
4、閱讀程序,常在匯編語言程序中為了便于理解和閱讀程序,常常加上注釋。注釋必須以;開頭,可以加在任何一行常加上注釋。注釋必須以;開頭,可以加在任何一行中。注釋部分從分號起直至行尾。中。注釋部分從分號起直至行尾。 表達式由操作數(shù)和運算符組成,在表達式由操作數(shù)和運算符組成,在。 操作數(shù)在內(nèi)容上可以代表一個數(shù)據(jù)也可以代表一個存儲單元操作數(shù)在內(nèi)容上可以代表一個數(shù)據(jù)也可以代表一個存儲單元地址。表達式中的操作數(shù)不同于指令中的操作數(shù),對表達式中操地址。表達式中的操作數(shù)不同于指令中的操作數(shù),對表達式中操作數(shù)的運算發(fā)生在匯編過程中,對指令操作數(shù)的運算發(fā)生在程序作數(shù)的運算發(fā)生在匯編過程中,對指令操作數(shù)的運算發(fā)生在程序
5、執(zhí)行過程中。執(zhí)行過程中。MOV AX,100H+2 MOV AX,102H ASM-86中有中有5類運算符,對表達式中運算符所定義的運算類運算符,對表達式中運算符所定義的運算發(fā)生在匯編過程中,在目標代碼中只有運算的結(jié)果。發(fā)生在匯編過程中,在目標代碼中只有運算的結(jié)果。START:MOV AL,20 INC AL JMP START+2MOV AL,80H AND 7FHMOV AL,0MOV AL,80H OR 7FHMOV AL,0FFHMOV AL,80H XOR 0FHMOV AL,8FHMOV AL,NOT 0MOV AL,0FFH 參與關(guān)系運算的兩個操作數(shù)必須都是數(shù)據(jù)(或用符號表示的數(shù)
6、參與關(guān)系運算的兩個操作數(shù)必須都是數(shù)據(jù)(或用符號表示的數(shù)據(jù)),或是同一段中的存儲單元地址,結(jié)果是一數(shù)值。如果關(guān)系不據(jù)),或是同一段中的存儲單元地址,結(jié)果是一數(shù)值。如果關(guān)系不成立,在匯編時結(jié)果為成立,在匯編時結(jié)果為 ;如果關(guān)系成立,在匯編時結(jié)果為;如果關(guān)系成立,在匯編時結(jié)果為或或。關(guān)系運算配合邏輯運算可用于條件匯編。關(guān)系運算配合邏輯運算可用于條件匯編。MOV AL,5 GT 4MOV AL,0FFHMOV AX,5 GT 4MOV AX,0FFFFHMOV BX,(,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30)若若PORT小于小于5 MOV BX,20若若PORT大
7、于或等于大于或等于5 MOV BX,30 取地址偏移量取地址偏移量 取地址段值取地址段值MOV BX,OFFSET DA1 = LEA BX,DA1MOV AX,SEG DA1MOV DS,AX 取存儲單元類型取存儲單元類型 KKKDB 20TYPE KKK 值為值為1 計算存儲區(qū)的單元數(shù)計算存儲區(qū)的單元數(shù) 計算存儲區(qū)的字節(jié)總數(shù)計算存儲區(qū)的字節(jié)總數(shù) ABC DW 100DUP(?)(?)TYPE ABC 值為值為2LENTH ABC值為值為100SIZE ABC值為值為200對存儲單元規(guī)定類型,常和對存儲單元規(guī)定類型,常和,等偽指令一同使用。等偽指令一同使用。MOV BYTE PTR1000H
8、,0PTR也可用來更改已經(jīng)規(guī)定了類型的存儲單元的類型。也可用來更改已經(jīng)規(guī)定了類型的存儲單元的類型。 XYZDW 100DUP(?)(?)PPEQUBYTE PTR XYZQQEQUDWORD PTR XYZ 用來改變存儲單元類型用來改變存儲單元類型 XYZ1EQUTHIS BYTEXYZDW1234H 8086匯編語言中有兩種語句,指令性語句和指示性語句。就是8086的一條指令,匯編過程中會產(chǎn)生可執(zhí)行的代碼。也叫,用來為匯編程序提供某些信息,讓匯編程序在匯編過程中執(zhí)行某些特定操作。指示性語句在匯編過程中不會產(chǎn)生可執(zhí)行的代碼。ABCDB100 偽指令給符號定義一個值。在程序中,凡是出現(xiàn)該符號的地
9、方,匯編時均用其值代替。 ABCEQU100;ABC代替常數(shù)代替常數(shù)100 XYZEQUABC SUMEQU30*25;SUM代替數(shù)值表達式代替數(shù)值表達式 COUNTEQUCX;COUNT代替寄存器代替寄存器CX MEQUMOV;M代替指令助記符代替指令助記符MOV MOV AL,ABC MOV AL,100MOV AX,COUNT MOV AX,CX 需要注意的是,一個符號一經(jīng)EQU偽指令賦值后,在整個程序中,不允許再對同一符號重新賦值。如需重新賦值必須先解除原有的賦值。 ASM-86提供了解除標號賦值的偽指令PURGE。定義字節(jié),即每個數(shù)據(jù)是1個字節(jié)。定義字,即每個數(shù)據(jù)占1個字(2個字節(jié))
10、。定義雙字,即每個數(shù)據(jù)占2個字(4個字節(jié))。 低字部分在低地址,高字部分在高地址。定義4字長,即每個數(shù)據(jù)占4個字(8個字節(jié)) 。定義10個字節(jié)長。 CRDB0DH AMNDW0FFDH BUF_DISDB? DONTDB 9DUP(?) STDBHOW ARE YOU! TABLEDB00,01,03,02,06DB22,44,66,77,88 1000H:ABCDB0 MOV AL,ABC MOV AL,1000H MOV ABC,ALMOV 1000H,ALMOV BYTE PTRDI,0MOV WORD PTR2000,0JMP DWORD PTRSI 和和 成對使用,前者用于定義一成對
11、使用,前者用于定義一個段的開始,后者用于定義段的終止。個段的開始,后者用于定義段的終止。例:例:DATA SEGMENT0000H:10HM1DB10H0001H:34HM2DW1234H0002H:12HDATA ENDS 用于說明已定義的段作為哪個段使用。用于說明已定義的段作為哪個段使用。ASSUME DS:DATA 用于規(guī)定后續(xù)程序存放單元的地址偏移量。用于規(guī)定后續(xù)程序存放單元的地址偏移量。ORG 2000HMOV AX,0MOV CX,8MOV AX,DATAMOV DS,AX 在在ASM-86中過程就是子程序。中過程就是子程序。和和成成對使用,前者用于定義一個過程的開始,后者用于過程
12、對使用,前者用于定義一個過程的開始,后者用于過程的終止。兩者之間的內(nèi)容作為過程,即子程序。的終止。兩者之間的內(nèi)容作為過程,即子程序。表示子程序供段內(nèi)調(diào)用,表示子程序供段內(nèi)調(diào)用,表示子程序供段間調(diào)用,表示子程序供段間調(diào)用,如沒有明確指出默認子程序供段內(nèi)調(diào)用。如沒有明確指出默認子程序供段內(nèi)調(diào)用。AA1 PROC NEAR RETAA1ENDP AA2 PROC FARRETAA2ENDP 偽指令偽指令END是源程序結(jié)束的標志,其后的表達式通是源程序結(jié)束的標志,其后的表達式通常是程序第一條指令前的標號。如果程序第一條指令位常是程序第一條指令前的標號。如果程序第一條指令位于源程序最前端表達式可省略。對
13、源程序中于源程序最前端表達式可省略。對源程序中END后的部后的部分匯編時不作處理。分匯編時不作處理。 流程圖是表示程序結(jié)構(gòu)的圖形,它由邏輯框和流程圖是表示程序結(jié)構(gòu)的圖形,它由邏輯框和流程線組成。流程線組成。 流程線是指示程序邏輯處理順序的符號。流程線是指示程序邏輯處理順序的符號。 邏輯框是表示程序邏輯處理功能的符號。邏輯框是表示程序邏輯處理功能的符號。 表示程序的邏輯起點和終點。表示程序的邏輯起點和終點。 表示程序的一種處理功能。表示程序的一種處理功能。 表示一個判斷點,程序在此產(chǎn)生分支。表示一個判斷點,程序在此產(chǎn)生分支。 表示程序的來源或去向。表示程序的來源或去向。 帶重復前綴的字符串傳送指
14、令流程帶重復前綴的字符串傳送指令流程 REP MOVSBAB DISI 修改修改SI,DICX=CX-1CX=0?YN 順序結(jié)構(gòu)是最簡單順序結(jié)構(gòu)是最簡單的一種程序結(jié)構(gòu),在流的一種程序結(jié)構(gòu),在流程圖上表示為若干處理程圖上表示為若干處理框的串行連接。用編程框的串行連接。用編程語言表達時就是一條語語言表達時就是一條語句緊跟一條語句順序執(zhí)句緊跟一條語句順序執(zhí)行。行。S1S1S2S2SnSnDSEG SEGMENTBCD DB86HASC DB2DUP(?)(?);高位在前高位在前DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEG
15、MOV DS,AX MOV AL,BCD AND AL,0FH ADDAL,30H MOV ASC+1,AL MOV AL,BCD MOV CL,4 SHR AL,CL ADD AL,30H MOV ASC,AL HLTCSEG ENDS END START 分支結(jié)構(gòu)用于在程序中產(chǎn)生分支分支結(jié)構(gòu)用于在程序中產(chǎn)生分支,根據(jù)條件決根據(jù)條件決定執(zhí)行程序的哪個分支。分支結(jié)構(gòu)在流程圖中表示定執(zhí)行程序的哪個分支。分支結(jié)構(gòu)在流程圖中表示為判斷框。用編程語句表達時,判斷框一般是條件為判斷框。用編程語句表達時,判斷框一般是條件轉(zhuǎn)移指令。轉(zhuǎn)移指令。條件條件= =真?真?S1S1S2S2YN 單分支結(jié)構(gòu)程序在一個判
16、斷點只使用一個判斷框單分支結(jié)構(gòu)程序在一個判斷點只使用一個判斷框產(chǎn)生程序的兩個分支。產(chǎn)生程序的兩個分支。 編寫子程序,將編寫子程序,將AL中的中的8 8位二進制數(shù)轉(zhuǎn)換為位二進制數(shù)轉(zhuǎn)換為2 2位組合位組合BCD碼。如碼。如果果AL內(nèi)容超出內(nèi)容超出2位位BCD碼所能表達的范圍,則退出程序時置位碼所能表達的范圍,則退出程序時置位CF;若能正常轉(zhuǎn)換,則將若能正常轉(zhuǎn)換,則將CF清清0 0,并將轉(zhuǎn)換結(jié)果存放在,并將轉(zhuǎn)換結(jié)果存放在AL中。中。AL99?AL99?轉(zhuǎn)換轉(zhuǎn)換置位置位CFCFYN返回返回返回返回入口入口BIN2BCD:CMP AL,99 JBE BB1 STC RET BB1: MOV CL,10
17、XOR AH,AH DIV CL MOV CL,4 SHL AL,CL OR AL,AH RETBIN2BCD:CMP AL,99 JBE BB1 STC RET BB1: AAM MOV CL,4 SHL AH,CL OR AL,AH RET 在多分支結(jié)構(gòu)程序中,往往根據(jù)條件的不同狀態(tài)在多分支結(jié)構(gòu)程序中,往往根據(jù)條件的不同狀態(tài)產(chǎn)生出程序的多個分支。產(chǎn)生出程序的多個分支。 在這種多分支結(jié)構(gòu)程序中,連續(xù)使用多個判斷框在這種多分支結(jié)構(gòu)程序中,連續(xù)使用多個判斷框產(chǎn)生出程序的多個分支。產(chǎn)生出程序的多個分支。 在在AL中存放鍵盤輸入的數(shù)字中存放鍵盤輸入的數(shù)字09的的ASCII碼,編程根據(jù)碼,編程根據(jù)AL
18、的內(nèi)容分別執(zhí)行的內(nèi)容分別執(zhí)行ADR0,ADR1,ADR9等程序段。等程序段。TBENCH: CMP AL,0 JZ ADR0 CMP AL,1 JZ ADR1 CMP AL,8 JZ ADR8ADR9: ADR0: ADR8: AL=AL=0 0AL=AL=1 1AL=AL=8 8執(zhí)行執(zhí)行ADR0ADR0執(zhí)行執(zhí)行ADR1ADR1執(zhí)行執(zhí)行ADR8ADR8執(zhí)行執(zhí)行ADR9ADR9Y YY YY YN NN NN N 在這種多分支結(jié)構(gòu)程序中,把多個分支程序的起在這種多分支結(jié)構(gòu)程序中,把多個分支程序的起始地址(入口地址)依次順序存放在存儲區(qū)中,這個始地址(入口地址)依次順序存放在存儲區(qū)中,這個存儲區(qū)稱
19、為地址表。根據(jù)條件的不同狀態(tài)將相應(yīng)處理存儲區(qū)稱為地址表。根據(jù)條件的不同狀態(tài)將相應(yīng)處理程序的入口地址從地址表中找出,然后利用間接轉(zhuǎn)移程序的入口地址從地址表中找出,然后利用間接轉(zhuǎn)移指令產(chǎn)生出程序的多個分支。指令產(chǎn)生出程序的多個分支。 在在AL中存放鍵盤輸入的數(shù)字中存放鍵盤輸入的數(shù)字09的的ASCII碼,編程根據(jù)碼,編程根據(jù)AL的內(nèi)容的內(nèi)容分別執(zhí)行分別執(zhí)行ADR0,ADR1,ADR9等程序段。等程序段。ADRTAB DW OFFSET ADR0 DW OFFSET ADR1 DW OFFSET ADR9BENCH: SUB AL,0 XOR AH,AH SHL AX,1 LEA DI,ADRTAB
20、ADD DI,AX JMP WORD PTRDI ADR0: ADR1: ADR9: 在這種多分支結(jié)構(gòu)程序中,把轉(zhuǎn)移到多個分支程在這種多分支結(jié)構(gòu)程序中,把轉(zhuǎn)移到多個分支程序的無條件轉(zhuǎn)移指令(機器碼)依次順序存放在存儲序的無條件轉(zhuǎn)移指令(機器碼)依次順序存放在存儲區(qū)中(代碼段),這個存儲區(qū)稱為指令表。根據(jù)條件區(qū)中(代碼段),這個存儲區(qū)稱為指令表。根據(jù)條件的不同狀態(tài)控制程序轉(zhuǎn)移到指令表中對應(yīng)所需程序段的不同狀態(tài)控制程序轉(zhuǎn)移到指令表中對應(yīng)所需程序段的轉(zhuǎn)移指令處,然后利用表中的轉(zhuǎn)移指令最終轉(zhuǎn)移到的轉(zhuǎn)移指令處,然后利用表中的轉(zhuǎn)移指令最終轉(zhuǎn)移到所需的分支處理程序段。所需的分支處理程序段。 循環(huán)結(jié)構(gòu)用于控制
21、一段程序重復執(zhí)行。分可控循環(huán)結(jié)構(gòu)用于控制一段程序重復執(zhí)行。分可控制循環(huán)和不可控循環(huán)(死循環(huán))兩種情況。制循環(huán)和不可控循環(huán)(死循環(huán))兩種情況。 進入循環(huán)后無法自行退出循環(huán)。進入循環(huán)后無法自行退出循環(huán)。S1S1 STOP: JMP STOP 根據(jù)條件是否滿足決定程序段是否重復執(zhí)行,每根據(jù)條件是否滿足決定程序段是否重復執(zhí)行,每執(zhí)行一遍都要對條件進行判斷,直到條件不滿足時,執(zhí)行一遍都要對條件進行判斷,直到條件不滿足時,停止重復執(zhí)行。停止重復執(zhí)行。條件條件= =真?真?S1S1YN條件條件= =真?真?S1S1YN 使用一個判斷條件控制循環(huán)執(zhí)行。在流程圖中使用一個判斷條件控制循環(huán)執(zhí)行。在流程圖中S1S1
22、部分為順序或分支結(jié)構(gòu),不再包含循環(huán)結(jié)構(gòu)程序段。部分為順序或分支結(jié)構(gòu),不再包含循環(huán)結(jié)構(gòu)程序段。 將將DS段段1000H單元開始存放的單元開始存放的10個大寫字母轉(zhuǎn)換成小寫個大寫字母轉(zhuǎn)換成小寫字母存放到字母存放到ES段段2000H開始的單元。開始的單元。 MOV SI,1000H MOV DI,2000H MOV CX,10 CLDL1:LODSB ADD AL,20H STOSB LOOP L1 HLT置初值置初值 SIALSIALAL=AL+20HAL=AL+20HALDIALDI修正修正SISI,DIDICX=CX-1CX=CX-1CX=0CX=0?停機停機N NY Y 循環(huán)結(jié)構(gòu)程序由三部分
23、組成。循環(huán)結(jié)構(gòu)程序由三部分組成。 需要重復執(zhí)行的程序段,包括循環(huán)需要重復執(zhí)行的程序段,包括循環(huán),它是循環(huán)結(jié)構(gòu)程序要完成的主要任務(wù);另一部,它是循環(huán)結(jié)構(gòu)程序要完成的主要任務(wù);另一部分是循環(huán)的分是循環(huán)的,主要完成循環(huán)結(jié)束條件的判斷。,主要完成循環(huán)結(jié)束條件的判斷。 控制循環(huán)結(jié)束的條件??刂蒲h(huán)結(jié)束的條件。 循環(huán)中所使用的各種變量的初值。一循環(huán)中所使用的各種變量的初值。一是循環(huán)工作部分的初值;另一部分是結(jié)束條件的初值。是循環(huán)工作部分的初值;另一部分是結(jié)束條件的初值。置初值是循環(huán)結(jié)構(gòu)程序的重要部分。置初值是循環(huán)結(jié)構(gòu)程序的重要部分。 多重循環(huán)指嵌套的循環(huán),在外循環(huán)的循環(huán)體中還多重循環(huán)指嵌套的循環(huán),在外循環(huán)
24、的循環(huán)體中還有采用循環(huán)結(jié)構(gòu)的程序段。有采用循環(huán)結(jié)構(gòu)的程序段。 軟件延時子程序。軟件延時子程序。DELAY:MOV AX,1000 LP0:MOV BX,1000 LP1:MOV CX,1000 LP2:NOP NOP LOOP LP2 DEC BX JNZ LP1 DEC AX JNZ LP0 RET 對對1010個無符號數(shù)由小到大排序。個無符號數(shù)由小到大排序。 2222H H,55H55H,36H36H,97H97H,11H11H,AFHAFH,06H06H,88H88H,F(xiàn)FHFFH,66H66H2222H H,55H55H,36H36H,97H97H,11H11H,AFHAFH,06H0
25、6H,88H88H,66H66H,F(xiàn)FHFFH2222H H,55H55H,36H36H,97H97H,11H11H,AFHAFH,06H06H,66H66H,88H88H,F(xiàn)FHFFH2222H H,55H55H,36H36H,97H97H,11H11H,06H06H,AFHAFH,66H66H,88H88H,F(xiàn)FHFFH2222H H,55H55H,36H36H,97H97H,06H06H,11H11H,AFHAFH,66H66H,88H88H,F(xiàn)FHFFH2222H H,55H55H,36H36H,06H06H,97H97H,11H11H,AFHAFH,66H66H,88H88H,F(xiàn)FH
26、FFH2222H H,55H55H,06H06H,36H36H,97H97H,11H11H,AFHAFH,66H66H,88H88H,F(xiàn)FHFFH2222H H,06H06H,55H55H,36H36H,97H97H,11H11H,AFHAFH,66H66H,88H88H,F(xiàn)FHFFH06H06H,2222H H,55H55H,36H36H,97H97H,11H11H,AFHAFH,66H66H,88H88H,F(xiàn)FHFFH2222H H,55H55H,36H36H,97H97H,11H11H,AFHAFH,66H66H,88H88H,F(xiàn)FHFFH2222H H,55H55H,36H36H,97
27、H97H,11H11H,66H66H,AFHAFH,88H88H,F(xiàn)FHFFH2222H H,55H55H,36H36H,11H11H,97H97H,66H66H,AFHAFH,88H88H,F(xiàn)FHFFH2222H H,55H55H,11H11H,36H36H,97H97H,66H66H,AFHAFH,88H88H,F(xiàn)FHFFH2222H H,11H11H,55H55H,36H36H,97H97H,66H66H,AFHAFH,88H88H,F(xiàn)FHFFH11H11H,2222H H,55H55H,36H36H,97H97H,66H66H,AFHAFH,88H88H,F(xiàn)FHFFH2222H H,5
28、5H55H,36H36H,97H97H,66H66H,AFHAFH,88H88H,F(xiàn)FHFFH2222H H,55H55H,36H36H,97H97H,66H66H,88H88H,AFHAFH,F(xiàn)FHFFH2222H H,55H55H,36H36H,66H66H,97H97H,88H88H,AFHAFH,F(xiàn)FHFFH2222H H,36H36H,55H55H,66H66H,97H97H,88H88H,AFHAFH,F(xiàn)FHFFH36H36H,55H55H,66H66H,97H97H,88H88H,AFHAFH,F(xiàn)FHFFH36H36H,55H55H,66H66H,88H88H,97H97H,AF
29、HAFH,F(xiàn)FHFFH55H55H,66H66H,88H88H,97H97H,AFHAFH,F(xiàn)FHFFH55H55H,66H66H,88H88H,97H97H,AFHAFH,F(xiàn)FHFFH 排序中實際要使用兩重循環(huán),內(nèi)層循環(huán)完成一輪比較中,各元素順序兩兩比較及交換;外循環(huán)控制一輪一輪對各元素進行比較直到全部數(shù)據(jù)排序完成。 內(nèi)層循環(huán)每一輪的循環(huán)次數(shù)是確定的,可使用CX作為循環(huán)計數(shù)器,CX的初值在第一輪循環(huán)為9,第二輪為8,以后每輪初值依次減少1。 外層循環(huán)不使用次數(shù)控制循環(huán),其終止條件為一輪內(nèi)循環(huán)中如果或,此時認為排序完成。BX:內(nèi)循環(huán)初值CX:內(nèi)循環(huán)計數(shù)器SI: 內(nèi)循環(huán)數(shù)據(jù)指針,指向兩兩比較的右
30、側(cè)元素DX:指示最后一次交換發(fā)生時,右側(cè)元素的地址TABLE DB 22H,55H,36H,97H,11H DB 0AFH,6,88H,0FFH,66HSTART: MOV BX,9 LP0: MOV SI,OFFSET TABLE+9 MOV CX,BX MOV DX,SI LP1: MOV AL,SI CMP AL,SI-1 JNB LP2 MOV AH,SI-1 MOV SI,AH MOV SI-1,AL MOV DX,SI LP2: DEC SI LOOP LP1 DEC BX CMP DX,OFFSET TABLE+9 JNZ LP0 RET入口入口BX=9BX=9SISI末地址末地
31、址CXBXCXBXDXSIDXSI SISI-1?SISI-1?交換交換 SISI-1SISI-1 DXSI DXSISI=SI-1SI=SI-1CX=CX-1CX=CX-1CX=0CX=0?BX=BX-1BX=BX-1DX=DX=末地址?末地址?返回返回N NY YN NN NY YY Y 使用子程序可以有效節(jié)省代碼空間,使整個程使用子程序可以有效節(jié)省代碼空間,使整個程序的結(jié)構(gòu)更加清晰。序的結(jié)構(gòu)更加清晰。 可以通過使用子程序調(diào)用和返回指令實現(xiàn)主程可以通過使用子程序調(diào)用和返回指令實現(xiàn)主程序和子程序間的轉(zhuǎn)返。序和子程序間的轉(zhuǎn)返。CALLRET 子程序分段內(nèi)調(diào)用子程序分段內(nèi)調(diào)用(NEAR)和段間和
32、段間(FAR)調(diào)用,注意調(diào)用和返回指令應(yīng)配套。調(diào)用,注意調(diào)用和返回指令應(yīng)配套。 為使子程序有較好的通用性,一般將子程序中使用到的寄存器為使子程序有較好的通用性,一般將子程序中使用到的寄存器的內(nèi)容在進入子程序時通過堆棧保存起來,在子程序返回前將保存的內(nèi)容在進入子程序時通過堆棧保存起來,在子程序返回前將保存的內(nèi)容恢復到相應(yīng)寄存器中。的內(nèi)容恢復到相應(yīng)寄存器中。子程序:子程序: PUSH AX PUSH BX PUSH CX PUSHF POPF POP CX POP BX POP AX RET 由于堆棧采用后進先出的結(jié)構(gòu),現(xiàn)場保護時的入棧順序與恢復由于堆棧采用后進先出的結(jié)構(gòu),現(xiàn)場保護時的入棧順序與恢
33、復現(xiàn)場時的出棧順序必須現(xiàn)場時的出棧順序必須。 主程序要通過一定方式把需要子程序處理的數(shù)據(jù)傳遞給子程主程序要通過一定方式把需要子程序處理的數(shù)據(jù)傳遞給子程序,子程序也需要通過一定方式將處理結(jié)果傳遞給主程序。這種序,子程序也需要通過一定方式將處理結(jié)果傳遞給主程序。這種參數(shù)傳遞的方式在很大程度上決定了子程序的通用性和易用性。參數(shù)傳遞的方式在很大程度上決定了子程序的通用性和易用性。 在主程序和子程序間實現(xiàn)約定一組用于存放參數(shù)的寄存器,在主程序和子程序間實現(xiàn)約定一組用于存放參數(shù)的寄存器,當主程序調(diào)用子程序時將需要傳遞給子程序的參數(shù)存放到約定好當主程序調(diào)用子程序時將需要傳遞給子程序的參數(shù)存放到約定好的寄存器
34、中。子程序從寄存器中獲取參數(shù)處理完畢后將結(jié)果存放的寄存器中。子程序從寄存器中獲取參數(shù)處理完畢后將結(jié)果存放到事先約定好的寄存器中,子程序返回后主程序可以從寄存器中到事先約定好的寄存器中,子程序返回后主程序可以從寄存器中獲得結(jié)果。獲得結(jié)果。 求數(shù)求數(shù) N N 的平方根,可以從的平方根,可以從 N N 中依次減去由中依次減去由1 1開始的連續(xù)奇開始的連續(xù)奇數(shù),減去的奇數(shù)個數(shù)即為平方根。如果正好能夠減到數(shù),減去的奇數(shù)個數(shù)即為平方根。如果正好能夠減到0 0,則能夠,則能夠得到精確的平方根,否則只能得到平方根的整數(shù)部分。得到精確的平方根,否則只能得到平方根的整數(shù)部分。 25-1-3-5-7-9=0入口:入
35、口:DX 被開方數(shù)被開方數(shù)出口:出口:AX 平方根平方根SQROOT PROC NEAR PUSHF PUSH BX XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: POP BX POPF RETSQROOT ENDP保護現(xiàn)場保護現(xiàn)場AXAX清零清零形成奇數(shù)形成奇數(shù)DX-DX-奇數(shù)奇數(shù)DX=0DX=0?夠減?夠減?恢復現(xiàn)場恢復現(xiàn)場 返回返回增量增量AXAXN NN NY YY Y 計算100的平方根,結(jié)果存放到內(nèi)存1000H單元。MOV
36、DX,100CALL SQROOTMOV 1000H,AX 使用寄存器傳遞參數(shù),使用簡單,處理速度快,但受寄存器數(shù)目的限制,只適合的傳遞。 事先約定使用一部分存儲單元傳遞參數(shù)。適于大量參數(shù)的傳遞。 通過內(nèi)存?zhèn)鬟f參數(shù)固定占用存儲單元,內(nèi)存利用率低,使用不夠靈活,通用性差。SQROOT PROC NEAR PUSH DX PUSH BX PUSH AX PUSHF MOV DX,ARGX XOR AX,AX AND DX,DX JZ SQRT2SQRT1: MOV BX,AX SHL BX,1 INC BX SUB DX,BX JC SQRT2 INC AX JMP SQRT1SQRT2: MOV ROOT,AX POPF POP AX POP BX POP DX RETSQROOT ENDP入口:入口
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 互聯(lián)網(wǎng)金融產(chǎn)品技術(shù)支持合作合同
- 數(shù)據(jù)驅(qū)動的供應(yīng)鏈優(yōu)化項目協(xié)議
- 二零二五年度城市道路建設(shè)施工承包合同3篇
- 2024年知識產(chǎn)權(quán)保護與維權(quán)服務(wù)合同
- 二零二五年度基礎(chǔ)設(shè)施建設(shè)項目貸款合同規(guī)范文本3篇
- 2024年裝修工程承接保密協(xié)議3篇
- 2024年河北省石家莊市第二十八中數(shù)學九年級中考三模數(shù)學試題(含答案)
- 2024年物流倉儲服務(wù)與租賃合同
- 2024年金融市場趨勢分析與投資咨詢服務(wù)合同3篇
- 2024年環(huán)境勘探與評估合同
- 新概念英語第2冊課文(完整版)
- 教師普通話達標分析報告
- 公安食藥環(huán)培訓課件
- 2-氨基-4-硝基苯甲醚化學品安全說明書
- 遼寧省沈陽市皇姑區(qū)2023-2024學年九年級上學期期末考試化學試卷
- 【重慶武隆區(qū)文旅品牌傳播存在的問題及優(yōu)化建議分析13000字(論文)】
- 水土保持監(jiān)理工作報告
- 時間管理學習通超星課后章節(jié)答案期末考試題庫2023年
- 分子影像學概論課件
- 中國移動呼叫中心的精細化管理
- (全)2023電氣工程師內(nèi)部考試習題含答案(繼保)
評論
0/150
提交評論