第四章-匯編語言程序開發(fā)-1_第1頁
第四章-匯編語言程序開發(fā)-1_第2頁
第四章-匯編語言程序開發(fā)-1_第3頁
第四章-匯編語言程序開發(fā)-1_第4頁
第四章-匯編語言程序開發(fā)-1_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第四章 匯編語言程序開發(fā)張華平 副教授 博士Email: kevinzhangWebsite: http:/ICTCLAS張華平博士大數(shù)據(jù)搜索挖掘?qū)嶒炇?(wSMSBIT)(1)【重點(diǎn)講解】匯編語言編程基本知識、Windows匯編語言程序設(shè)計(2)【重點(diǎn)講解】分支與循環(huán)程序設(shè)計、浮點(diǎn)運(yùn)算(3)【一般性講解】程序優(yōu)化2重點(diǎn)范圍4.1 匯編語言基礎(chǔ)知識機(jī)器語言:直接用二進(jìn)制代碼的機(jī)器指令表示的語言。匯編語言:用指令助記符、符號地址、標(biāo)號等符號書寫程序的語言。高級語言:高級語言是一種類似于人類語言的語言。3匯編語言是一種符號化了的機(jī)器語言,即用指令助記符、符號地址、標(biāo)號等符號書寫程序的語言。44.1

2、.1 匯編語言概述三種語言的比較5機(jī)器語言匯編語言高級語言基本形式二進(jìn)制助記符語句編譯程序不需要需要需要執(zhí)行效率高高低占用空間少少多CPU依賴性依賴依賴不依賴編程難度復(fù)雜中等容易6匯編語言程序上機(jī)過程 匯編語言實踐環(huán)境基于DOS平臺。 當(dāng)匯編語言源程序編好后,要使其實現(xiàn)功能,需經(jīng)過以下過程: 建立、編輯 匯編 連接 運(yùn)行 調(diào)試4.1.2 匯編語言編程環(huán)境4.1.2 匯編語言編程環(huán)境平 臺:Intel 80X86/PentiumDOS/虛擬8086模式(V86)Windows/保護(hù)模式 MASM5.1 MASM6.11 MASM327上機(jī)過程(實模式)上機(jī)過程:masmlink.exe / .c

3、om 編輯:temp.asm 匯編:masm temp.asmtemp.obj 連接:link temp.objtemp.exe調(diào)試方式:Debug84.1.2 匯編語言編程環(huán)境4.1.2 匯編語言編程環(huán)境上機(jī)過程(保護(hù)模式);集成開發(fā)環(huán)境VS上機(jī)過程:mllink 編輯:temp.asm 匯編:ml /c /coff hello.asmhello.obj 連接:link /subsystem:consolewindows hello.objhello.exe調(diào)試方式:WinDebug104.1.3 匯編語言語句格式 匯編語句:指令、偽指令、宏指令。 每條指令語句都生成機(jī)器代碼,各對應(yīng)一種CP

4、U操作,在程序運(yùn)行時執(zhí)行。 偽指令語句由匯編程序在匯編過程中執(zhí)行,數(shù)據(jù)定義語句分配存儲空間,其它偽指令不生成目標(biāo)碼。 宏指令是用戶按照宏定義格式編寫的一段程序,可以包含指令、偽指令、甚至其他宏指令。11匯編語言語句格式:名字 助記符 操作數(shù) ;注釋其中帶 的內(nèi)容是可選的。12 名字域是語句的符號地址,可以由26個大小寫英文字母、09數(shù)字、_、$、?等字符組成,數(shù)字不能出現(xiàn)在名字的第一個字符位置。 指令的名字叫做標(biāo)號,必須以冒號(:)結(jié)束。它提供給循環(huán)或轉(zhuǎn)移指令的轉(zhuǎn)向地址。 偽指令的名字可以是變量名、過程名、段名等。通常,名字具有三屬性:段基址、偏移量和類型。 標(biāo)號的類型有NEAR型和FAR型,

