大三上學(xué)期課件微機(jī)cai第四五六章_第1頁(yè)
大三上學(xué)期課件微機(jī)cai第四五六章_第2頁(yè)
大三上學(xué)期課件微機(jī)cai第四五六章_第3頁(yè)
大三上學(xué)期課件微機(jī)cai第四五六章_第4頁(yè)
大三上學(xué)期課件微機(jī)cai第四五六章_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

第四章8086匯編語(yǔ)言基礎(chǔ)4.1匯編語(yǔ)言的簡(jiǎn)介匯編語(yǔ)言是一種以處理器指令系統(tǒng)為基礎(chǔ)的低級(jí)程序設(shè)計(jì)語(yǔ)言,它采用助記符表達(dá)指令操作碼,采用標(biāo)識(shí)符號(hào)表示指令操作數(shù)利用匯編語(yǔ)言編寫(xiě)程序的主要優(yōu)點(diǎn)是可以直接、有效地控制計(jì)算機(jī)硬件,因而容易創(chuàng)建代碼序列短小、運(yùn)行快速的可執(zhí)行程序在有些應(yīng)用領(lǐng)域,匯編語(yǔ)言的作用是不容置疑和無(wú)可替代的匯編程序設(shè)計(jì)的過(guò)程是與其他高級(jí)語(yǔ)言程序設(shè)計(jì)大致相同匯編語(yǔ)言源程序格式完整的匯編語(yǔ)言源程序由段組成一個(gè)匯編語(yǔ)言源程序可以包含若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列需獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段,并指示程序執(zhí)行的起始點(diǎn),一個(gè)程序只有一個(gè)起始點(diǎn)所有的可執(zhí)行性語(yǔ)句必須位于某一個(gè)代碼段內(nèi),說(shuō)明性語(yǔ)句可根據(jù)需要位于任一段內(nèi)通常,程序還需要一個(gè)堆棧段

源程序由語(yǔ)句序列構(gòu)成⑴執(zhí)行性語(yǔ)句——執(zhí)行性語(yǔ)句用于表達(dá)處理器指令(也稱為硬指令),匯編后對(duì)應(yīng)一條指令代碼。由處理器指令組成的代碼序列是程序設(shè)計(jì)的主體標(biāo)號(hào):

硬指令助記符操作數(shù),操作數(shù)

;注釋⑵說(shuō)明性語(yǔ)句——說(shuō)明性語(yǔ)句用于表達(dá)偽指令,指示源程序如何匯編、變量怎樣定義、過(guò)程怎么設(shè)置等名字偽指令助記符

參數(shù),參數(shù),……;注釋匯編語(yǔ)言源語(yǔ)句格式硬指令(Instruction)——使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的指令 硬指令就是第2章學(xué)習(xí)的處理器指令,與具體的處理器有關(guān)、與匯編程序無(wú)關(guān)偽指令(Directive)——不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說(shuō)明性指令 偽指令與具體的處理器類型無(wú)關(guān),但與匯編程序有關(guān)。不同版本的匯編程序支持不同的偽指令

硬指令和偽指令采用易于記憶的符合表達(dá),這就是助記符硬指令與偽指令標(biāo)號(hào)是反映硬指令位置(邏輯地址)和屬性的標(biāo)識(shí)符,后跟一個(gè)冒號(hào)分隔名字是反映偽指令位置(邏輯地址)和屬性的標(biāo)識(shí)符,后跟空格或制表符分隔,沒(méi)有冒號(hào)標(biāo)識(shí)符(Identifier)一般最多由31個(gè)字母、數(shù)字及規(guī)定的特殊符號(hào)(如_、$、?、@)組成,不能以數(shù)字開(kāi)頭。默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識(shí)符中的字母大小寫(xiě)一個(gè)源程序中,每個(gè)標(biāo)識(shí)符的定義是唯一的,還不能是匯編語(yǔ)言采用的保留字4.2匯編語(yǔ)言的標(biāo)記保留字(ReservedWord)是匯編程序已經(jīng)利用的標(biāo)識(shí)符(也稱為關(guān)鍵字),主要有:硬指令助記符——例如:MOV、ADD偽指令助記符——例如:DB、DW操作符——例如:OFFSET、PTR寄存器名——例如:AX、CS預(yù)定義符號(hào)——例如:@data

