版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
微機(jī)原理及應(yīng)用所有復(fù)雜操作,我們做;圖書附贈,永久免費(fèi),只為老師用書更方便課件教案微課掃碼題庫建課互評考試平臺
學(xué)習(xí)工具目錄微型計(jì)算機(jī)基礎(chǔ)01微處理器02指令系統(tǒng)(上)03指令系統(tǒng)(下)04匯編語言程序設(shè)計(jì)05存儲器06輸入輸出與中斷07可編程接口芯片08數(shù)模轉(zhuǎn)換與模數(shù)轉(zhuǎn)換09綜合實(shí)踐——交通燈控制系統(tǒng)10第五章匯編語言程序設(shè)計(jì)本章導(dǎo)讀學(xué)習(xí)目標(biāo)掌握匯編語言程序的編輯、匯編、連接和調(diào)試方法。掌握搭建DOSBox上機(jī)環(huán)境的方法。掌握匯編語言的概念、助記符和語句格式,以及常數(shù)、表達(dá)式、標(biāo)號、變量和運(yùn)算符的定義與用法。掌握匯編語言的常用偽指令的格式和用法,以及源程序的結(jié)構(gòu)。掌握匯編程序設(shè)計(jì)的基本方法。掌握高級匯編程序設(shè)計(jì)方法。深刻認(rèn)識代碼質(zhì)量的重要性,培養(yǎng)精益求精、追求卓越的工匠精神。任務(wù)導(dǎo)航任務(wù)一匯編語言程序的上機(jī)操作任務(wù)二匯編語言基礎(chǔ)知識任務(wù)三匯編程序設(shè)計(jì)的基本方法任務(wù)四
高級匯編程序設(shè)計(jì)匯編語言程序的上機(jī)操作01用戶可以在任意一種編輯程序(如EDIT、NOTEPAD等)下,用鍵盤鍵入或編輯匯編語言的源程序。5.1.1匯編語言程序從寫出到執(zhí)行的過程1編輯源程序匯編語言不能直接被計(jì)算機(jī)識別和執(zhí)行,因此,用戶編寫好的匯編語言源程序必須經(jīng)過編輯匯編連接調(diào)試才能運(yùn)行并得到運(yùn)算結(jié)果。此時(shí),源程序以
ASCII碼形式存放于內(nèi)存中。將源文件以ASM為擴(kuò)展名存盤后,在磁盤上就建立了一個(gè)匯編語言源程序文件。匯編語言程序從寫出到執(zhí)行的過程讓我們播放視頻了解一下吧。要使匯編語言源程序在機(jī)器上運(yùn)行,必須先用匯編程序MASM對ASM文件進(jìn)行匯編,生成一個(gè)擴(kuò)展名為
OBJ
的目標(biāo)程序文件。5.1.1匯編語言程序從寫出到執(zhí)行的過程2匯編程序在匯編過程中,可生成3個(gè)文件,用戶可根據(jù)需要有選擇地建立相應(yīng)文件。此時(shí),源程序中的指令被匯編成了計(jì)算機(jī)可以識別的二進(jìn)制代碼。(1)Objectfilename[Filename.OBJ]:目標(biāo)文件(2)Sourcelisting[NUL.LST]:列表文件(3)Cross-reference[NUL.CRF]:交叉引用文件同學(xué)們,我們平時(shí)用匯編語言寫的代碼,計(jì)算機(jī)能直接運(yùn)行嗎?為什么?如果不能,那我們需要用什么工具來轉(zhuǎn)換它,又會生成哪些有用的文件呢?匯編產(chǎn)生的目標(biāo)程序文件雖然是二進(jìn)制代碼文件,但它還不能直接運(yùn)行,須再經(jīng)過連接程序LINK進(jìn)行連接,生成一個(gè)擴(kuò)展名為
EXE的可執(zhí)行文件。5.1.1匯編語言程序從寫出到執(zhí)行的過程3連接程序在連接過程中,可生成3個(gè)文件,用戶可根據(jù)需要有選擇地建立相應(yīng)文件。(1)RunFile[Filename.EXE]:可執(zhí)行文件(2)ListFile[NUL.MAP]:映像文件(3)Libraries[.LIB]:庫文件所謂連接程序,就是找到要連接的所有目標(biāo)模塊,將它們裝入內(nèi)存,進(jìn)而連接在一起形成一個(gè)完整的程序。經(jīng)過前面幾個(gè)步驟后,將可執(zhí)行文件裝入內(nèi)存,就可以在DOS下運(yùn)行此匯編程序了。4運(yùn)行和調(diào)試程序DOSBox是一款開源的DOS模擬程序,可用于在Windows7、Windows10、Windows11等64位Windows操作系統(tǒng)中運(yùn)行DOS命令及應(yīng)用程序。利用DOSBox搭建匯編語言開發(fā)環(huán)境的具體方法如下。5.1.2搭建DOSBox上機(jī)環(huán)境步驟一雙擊運(yùn)行本書配套工具包中的安裝文件DOSBox0.74-3-win32-installer.exe,根據(jù)提示完成DOSBox安裝。步驟二將本書配套工具包中的“MASM”文件夾(包含MASM.EXE、EDIT.EXE、LINK.EXE、DEBUG.EXE、等文件)復(fù)制到D盤根目錄下。搭建DOSBox上機(jī)環(huán)境安裝DOSBox后,如何在其中配置虛擬磁盤并運(yùn)行DOS程序?5.1.2搭建DOSBox上機(jī)環(huán)境步驟三將dosbox-0.74-3.conf配置文件中的以下兩行內(nèi)容windowresolution=originaloutput=surface修改為windowresolution=1028x1024output=opengl不支持窗口縮放5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母步驟四作用:將DOSBox窗口尺寸由原始大小(original)改為指定尺寸(1028x1024)。支持窗口縮放5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母步驟五雙擊桌面上的DOSBox圖標(biāo),進(jìn)入DOSBox界面。此時(shí),便可在DOS下編輯、匯編、連接和調(diào)試匯編語言程序了。已自動將指定目錄(D:\MASM)掛載為DOSBox環(huán)境中的C盤輸入“edit”并按回車鍵,可啟動edit編輯程序;輸入“debug”并按回車鍵,可進(jìn)入debug調(diào)試程序。例如5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母算法分析將26個(gè)小寫英文字母在屏幕上顯示出來先將第一個(gè)小寫英文字母a的ASCII碼值存入存儲單元A,然后通過一個(gè)循環(huán),將26個(gè)字母逐個(gè)顯示出來。應(yīng)預(yù)先設(shè)置循環(huán)次數(shù)(即字母個(gè)數(shù)),每執(zhí)行一次循環(huán),A中的值(即要顯示字符對應(yīng)的ASCII碼值)都應(yīng)增加1。5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母源程序DSEGSEGMENT ;數(shù)據(jù)段,給變量指定數(shù)據(jù),分配存儲空間ADB97DDSEGENDSSSEGSEGMENTSTACK ;堆棧段
DB100DUP(?)SSEGENDSCSEGSEGMENT ;代碼段
ASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,DSEG ;給數(shù)據(jù)段寄存器裝初值
MOVDS,AX5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母源程序 MOVCX,26D ;將循環(huán)計(jì)數(shù)值存入CX MOVDL,a ;將字母a的ASCII碼存入DLNEXT:MOVAH,02H ;顯示字符
INT21H INCA ;A中的值加1 MOVDL,A LOOPNEXT ;執(zhí)行循環(huán)
MOVAH,4CH ;系統(tǒng)功能調(diào)用,結(jié)束程序返回DOS INT21HCSEGENDSENDSTART5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母步驟一進(jìn)入DOSBox界面,輸入“edit”命令后按回車鍵,啟動EDIT編輯程序。由于此時(shí)輸入的edit命令未給出源程序文件名,因此,EDIT編輯程序窗口上方顯示的是“UNTITLED1”,表示新建了一個(gè)未命名文件。如果要編輯一個(gè)已經(jīng)存在的源程序文件,那么輸入edit命令時(shí)要帶上源程序文件名。5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母步驟二在EDIT編輯程序窗口中輸入上面的匯編語言源程序,然后選擇“File”/“Save”選項(xiàng),將其以“5-1.asm”為文件名保存于當(dāng)前目錄下。步驟三選擇“File”/“Exit”選項(xiàng),退出EDIT編輯程序,返回DOS,輸入“masm5-1.asm”命令后按回車鍵,在當(dāng)前目錄下生成一個(gè)名為“5-1.obj”的文件。5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母步驟三在匯編過程中,系統(tǒng)會提示用戶逐項(xiàng)輸入每個(gè)文件的名稱。當(dāng)不需要修改默認(rèn)文件名或不需要生成某一文件時(shí),按回車鍵即可。這里直接按三次回車鍵,表示按默認(rèn)文件名生成目標(biāo)文件,不需要生成列表文件和交叉引用文件。生成目標(biāo)文件,且顯示0WarningErrors0SevereErrors源程序無錯(cuò)顯示錯(cuò)誤提示和錯(cuò)誤位置,需要對源程序文件進(jìn)行編輯修改后再重新匯編源程序有錯(cuò)5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母步驟四輸入“l(fā)ink5-1.obj”命令后按回車鍵,在當(dāng)前目錄下生成一個(gè)名為“5-1.exe”的文件。在連接過程中,系統(tǒng)會提示用戶逐項(xiàng)輸入每個(gè)文件的名稱。當(dāng)不需要修改默認(rèn)文件名或不需要生成某一文件時(shí),按回車鍵即可。這里直接按三次回車鍵,表示按默認(rèn)文件名生成可執(zhí)行文件,不需要生成映像文件和庫文件。5.1.3實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母步驟五在DOS下直接輸入文件名“5-1”并按回車鍵,即可運(yùn)行此程序,顯示運(yùn)行結(jié)果。至此,程序運(yùn)行結(jié)束,屏幕上顯示出26個(gè)小寫英文字母。要將鼠標(biāo)指針從DOSBox窗口中釋放(使其能夠在桌面上正常移動),可以按“Ctrl+F10”組合鍵。課堂檢測匯編語言程序從編寫到執(zhí)行需要經(jīng)過哪四個(gè)核心步驟?DOSBox是一款什么的DOS模擬程序?課堂小結(jié)匯編語言程序的上機(jī)操作匯編語言程序從寫出到執(zhí)行的過程搭建DOSBox上機(jī)環(huán)境實(shí)戰(zhàn)演練——顯示26個(gè)小寫英文字母匯編語言基礎(chǔ)知識025.2.1匯編語言簡介由于計(jì)算機(jī)只能識別和執(zhí)行由二進(jìn)制代碼組成的機(jī)器指令,而這種二進(jìn)制機(jī)器語言對人來說很難理解,于是人們采用字母、符號等來表示機(jī)器指令的二進(jìn)制代碼,這就是匯編語言。匯編語言源程序:用匯編語言編寫的程序。助記符:匯編語言中的字母、符號。匯編:將匯編語言源程序翻譯成機(jī)器語言的過程。又稱符號語言匯編語言是面向機(jī)器的低級語言,它與機(jī)器語言是一一對應(yīng)的,但它比機(jī)器語言更容易理解和掌握。匯編語言與微處理器的類型密切相關(guān),因此,它比高級語言更接近硬件。5.2.2匯編語言中的助記符指令助記符定義:匯編語言的基本助記符,它在匯編時(shí)被轉(zhuǎn)換成二進(jìn)制的指令代碼,每一條指令代碼都對應(yīng)著CPU的一種操作。指令語句:由指令助記符構(gòu)成的可執(zhí)行語句。指令系統(tǒng)中的每條指令都是指令語句。偽指令助記符定義:在匯編過程中用來控制匯編程序的一些特定的助記符,它在匯編時(shí)不產(chǎn)生機(jī)器碼,也不產(chǎn)生任何操作,在匯編語言源程序中可以構(gòu)成獨(dú)立的語句。偽指令語句:由偽指令助記符構(gòu)成的語句,又稱指示性語句。其他助記符在匯編語言中,還有另外一些常見的助記符,如標(biāo)號、常量、變量和表達(dá)式等,這些助記符是可以由用戶自己定義的。5.2.2匯編語言中的助記符匯編語言的語句格式同學(xué)們,我們剛學(xué)習(xí)了匯編語言的語句格式,現(xiàn)在請大家思考:如果要將一條匯編指令“MOVAX,BX”中的“MOV”替換為其他助記符,比如“COPY”,會有什么問題?為什么匯編語言中助記符不能隨意更改?小組討論后分享你們的看法吧!5.2.3匯編語言的語句格式[標(biāo)號:]指令助記符[操作數(shù),操作數(shù)][;注釋]指令語句[名字]偽指令助記符[操作數(shù),…,操作數(shù)][;注釋]匯編語言語句偽指令語句方括號中的內(nèi)容可有可無,所以只有助記符是語句中必不可少的部分。5.2.3匯編語言的語句格式后面有冒號后面是空格(1)標(biāo)號和名字(2)助記符(3)操作數(shù)(4)注釋可作為指令語句的符號地址,代表該指令語句在存儲器中的地址可以是變量名、段名、過程名、符號名等,代表它們在存儲器中的地址標(biāo)號和名字都是使用標(biāo)識符定義的,標(biāo)識符的命名規(guī)則如下。
由英文大寫字符、英文小寫字母、數(shù)字和一些特殊符號(?@_.$)組成。不能以數(shù)字開頭?!?”不能單獨(dú)作為一個(gè)標(biāo)識符?!?”只能作為首字符。最多由31個(gè)字符組成。不能把保留字作為標(biāo)識符。5.2.3匯編語言的語句格式(1)標(biāo)號和名字(2)助記符(3)操作數(shù)(4)注釋規(guī)定了指令語句的操作類型指令助記符規(guī)定了偽指令語句的偽操作功能偽指令助記符匯編語句中必不可少的部分操作數(shù)可能是一個(gè)、兩個(gè)或沒有,它們之間用逗號分隔。指令語句操作數(shù)根據(jù)偽操作命令的不同而不同,有的偽指令不允許有操作數(shù),有的偽指令允許帶多個(gè)操作數(shù)。偽指令語句可以是寄存器、存儲器、常數(shù)、變量、標(biāo)號和表達(dá)式5.2.3匯編語言的語句格式以分號開頭,直到行尾結(jié)束,用來對語句或程序的功能加以說明,增加程序的可讀性。它不是程序的可執(zhí)行部分,在匯編時(shí)不產(chǎn)生任何代碼。(1)標(biāo)號和名字(2)助記符(3)操作數(shù)(4)注釋5.2.4匯編語言的常數(shù)和表達(dá)式常數(shù)數(shù)值常數(shù)字符串常數(shù)可以是二進(jìn)制常數(shù)、八進(jìn)制常數(shù)、十進(jìn)制常數(shù)和十六進(jìn)制常數(shù)。不同的數(shù)制要用后綴表明,如6BH、10110111B等。由單引號引起來的一個(gè)或多個(gè)字符,例如,'IAMASTUDENT'。在匯編語言中,數(shù)值常數(shù)必須以數(shù)字開頭,如十六進(jìn)制數(shù)B6H要寫成0B6H。同學(xué)們,我們在編程時(shí)經(jīng)常用到數(shù)字和文字。那么,匯編語言中數(shù)字和文字是怎么表示的呢?比如十六進(jìn)制的B6H能直接寫成B6H嗎?還有,字符串是用雙引號還是單引號呢?5.2.4匯編語言的常數(shù)和表達(dá)式可以是常數(shù)、標(biāo)號、變量、寄存器或表達(dá)式表達(dá)式中的運(yùn)算符算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符+(加法)-(減法)*(乘法)/(除法)MOD(取模)AND(與)OR(或)XOR(異或)NOT(非)SHL(左移)SHR(右移)EQ(等于)NE(不等于)LT(小于)GT(大于)LE(小于或等于)GE(大于或等于)表達(dá)式數(shù)字表達(dá)式地址表達(dá)式匯編時(shí)對表達(dá)式進(jìn)行計(jì)算,表達(dá)式的結(jié)果是一個(gè)數(shù)值表達(dá)式的結(jié)果是一個(gè)存儲單元的地址操作數(shù)運(yùn)算符表達(dá)式5.2.4匯編語言的常數(shù)和表達(dá)式算術(shù)運(yùn)算符常用于數(shù)字表達(dá)式或地址表達(dá)式中,將其用于地址表達(dá)式中時(shí),必須保證運(yùn)算有意義。(1)算術(shù)運(yùn)算符兩個(gè)地址相乘或相除是無意義的,兩個(gè)不同段的地址相加或相減也是無意義的。經(jīng)常使用的是地址加減數(shù)字量,如上例,COUNT+5表示指向COUNT單元后面的第5個(gè)存儲單元的地址。若COUNT的偏移地址為1000H,則“LEASI,COUNT+5”等效于“LEASI,[1005H]”例如5.2.4匯編語言的常數(shù)和表達(dá)式邏輯運(yùn)算符只能用于數(shù)字表達(dá)式中,不能用于地址表達(dá)式中。運(yùn)算時(shí)是將兩個(gè)數(shù)字操作數(shù)分別按位進(jìn)行運(yùn)算。(2)邏輯運(yùn)算符關(guān)系運(yùn)算符連接的兩個(gè)操作數(shù)必須都是數(shù)字操作數(shù)或者都是地址操作數(shù),運(yùn)算結(jié)果是一個(gè)邏輯值:如果關(guān)系為真,則結(jié)果為0FFFFH如果關(guān)系為假,則結(jié)果為0如“MOVAX,NUMGT100”:若NUM大于100,則等效于“MOVAX,0FFFFH”否則,將等效于“MOVAX,0”(3)關(guān)系運(yùn)算符“MOVAL,0ABHAND0FH”等效于“MOVAL,0BH”例如5.2.5匯編語言的標(biāo)號和變量定義:指令語句的標(biāo)識符,表示該指令所在內(nèi)存單元的地址。在匯編語言程序中,標(biāo)號常用在第一條指令、轉(zhuǎn)移和循環(huán)的目標(biāo)指令,以及子程序的第一條指令之前,并作為轉(zhuǎn)移指令、循環(huán)指令或子程序調(diào)用指令的操作數(shù),從而確定程序轉(zhuǎn)移的目標(biāo)地址。與程序中第一條指令前的標(biāo)號相對應(yīng),在代碼段結(jié)束之后要加一條“END標(biāo)號”語句。標(biāo)號具有以下3個(gè)屬性:段地址(SEG)定義標(biāo)號所在段的起始地址。偏移地址(OFFSET)定義標(biāo)號所在位置與段的起始地址之間的偏移量。類型(TYPE)可以是NEAR(段內(nèi)轉(zhuǎn)移)或FAR(段間轉(zhuǎn)移),一般默認(rèn)為NEAR。5.2.5匯編語言的標(biāo)號和變量作用:定義存放在存儲單元中的數(shù)據(jù),一般在數(shù)據(jù)段或附加段中定義,并且在程序中可以隨時(shí)修改其值。每個(gè)變量都有一個(gè)變量名,作為存儲單元的名字或符號地址,通過變量名可以對存儲單元中的數(shù)據(jù)進(jìn)行訪問。DB、DW、DD、DQ和DT是專門用于數(shù)據(jù)定義的偽指令。匯編時(shí),匯編程序?yàn)樽兞糠峙湎鄳?yīng)字節(jié)數(shù),并把表達(dá)式的值存放在指定的內(nèi)存單元中。變量的定義格式為變量名
DB
表達(dá)式 ;定義字節(jié)變量變量名DW
表達(dá)式 ;定義字變量變量名DD表達(dá)式 ;定義雙字變量變量名DQ表達(dá)式 ;定義8字節(jié)變量變量名DT
表達(dá)式 ;定義10字節(jié)變量5.2.5匯編語言的標(biāo)號和變量在編寫程序時(shí),變量名是可以直接引用的。在匯編程序?yàn)樽兞糠峙湎鄳?yīng)的內(nèi)存區(qū)域后,對變量的引用實(shí)際上都轉(zhuǎn)換成了變量的偏移地址。變量的屬性:12345段地址(SEG)定義變量所在段的起始地址偏移地址(OFFSET)定義變量的位置與段的起始地址之間的偏移量。類型(TYPE)定義變量所占存儲單元的字節(jié)數(shù),用DB,DW和DD偽指令定義的變量類型分別是字節(jié)(BYTE)、字(WORD)和雙字(DWORD)。長度(LENGTH)定義變量的個(gè)數(shù)。大小(SIZE)分配給變量的總字節(jié)數(shù)。5.2.6匯編語言的屬性運(yùn)算符和表達(dá)式屬性運(yùn)算符:用來獲取或重新定義變量或標(biāo)號屬性的運(yùn)算符。格式:OFFSET變量或標(biāo)號功能:返回變量或標(biāo)號的偏移地址(2)取偏移地址運(yùn)算符OFFSET“MOVSI,OFFSETCOUNT”,指的是將變量COUNT的偏移地址送入SI。例如格式:SEG變量或標(biāo)號功能:返回變量或標(biāo)號的段地址(1)取地址運(yùn)算符SEG“MOVAX,SEGCOUNT”,指的是將變量COUNT的段地址送入AX。例如5.2.6匯編語言的屬性運(yùn)算符和表達(dá)式格式:TYPE變量或標(biāo)號功能:返回變量或標(biāo)號的類型值(3)取類型運(yùn)算符TYPE變量或標(biāo)號的類型值類
型類型值字節(jié)變量1字變量2雙字變量4NEAR標(biāo)號-1FAR標(biāo)號-2“MOVAX,TYPECOUNT”,指的是將變量COUNT的類型值送入AX。例如5.2.6匯編語言的屬性運(yùn)算符和表達(dá)式格式:LENGTH變量功能:返回變量的長度(即變量中元素的個(gè)數(shù)),可以以字節(jié)、字或雙字為單位(4)取變量長度運(yùn)算符LENGTH例如LENGTHCOUNT的值為100定義“COUNTDW100DUP(1)”LENGTHBUFF的值為1定義“BUFFDD1,2,3”當(dāng)在變量定義中使用DUP時(shí),該表達(dá)式返回分配給變量的單元數(shù),其他情況下返回值為1。5.2.6匯編語言的屬性運(yùn)算符和表達(dá)式格式:SIZE變量功能:返回變量所包含的總字節(jié)數(shù)(5)取變量總字節(jié)數(shù)運(yùn)算符SIZE若定義“COUNTDW100DUP(1)”,則SIZECOUNT的值為200。例如該表達(dá)式的值實(shí)際上是LENGTH值和TYPE值的乘積,即SIZE=LENGTH×TYPE。格式:類型PTR變量、標(biāo)號或表達(dá)式功能:對已定義的變量、標(biāo)號或表達(dá)式臨時(shí)轉(zhuǎn)換類型,類型可以是BYTE、WORD、DWORD、NEAR或FAR(6)類型運(yùn)算符PTR“MOVAX,WORDPTRCOUNT”,指的是將變量COUNT臨時(shí)轉(zhuǎn)換成字類型。例如該操作符表達(dá)式只在本語句中有效,在其他地方不起作用。5.2.6匯編語言的屬性運(yùn)算符和表達(dá)式格式:變量或標(biāo)號EQUTHIS類型功能:指定變量或標(biāo)號的類型,但不為其分配存儲單元,所定義變量的段地址和偏移地址與下一個(gè)存儲單元地址相同(7)類型定義運(yùn)算符THISCOUNTEQUTHISBYTERESULTDW100DUP(?)該語句定義COUNT為字節(jié)類型,其地址與RESULT完全相同。注意,這里的RESULT是字型類型。例如格式:“段寄存器名:[變量、標(biāo)號或地址表達(dá)式]”。功能:給變量、標(biāo)號或地址表達(dá)式臨時(shí)指定一個(gè)段屬性(8)段超越前綴“MOVAX,ES:[1000H]”,指的是將附加段中偏移地址為1000H的內(nèi)存單元的內(nèi)容送入AX。例如5.2.6匯編語言的屬性運(yùn)算符和表達(dá)式格式:HIGH變量或標(biāo)號功能:分離出變量或標(biāo)號對應(yīng)的運(yùn)算對象的高字節(jié)(9)取高字節(jié)運(yùn)算符HIGH“DATAEQU1234H”,則“MOVAL,HIGHDATA”的結(jié)果為(AL)=12H。例如格式:LOW變量或標(biāo)號功能:分離出變量或標(biāo)號對應(yīng)的運(yùn)算對象的低字節(jié)(10)取低字節(jié)運(yùn)算符LOW“DATAEQU1234H”,則“MOVAL,LOWDATA”的結(jié)果為(AL)=34H。例如格式:SHORT標(biāo)號功能:說明轉(zhuǎn)移指令中的轉(zhuǎn)移為短轉(zhuǎn)移,即目標(biāo)地址與本指令之間的距離在-128~127字節(jié)范圍內(nèi)。(11)短轉(zhuǎn)移運(yùn)算符SHORT“JMPSHORTNEXT”,限制轉(zhuǎn)移范圍小于128個(gè)字節(jié)。例如5.2.7常用偽指令常用偽指令1數(shù)據(jù)定義偽指令2符號定義偽指令3段定義偽指令4過程定義偽指令5結(jié)束偽指令5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令格式:變量數(shù)據(jù)定義偽指令表達(dá)式功能:為數(shù)據(jù)分配存儲單元,其類型由使用的數(shù)據(jù)定義偽指令決定。常用的數(shù)據(jù)定義偽指令偽指令功
能DB定義一個(gè)字節(jié)類型的變量DW定義一個(gè)字類型的變量DD定義一個(gè)雙字類型的變量DQ定義一個(gè)8字節(jié)類型的變量DT定義一個(gè)10字節(jié)類型的變量“COUNTDW1122H,3344H
”的內(nèi)存單元分配情況。例5-25.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令數(shù)據(jù)段DSEG由以下語句組成。DSEGSEGMENTNUM1DB12HNUM2DB34H,56H,78HNUM3DB?DSEGENDS設(shè)本段的段基址為1000H,則相應(yīng)的內(nèi)存單元分配情況如右圖所示。例5-11000H1001H1002H1003H1004H12H34H56H78H?22H11H44H33H5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令“DB100DUP(?)”的功能是分配100個(gè)字節(jié)的內(nèi)存單元。例5-3“DATADB‘ABCD’”的內(nèi)存單元分配情況。例5-441H42H20H43H44H“?”用來定義值不確定的變量,并為變量保留空單元,常用來存放運(yùn)算結(jié)果。對字符串進(jìn)行定義時(shí)可以用DB或DW偽指令,字符串必須用單引號引起來。用DW定義的字符串只允許包含一個(gè)或兩個(gè)字符,當(dāng)字符多于兩個(gè)時(shí)必須用DB來定義。另外,空格也是一個(gè)字符(ASCII碼為20H)。5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令(1)賦值偽指令格式:標(biāo)識符EQU
表達(dá)式功能:用一個(gè)標(biāo)識符表示表達(dá)式的值,但并不為其分配內(nèi)存單元例如COUNTEQU10給COUNT賦值10NUMEQUTAB[BX+3]將表達(dá)式TAB[BX+3]的值賦值給NUM例如可以這樣定義變量COUNT:COUNT=10COUNT=COUNT+1偽指令不能對標(biāo)識符進(jìn)行再定義(2)等號偽指令格式:標(biāo)識符=表達(dá)式功能:與EQU的功能相同,并且也不分配內(nèi)存單元,但“=”可以對同一標(biāo)識符進(jìn)行重新定義5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令(3)標(biāo)號定義偽指令格式:變量或標(biāo)號LABEL類型功能:定義或修改變量或標(biāo)號的類型例如COUNTLABELBYTEDB10功能:定義變量COUNT為字節(jié)型變量,值為10。5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令格式:段名SEGMENT[定位類型][組合類型][類別]
……
段名ENDS功能:對段的結(jié)構(gòu)進(jìn)行定義,所有段必須經(jīng)過定義才能使用(1)SEGMENT和ENDS偽指令表示對段的起始邊界的約定,有BYTE(從字節(jié)邊界開始)、WORD(從字邊界開始)、PARA(從一個(gè)節(jié)的邊界開始,16個(gè)字節(jié)為一個(gè)節(jié))和PAGE(從頁邊界開始,256個(gè)字節(jié)為一頁)4種類型,默認(rèn)類型為PARA。用來說明各模塊的組合方式,以保證各模塊在匯編后連接成一個(gè)完整的程序,有NONE,PUBLIC,STACK,COMMON,AT表達(dá)式和MEMORY共6種組合類型。5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令NONE:本段與其他段在邏輯上無關(guān),連接后各模塊中的各段具有自己的段地址和偏移地址。PUBLIC:連接時(shí),不同模塊中屬于此類型的同名段連接成一個(gè)邏輯段,按順序排列在同一個(gè)物理段中,并具有相同的段地址。STACK:連接方式同PUBLIC,僅用于說明堆棧段。COMMON:連接時(shí),各模塊中屬于此類型的同名段合并成一個(gè)邏輯段,且相互覆蓋,具有相同的段地址。AT表達(dá)式:連接時(shí),將表達(dá)式的值作為段地址。MEMORY:連接時(shí),將本段裝在被連接的其他所有段之上。5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令格式:段名SEGMENT[定位類型][組合類型][類別]
……
段名ENDS功能:對段的結(jié)構(gòu)進(jìn)行定義,所有段必須經(jīng)過定義才能使用(1)SEGMENT和ENDS偽指令用單引號引起來的字符串,連接程序把不同模塊中同類型的段存放在連續(xù)的存儲區(qū)域中。SEGMENT和ENDS必須成對出現(xiàn),它們前面的段名必須一致。段名一旦定義就具備了屬性段基址偏移地址定位類型組合類型類別5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令格式:“ASSUME段寄存器:段名[,…,段寄存器:段名]”功能:在各段定義完之后,用于指明段寄存器與各段之間的對應(yīng)關(guān)系,告訴匯編程序源程序中的各段由哪個(gè)段寄存器去尋址(2)ASSUME偽指令例如“ASSUMECS:CSEG,DS:DSEG,SS:SSEG”的功能:
將CS、DS和SS分別設(shè)定為代碼段、數(shù)據(jù)段和堆棧段寄存器,并指明程序中定義的CSEG段為代碼段,DSEG段為數(shù)據(jù)段,SSEG段為堆棧段。5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令A(yù)SSUME只是指明各段寄存器中存放哪個(gè)段的段地址,但并沒有為其設(shè)定初值。所以程序中必須通過指令將段基址裝入段寄存器。每個(gè)段的段地址實(shí)際上是一個(gè)16位的立即數(shù),用其段名來表示(設(shè)DATA段為數(shù)據(jù)段),故先將段地址送入通用寄存器后,再傳送給段寄存器,代碼為MOVAX,DATAMOVDS,AXMOVES,AX(2)ASSUME偽指令必須由用戶通過數(shù)據(jù)傳送指令實(shí)現(xiàn)CS和SS兩個(gè)段寄存器的值是由系統(tǒng)自動裝入的。5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令格式:過程名PROC[類型]
……
RET
過程名ENDP功能:標(biāo)識一個(gè)執(zhí)行特定功能的代碼塊(又稱子程序),該程序可被其他程序調(diào)用PROC和ENDP必須成對出現(xiàn),它們前面的過程名是相同的,最后一條指令是返回指令,使過程結(jié)束后可以返回主程序??梢允荖EAR(段內(nèi)調(diào)用)或FAR(段間調(diào)用)5.2.7常用偽指令數(shù)據(jù)定義偽指令段定義偽指令符號定義偽指令過程定義偽指令結(jié)束偽指令格式:END[標(biāo)號]功能:匯編程序結(jié)束是程序開始執(zhí)行的起始地址標(biāo)號,表示程序裝入內(nèi)存后要從此處啟動程序5.2.8匯編語言源程序的結(jié)構(gòu)匯編語言源程序是由若干個(gè)邏輯段組成的,一個(gè)匯編語言源程序的基本框架為數(shù)據(jù)段DS:定義程序中的數(shù)據(jù)和變量,分配存儲空間。附加段ES:當(dāng)用戶程序中使用的數(shù)據(jù)量很大或使用字符串操作指令時(shí),須設(shè)置附加段,以增加數(shù)據(jù)段的容量。5.2.8匯編語言源程序的結(jié)構(gòu)堆棧段SS:分配堆棧段的大小或保存子程序調(diào)用和程序中斷時(shí)的斷點(diǎn)地址等。代碼段CS:存放程序指令序列的區(qū)域。指定每個(gè)段分配給哪一個(gè)段寄存器把段地址裝入相應(yīng)的段寄存器中,其中代碼段的段地址由系統(tǒng)自動裝入表示匯編語言程序結(jié)束,返回DOS數(shù)據(jù)段和堆棧段一般用來存放程序中需要的數(shù)據(jù)及運(yùn)算結(jié)果,代碼段則用來存放被執(zhí)行的程序5.2.9實(shí)戰(zhàn)演練——統(tǒng)計(jì)一組數(shù)據(jù)中正數(shù)、零和負(fù)數(shù)的個(gè)數(shù)算法分析統(tǒng)計(jì)一組數(shù)據(jù)中正數(shù)、零和負(fù)數(shù)的個(gè)數(shù),并將負(fù)數(shù)的個(gè)數(shù)在屏幕上顯示出來。程序包括3個(gè)邏輯段:數(shù)據(jù)段(DS)堆棧段(SS)代碼段(CS)定義了兩個(gè)字節(jié)型變量,其中,變量ARRAY定義了一個(gè)數(shù)組,NUM用于存放運(yùn)算結(jié)果。定義了一個(gè)COUNT子程序,功能:統(tǒng)計(jì)數(shù)組中正數(shù)、零和負(fù)數(shù)的個(gè)數(shù)。在COUNT子程序中,先將循環(huán)計(jì)數(shù)值存入CX,然后將數(shù)組中各元素與0進(jìn)行比較。如果是零,則程序轉(zhuǎn)移至ZERO處執(zhí)行如果是正數(shù),則程序轉(zhuǎn)移至ZHENG處執(zhí)行變量名ARRAY表示數(shù)組的首地址,每一次循環(huán)結(jié)束,SI可控制指向數(shù)組中的下一個(gè)元素。COUNT過程結(jié)束后,通過返回主程序,將負(fù)數(shù)的統(tǒng)計(jì)結(jié)果顯示出來。5.2.9實(shí)戰(zhàn)演練——統(tǒng)計(jì)一組數(shù)據(jù)中正數(shù)、零和負(fù)數(shù)的個(gè)數(shù)源程序DSEGSEGMENT ;數(shù)據(jù)段,給變量指定數(shù)據(jù),分配存儲空間
ARRAYDB5,3,-4,0,-5,-3 ;定義一個(gè)數(shù)組
NUMDB0,0,0 ;NUM用于存放正數(shù)、零和負(fù)數(shù)的個(gè)數(shù)DSEGENDSSSEGSEGMENT ;堆棧段
DB100DUP(0)SSEGENDSCSEGSEGMENT ;代碼段
ASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,DSEG ;將數(shù)據(jù)段基址裝入數(shù)據(jù)段寄存器
MOVDS,AX5.2.9實(shí)戰(zhàn)演練——統(tǒng)計(jì)一組數(shù)據(jù)中正數(shù)、零和負(fù)數(shù)的個(gè)數(shù)源程序
MOVSI,0 ;將SI的初值置為0
CALLCOUNT ;調(diào)用COUNT子程序ADDNUM[2],30H ;將負(fù)數(shù)的個(gè)數(shù)轉(zhuǎn)換為ASCII碼
MOVDL,NUM[2] ;DOS功能調(diào)用,顯示負(fù)數(shù)的個(gè)數(shù)
MOVAH,02HINT21HMOVAH,4CH ;系統(tǒng)功能調(diào)用,結(jié)束程序返回DOSINT21HCOUNTPROCNEAR ;COUNT過程
MOVCX,6 ;將循環(huán)的次數(shù)送入CXLOP:CMPARRAY[SI],0 ;將數(shù)組中的各元素與0比較5.2.9實(shí)戰(zhàn)演練——統(tǒng)計(jì)一組數(shù)據(jù)中正數(shù)、零和負(fù)數(shù)的個(gè)數(shù)源程序JZZERO ;結(jié)果為0時(shí)轉(zhuǎn)移到ZERO處JNSZHENG ;結(jié)果為正時(shí)轉(zhuǎn)移到ZHENG處ADDNUM[2],1 ;統(tǒng)計(jì)負(fù)數(shù)的個(gè)數(shù)JMPNEXT ;轉(zhuǎn)移到NEXT處ZHENG:ADDNUM[0],1 ;統(tǒng)計(jì)正數(shù)的個(gè)數(shù)NEXT:INCSI ;SI的內(nèi)容加1LOOPLOP ;執(zhí)行循環(huán)
RET ;返回子程序調(diào)用處COUNTENDPCSEGENDSENDSTART拓展閱讀匯編語言是計(jì)算機(jī)底層編程語言之一,它直接與計(jì)算機(jī)硬件交互。特點(diǎn):高效、靈活因此,匯編語言編程不僅是技術(shù)的體現(xiàn),更是對工匠精神的傳承。然而,匯編語言編程過程煩瑣且容易出錯(cuò),要求我們必須保持專注和執(zhí)著,細(xì)致檢查每一行代碼,不放過任何一個(gè)小錯(cuò)誤,不斷提升代碼質(zhì)量。課堂檢測匯編語言中的助記符分為哪兩種類型?在匯編語言中,DB、DW、DD這三個(gè)偽指令分別用于定義什么類型的變量?課堂小結(jié)匯編語言基礎(chǔ)知識匯編語言簡介匯編語言中的助記符匯編語言的語句格式匯編語言的常數(shù)和表達(dá)式匯編語言的標(biāo)號和變量匯編語言的屬性運(yùn)算符和表達(dá)式常用偽指令匯編語言源程序的結(jié)構(gòu)實(shí)戰(zhàn)演練——統(tǒng)計(jì)一組數(shù)據(jù)中正數(shù)、零和負(fù)數(shù)的個(gè)數(shù)匯編程序設(shè)計(jì)的基本方法035.3.1匯編程序設(shè)計(jì)的一般步驟在編寫復(fù)雜的程序時(shí),往往需要考慮程序的結(jié)構(gòu)化設(shè)計(jì),以使程序在實(shí)現(xiàn)所要求功能的基礎(chǔ)上,進(jìn)一步優(yōu)化。匯編程序設(shè)計(jì)的一般步驟如下:1.分析問題,確定算法3.編寫源程序2.畫出程序流程圖4.調(diào)試程序5.3.1匯編程序設(shè)計(jì)的一般步驟編寫程序之前,應(yīng):1.分析問題,確定算法首先對要求解的問題進(jìn)行仔細(xì)分析,明確問題的條件和任務(wù),找出解決問題的方法和步驟。然后選擇合理的算法和數(shù)據(jù)結(jié)構(gòu),將一個(gè)實(shí)際問題轉(zhuǎn)化為計(jì)算機(jī)可以處理的問題,這是編寫一個(gè)好程序的基礎(chǔ)。2.畫出程序流程圖根據(jù)設(shè)計(jì)的算法畫出程序流程圖,從而直觀、形象地描述程序的執(zhí)行過程,進(jìn)而檢驗(yàn)算法的可行性。流程圖是用一些圖形框代表各種操作的示意圖。(a)起止框(b)處理框
(c)判斷框(d)連接框(e)流程線5.3.1匯編程序設(shè)計(jì)的一般步驟(a)起止框(b)處理框
(c)判斷框(d)連接框(e)流程線2.畫出程序流程圖框內(nèi)寫上“開始”或“結(jié)束”,表示一個(gè)過程的開始或結(jié)束,其中,起始框有一個(gè)出口,終止框有一個(gè)入口??騼?nèi)寫上簡要的功能或說明,表示過程中執(zhí)行的一個(gè)操作,它有一個(gè)入口和一個(gè)出口??騼?nèi)寫上判斷條件,根據(jù)一個(gè)給定的條件判斷如何執(zhí)行后面的操作,它有一個(gè)入口和若干個(gè)出口,在出口處標(biāo)明“Y”或“N”,表示成立或不成立??騼?nèi)寫上一個(gè)標(biāo)識符,表示將具有相同標(biāo)識符的過程連接起來。表示程序執(zhí)行的方向。同學(xué)們,我們都知道程序是有邏輯順序的,那么怎么用圖形清晰地表示程序的流程呢?比如,一個(gè)程序的開始和結(jié)束用什么圖形表示?判斷一個(gè)條件時(shí),又該用什么圖形?5.3.1匯編程序設(shè)計(jì)的一般步驟3.編寫源程序根據(jù)程序流程圖采用匯編語言編寫程序,實(shí)現(xiàn)前面設(shè)計(jì)的算法,并保存成ASM文件。編寫匯編程序時(shí),應(yīng)先對內(nèi)存單元和工作寄存器進(jìn)行合理分配。上機(jī)運(yùn)行、調(diào)試程序,檢驗(yàn)程序是否正確,并修改其中的錯(cuò)誤。運(yùn)行時(shí),先對源程序進(jìn)行匯編,生成OBJ目標(biāo)文件,再把OBJ文件連接成可執(zhí)行文件。4.調(diào)試程序程序設(shè)計(jì)的基本方法順序結(jié)構(gòu)程序設(shè)計(jì)方法分支結(jié)構(gòu)程序設(shè)計(jì)方法循環(huán)結(jié)構(gòu)程序設(shè)計(jì)方法5.3.2順序結(jié)構(gòu)程序設(shè)計(jì)最簡單、最基本的程序結(jié)構(gòu),按照指令在程序中排列的先后順序逐條執(zhí)行順序結(jié)構(gòu)程序的流程圖中只有一個(gè)起始框和一個(gè)結(jié)束框5.3.3分支結(jié)構(gòu)程序設(shè)計(jì)在解決實(shí)際問題時(shí),經(jīng)常需要對某種條件進(jìn)行判斷,根據(jù)不同的情況做出不同的處理,在程序中就表現(xiàn)為程序轉(zhuǎn)向不同的目標(biāo)地址去執(zhí)行,這就是分支結(jié)構(gòu)程序。分支結(jié)構(gòu)程序設(shè)計(jì)如果用分支結(jié)構(gòu)設(shè)計(jì)一個(gè)判斷奇偶數(shù)的程序,你會如何實(shí)現(xiàn)?典型的分支結(jié)構(gòu)雙分支結(jié)構(gòu)多分支結(jié)構(gòu)跳轉(zhuǎn)表實(shí)現(xiàn)分支結(jié)構(gòu)中的分支程序,要用到條件測試轉(zhuǎn)移指令CMP(比較指令)CMPS(串比較指令)TEST(檢測指令)常用的指令有5.3.3分支結(jié)構(gòu)程序設(shè)計(jì)1.雙分支結(jié)構(gòu)雙分支結(jié)構(gòu)有兩種結(jié)構(gòu)形式,分別是IF…THEN結(jié)構(gòu)和IF…THEN…ELSE結(jié)構(gòu)。IF…THEN結(jié)構(gòu)5.3.3分支結(jié)構(gòu)程序設(shè)計(jì)1.雙分支結(jié)構(gòu)IF…THEN…ELSE結(jié)構(gòu)5.3.3分支結(jié)構(gòu)程序設(shè)計(jì)2.多分支結(jié)構(gòu)多分支結(jié)構(gòu)相當(dāng)于高級語言中的CASE結(jié)構(gòu)5.3.3分支結(jié)構(gòu)程序設(shè)計(jì)3.跳轉(zhuǎn)表在內(nèi)存的一個(gè)連續(xù)區(qū)域中,依次存放完成各功能的分支子程序的首地址,構(gòu)成一個(gè)跳轉(zhuǎn)表。程序運(yùn)行時(shí),通過計(jì)算存儲單元的偏移地址,獲得對應(yīng)的分支子程序的首地址,從而轉(zhuǎn)去執(zhí)行對應(yīng)的子程序。這種方法的關(guān)鍵是計(jì)算存放分支子程序的首地址的存儲單元的地址。計(jì)算方法:跳轉(zhuǎn)表基地址+偏移地址5.3.4實(shí)戰(zhàn)演練——求三個(gè)帶符號數(shù)中的最大數(shù)算法分析比較三個(gè)帶符號數(shù)X、Y和Z的大小,并將最大的那個(gè)數(shù)存入MAX所在的存儲單元中。用于比較前兩個(gè)數(shù)的大小,從而得到兩數(shù)中較大的那個(gè)數(shù),并將其存入AL第一個(gè)分支結(jié)構(gòu)用于將AL中的數(shù)與第三個(gè)數(shù)進(jìn)行比較,從而求得三個(gè)數(shù)中最大的那個(gè)數(shù),并將其存入指定的存儲單元第二個(gè)分支結(jié)構(gòu)兩個(gè)雙分支結(jié)構(gòu)5.3.4實(shí)戰(zhàn)演練——求三個(gè)帶符號數(shù)中的最大數(shù)程序流程圖5.3.4實(shí)戰(zhàn)演練——求三個(gè)帶符號數(shù)中的最大數(shù)DSEGSEGMENT ;數(shù)據(jù)段,給變量指定數(shù)據(jù),分配存儲空間
XDB12HYDB-3ZDB15MAXDB?DSEGENDSSSEGSEGMENTSTACK ;堆棧段DB100DUP(?)SSEGENDS源程序5.3.4實(shí)戰(zhàn)演練——求三個(gè)帶符號數(shù)中的最大數(shù)CSEGSEGMENT ;代碼段ASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,DSEG ;將數(shù)據(jù)段基址裝入數(shù)據(jù)段寄存器
MOVDS,AXMOVAL,X ;將X送入ALCMPAL,Y ;比較X和Y大小
JGF1 ;如果X>Y,則程序轉(zhuǎn)移至F1MOVAL,Y ;如果X≤Y,將Y送入ALF1:CMPAL,Z ;比較AL中的內(nèi)容和Z大小源程序5.3.4實(shí)戰(zhàn)演練——求三個(gè)帶符號數(shù)中的最大數(shù)JGF3 ;如果(AL)>Z,則程序轉(zhuǎn)移至F3F2:MOVAL,Z ;如果(AL)≤Z,將Z送入ALF3:MOVMAX,AL ;將最大值A(chǔ)L送入MAXMOVAH,4CH ;系統(tǒng)功能調(diào)用,結(jié)束程序返回DOSINT21HCSEGENDSENDSTART源程序基本組成分類結(jié)構(gòu)形式5.3.5循環(huán)結(jié)構(gòu)程序設(shè)計(jì)在解決某些問題時(shí),有時(shí)需要重復(fù)執(zhí)行某一段程序,這種情況可采用循環(huán)結(jié)構(gòu)程序設(shè)計(jì)方法實(shí)現(xiàn)。
(2)循環(huán)體部分循環(huán)程序的主體部分,也就是需要重復(fù)執(zhí)行的程序段。(4)循環(huán)控制部分判斷循環(huán)結(jié)束條件,控制循環(huán)的繼續(xù)或終止。(5)結(jié)束部分循環(huán)結(jié)束后對結(jié)果的處理。(3)修改部分修改地址指針、循環(huán)計(jì)數(shù)器等參數(shù)的值,為執(zhí)行下一次循環(huán)做準(zhǔn)備。(1)初始化部分循環(huán)的準(zhǔn)備部分,常用于為寄存器、存儲單元、地址指針和循環(huán)計(jì)數(shù)器設(shè)置初值等。5.3.5循環(huán)結(jié)構(gòu)程序設(shè)計(jì)基本組成分類結(jié)構(gòu)形式NY初始化部分循環(huán)體部分修改部分控制部分NY控制部分初始化部分循環(huán)體部分修改部分(a)
(b)循環(huán)結(jié)構(gòu)程序的結(jié)構(gòu)形式先判斷循環(huán)控制條件,條件滿足則執(zhí)行循環(huán)體部分,否則退出循環(huán);先執(zhí)行一次循環(huán)體部分,然后判斷循環(huán)控制條件是否滿足,若不滿足,則繼續(xù)執(zhí)行循環(huán)體部分,直到滿足循環(huán)控制條件時(shí)退出循環(huán)。5.3.5循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序計(jì)數(shù)控制循環(huán)條件控制循環(huán)按照循環(huán)控制方式基本組成分類結(jié)構(gòu)形式方法:通過設(shè)置循環(huán)計(jì)數(shù)器的值來控制循環(huán)的次數(shù),每循環(huán)一次,計(jì)數(shù)器的值自動減1,直到值為0時(shí)循環(huán)結(jié)束。方法:每次循環(huán)體執(zhí)行前或執(zhí)行后,通過對某個(gè)特定條件的判斷來決定是否執(zhí)行下一次循環(huán)循環(huán)結(jié)構(gòu)程序單重循環(huán)多重循環(huán)按照循環(huán)嵌套的層次循環(huán)體內(nèi)只包含順序結(jié)構(gòu)程序或分支結(jié)構(gòu)程序循環(huán)體內(nèi)除了包含順序結(jié)構(gòu)程序或分支結(jié)構(gòu)程序,還包含循環(huán)結(jié)構(gòu)程序用于循環(huán)次數(shù)已知的循環(huán)用于循環(huán)次數(shù)未知的循環(huán)5.3.6實(shí)戰(zhàn)演練——冒泡排序法從第一個(gè)數(shù)開始每次對相鄰兩個(gè)數(shù)進(jìn)行比較,將較小的數(shù)放到后面的位置。這樣,第一遍需要比較N-1次,第二遍需要比較N-2次,以此類推,一共需要比較N-1遍。算法分析對以DATA為首地址的N個(gè)帶符號數(shù)進(jìn)行冒泡排序。程序中使用兩層循環(huán),都是采用先執(zhí)行循環(huán)體,再判斷循環(huán)控制條件的結(jié)構(gòu)形式。循環(huán)條件為比較次數(shù)CX的值不為0,用于對相鄰的兩個(gè)數(shù)進(jìn)行比較內(nèi)層循環(huán)為條件控制循環(huán)循環(huán)計(jì)數(shù)器控制循環(huán)的次數(shù),每執(zhí)行一次外層循環(huán),都可以將比較序列中最小的數(shù)放置到存儲單元最后的位置上外層循環(huán)為計(jì)數(shù)控制循環(huán)5.3.6實(shí)戰(zhàn)演練——冒泡排序法程序流程圖5.3.6實(shí)戰(zhàn)演練——冒泡排序法源程序DSEGSEGMENT ;數(shù)據(jù)段,給變量指定數(shù)據(jù),分配存儲空間
DATADW1,-8,-6,8,0NEQU5DSEGENDSCSEGSEGMENT ;代碼段
ASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEG ;將數(shù)據(jù)段基址裝入數(shù)據(jù)段寄存器
MOVDS,AXMOVCX,N ;將外層循環(huán)的次數(shù)送入CX5.3.6實(shí)戰(zhàn)演練——冒泡排序法源程序DECCXLOP1:LEASI,DATA ;外層循環(huán)
MOVDX,CX ;保存CX中的值LOP2:MOVAX,[SI] ;內(nèi)層循環(huán)
CMPAX,[SI+2] ;比較相鄰兩個(gè)數(shù)的大小
JGENEXT ;若前面的數(shù)大于或等于后面的數(shù),轉(zhuǎn)移至NEXTXCHGAX,[SI+2] ;若前面的數(shù)小于后面的數(shù),則兩數(shù)交換
MOV[SI],AXNEXT:ADDSI,2 ;SI增加25.3.6實(shí)戰(zhàn)演練——冒泡排序法源程序DECCX ;修改內(nèi)層循環(huán)參數(shù)
JNELOP2 ;判斷循環(huán)控制條件,是否繼續(xù)執(zhí)行內(nèi)層循環(huán)
MOVCX,DX ;將外層循環(huán)次數(shù)重新送入循環(huán)計(jì)數(shù)器CXLOOPLOP1 ;執(zhí)行外層循環(huán)
MOVAH,4CH ;系統(tǒng)功能調(diào)用,結(jié)束程序返回DOSINT21HCSEGENDSENDSTART課堂檢測順序結(jié)構(gòu)程序的執(zhí)行流程有何特點(diǎn)?按照循環(huán)嵌套的層次,循環(huán)結(jié)構(gòu)可以分為什么?課堂小結(jié)匯編程序設(shè)計(jì)的基本方法匯編程序設(shè)計(jì)的一般步驟順序結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)程序設(shè)計(jì)實(shí)戰(zhàn)演練——求三個(gè)帶符號數(shù)中的最大數(shù)循環(huán)結(jié)構(gòu)程序設(shè)計(jì)實(shí)戰(zhàn)演練——冒泡排序法高級匯編程序設(shè)計(jì)045.4.1使用子程序子程序或過程:在程序設(shè)計(jì)中,如果一個(gè)具有獨(dú)立功能的程序段在程序中要多次使用,可以將該程序段編成一個(gè)獨(dú)立的程序模塊。當(dāng)程序中需要執(zhí)行該程序段時(shí),用CALL指令調(diào)用相應(yīng)的子程序即可。主程序:調(diào)用子程序的程序。子程序設(shè)計(jì):主程序調(diào)用子程序的程序設(shè)計(jì)方法。參數(shù)傳遞:在調(diào)用子程序時(shí),主程序和子程序之間數(shù)據(jù)信息的交換。入口參數(shù)出口參數(shù)包括子程序調(diào)用前,將子程序中需要的數(shù)據(jù)(入口參數(shù))傳送給子程序子程序調(diào)用后,將處理結(jié)果(出口參數(shù))返回給主程序該方法的特點(diǎn)是速度快,但只適用于參數(shù)較少的情況。5.4.1使用子程序(1)通過寄存器傳遞參數(shù)子程序調(diào)用前子程序調(diào)用后將入口參數(shù)的值存放在指定寄存器中,通過寄存器將所需數(shù)據(jù)傳送給子程序?qū)⒊隹趨?shù)的值也存放在指定寄存器中,再通過寄存器將結(jié)果返回給主程序該方法適用于參數(shù)較多的情況,需要先在內(nèi)存中建立一個(gè)參數(shù)表。子程序調(diào)用前子程序調(diào)用后將入口參數(shù)的值存放在指定內(nèi)存單元中,通過內(nèi)存單元將所需數(shù)據(jù)傳送給子程序?qū)⒊隹趨?shù)的值存放在指定內(nèi)存單元中,再通過內(nèi)存單元將結(jié)果返回給主程序5.4.1使用子程序先在主程序中建立存儲區(qū)域:(2)通過內(nèi)存單元傳遞參數(shù)該方法適用于參數(shù)較多且子程序有嵌套、遞歸調(diào)用的情況。子程序調(diào)用前子程序調(diào)用后將入口參數(shù)的值壓入堆棧,通過執(zhí)行出棧操作將所需數(shù)據(jù)傳送給子程序?qū)⒊隹趨?shù)的值壓入堆棧,再通過執(zhí)行出棧操作將結(jié)果返回給主程序5.4.1使用子程序(3)通過堆棧傳遞參數(shù)5.4.1使用子程序子程序嵌套:將子程序作為調(diào)用程序又去調(diào)用其他子程序。子程序遞歸調(diào)用:在子程序嵌套的情況下,一個(gè)子程序調(diào)用的子程序就是它自身。子程序嵌套5.4.1使用子程序由于寄存器的數(shù)目是有限的,主程序中用到的某些寄存器可能在子程序中還要使用。因此,在子程序調(diào)用后,這些寄存器中的內(nèi)容就發(fā)生了變化。如果還想使用原來寄存器中的內(nèi)容,就必須在子程序調(diào)用前,將子程序中可能用到的寄存器中的內(nèi)容保護(hù)起來,這個(gè)過程稱為現(xiàn)場保護(hù)?,F(xiàn)場保護(hù)最常用的方法是,在子程序開始時(shí),先將要保護(hù)的寄存器中的內(nèi)容壓入堆棧,返回主程序之前再將這些值彈出到相應(yīng)的寄存器中。通常,子程序中用到的寄存器都要進(jìn)行現(xiàn)場保護(hù)。現(xiàn)場保護(hù)時(shí),壓入堆棧的寄存器順序應(yīng)與恢復(fù)現(xiàn)場時(shí)出棧的順序相反。5.4.1使用子程序編寫將16位二進(jìn)制數(shù)轉(zhuǎn)換成4位十六進(jìn)制數(shù)的ASCII碼子程序。例5-5子程序說明如下。子程序名:BTH功能描述:將16位二進(jìn)制數(shù)轉(zhuǎn)換成4位十六進(jìn)制數(shù)的ASCII碼形式。入口參數(shù):BX中存放待轉(zhuǎn)換的二進(jìn)制數(shù)。出口參數(shù):DI中存放轉(zhuǎn)換結(jié)果的偏移地址。所用寄存器:CH中存放十六進(jìn)制數(shù)位數(shù),CL中存放移位次數(shù)。5.4.1使用子程序BTHPROCFARPUSHF ;將標(biāo)志寄存器的內(nèi)容壓入堆棧
PUSHAX ;將寄存器的內(nèi)容壓入堆棧
PUSHCXMOVCH,4 ;將十六進(jìn)制數(shù)位數(shù)存入CHCONV:MOVCL,4 ;將移位次數(shù)存入CLROLBX,CL ;將BX中的數(shù)循環(huán)左移4位,將最高4位移至最低4位
MOVAL,BL ;將BX的低8位存入ALANDAL,0FH ;使AL中保存BX的最低4位
CMPAL,09H ;判斷AL是否在0~9之間
JLEASC ;若在0~9之間,則程序轉(zhuǎn)移至ASC例5-55.4.1使用子程序ADDAL,37H ;AL在A~F之間時(shí),二進(jìn)制數(shù)與ASCII碼相差37HJMPEXITASC:ADDAL,30H ;AL在0~9之間時(shí),二進(jìn)制數(shù)與ASCII碼相差30HEXIT:MOV[DI],AL ;將轉(zhuǎn)換結(jié)果存入DI所指向的存儲單元
INCDIDECCHJNZCONV ;未轉(zhuǎn)換完,繼續(xù)轉(zhuǎn)換
POPCX ;恢復(fù)寄存器中的內(nèi)容
POPAXRETBTHENDP例5-55.4.2DOS功能調(diào)用DOS操作系統(tǒng)為用戶提供了豐富的服務(wù)程序,用于對文件、設(shè)備和內(nèi)存等進(jìn)行管理。這些程序構(gòu)成了一些功能模塊,每個(gè)模塊完成一種特定的功能操作,用戶可在程序中使用軟中斷指令“INTn”調(diào)用相應(yīng)的模塊。調(diào)用DOS的中斷處理程序類型碼n=20H~3FH時(shí)調(diào)用BIOS的中斷處理程序類型碼n=05H~1FH時(shí)常用的系統(tǒng)功能調(diào)用DOS功能調(diào)用方法0201DOS功能調(diào)用5.4.2DOS功能調(diào)用定義:用軟中斷指令“INT21H”來實(shí)現(xiàn)的?!癐NT21H”軟中斷是一個(gè)提供了80多個(gè)子程序的大型中斷服務(wù)程序,每個(gè)子程序都有一個(gè)功能號,對應(yīng)著一種特定的操作和處理。1.DOS功能調(diào)用方法調(diào)用DOS系統(tǒng)功能子程序時(shí),用戶不必了解設(shè)備的物理特性、接口方式和內(nèi)存分配等,只需將其入口參數(shù)和功能號送入指定寄存器即可。DOS系統(tǒng)功能的調(diào)用方法:123將入口參數(shù)送入指定寄存器中將子程序的功能號送入寄存器AH中執(zhí)行“INT21H”5.4.2DOS功能調(diào)用(1)輸入字符在調(diào)用此功能之前,應(yīng)先定義一個(gè)內(nèi)存緩沖區(qū)。第一個(gè)字節(jié)指定緩沖區(qū)能容納的字符個(gè)數(shù)第二個(gè)字節(jié)設(shè)置實(shí)際輸入的字符個(gè)數(shù)第三個(gè)字節(jié)開始存放輸入的字符2.常用的系統(tǒng)功能調(diào)用格式:MOVAH,01HINT21H功能:接收從鍵盤輸入的字符,在屏幕上顯示該字符,并將字符的ASCII碼送入寄存器AL中。格式:LEADX,內(nèi)存緩沖區(qū)首地址
MOVAH,0AHINT21H功能:接收從鍵盤輸入的字符串,在屏幕上顯示該字符串,并將其送入內(nèi)存緩沖區(qū)中。(2)輸入字符串同學(xué)們,我們平時(shí)在電腦上輸入文字時(shí),計(jì)算機(jī)是怎么接收的呢?比如輸入一個(gè)字符和輸入一串文字,它們的處理方式一樣嗎?格式:MOVDX,待顯示字符串的偏移地址
MOVAH,09H
INT21H功能:將字符串在屏幕上顯示出來5.4.2DOS功能調(diào)用(3)顯示字符待顯示的字符串存放的地址為DS:[DX],且以‘$’符號作為結(jié)束標(biāo)志。2.常用的系統(tǒng)功能調(diào)用格式:MOVDL,待顯示字符的ASCII碼
MOVAH,02H
INT21H功能:將寄存器DL中的內(nèi)容在屏幕上顯示出來(4)顯示字符串(5)打印輸出格式:MOVDL,'字符'
MOVAH,05H
INT21H功能:將送入DL中的字符送到打印機(jī)接口打印輸出5.4.2DOS功能調(diào)用2.常用的系統(tǒng)功能調(diào)用(6)檢查鍵盤狀態(tài)格式:MOVAH,0BH INT21H功能:檢查是否有鍵按下若有鍵按下,則AL=0FFH否則,AL=00H(7)程序結(jié)束格式:MOVAH,4CH
INT21H功能:結(jié)束當(dāng)前程序并返回DOS5.4.2DOS功能調(diào)用
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025鞋類產(chǎn)品定制服務(wù)行業(yè)市場發(fā)展前景評估運(yùn)營模式投資布局規(guī)劃研究報(bào)告
- 2025鞋履行業(yè)運(yùn)動鞋市場消費(fèi)行為分析及產(chǎn)品設(shè)計(jì)創(chuàng)新報(bào)告
- 2026年衛(wèi)生專業(yè)技術(shù)資格考試神經(jīng)電生理(腦電圖)技術(shù)復(fù)習(xí)題及答案解析
- 2025鎮(zhèn)江新材料產(chǎn)業(yè)集群發(fā)展現(xiàn)狀調(diào)研及投資布局規(guī)劃研究報(bào)告
- 2025郵政物流行業(yè)數(shù)字化轉(zhuǎn)型實(shí)施計(jì)劃分析報(bào)告書
- 白土補(bǔ)充精制裝置操作工操作知識測試考核試卷含答案
- 觀眾情緒波動對電視節(jié)目表現(xiàn)周期性影響-洞察及研究
- 金橋區(qū)域AI政策與產(chǎn)業(yè)創(chuàng)新研究-洞察及研究
- 2025年浙江會計(jì)從業(yè)資格考試會計(jì)基礎(chǔ)試題及答案
- 輪胎橡膠回收技術(shù)-洞察及研究
- 本田供應(yīng)商品質(zhì)監(jiān)查1
- 創(chuàng)業(yè)人生(上海大學(xué))【超星爾雅學(xué)習(xí)通】章節(jié)答案
- 開放系統(tǒng)10862人文英語(4)期末機(jī)考真題及答案
- GB/T 4957-2003非磁性基體金屬上非導(dǎo)電覆蓋層覆蓋層厚度測量渦流法
- GB/T 27806-2011環(huán)氧瀝青防腐涂料
- GB/T 12618.1-2006開口型平圓頭抽芯鉚釘10、11級
- FZ/T 52051-2018低熔點(diǎn)聚酯(LMPET)/聚酯(PET)復(fù)合短纖維
- 設(shè)備吊裝方案編制受力計(jì)算
- 食品工程原理概述經(jīng)典課件
- 養(yǎng)老院機(jī)構(gòu)組織架構(gòu)圖
- 《中國傳統(tǒng)文化心理學(xué)》課件第五章 傳統(tǒng)文化與心理治療(修)
評論
0/150
提交評論