5、變量的類型有字節(jié)、字、雙字、四字等。13 助記符域給出操作的符號表示,可以是指令助記符、偽指令助記符等。例如加法指令的助記符是ADD。 操作數(shù)域為操作提供必要的信息。每條指令語句的操作數(shù)個數(shù)已由系統(tǒng)確定,例如加法指令有兩個操作數(shù)。 注釋域用以說明本條語句在程序中的功能,要簡單明了。注釋以分號(;)開始。144.2 常用偽指令4.2.1、數(shù)據(jù)定義偽指令4.2.2、符號定義偽指令4.2.3、操作符偽指令4.2.4、框架定義偽指令154.2.1、數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令用來定義程序中使用的數(shù)據(jù)。這是一組使用頻率很高的語句,因為大部分程序都會涉及到數(shù)據(jù)問題。 格式:變量名 助記符 操作數(shù) 功能:為

6、變量分配單元,并為其初始化或者只預(yù)留空間。16說明:變量名是可選的,需要時由用戶自己起。它是該數(shù)據(jù)區(qū)的符號地址,也是其中第一個數(shù)據(jù)項的偏移量。程序通過變量名引用其中的數(shù)據(jù)。17助記符是數(shù)據(jù)類型的符號表示。助記符數(shù)據(jù)類型 一個數(shù)據(jù)項字節(jié)數(shù)DB(BYTE)字節(jié)型1DW(WORD)字型2DD(DWORD)雙字型4DQ(QWORD)四字型8DF(FWORD)六字節(jié)型6DT(TBYTE)10字節(jié)型10注:( )中是在MASM6.11版本中可以使用的助記符。必須掌握DB、DW、DD。18 操作數(shù) 操作數(shù)可以是數(shù)字常量、數(shù)值表達(dá)式、字符串常量、地址表達(dá)式、?、 DUP(操作數(shù),)形式。19a.數(shù)字常量及數(shù)值

7、表達(dá)式操作數(shù)可以是數(shù)值表達(dá)式,數(shù)字中若出現(xiàn)字母形式,不區(qū)分大小寫。如下所示:十進(jìn)制數(shù):以D結(jié)尾,匯編語言中缺省值是十進(jìn)制數(shù),所以D可以省略不寫。二進(jìn)制數(shù):以B結(jié)尾。例如,10100011B,10100011b。十六進(jìn)制數(shù):以H結(jié)尾。例如,12H,12h,0AB56H,0ab56h。八進(jìn)制數(shù):以Q或O(字母)結(jié)尾。例如,352Q。20b.字符串常量在匯編語言中字符需要用單引號括起來,其值為字符的ASCII值。因為每個字符占用一個字節(jié),所以最好用DB助記符定義字符串。例如,A的值為41H。abc的值為616263H。21c.地址表達(dá)式 操作數(shù)可以是地址符號。若只定義符號的偏移量部分,則使用DW助記

8、符。若要定義它的雙字長地址指針(既含16位偏移量又含段基址),則使用DD助記符,其中低字中存放偏移量,高字中存放段基址。 例如,“VAR DW LAB”語句在匯編后VAR中含有LAB的偏移量。22d. ?在程序中使用“?”為變量預(yù)留空間而不賦初值。e. DUP(操作數(shù),)若要對某些數(shù)據(jù)重復(fù)多次,可以使用這種格式。其功能是把( )中的內(nèi)容復(fù)制n次。DUP可以嵌套。23 例. M1 DB 15,67H,11110000B,?M2 DB 15,AB$M3 DW 4*5M4 DD 1234HM5 DB 2 DUP(5,A)M6 DW M2;M2的偏移量M7 DD M2;M2的偏移量、段基址設(shè)以上數(shù)據(jù)自

9、1470:0000開始存放,則為:0F 67 F0 00 31 35 41 42 24 14 00 34 12 00 00 05 41 05 41 04 00 04 00 70 14。LEA DX, M4+2MOV CX, M4+225可直接通過變量名引用變量,但要注意類型匹配。例如以下程序片段:MOV AL,M1;(AL) 15MOV BX,M3;(BX) 20ADD M3,6;(M3) 26MOV AL,M2;(AL)131HMOV BL,M2+2;(BL)A41HMOV M1+3,BL;(M13) 41HM22的這種表示形式?264.2.2、符號定義偽指令有時程序中會多次出現(xiàn)同一個表達(dá)式