匯編語(yǔ)言大小寫(xiě)不敏感處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲(chǔ)單元偽指令的參數(shù)可以是常數(shù)、變量名、表達(dá)式等,可以有多個(gè),參數(shù)之間用逗號(hào)分隔語(yǔ)句中由分號(hào)“;”開(kāi)始的部分為注釋內(nèi)容,用以增加源程序的可讀性必要時(shí),一個(gè)語(yǔ)句行也可以由分號(hào)開(kāi)始作為階段性注釋匯編程序在翻譯源程序時(shí)將跳過(guò)該部分,不對(duì)它們做任何處理語(yǔ)句的4個(gè)組成部分要用分隔符分開(kāi)標(biāo)號(hào)后用冒號(hào),注釋前用分號(hào)操作數(shù)之間和參數(shù)之間使用逗號(hào)分隔其他部分通常采用空格或制表符多個(gè)空格和制表符的作用與一個(gè)相同MASM支持續(xù)行符“\”

常量表示一個(gè)固定的數(shù)值,它又分成多種形式常數(shù)字符串符合常量數(shù)值表達(dá)式4.2表達(dá)式1.常數(shù)指由10、16、2和8進(jìn)制形式表達(dá)的數(shù)值,各種進(jìn)制的數(shù)據(jù)以后綴字母區(qū)分,默認(rèn)不加后綴字母的是十進(jìn)制數(shù)十進(jìn)制由0~9數(shù)字組成,以字母D(d)結(jié)尾(缺省情況可以省略)100,255D十六進(jìn)制由0~9、A~F數(shù)字組成,以字母H(h)結(jié)尾,以字母開(kāi)頭的常數(shù)需要加一個(gè)前導(dǎo)064H,0FFH0B800H二進(jìn)制由0和1兩個(gè)數(shù)字組成,以字母B(b)結(jié)尾01100100B字符串常量是用單引號(hào)或雙引號(hào)括起來(lái)的單個(gè)字符或多個(gè)字符其數(shù)值是每個(gè)字符對(duì)應(yīng)的ASCII碼值例如:

‘d’(等于64H)

‘AB’(等于4142H)

‘Hello,Assembly!’2.字符串符號(hào)常量使用標(biāo)識(shí)符表達(dá)一個(gè)數(shù)值MASM提供等價(jià)機(jī)制,用來(lái)為常量定義符號(hào)名符號(hào)定義偽指令有“等價(jià)EQU”和“等號(hào)=”: 符號(hào)名EQU

數(shù)值表達(dá)式 符號(hào)名EQU<字符串> ;MASM5.x不支持 符號(hào)名=數(shù)值表達(dá)式EQU用于數(shù)值等價(jià)時(shí)不能重復(fù)定義符號(hào)名,但“=”允許有重復(fù)賦值。例如:

X =7 ;等效于:Xqeu7 X =X+5 ;“XEQUX+5”是錯(cuò)誤的3.符號(hào)變量數(shù)值表達(dá)式一般是指由運(yùn)算符連接的各種常量所構(gòu)成的表達(dá)式匯編程序在匯編過(guò)程中計(jì)算表達(dá)式,最終得到一個(gè)確定的數(shù)值,所以也是常量表達(dá)式的數(shù)值在程序運(yùn)行前的匯編階段計(jì)算,所以組成表達(dá)式的各部分必須在匯編時(shí)就能確定匯編語(yǔ)言支持多種運(yùn)算符(表3.4)我們經(jīng)常使用的是加減乘除(+-*/)例如:movax,3*4+5 ;等價(jià)于:movax,174.數(shù)值表達(dá)式變量

變量實(shí)質(zhì)上是指內(nèi)存單元的數(shù)據(jù),雖然內(nèi)存單元地址不變,但其中存放的數(shù)據(jù)可以改變變量需要事先定義才能使用變量定義(Define)偽指令為變量申請(qǐng)固定長(zhǎng)度為單位的存儲(chǔ)空間,并可以同時(shí)將相應(yīng)的存儲(chǔ)單元初始化定義后的變量可以利用變量名等方法引用其中的數(shù)據(jù),即變量的數(shù)值地址操作符地址操作符取得名字或標(biāo)號(hào)的段地址和偏移地址[]將括起的表達(dá)式作為存儲(chǔ)器地址指針$當(dāng)前偏移地址:段前綴,采用指定的段地址寄存器OFFSET名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的偏移地址SEG名字/標(biāo)號(hào)返回名字或標(biāo)號(hào)的段地址