10、,為方便起見可以用符號定義偽指令給該表達(dá)式定義一個符號,以便于引用及減少程序修改量,并提高程序的可讀性。匯編后該符號代表一個確定的值。271等值EQU偽指令格式:符號名 EQU 表達(dá)式功能:用符號名代表表達(dá)式或表達(dá)式的值。說明:表達(dá)式可以是任何有效的操作數(shù)格式。例如常數(shù)、數(shù)值表達(dá)式、另一符號名或助記符。注意:用EQU定義的符號在同一個程序中不能再定義。28例. CR EQU 0DH ;回車符的ASCII值LF EQU 0AH ;換行符的ASCII值BEL EQU 07H ;響鈴符的ASCII值PORT_B EQU 61H;定義PORT_ B端口 B EQU BP6 ;BP6用B表示程序中可以通

11、過符號引用這些值,例如:MOVAL,CR ;等價于 MOVAL, 0DHADDBL,B ;等價于 ADD BL,BP6)OUTPORT_B,AL ;輸出到61H端口29 EQU用途:增加程序可讀性、縮短程序書寫長度、避免因為某些修改而帶來的程序不一致性。 EQU偽指令除了以上用途外,經(jīng)常使用它的一個場合是與配合,得到變量分配的字節(jié)數(shù)。如下所示:MSG DB This is first string.Count equ $msgMov cl,count;(CL)MSG的串長2130 這樣做可以由匯編程序在匯編過程中自動計算字符串的長度,避免了編程者計數(shù)。特別是當(dāng)因字符串改變而串長改變時,取串長的

12、語句無需做任何修改。由于用EQU定義的符號在同一個程序中不能再定義,所以以下語句是錯誤的:CT EQU 1CT EQU CT1312等號()偽指令 格式:符號名 數(shù)值表達(dá)式 功能:用符號名代替數(shù)值表達(dá)式的值 說明:等號偽指令與EQU偽指令功能相似,其區(qū)別是等號偽指令的表達(dá)式只能是常數(shù)或數(shù)值表達(dá)式。 用“”定義的符號在同一個程序中可以再定義。通常在程序中用“”定義常數(shù)。例. DPL1 20HK 1K K1324.2.3 操作符偽指令操作符可以出現(xiàn)在語句的操作數(shù)表達(dá)式中。該操作在匯編程序匯編時實現(xiàn)。包括算術(shù)、邏輯、關(guān)系、屬性、返回值操作符。33ORG偽指令格式:ORG 數(shù)值表達(dá)式功能:$在程序中表

13、示當(dāng)前地址計數(shù)器的值。程序中的每一行都有一個地址,從程序的第一行到最后一行,地址計數(shù)器在不斷地增加。說明:程序中一般不直接使用$的值,而是使用它來計算變量占用的空間。例 wVar WORD0102h, 1000, 100*100BYTESOFWVAR EQU$-wVar;值等于6。MOV EAX, $;00401010 B8 10 10 40 00=MOV EAX,04010101. 操作符4.2.3 操作符偽指令34格式:offset 變量|標(biāo)號功能:offset操作符用來取出變量或標(biāo)號的地址(在段中的偏移量)。在32位編程環(huán)境中,地址是一個32位的數(shù)。例4.9MOVEBX, dVar2MO

14、VEBX, offset dVar23. OFFSET操作符4.2.3 操作符偽指令354、算術(shù)操作符算術(shù)操作符包括、*、和MOD(取模)操作符。算術(shù)操作符可以用在數(shù)值表達(dá)式或地址表達(dá)式中。4.2.3 操作符偽指令36例.X DW 12,34,56CT EQU (-X)/2MOV CX ,CT;(CX) 3MOV AX ,XADD AX ,X+2;(AX) 464.2.3 操作符偽指令375、邏輯操作符 邏輯操作符包括AND、OR、XOR和NOT。邏輯操作符是按位操作的,它只能用在數(shù)值表達(dá)式中。例. PORT EQU 0FH AND DL,PORT AND 0FEH匯編后: AND DL,0E

15、H4.2.3 操作符偽指令386、關(guān)系操作符 關(guān)系操作符包括EQ、NE、LT、LE、GT、GE。其操作結(jié)果為一個邏輯值,若關(guān)系成立結(jié)果為真(全1),否則結(jié)果為假(0)。其中的操作數(shù)必須是數(shù)字或同段內(nèi)的兩個存儲器地址。例.指令 MOV AL,CH LT 20的匯編結(jié)果: MOV AL,0FFH ;當(dāng)CH20時 或:MOV AL,0 ;當(dāng)CH20時4.2.3 操作符偽指令394.2.4 框架定義偽指令 匯編程序在缺省情況下只接受80868088的指令系統(tǒng),即使在386以上機(jī)器也是如此,因此為80868088編寫的程序在286以上的處理器都可以順利執(zhí)行。 為了能夠使用其它微處理器或協(xié)處理器的指令系統(tǒng)