類型操作符類型操作符對(duì)名字或標(biāo)號(hào)的類型屬性進(jìn)行設(shè)置

類型名PTR名字/標(biāo)號(hào)其中可以是BYTE、WORD、DWORD(依次表示字節(jié)、字、雙字)等,或者是NEAR、FAR(分別表示近、遠(yuǎn)),還可以是由結(jié)構(gòu)、記錄等定義的類型對(duì)變量:LENGTHOF操作符獲知某變量名指向多少個(gè)數(shù)據(jù)項(xiàng)SIZEOF操作符獲知它共占用多少字節(jié)空間ASM—86的關(guān)系運(yùn)算符有:相等(EQ)不等(NE)小于(LT)大于(GT)小于等于(LE)大于等于(GE)關(guān)系操作符算術(shù)運(yùn)算符有:1.加(+)2.減(-)3.乘(*)4.除(/)5.取余(MOD)6.右移(SHR)7.左移(SHL)算術(shù)運(yùn)算符ASM—86的屬性運(yùn)算符有:一、PTR

格式:類型PTR地址表達(dá)式功能:臨時(shí)指定由地址表達(dá)式所確定的存儲(chǔ)單元的類型屬性。二、SHORT

當(dāng)指令“JMP目標(biāo)地址”中的目標(biāo)地址與該指令下一條指令之間的距離在-128~+127直接單元范圍內(nèi)的時(shí),可以用SHORT運(yùn)算符來(lái)告訴匯編程序?qū)MP指令會(huì)變成兩個(gè)字節(jié)的代碼:第一字節(jié)為操作碼第二字節(jié)為相對(duì)位移量(補(bǔ)碼)。三、THIS

格式:THIS類型功能:指定變量或標(biāo)號(hào)的類型。四、段跨越前綴格式:段寄存器:地址表達(dá)式或段名:地址表達(dá)式功能:用來(lái)改變地址表達(dá)式的段屬性。五、關(guān)于方括號(hào)[]屬性運(yùn)算符

在8086匯編語(yǔ)言中,方括號(hào)[]用于表示一個(gè)地址,如[BX],[BP+2]、[DI+X1]等。使用規(guī)則如下:1、只有BX、BP、DI、SI寄存器可以出現(xiàn)在方括號(hào)內(nèi)。2、常數(shù)和數(shù)值表達(dá)式不能單獨(dú)出現(xiàn)在方括號(hào)內(nèi)。3、BX和BP不得同時(shí)出現(xiàn)在同一方括號(hào)內(nèi)。4、方括號(hào)中的寄存器之間僅能進(jìn)行加法。關(guān)于方括號(hào)

分離運(yùn)算符有HIGH和LOW它們可用在字類型的操作數(shù)之前,以截取該字的高位字節(jié)或低位字節(jié)。如指令“MOVAH,HIGH0ABCDH”等效于“MOVAH,0ABH”。分離運(yùn)算符

匯編語(yǔ)言中有兩類語(yǔ)句:指令性語(yǔ)句和指示性語(yǔ)句。一、指令性語(yǔ)句:標(biāo)號(hào);指令助記符操作數(shù);注釋二、指示性語(yǔ)句:名稱偽指令操作數(shù);注釋4.3語(yǔ)句ASM—86的偽指令有20條,是向匯編程序發(fā)出的命令,常用的偽指令有:段定義偽指令

SEGMENT/ENDS,ORG,ASSUME過(guò)程定義偽指令

PROC/ENDP定義訪問(wèn)外部標(biāo)識(shí)符偽指令EXTRN、PUBLIC源程序終結(jié)偽指令

END數(shù)據(jù)/存儲(chǔ)器定義偽指令

DB、DW、DD符號(hào)定義偽指令

EQU給存儲(chǔ)單元命名偽指令