16、編寫高級的32位機(jī)軟件,需要在程序中增加選擇微處理器的偽指令。40較常使用的選擇微處理器偽指令有以下幾種:偽指令功 能.286選擇80286微處理器指令系統(tǒng).386選擇80386微處理器指令系統(tǒng).486選擇80486微處理器指令系統(tǒng).586選擇80586微處理器指令系統(tǒng) .8087選擇8087數(shù)字協(xié)處理器指令系統(tǒng).287選擇80287數(shù)字協(xié)處理器指令系統(tǒng).387選擇80387數(shù)字協(xié)處理器指令系統(tǒng)4.2.4 框架定義偽指令偽指令格式功 能.data定義數(shù)據(jù)段.data?定義存放未初始化變量的數(shù)據(jù)段.const定義存放常量的數(shù)據(jù)段.code定義代碼段.startup指定加載后的程序入口點(diǎn).EXIT

17、返回DOS或父進(jìn)程.stack size建立一個堆棧段并定義其大小(size以字節(jié)為單位。若不指定size參數(shù),則使用默認(rèn)值1 KB)。.MODEL 內(nèi)存模式,調(diào)用規(guī)則,其他模式定義程序工作的模式42二、簡化段定義常用結(jié)構(gòu)中的偽指令1定義存儲模型偽指令常用格式:.model 存儲模型功能:定義存儲模型。43常用的存儲模型有:TINY:所有代碼和數(shù)據(jù)放置在一個段中。SMALL:所有代碼在一個段內(nèi),所有數(shù)據(jù)在另一個段。MEDIUM:代碼放置在多個段內(nèi)。數(shù)據(jù)限制在一個段。COMPACT:代碼在一個段內(nèi),數(shù)據(jù)可以在多個段內(nèi)。LARGE:代碼和數(shù)據(jù)被放置在多個段內(nèi)。HUGE:單個數(shù)據(jù)項可以超過64K,其

18、它同LARGE模型。FLAT:與TINY模型類似,所有代碼和數(shù)據(jù)放置在一個段中。TINY模型的段是16位,F(xiàn)LAT32位。442定義堆棧段尺寸偽指令格式:.stack size功能:建立一個堆棧段并定義其大小說明:若不指定size參數(shù),則使用缺省值1KB。454.3 匯編語言程序格式4.3.1 用戶界面(User Interface)字符用戶界面(Characteral User Interface,CUI)圖形用戶界面(Graphic User Interface,GUI)4.3.2 控制臺界面的匯編源程序4.3.3 Windows界面的匯編源程序46.386.model flat, std

19、calloption casemap:noneincludelib msvcrt.libprintf PROTO C :ptr sbyte,:VARARG.dataszMsg byte “Hello World! %c”,0ah,0a byte Y b byte hello.codestart: invoke printf,offset szMsg,ainvoke printf,offset szMsg,offset bretend start4.3.2 控制臺界面的匯編源程序.386.model flat,stdcalloption casemap:none模式定義includelib ms

20、vcrt.libprintf PROTO C :ptr sbyte, :VARARG庫文件及函數(shù)聲明.dataszMsg byte Hello World!, 0ah, 0數(shù)據(jù)部分.codestart: invoke printf, OFFSET szMsg retend start代碼部分4.3.2 控制臺界面的匯編源程序4.3.2 控制臺界面的匯編源程序1. 模式定義.386.model flat, stdcalloption casemap:none(1).386語句定義了程序使用80386指令集。(2).model flat, stdcall語句。(3)option語句。option語

21、句有許多選項,例如option language、option segment等,在Win32中需要定義option casemap:none,用以說明程序中的變量和子程序名是否對大小寫敏感4.3.2 控制臺界面的匯編源程序2. includelib語句includelib 庫文件名4.3.2 控制臺界面的匯編源程序4.3.2 控制臺界面的匯編源程序3. 函數(shù)聲明函數(shù)名稱PROTO 調(diào)用規(guī)則 :第一個參數(shù)類型 ,:后續(xù)參數(shù)類型 在匯編語言中,用ptr sbyte代表const char *printf PROTO C :ptr sbyte, :VARARG函數(shù)聲明后,就可以用INVOKE偽指令

22、來調(diào)用4.3.2 控制臺界面的匯編源程序4. include語句include語句格式:include 文件名include kernel32.incinclude user32.inc5. 數(shù)據(jù)和代碼部分程序中的數(shù)據(jù)部分從.data語句開始定義,代碼部分從.code語句開始定義,所有的指令都必須寫在代碼區(qū)中。在編程時,不能把那些需要修改的變量放到.code部分。4.3.2 控制臺界面的匯編源程序6. 程序結(jié)束與DOS程序相同,Win32程序在遇到end語句時結(jié)束。end語句后面跟的標(biāo)號指出了程序執(zhí)行的入口點(diǎn),即裝入執(zhí)行的第一條指令的位置,表示源程序結(jié)束。語句格式:END 過程名7. 跨行in

23、vokeMessageBox, NULL,;HWND hWnd offset szMsg,;LPCSTR lpTextoffset szTitle,;LPCSTR lpCaptionMB_OK;UINT uType4.3.2 控制臺界面的匯編源程序8. 程序中的數(shù)據(jù)歸類(1)可讀可寫的初始變量(2) 可讀可寫的未初始變量:buffer byte 65536 dup (?) (3)常量數(shù)據(jù)szMsgbyte“Hello World!”, 0ah, 09. invoke偽指令-相當(dāng)于Call格式:invoke 函數(shù)名,參數(shù)1 ,參數(shù)2功能:調(diào)用函數(shù)或子程序。4.3.3 Windows界面的匯編源程

24、序.386.model flat, stdcalloption casemap:noneMessageBoxAPROTO :dword, :dword, :dword, :dwordMessageBoxequIncludelibuser32.libNULLequ0MB_OKequ0.stack 4096.dataSzTitlebyteHi!, 0SzMsgbyteHello World! ,0.codestart:invoke MessageBox, NULL,; HWND hWndoffset szMsg,; LPCSTR lpTextoffset szTitle,; LPCSTR lpCa

25、ptionMB_OK; UINT uType retendstart4.3.4 輸入輸出有關(guān)的Windows API函數(shù)1、printfincludelib msvcrt.libprintf PROTO C :ptr sbyte,:varargprintf PROTO C :dword,:vararginvoke printf, offset szOut, x, n, p其中,szOut要在數(shù)據(jù)區(qū)中定義,例如:szOut byte x=%d n=%d x(n)=%d, 0ah, 0其效果等價于:printf (x=%d n=%d x(n)=%dn , x, n, p);4.3.4 輸入輸出有關(guān)

26、的Windows API函數(shù)2、scanfincludelib msvcrt.libscanf PROTO C :dword,:varargszInFmtStr byte %d %c %d, 0invoke scanf, offset szInFmtStr, offset a, offset b, offset d其中,第1個參數(shù)是格式字符串szInFmtStr的地址,第2、3、4個參數(shù)分別是a、b、d的地址。其效果等價于:scanf(%d %c %d, &a, &b, &d);4.3.4 輸入輸出有關(guān)的Windows API函數(shù)3、 MessageBoxAincludelib user32.

27、lib#define WINAPI _stdcallintWINAPIMessageBoxA( HWND hWnd ,/窗口句柄 LPCSTR lpText,/消息框正文的指針 LPCSTR lpCaption, /消息框窗口標(biāo)題的指針 UINT uType); /消息框類型它的調(diào)用規(guī)則和參數(shù)類型說明為:MessageBoxA PROTO :DWORD, :DWORD, :DWORD, :DWORD4.4 分支與循環(huán)程序設(shè)計需要根據(jù)不同條件進(jìn)行不同的處理,此時需要設(shè)計分支程序。 IF_THEN_ELSE分支結(jié)構(gòu) (a)IF結(jié)構(gòu);(b)IF_THEN_ELSE結(jié)構(gòu) 1.IF結(jié)構(gòu)程序舉例(單分支結(jié)

28、構(gòu))例5.1 求帶符號數(shù)A和B的較大值MAXAB=MAX(A, B)。;PROG0501;PROG0501 MOV EAX, A CMP EAX, B JGE AIsLarger; 如果AB,跳轉(zhuǎn)到AIsLarger標(biāo)號處 MOV EAX, BAIsLarger: MOV MAXAB, EAX2.IF_THEN_ELSE結(jié)構(gòu)程序舉例 例5.3 求帶符號數(shù)X的符號,如果X=0,SIGNX置1,否則置為-1。;PROG0503;PROG0503X SDWORD-45SIGNX SDWORD ? MOV SIGNX, 0 CMP X, 0 JGE XisPostive ; X0,跳轉(zhuǎn) MOV SIG