LABEL確定變量/標(biāo)號(hào)類型偽指令BYTE、WORD、DWORD、NEAR、FAR。這些指令的功能我們?cè)谝院蟮膶W(xué)習(xí)過(guò)程中逐漸介紹。4.4偽指令本章主要內(nèi)容小結(jié)和基本要求:(1)匯編語(yǔ)言是面向機(jī)器的語(yǔ)言,是機(jī)器語(yǔ)言的符號(hào)表示。(2)匯編語(yǔ)言程序的語(yǔ)句可分為兩類:指令性語(yǔ)言和指示性語(yǔ)言。(3)本章重點(diǎn)掌握源程序中語(yǔ)句書(shū)寫(xiě)的格式及功能,同時(shí),還要知道數(shù)據(jù)定義語(yǔ)所定義的數(shù)據(jù)在內(nèi)存中的存放地址。4.4小結(jié)第五章匯編語(yǔ)言程序的匯編及上機(jī)過(guò)程5.1匯編語(yǔ)言源程序的結(jié)構(gòu)ASM—86匯編語(yǔ)言程序在結(jié)構(gòu)上有以下幾個(gè)特點(diǎn):(1)一個(gè)匯編語(yǔ)言源程序有一個(gè)或幾個(gè)段組成,每個(gè)段由SEGMENT語(yǔ)句開(kāi)始以ENDS結(jié)束。(2)構(gòu)成源程序的這些段可分為四類:代碼段、數(shù)據(jù)段、附加段和堆棧段。(3)若一個(gè)源程序段僅有一個(gè)段組成,這個(gè)段必為代碼段。(4)源程序的每一個(gè)段中的語(yǔ)句是指示性語(yǔ)句或是指令性語(yǔ)句。(5)一條語(yǔ)句占一行。(6)每個(gè)代碼段都有ASSUME語(yǔ)句,用于確定段與段寄存器間的關(guān)系(7)整個(gè)程序必須以END偽指令結(jié)束。宏是具有宏名的一段匯編語(yǔ)句序列宏需要先定義,然后在程序中進(jìn)行宏調(diào)用由于形式上類似其他指令,所以常稱其為宏指令宏指令實(shí)際上是一段代碼序列的縮寫(xiě);在匯編時(shí),匯編程序用對(duì)應(yīng)的代碼序列替代宏指令因?yàn)槭窃趨R編過(guò)程中實(shí)現(xiàn)的宏展開(kāi),所以常稱為宏匯編5.2宏指令宏定義宏定義由一對(duì)宏匯編偽指令MACRO和ENDM來(lái)完成,格式如下:

宏名

MACRO[形參表]

…… ;宏定義體

ENDM其中宏名是符合語(yǔ)法的標(biāo)識(shí)符,同一源程序中該名字定義唯一。宏定義體中不僅可以是硬指令序列,還可以是偽指令語(yǔ)句序列可選的形參表給出了宏定義中用到的形式參數(shù),每個(gè)形式參數(shù)之間用逗號(hào)分隔宏定義之后就可以使用它,即宏調(diào)用:

宏名

[實(shí)參表]宏調(diào)用的格式同一般指令一樣:在使用宏指令的位置寫(xiě)下宏名,后跟實(shí)體參數(shù);如果有多個(gè)參數(shù),應(yīng)按形參順序填入實(shí)參,也用逗號(hào)分隔在匯編時(shí),宏指令被匯編程序用對(duì)應(yīng)的代碼序列替代,這就是宏展開(kāi)宏展開(kāi)的具體過(guò)程是:當(dāng)匯編程序掃描源程序遇到已有定義的宏調(diào)用時(shí),即用相應(yīng)的宏定義體完全替代源程序的宏指令,同時(shí)用位置匹配的實(shí)參對(duì)形參進(jìn)行取代宏調(diào)用dispchar macrochar ;;宏定義

movah,2 ;;宏定義體

movdl,char int21h

endm

… dispchar‘?’ ;宏調(diào)用(宏指令)

1

movah,2 ;宏展開(kāi)

1

movdl,’?’1 int21h宏調(diào)用實(shí)例dispmsg macromessage ;;宏定義

movah,9 ;;宏定義體

leadx,message int21h

endm

… dispmsgstring ;宏調(diào)用(宏指令)

1

movah,9 ;宏展開(kāi)

1