29、NX, -1 JMP HERE ; 跳過“MOV SIGNX, 1”語句XisPostive: ;CMP X,0 JE XisZero MOV SIGNX, 1 JMP HEREXisZero: MOV SIGNX,0HERE:4.4 分支與循環(huán)程序設(shè)計例5.5 在升序數(shù)組中查找指定數(shù)。 算法分析:在有序數(shù)組中查找元素,使用折半查找的效率最高,平均比較次數(shù)為log2n(順序查找的次數(shù)n/2)。本例使用折半查找法。設(shè):字節(jié)型數(shù)組為R元素個數(shù)為n要查找的數(shù)為a查找范圍,以下界l和上界h表示l和h是數(shù)組下標(biāo)初始時下界為0上界為n-1,即整個數(shù)組m是下界l和上界h的中點(diǎn)查找結(jié)束條件:lh,意味無指定數(shù)

30、4.4 分支與循環(huán)程序設(shè)計折半查找算法的流程 4.4 分支與循環(huán)程序設(shè)計執(zhí)行過程如下:(1)先設(shè)定一個查找范圍,以下界l和上界h表示。l和h是數(shù)組下標(biāo)。初始時,下界為0,上界為n-1,即查找范圍是整個數(shù)組。(2)如果下界l大于上界h,則查找范圍為空,查找結(jié)束。在這種情況下,數(shù)組中沒有a,算法結(jié)束。(3)取下界l和上界h的中點(diǎn)m,m=(l+h)/2。(4)從數(shù)組的中點(diǎn)m處取出一個數(shù)Rm,和a進(jìn)行比較。(5)如果Rm等于a,則在數(shù)組中找到a,下標(biāo)為m。算法結(jié)束。(6)如果Rm大于a,中點(diǎn)上的數(shù)比a大,從中點(diǎn)到上界中的所有數(shù)都比a大,修改上界h為m-1。然后跳轉(zhuǎn)到第(2)步。(7)如果Rm小于a,中

31、點(diǎn)上的數(shù)比a小,從下界到中點(diǎn)中的所有數(shù)都比a小,修改下界l為m+1。然后跳轉(zhuǎn)到第(2)步。每經(jīng)過一次比較,查找范圍就縮小一半??s小查找范圍的過程如圖5-4所示。;PROG05054.4 分支與循環(huán)程序設(shè)計SWITCH_CASE結(jié)構(gòu)分支程序設(shè)計 分支較少的IF_THEN_ELSE結(jié)構(gòu)使用條件轉(zhuǎn)移指令實現(xiàn)分支較多時使用條件轉(zhuǎn)移指令實現(xiàn)分支程序變得較復(fù)雜,不易讀懂、擴(kuò)充。多分支的SWITCH_CASE結(jié)構(gòu)可用基于跳轉(zhuǎn)表的方法實現(xiàn)實現(xiàn)的關(guān)鍵是先要構(gòu)成跳轉(zhuǎn)表然后用無條件間接轉(zhuǎn)移指令實現(xiàn)跳轉(zhuǎn)SWITCH_CASE結(jié)構(gòu)可用于主控程序設(shè)計等;PROG05074.4 分支與循環(huán)程序設(shè)計例. 編制一個管理文件的菜

32、單程序,要求能夠?qū)崿F(xiàn)建立文件、修改文件、刪除文件、顯示文件和退出應(yīng)用程序5個主控功能。首先在屏幕上顯示5種功能,然后從鍵盤上輸入數(shù)字15即可轉(zhuǎn)入相應(yīng)的功能,而輸入其他字符則提示輸入非法。若選擇退出功能,則能正確返回;若選擇其他功能,應(yīng)能返回到主菜單。 屏幕顯示為:4.4 分支與循環(huán)程序設(shè)計算法分析:要能夠轉(zhuǎn)移到不同分支,必須提供各個分支的入口地址。對于SWITCH_CASE結(jié)構(gòu),由于分支眾多,可以把各分支入口地址集中在一起構(gòu)成一個地址表,把這個地址表稱為跳轉(zhuǎn)表。設(shè)建立文件分支入口標(biāo)號為CR,修改文件分支入口標(biāo)號為UP,刪除文件分支入口標(biāo)號為DE,顯示文件分支入口標(biāo)號為PR,退出分支入口標(biāo)號為Q

33、U,則該跳轉(zhuǎn)表如下所示: JMPTAB DD OFFSET CR;跳轉(zhuǎn)表 DD OFFSET UP DD OFFSET DE DD OFFSET PR DD OFFSET QU4.4 分支與循環(huán)程序設(shè)計菜單程序流程圖 說明:位移量是跳轉(zhuǎn)表中所選項與表基址的距離。把所有功能號連續(xù)排列,設(shè)選擇了K號功能,則:索引號K起始功能號(例如功能號為1,2,3N,則索引號K1)位移量索引號每項入口地址占用的字 節(jié)數(shù)。表項地址表基址位移量。一旦得到了表項地址,使用無條件間接轉(zhuǎn)移指令實現(xiàn)轉(zhuǎn)移即可 用無條件間接轉(zhuǎn)移指令實現(xiàn)SWITCH_CASE轉(zhuǎn)在32位程序中,地址表用DD定義,用段內(nèi)間接轉(zhuǎn)移指令實現(xiàn)跳轉(zhuǎn)在16位

34、程序中,若跳轉(zhuǎn)表是用DW定義的,則用段內(nèi)間接轉(zhuǎn)移指令。地址表用DD定義,則用段間間接轉(zhuǎn)移指令本例使用以下指令得到表項地址,并實現(xiàn)轉(zhuǎn)移mov eax, JmpTabebx*4 jmp eax 也可以使用jmp JmpTabebx*4指令等實現(xiàn)循環(huán)兩種基本結(jié)構(gòu)DO_WHILE結(jié)構(gòu)先判斷后執(zhí)行結(jié)構(gòu),把對循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷控制條件,若滿足控制條件就執(zhí)行循環(huán)體,否則退出循環(huán)。DO_UNTIL結(jié)構(gòu)先執(zhí)行后判斷結(jié)構(gòu),先執(zhí)行循環(huán)體然后再判斷控制條件,若滿足控制條件則繼續(xù)執(zhí)行循環(huán)體,否則退出循環(huán)兩種結(jié)構(gòu)一般可以隨習(xí)慣使用,但在初始循環(huán)次數(shù)可能為0的情況下則必須使用DO_WHILE結(jié)構(gòu) 4.

35、4 分支與循環(huán)程序設(shè)計基本循環(huán)結(jié)構(gòu) 4.4 分支與循環(huán)程序設(shè)計無論使用哪種循環(huán)結(jié)構(gòu),循環(huán)程序一般應(yīng)包括以下幾個部分。(1)循環(huán)初始化。它包括設(shè)置循環(huán)次數(shù)的初始值、地址指針的初始設(shè)置等。(2)循環(huán)體。這是循環(huán)工作的主體,包括要重復(fù)執(zhí)行的操作,以及循環(huán)的修改部分。修改部分包括地址指針的修改、循環(huán)控制條件的修改等。(3)循環(huán)控制部分。它是控制循環(huán)的關(guān)鍵,判斷循環(huán)條件滿足與否。例如判斷循環(huán)次數(shù)是否為0等。 4.4 分支與循環(huán)程序設(shè)計單重循環(huán)程序設(shè)計例5.10 計算n的階乘。算法分析:階乘(factorial)計算的公式為:n!=n(n-1)(n-2)21。因此,需要循環(huán)n次,每次循環(huán)中完成一次乘法。;

36、PROG05104.4 分支與循環(huán)程序設(shè)計;PROG0510.386.model flat,stdcalloption casemap:noneincludelib msvcrt.libprintf PROTO C :dword,:vararg.dataFact dword ?N equ 6szFmt byte factorial(%d)=%d, 0ah, 0;輸出結(jié)果格式字符串.codestart: mov ecx, N;循環(huán)初值 mov eax, 1;Fact初值e10: imul eax, ecx;Fact=Fact*ECX loop e10;循環(huán)N次 mov Fact, eax;保存結(jié)