leadx,string1 int21h比較僅是源程序級(jí)的簡(jiǎn)化:宏調(diào)用在匯編時(shí)進(jìn)行程序語(yǔ)句的展開(kāi),不需要返回;不減小目標(biāo)程序,執(zhí)行速度沒(méi)有改變通過(guò)形參、實(shí)參結(jié)合實(shí)現(xiàn)參數(shù)傳遞,簡(jiǎn)捷直觀、靈活多變還是目標(biāo)程序級(jí)的簡(jiǎn)化:子程序調(diào)用在執(zhí)行時(shí)由CALL指令轉(zhuǎn)向、RET指令返回;形成的目標(biāo)代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲(chǔ)單元或堆棧等傳遞參數(shù)宏子程序宏與子程序的比較宏與子程序具有各自的特點(diǎn),程序員應(yīng)該根據(jù)具體問(wèn)題選擇使用那種方法通常,當(dāng)程序段較短或要求較快執(zhí)行時(shí),應(yīng)選用宏;當(dāng)程序段較長(zhǎng)或?yàn)闇p小目標(biāo)代碼時(shí),要選用子程序比較

結(jié)論宏子程序

本部分將在上機(jī)過(guò)程中介紹5.3ASM—86匯編

語(yǔ)言源程序的匯編與連接一、匯編語(yǔ)言有若干段組成:代碼段、數(shù)據(jù)段、堆棧段、和附加段。二、了解匯編語(yǔ)言的結(jié)構(gòu)。三、會(huì)定義和利用“宏”。四、了解匯編語(yǔ)言程序的匯編和連接。5.4小結(jié)第六章匯編語(yǔ)言程序設(shè)計(jì)方法編輯文本編輯器,如EDIT.COM源程序:文件名.asm匯編匯編程序,如ML.EXE目標(biāo)模塊:文件名.obj連接連接程序,如LINK.EXE可執(zhí)行文件:文件名.exe調(diào)試調(diào)試程序,如DEBUG.EXE應(yīng)用程序錯(cuò)誤錯(cuò)誤錯(cuò)誤錯(cuò)誤6.1匯編語(yǔ)言設(shè)計(jì)步驟沒(méi)有分支、循環(huán)等轉(zhuǎn)移指令的程序,會(huì)按指令書(shū)寫(xiě)的前后順利依次執(zhí)行,這就是順序程序順序結(jié)構(gòu)是最基本的程序結(jié)構(gòu)完全采用順序結(jié)構(gòu)編寫(xiě)的程序并不多見(jiàn)下例順序程序設(shè)計(jì)實(shí)例采用查表法,實(shí)現(xiàn)一位16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼顯示6.2順序結(jié)構(gòu)程序設(shè)計(jì);數(shù)據(jù)段ASCII db30h,31h,32h,33h,34h,35h,36h,37h,38h,39h

;對(duì)應(yīng)0~9的ASCII碼

db41h,42h,43h,44h,45h,46h

;對(duì)應(yīng)A~F的ASCII碼hex db04h,0bh

;假設(shè)兩個(gè)數(shù)據(jù)例題

;代碼段movbx,offsetASCII;BX指向ASCII碼表moval,hex ;AL取得一位16進(jìn)制數(shù);恰好就是ASCII碼表中的位移andal,0fh ;只有低4位是有效的,高4位清0xlat;換碼:AL←DS:[BX+AL]XLATmovdl,al

;入口參數(shù):DL←ALmovah,2

;02號(hào)DOS功能調(diào)用int21h

;顯示一個(gè)ASCII碼字符moval,hex+1

;轉(zhuǎn)換并顯示下一個(gè)數(shù)據(jù)andal,0fhxlatmovdl,almovah,2int21hXLAT分支程序根據(jù)條件是真或假?zèng)Q定執(zhí)行與否判斷的條件是各種指令,如CMP、TEST等執(zhí)行后形成的狀態(tài)標(biāo)志轉(zhuǎn)移指令Jcc和JMP可以實(shí)現(xiàn)分支控制分支結(jié)構(gòu)有單分支結(jié)構(gòu)雙分支結(jié)構(gòu)多分支結(jié)構(gòu)6.3分支結(jié)構(gòu)程序設(shè)計(jì)條件成立跳轉(zhuǎn),否則順序執(zhí)行分支語(yǔ)句體注意選擇正確的條件轉(zhuǎn)移指令和轉(zhuǎn)移目標(biāo)地址實(shí)例:求絕對(duì)值單分支結(jié)構(gòu)

cmpax,0

jgenonneg

;條件滿足(AX≥0),轉(zhuǎn)移

negax

;條件不滿足,求補(bǔ)nonneg:

movresult,ax

;條件滿足

;不恰當(dāng)?shù)姆种?/p>

cmpax,0

jlyesneg

;條件滿足(AX<0),轉(zhuǎn)移

jmpnonnegyesneg:

negax

;條件不滿足,求補(bǔ)nonneg:

movresult,ax

;條件滿足例題:求絕對(duì)值條件成立跳轉(zhuǎn)執(zhí)行第2個(gè)分支語(yǔ)句體,否則順序執(zhí)行第1個(gè)分支語(yǔ)句體注意第1個(gè)分支體后一定要有一個(gè)JMP指令跳到第2個(gè)分支體后實(shí)例:顯示BX的最高位雙分支結(jié)構(gòu) shlbx,1 ;BX最高位移入CF標(biāo)志

jcone

;CF=1,即最高位為1,轉(zhuǎn)移

movdl,30h

;CF=0,即最高位為0:DL←30H=‘0’

jmptwo

;一定要跳過(guò)另一個(gè)分支體one: movdl,31h ;DL←31H=‘1’two: movah,2 int21h ;顯示可以用JNC替換JC例題:顯示BX的最高位 shlbx,1 ;BX最高位移入CF標(biāo)志

jncone

;CF=0,即最高位為0,轉(zhuǎn)移

movdl,31h

;CF=1,即最高位為1:DL←31H=‘1’

jmptwo

;一定要跳過(guò)另一個(gè)分支體one: movdl,30h ;DL←30H=‘0’two: movah,2 int21h ;顯示轉(zhuǎn)換為單分支結(jié)構(gòu) movdl,’0’ ;DL←30H=‘0’ shlbx,1 ;BX最高位移入CF標(biāo)志

jnctwo

;CF=0,即最高位為0,轉(zhuǎn)移

movdl,’1’

;CF=1,即最高位為1:DL←31H=‘1’two: movah,2 int21h ;顯示

編寫(xiě)分支程序,需留心分支的開(kāi)始和結(jié)束 movdl,0 shlbx,1 ;BX最高位移入CF標(biāo)志

adcdl,30h

;CF=0,DL←0+30h+0=30H=‘0’

;CF=1,DL←0+30h+1=31H=‘1’two: movah,2 int21h ;顯示多分支結(jié)構(gòu)是多個(gè)條件對(duì)應(yīng)各自的分支語(yǔ)句體,哪個(gè)條件成立就轉(zhuǎn)入相應(yīng)分支體執(zhí)行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YNorah,ah ;=cmpah,0jzfunction0decah ;=cmpah,1jzfunction0decah ;=cmpah,2jzfunction0多分支結(jié)構(gòu)循環(huán)程序結(jié)構(gòu)是滿足一定條件的情況下,重復(fù)執(zhí)行某段程序循環(huán)結(jié)構(gòu)的程序通常有3個(gè)部分:循環(huán)初始部分——為開(kāi)始循環(huán)準(zhǔn)備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的數(shù)值等循環(huán)體部分——指重復(fù)執(zhí)行的程序部分,其中包括對(duì)循環(huán)條件等的修改程序段循環(huán)控制部分——判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán)關(guān)鍵是什么?6.4循環(huán)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序的設(shè)計(jì)關(guān)鍵是循環(huán)控制部分循環(huán)控制可以在進(jìn)入循環(huán)之前進(jìn)行,也可以在循環(huán)體后進(jìn)行,于是形成兩種結(jié)構(gòu):“先判斷、后循環(huán)”結(jié)構(gòu)“先循環(huán)、后判斷”結(jié)構(gòu)循環(huán)結(jié)束的控制可以用循環(huán)次數(shù),還可以用特定條件等,于是又有:計(jì)數(shù)控制循環(huán)條件控制循環(huán)圖示循環(huán)控制

結(jié)束

初始化

循環(huán)的初始狀態(tài)

循環(huán)體

循環(huán)的工作部分及修改部分