37、果 invokeprintf, offset szFmt, N, Fact;打印結(jié)果 retendstart4.4 分支與循環(huán)程序設(shè)計多重循環(huán)程序設(shè)計 有些復(fù)雜問題使用單重循環(huán)可能無法解決,此時就需要設(shè)計多重循環(huán)程序。 在多重循環(huán)的程序中,內(nèi)層循環(huán)嵌套于外層循環(huán),循環(huán)的嵌套層次沒有限制。 各層循環(huán)都有各自的循環(huán)次數(shù)、循環(huán)體、循環(huán)結(jié)束條件,相互之間不能干擾、交叉。4.4 分支與循環(huán)程序設(shè)計DELAY PROCMOV BL,20;置外循環(huán)次數(shù)DELAY10:MOV CX,2801;置內(nèi)循環(huán)次數(shù)WT: LOOP WT;內(nèi)循環(huán)體DEC BL;修改外循環(huán)次數(shù)JNZ DELAY10;外循環(huán)控制RETDEL

38、AY ENDP冒泡排序4.5.1 浮點(diǎn)數(shù)的表述與存儲4.5 浮點(diǎn)運(yùn)算格式說明單精度32位:1位符號位,8位階碼,23位為有效數(shù)字的小數(shù)部分。雙精度64位:1位符號位,11位階碼,52位為有效數(shù)字的小數(shù)部分。擴(kuò)展精度80位:1位符號位,15位階碼,1位為整數(shù)部分,63位為小數(shù)部分。01000010 11101110 00011011 10100110根據(jù)單精度的劃分方式把32位劃分成三部分:.符號位為0,為正數(shù);.指數(shù)為 10000101(133),減去127得6;.尾數(shù)加上1后為1.11011100001101110100110,十進(jìn)制表示為:1.86021876尾數(shù)乘以2的6次方后可得結(jié)果為

39、:119.05400(單精度78位有效數(shù)字)4.5 浮點(diǎn)運(yùn)算4.5.2 浮點(diǎn)數(shù)寄存器4.5.2 浮點(diǎn)寄存器;PROG0409.asm.586.model flat, stdcalloption casemap:noneincludelib msvcrt.libprintf PROTO C :ptr sbyte, :VARARG.dataszMsgbyte %f, 0ah, 0areal83.2breal82.6mreal87.1freal8?.codestart:finit;finit為FPU棧寄存器的初始化fld m ;fld為浮點(diǎn)值入棧fld bfmul st(0),st(1);fmul為

40、浮點(diǎn)數(shù)相乘,結(jié)果保存在目標(biāo)操作數(shù)中fld afadd st(0),st(1);fmul為浮點(diǎn)數(shù)相加,結(jié)果保存在目標(biāo)操作數(shù)中fst f;fst將棧頂數(shù)據(jù)保存到內(nèi)存單元invoke printf, offset szMsg, fretendstart計算表達(dá)式f = a + b * m的值4.5.2 浮點(diǎn)寄存器4.5.3 浮點(diǎn)指令及其編程areal83.2 ;定義64位浮點(diǎn)數(shù)變量a,初始化為3.2breal10100.25e9 ;定義80位浮點(diǎn)數(shù)變量b,初始化為100.25e9cqword3. ;定義64位浮點(diǎn)數(shù)變量c,初始化為3.0dqword3 ;定義64位整型變量d,初始化為32. 數(shù)據(jù)定義

41、4.5.3 浮點(diǎn)指令及其編程3. 尋址方式(1)寄存器尋址:操作數(shù)保存在指定的數(shù)據(jù)寄存器棧中,用ST(i)表示。例4.35 指令:fadd st(0), st(1)將寄存器棧中的ST(0)和ST(1)相加,結(jié)果存儲在ST(0)中。(2)存儲器尋址:操作數(shù)在內(nèi)存中,內(nèi)存中的數(shù)據(jù)可以采用與數(shù)據(jù)有關(guān)的存儲器尋址方式訪問。例4.36 指令:fld m將在內(nèi)存定義的變量m加載到浮點(diǎn)寄存器棧中,m保存在內(nèi)存中,以直接尋址方式訪問。4.5.3 浮點(diǎn)指令及其編程4. 指令4.5.3 浮點(diǎn)指令及其編程4. 指令4.5.3 浮點(diǎn)指令及其編程4. 指令4.5.3 浮點(diǎn)指令及其編程4. 指令4.5.3 浮點(diǎn)指令及其編程4. 指令4.5.3 浮點(diǎn)指令及其編程; PROG0410.asm例4.37 輸入圓的半徑,計算圓面積。.dataszMsg1byt

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論