計(jì)數(shù)控制循環(huán)條件控制循環(huán)修改部分控制條件YN先循環(huán)后判斷的循環(huán)結(jié)構(gòu)計(jì)數(shù)控制循環(huán)利用循環(huán)次數(shù)作為控制條件易于采用循環(huán)指令LOOP和JCXZ實(shí)現(xiàn)初始化:將循環(huán)次數(shù)或最大循環(huán)次數(shù)置入CX循環(huán)體循環(huán)控制:用LOOP指令對(duì)CX減1、并判斷是否為0計(jì)數(shù)控制循環(huán) ;數(shù)據(jù)段array dw10;假設(shè)一個(gè)數(shù)組,其中頭個(gè)數(shù)據(jù)10表示元素個(gè)數(shù)

dw-3,0,20,900,587,-632,777,234,-34,-56;這是一個(gè)有符號(hào)字量元素組成的數(shù)組maxay dw? ;存放最大值minay dw? ;存放最小值初始化:循環(huán)次數(shù)=元素個(gè)數(shù)-1循環(huán)體:逐個(gè)比較求最大、小值循環(huán)控制:比較完所有數(shù)據(jù)例題:求數(shù)組元素的最大最小值條件控制循環(huán)需要利用特定條件判斷循環(huán)是否結(jié)束條件控制循環(huán)用條件轉(zhuǎn)移指令判斷循環(huán)條件轉(zhuǎn)移指令可以指定目的標(biāo)號(hào)來(lái)改變程序的運(yùn)行順序,如果目的標(biāo)號(hào)指向一個(gè)重復(fù)執(zhí)行的語(yǔ)句體的開(kāi)始或結(jié)束,便構(gòu)成了循環(huán)控制結(jié)構(gòu)條件控制循環(huán)

;數(shù)據(jù)段string db'Letushaveatry!',0

;代碼段

movbx,offsetstringagain: movdl,[bx] cmpdl,0

jzdone

;為0結(jié)束

movah,2 ;不為0,顯示

int21h incbx ;指向下一個(gè)字符

jmpagaindone: ……條件控制循環(huán)先判斷后循環(huán)例題:顯示以0結(jié)尾的字符串把功能相對(duì)獨(dú)立的程序段單獨(dú)編寫(xiě)和調(diào)試,作為一個(gè)相對(duì)獨(dú)立的模塊供程序使用,就形成子程序子程序可以實(shí)現(xiàn)源程序的模塊化,可簡(jiǎn)化源程序結(jié)構(gòu),可以提高編程效率主程序(調(diào)用程序)需要利用CALL指令調(diào)用子程序(被調(diào)用程序)子程序需要利用RET指令返回主程序6.5子程序設(shè)計(jì)匯編語(yǔ)言中,子程序要用一對(duì)過(guò)程偽指令PROC和ENDP聲明,格式如下:

過(guò)程名

PROC[NEAR|FAR] …… ;過(guò)程體

過(guò)程名

ENDP可選的參數(shù)指定過(guò)程的調(diào)用屬性。沒(méi)有指定過(guò)程屬性,則采用默認(rèn)屬性NEAR屬性(段內(nèi)近調(diào)用)的過(guò)程只能被相同代碼段的其他程序調(diào)用FAR屬性(段間遠(yuǎn)調(diào)用)的過(guò)程可以被相同或不同代碼段的程序調(diào)用過(guò)程定義和子程序編寫(xiě)⑴子程序要利用過(guò)程定義偽指令聲明⑵子程序最后利用RET指令返回主程序,主程序執(zhí)行CALL指令調(diào)用子程序⑶子程序中對(duì)堆棧的壓入和彈出操作要成對(duì)使用,保持堆棧的平衡⑷子程序開(kāi)始應(yīng)該保護(hù)使用到的寄存器內(nèi)容,子程序返回前相應(yīng)進(jìn)行恢復(fù)⑸子程序應(yīng)安排在代碼段的主程序之外,最好放在主程序執(zhí)行終止后的位置(返回DOS后、匯編結(jié)束END偽指令前),也可以放在主程序開(kāi)始執(zhí)行之前的位置子程序編寫(xiě)注意事項(xiàng)⑹子程序允許嵌套和遞歸⑺子程序可以與主程序共用一個(gè)數(shù)據(jù)段,也可以使用不同的數(shù)據(jù)段(注意修改DS),還可以在子程序最后設(shè)置數(shù)據(jù)區(qū)(利用CS尋址)⑻子程序的編寫(xiě)可以很靈活,例如具有多個(gè)出口(多個(gè)RET指令)和入口,但一定要保證堆棧操作的正確性⑼處理好

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論