第4章程序結(jié)構(gòu)幻燈片課件_第1頁(yè)
第4章程序結(jié)構(gòu)幻燈片課件_第2頁(yè)
第4章程序結(jié)構(gòu)幻燈片課件_第3頁(yè)
第4章程序結(jié)構(gòu)幻燈片課件_第4頁(yè)
第4章程序結(jié)構(gòu)幻燈片課件_第5頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章程序結(jié)構(gòu)4.1順序程序結(jié)構(gòu)4.2分支程序結(jié)構(gòu)4.3循環(huán)程序結(jié)構(gòu)第4章程序結(jié)構(gòu)以順序、分支和循環(huán)程序結(jié)構(gòu)為主線結(jié)合數(shù)值運(yùn)算、數(shù)組處理等示例程序掌握控制轉(zhuǎn)移指令以及編寫基本程序的方法4.1順序程序結(jié)構(gòu)按照指令書(shū)寫的前后順序執(zhí)行每條指令最基本的程序片段構(gòu)成復(fù)雜程序的基礎(chǔ)3個(gè)示例程序知道“1+2+3+……+N”等于多少嗎?知道處理器內(nèi)置的識(shí)別字符串是什么嗎?知道“01100100”代表什么嗎?〔例4-1〕自然數(shù)求和程序

;數(shù)據(jù)段num dword3456 ;假設(shè)一個(gè)N值(小于232-1)sum qword? ;代碼段

moveax,num ;EAX=N

addeax,1 ;EAX=N+1

imulnum ;EDX.EAX=(1+N)×N

shredx,1 ;64位邏輯右移一位(除以2)

rcreax,1 ;EDX.EAX=EDX.EAX÷2

movdwordptrsum,eax ;小端方式保存

movdwordptrsum+4,edx1+2+……+N=(1+N)×N÷2〔例4-3〕不同格式顯示程序moval,varcalldispbbcalldispcrlfmoval,varcalldisphbcalldispcrlfmoval,varcalldispuibcalldispcrlfmoval,varcalldispcvar

byte01100100b二進(jìn)制形式十六進(jìn)制形式十進(jìn)制形式字符形式運(yùn)行結(jié)果4.2分支程序結(jié)構(gòu)改變程序執(zhí)行順序、形成分支、循環(huán)、調(diào)用等程序結(jié)構(gòu)是很常見(jiàn)的程序設(shè)計(jì)問(wèn)題高級(jí)語(yǔ)言采用IF等語(yǔ)句表達(dá)條件,并根據(jù)條件是否成立轉(zhuǎn)向不同的程序分支匯編語(yǔ)言需要首先利用比較CMP、測(cè)試TEST、加減運(yùn)算、邏輯運(yùn)算等影響狀態(tài)標(biāo)志的指令形成條件然后利用條件轉(zhuǎn)移指令判斷由標(biāo)志表達(dá)的條件,并根據(jù)標(biāo)志狀態(tài)控制程序轉(zhuǎn)移到不同的程序段4.2.1無(wú)條件轉(zhuǎn)移指令程序代碼在代碼段CS:指明代碼段在主存中的段基地址EIP:給出將要執(zhí)行指令的偏移地址程序順序執(zhí)行,處理器自動(dòng)增量EIP程序控制轉(zhuǎn)移,EIP隨之改變程序轉(zhuǎn)移到另外的代碼段,EIP和CS都改變控制轉(zhuǎn)移類指令:改變EIP(有些也改變CS),即改變程序執(zhí)行順序(實(shí)現(xiàn)程序控制轉(zhuǎn)移)的指令本章學(xué)習(xí)控制轉(zhuǎn)移類指令1.轉(zhuǎn)移范圍段內(nèi)轉(zhuǎn)移在當(dāng)前代碼段范圍內(nèi)的程序轉(zhuǎn)移不需更改CS,只要改變EIP(偏移地址)近轉(zhuǎn)移(Near): 32位近轉(zhuǎn)移NEAR32、16位近轉(zhuǎn)移NEAR16短轉(zhuǎn)移(Short):轉(zhuǎn)移范圍在127~-128字節(jié)段間轉(zhuǎn)移從當(dāng)前代碼段跳轉(zhuǎn)到另一個(gè)代碼段需要更改CS(段地址)和EIP(偏移地址)遠(yuǎn)轉(zhuǎn)移(Far): 48位遠(yuǎn)轉(zhuǎn)移FAR32、32位遠(yuǎn)轉(zhuǎn)移FAR162.指令尋址方式相對(duì)尋址方式提供目標(biāo)地址相對(duì)于當(dāng)前指令指針EIP的位移量目標(biāo)地址(轉(zhuǎn)移后的EIP)=當(dāng)前EIP+位移量相對(duì)尋址都是段內(nèi)轉(zhuǎn)移,最常用、最靈活直接尋址方式直接提供目標(biāo)地址目標(biāo)地址(轉(zhuǎn)移后的CS和EIP)=指令操作數(shù)間接尋址方式指示寄存器或存儲(chǔ)單元目標(biāo)地址來(lái)自寄存器或存儲(chǔ)單元、間接獲得寄存器間接尋址:用寄存器保存目標(biāo)地址存儲(chǔ)器間接尋址:用存儲(chǔ)單元保存目標(biāo)地址目標(biāo)地址=目的地址=轉(zhuǎn)移地址3.JMP指令無(wú)條件轉(zhuǎn)移:程序無(wú)條件改變執(zhí)行順序JMP指令相當(dāng)于高級(jí)語(yǔ)言的goto語(yǔ)句

JMPlabel ;程序轉(zhuǎn)向label標(biāo)號(hào)指定的地址

;段內(nèi)相對(duì)尋址,段間直接尋址

JMPreg32/reg16 ;程序轉(zhuǎn)向寄存器指定的地址

;寄存器間接尋址

JMPmem48/mem32/mem16 ;程序轉(zhuǎn)向存儲(chǔ)單元指定的地址

;存儲(chǔ)器間接尋址JMP指令的4種類型1.段內(nèi)轉(zhuǎn)移、相對(duì)尋址標(biāo)號(hào)指明目標(biāo)地址,指令代碼包含位移量2.段內(nèi)轉(zhuǎn)移、間接尋址通用寄存器或主存單元包含目標(biāo)指令偏移地址3.段間轉(zhuǎn)移、直接尋址標(biāo)號(hào)包含目標(biāo)指令的段地址和偏移地址4.段間轉(zhuǎn)移、間接尋址32位段用3字存儲(chǔ)單元包含目標(biāo)地址16位段用雙字存儲(chǔ)單元包含目標(biāo)地址MASM會(huì)根據(jù)存儲(chǔ)模式等信息自動(dòng)識(shí)別〔例4-4〕無(wú)條件轉(zhuǎn)移程序-1

;數(shù)據(jù)段00000000 00000000 nvar dword?

;代碼段00000000 EB01 jmplabl1 ;相對(duì)尋址00000002 90

nop00000003 E900000001labl1: jmpnearptrlabl2 ;相對(duì)近轉(zhuǎn)移00000008 90

nop00000009 B800000011Rlabl2: moveax,offsetlabl30000000E FFE0

jmpeax ;寄存器間接尋址〔例4-4〕無(wú)條件轉(zhuǎn)移程序-200000010 90

nop00000011 B800000022Rlabl3: moveax,offsetlabl400000016 A300000000R

movnvar,eax0000001B FF2500000000R

jmpnvar ;存儲(chǔ)器間接尋址00000021 90

noplabl4:

movebx,offsetnvarjmpnearptr[ebx];數(shù)據(jù)的寄存器間接尋址數(shù)據(jù)的存儲(chǔ)器直接尋址4.2.2條件轉(zhuǎn)移指令根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移

Jcclabel ;條件滿足,發(fā)生轉(zhuǎn)移;否則,順序執(zhí)行下條指令LABEL表示目標(biāo)地址,采用段內(nèi)相對(duì)尋址32位IA-32處理器:達(dá)到32位的全偏移量16位80x86處理器:-128~+127間的短轉(zhuǎn)移條件轉(zhuǎn)移指令不影響標(biāo)志,但要利用標(biāo)志cc表示利用標(biāo)志判斷的條件,16種、兩類單個(gè)標(biāo)志狀態(tài)作為條件兩數(shù)大小關(guān)系作為條件15轉(zhuǎn)移條件cc:?jiǎn)蝹€(gè)標(biāo)志狀態(tài)JZ/JE

ZF=1 JumpifZero/EqualJNZ/JNE

ZF=0 JumpifNotZero/NotEqualJS

SF=1 JumpifSignJNS

SF=0 JumpifNotSignJP/JPE

PF=1 JumpifParity/ParityEvenJNP/JPO

PF=0 JumpifNotParity/ParityOddJO

OF=1 JumpifOverflowJNO

OF=0 JumpifNotOverflowJC

CF=1 JumpifCarryJNC

CF=0 JumpifNotCarry多個(gè)助記符方便記憶16轉(zhuǎn)移條件cc:兩數(shù)大小關(guān)系JB/JNAE

CF=1 JumpifBelow/NotAboveorEqualJNB/JAE

CF=0 JumpifNotBelow/AboveorEqualJBE/JNA

CF=1或ZF=1 JumpifBelow/NotAboveJNBE/JA

CF=0且ZF=0 JumpifNotBeloworEqual/AboveJL/JNGE

SF≠OF JumpifLess/NotGreaterorEqualJNL/JGE

SF=OF JumpifNotLess/GreaterorEqualJLE/JNG

ZF≠OF或ZF=1 JumpifLessorEqual/NotGreaterJNLE/JG

SF=OF且ZF=0 JumpifNotLessorEqual/Greater171.單個(gè)標(biāo)志狀態(tài)作為條件的條件轉(zhuǎn)移指令JZ(JE)和JNZ(JNE):利用零位標(biāo)志ZF判斷結(jié)果是零(相等)還是非零(不等)JS和JNS:利用符號(hào)標(biāo)志SF判斷結(jié)果是負(fù)還是正JO和JNO:利用溢出標(biāo)志OF判斷結(jié)果是溢出還是沒(méi)有溢出JP(JPE)和JNP(JPO):利用奇偶標(biāo)志PF判斷結(jié)果低字節(jié)“1”的個(gè)數(shù)是偶數(shù)還是奇數(shù)JC和JNC:利用進(jìn)位標(biāo)志CF判斷結(jié)果是有進(jìn)位(為1)還是無(wú)進(jìn)位(為0)18〔例4-5〕個(gè)數(shù)折半程序-1

moveax,885 ;假設(shè)一個(gè)數(shù)據(jù)

shreax,1 ;數(shù)據(jù)右移進(jìn)行折半

jncgoeven ;余數(shù)為0,即CF=0條件成立,轉(zhuǎn)移

addeax,1 ;否則余數(shù)為1,即CF=1,進(jìn)行加1操作goeven: calldispuid ;顯示結(jié)果

443運(yùn)行結(jié)果19〔例4-5〕個(gè)數(shù)折半程序-2

moveax,886 ;假設(shè)一個(gè)數(shù)據(jù)

shreax,1 ;數(shù)據(jù)右移進(jìn)行折半

jcgoodd ;余數(shù)為1,即CF=1條件成立,轉(zhuǎn)移

jmpgoeven ;余數(shù)為0,即CF=0無(wú)需處理,轉(zhuǎn)移到顯示!goodd: addeax,1 ;進(jìn)行加1操作goeven: calldispuid ;顯示結(jié)果jncgoeven

何不合二為一?20〔例4-5〕個(gè)數(shù)折半程序-3

moveax,887 ;假設(shè)一個(gè)數(shù)據(jù)

shreax,1 ;數(shù)據(jù)右移進(jìn)行折半

adceax,0 ;余數(shù)=CF=1,進(jìn)行加1操作

;余數(shù)=CF=0,沒(méi)有加1

calldispuid

;顯示結(jié)果

moveax,888 ;假設(shè)一個(gè)數(shù)據(jù)

addeax,1 ;個(gè)數(shù)加1

rcreax,1 ;數(shù)據(jù)右移進(jìn)行折半

calldispuid ;顯示結(jié)果改進(jìn)算法消除分支21〔例4-6〕位測(cè)試程序-1

;數(shù)據(jù)段no_msg byte'NotReady!',0yes_msg byte'ReadytoGo!',0 ;代碼段

moveax,56h ;假設(shè)一個(gè)數(shù)據(jù)

testeax,02h ;測(cè)試D1位(D1=1,其他位為0)

jznom ;D1=0條件成立,轉(zhuǎn)移

moveax,offsetyes_msg ;D1=1,顯示準(zhǔn)備好

jmpdone

;跳轉(zhuǎn)過(guò)另一個(gè)分支體!nom: moveax,offsetno_msg ;顯示沒(méi)準(zhǔn)備好done: calldispmsg22〔例4-6〕位測(cè)試程序-2

;數(shù)據(jù)段no_msg byte'NotReady!',0yes_msg byte'ReadytoGo!',0 ;代碼段

moveax,56h ;假設(shè)一個(gè)數(shù)據(jù)

testeax,02h ;測(cè)試D1位(D1=1,其他位為0)

jnzyesm ;D1=1條件成立,轉(zhuǎn)移

moveax,offsetno_msg ;D1=0,顯示沒(méi)準(zhǔn)備好

jmpdone ;跳轉(zhuǎn)過(guò)另一個(gè)分支體!yesm: moveax,offsetyes_msg ;顯示準(zhǔn)備好done: calldispmsg23〔例4-7〕奇校驗(yàn)程序

callreadc ;鍵盤輸入,AL=返回值

calldispcrlf ;回車換行(用于分隔)

calldispbb ;以二進(jìn)制形式顯示數(shù)據(jù)

calldispcrlf

;回車換行(用于分隔)

andal,7fh ;最高位置“0”、其他位不變

;同時(shí)標(biāo)志PF反映“1”的個(gè)數(shù)

jnpnext ;個(gè)數(shù)為奇數(shù),不需處理,轉(zhuǎn)移

oral,80h ;個(gè)數(shù)為偶數(shù),最高位置“1”、其他位不變next: calldispbb ;顯示含校驗(yàn)位的數(shù)據(jù)242.兩數(shù)大小關(guān)系作為條件的條件轉(zhuǎn)移指令無(wú)符號(hào)數(shù)用高(Above)、低(Below)低于(不高于等于):JB(JNAE)不低于(高于等于):JNB(JAE)低于等于(不高于):JBE(JNA)不低于等于(高于):JNBE(JA)有符號(hào)數(shù)用大(Greater)、?。↙ess)小于(不大于等于):JL(JNGE)不小于(大于等于):JNL(JGE)小于等于(不大于):JLE(JNG)不小于等于(大于):JNLE(JG)25〔例4-8〕數(shù)據(jù)比較程序-1

;數(shù)據(jù)段in_msg1 byte'Enteranumber:',0in_msg2 byte'Enteranothernumber:',0out_msg1 byte'Twonumbersareequal:',0out_msg2 byte'Thelessnumberis:',0out_msg3 byte13,10,'Thegreaternumberis:',0

;代碼段

moveax,offsetin_msg1 ;提示輸入

calldispmsg

callreadsid ;輸入第一個(gè)數(shù)據(jù)

movebx,eax ;保存到EBX

moveax,offsetin_msg2 ;提示輸入

calldispmsg callreadsid ;輸入第二個(gè)數(shù)據(jù)

movecx,eax ;保存到ECX26〔例4-8〕數(shù)據(jù)比較程序-2

cmpebx,ecx ;二個(gè)數(shù)據(jù)進(jìn)行比較

jnenequal ;兩數(shù)不相等,轉(zhuǎn)移

moveax,offsetout_msg1

calldispmsg ;顯示兩數(shù)相等

moveax,ebx calldispsid ;顯示相等的數(shù)據(jù)

jmpdone ;轉(zhuǎn)移到結(jié)束nequal: jlfirst ;EBX較小,不需要交換,轉(zhuǎn)移

xchgebx,ecx ;EBX保存較小數(shù),ECX保存較大數(shù)27〔例4-8〕數(shù)據(jù)比較程序-3first: moveax,offsetout_msg2 ;顯示較小數(shù)

calldispmsg moveax,ebx ;較小數(shù)在EBX中

calldispsid moveax,offsetout_msg3 ;顯示較大數(shù)

calldispmsg

moveax,ecx ;較大數(shù)在ECX中

calldispsiddone:284.2.3單分支結(jié)構(gòu)只有一個(gè)分支的程序類似高級(jí)語(yǔ)言的IF-THEN語(yǔ)句結(jié)構(gòu)注意采用正確的條件轉(zhuǎn)移指令當(dāng)條件滿足(成立),發(fā)生轉(zhuǎn)移,跳過(guò)分支體條件不滿足,順序向下執(zhí)行分支體條件轉(zhuǎn)移指令與高級(jí)語(yǔ)言的IF語(yǔ)句正好相反IF語(yǔ)句是條件成立,執(zhí)行分支體29〔例4-9〕求絕對(duì)值程序

;代碼段

callreadsid ;輸入一個(gè)有符號(hào)數(shù),從EAX返回值

cmpeax,0 ;比較EAX與0

jgenonneg ;條件滿足:EAX≥0,轉(zhuǎn)移

negeax ;條件不滿足:EAX<0,為負(fù)數(shù)

;需求補(bǔ)得正值nonneg: calldispuid ;分支結(jié)束,顯示結(jié)果示意圖30單分支結(jié)構(gòu)的流程圖返回31〔例4-10〕字母判斷程序

callreadc ;輸入一個(gè)字符,從AL返回值

cmpal,'A’ ;與大寫字母A比較

jbdone ;比大寫字母A小,不是大寫字母,轉(zhuǎn)移

cmpal,'Z’ ;與大寫字母Z比較

jadone ;比大寫字母Z大,不是大寫字母,轉(zhuǎn)移

oral,20h ;轉(zhuǎn)換為小寫

calldispcrlf ;回車換行

calldispc ;顯示小寫字母done:

324.2.4雙分支結(jié)構(gòu)雙分支程序結(jié)構(gòu)有兩個(gè)分支,條件為真執(zhí)行一個(gè)分支;條件為假,執(zhí)行另一個(gè)分支相當(dāng)于高級(jí)語(yǔ)言的IF-THEN-ELSE語(yǔ)句順序執(zhí)行的分支體1最后一定要有一條JMP指令跳過(guò)分支體2JMP指令必不可少,實(shí)現(xiàn)結(jié)束前一個(gè)分支回到共同的出口作用雙分支結(jié)構(gòu)有時(shí)可以改變?yōu)閱畏种ЫY(jié)構(gòu)事先執(zhí)行其中一個(gè)分支(選擇出現(xiàn)概率較高的分支)33〔例4-11〕顯示數(shù)據(jù)最高位程序-1

;數(shù)據(jù)段dvar dword0bd630422h ;假設(shè)一個(gè)數(shù)據(jù)

;代碼段

movebx,dvar shlebx,1 ;EBX最高位移入CF標(biāo)志

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

moval,'0';CF=0,即最高位為0:AL←'0'

jmptwo ;一定要跳過(guò)另一個(gè)分支one: moval,'1' ;AL←'1'two: calldispc ;顯示

雙分支結(jié)構(gòu)示意圖34雙分支結(jié)構(gòu)的流程圖返回35〔例4-11〕顯示數(shù)據(jù)最高位程序-2

;代碼段

movebx,dvar moval,'0' ;假設(shè)最高位為0:AL←'0'

shlebx,1 ;EBX最高位移入CF標(biāo)志

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

moval,'1' ;CF=1,即最高位為1,AL←'1'two: calldispc ;顯示單分支結(jié)構(gòu)36〔例4-12〕有符號(hào)數(shù)運(yùn)算溢出程序

;數(shù)據(jù)段dvar1 dword1234567890 ;假設(shè)兩個(gè)數(shù)據(jù)dvar2 dword-999999999dvar3 dword?okmsg byte'Correct!',0 ;正確信息errmsg byte'ERROR!Overflow!',0 ;錯(cuò)誤信息

;代碼段

moveax,dvar1 subeax,dvar2 ;求差

joerror ;有溢出,轉(zhuǎn)移

movdvar3,eax ;無(wú)溢出,保存差值

moveax,offsetokmsg ;顯示正確

jmpdisperror: moveax,offseterrmsg ;顯示錯(cuò)誤disp: calldispmsg

374.2.5多分支程序?qū)嶋H問(wèn)題存在多分支結(jié)構(gòu)分支處理中又有分支具有多個(gè)分支走向利用單分支和雙分支這兩個(gè)基本結(jié)構(gòu),可以解決程序中多個(gè)分支結(jié)構(gòu)的問(wèn)題熟悉了匯編語(yǔ)言編程思想,還可以采用其他技巧性的方法解決實(shí)際問(wèn)題使用表結(jié)構(gòu)實(shí)現(xiàn)多分支38〔例4-13〕地址表程序-1

;數(shù)據(jù)段msg1 byte'Chapter1:Fundamentals',0dh,0ah,0 …… ;10個(gè)信息msg byte'Inputnumber(1~10):',0dh,0ah,0table dword

disp1,disp2,disp3,disp4,disp5

dworddisp6,disp7,disp8,disp9,disp101)提示輸入數(shù)字,并輸入數(shù)字;2)判斷數(shù)字是否在規(guī)定的范圍內(nèi),不在范圍內(nèi)、重新輸入;3)顯示數(shù)字對(duì)應(yīng)的信息,退出。39〔例4-13〕地址表程序-2

;代碼段again: moveax,offsetmsg calldispmsg ;提示輸入

callreaduid ;接收輸入:EAX=數(shù)字

cmpeax,1 ;判斷范圍

jbagain

cmpeax,10

jaagain ;不在范圍內(nèi),重新輸入

deceax ;EAX=EAX-1

shleax,2 ;EAX=EAX×4

jmptable[eax] ;多分支跳轉(zhuǎn)40〔例4-13〕地址表程序-3disp1: moveax,offsetmsg1 jmpdispdisp2: moveax,offsetmsg2 jmpdisp

……disp9: moveax,offsetmsg9 jmpdispdisp10: moveax,offsetmsg10disp: calldispmsg ;顯示41〔例4-13〕地址表程序-4

;數(shù)據(jù)段

……table dwordmsg1,msg2,msg3,msg4,msg5 dwordmsg6,msg7,msg8,msg9,msg10

;代碼段

……

deceax ;EAX=EAX-1 shleax,2 ;EAX=EAX×4

moveax,table[eax] ;獲得信息字符串地址

calldispmsg ;顯示424.3循環(huán)程序結(jié)構(gòu)三個(gè)部分組成:循環(huán)初始——為開(kāi)始循環(huán)準(zhǔn)備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的初始值等;循環(huán)體——重復(fù)執(zhí)行的程序代碼,其中包括對(duì)循環(huán)條件的修改等;循環(huán)控制——判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán)“先判斷、后循環(huán)”的循環(huán)程序結(jié)構(gòu)對(duì)應(yīng)高級(jí)語(yǔ)言的WHILE語(yǔ)句“先循環(huán)、后判斷”的循環(huán)程序結(jié)構(gòu)對(duì)應(yīng)高級(jí)語(yǔ)言的DO語(yǔ)句示意圖43循環(huán)程序結(jié)構(gòu)的流程圖返回444.3.1循環(huán)指令

LOOPlabel;ECX←ECX-1;若ECX≠0,循環(huán)到LABEL;否則,順序執(zhí)行

JECXZlabel;ECX=0,轉(zhuǎn)移;否則順序執(zhí)行目標(biāo)地址采用相對(duì)短轉(zhuǎn)移實(shí)地址存儲(chǔ)模型使用CX作為計(jì)數(shù)器DECECXJNZlabelCMPECX,0JZlabel45〔例4-14〕數(shù)組求和程序

movecx,lengthofarray ;ECX=數(shù)組元素個(gè)數(shù)

xoreax,eax ;求和初值為0

movebx,eax ;數(shù)組指針為0again: addeax,array[ebx*(typearray)] ;求和

incebx ;指向下一個(gè)數(shù)組元素

loopagain

movsum,eax ;保存結(jié)果

calldispsid ;顯示結(jié)果循環(huán)體循環(huán)控制循環(huán)初始464.3.2計(jì)數(shù)控制循環(huán)通過(guò)次數(shù)控制循環(huán)利用LOOP指令屬于計(jì)數(shù)控制常見(jiàn)是“先循環(huán)、后判斷”循環(huán)結(jié)構(gòu)計(jì)數(shù)可以減量進(jìn)行,即減到0結(jié)束計(jì)數(shù)可以增量進(jìn)行,即達(dá)到規(guī)定值結(jié)束循環(huán)程序結(jié)構(gòu)的關(guān)鍵是如何控制循環(huán)47〔例4-15〕求最大值程序-1

;數(shù)據(jù)段array dword-3,0,20,900,-56count =lengthofarray ;數(shù)組的元素個(gè)數(shù)max dword? ;存放最大值 ;代碼段

movecx,count-1

;元素個(gè)數(shù)減1是循環(huán)次數(shù)

movesi,offsetarray

moveax,[esi]

;取出第一個(gè)元素給EAX,用于暫存最大值48〔例4-15〕求最大值程序-2again: addesi,4 cmpeax,[esi] ;與下一個(gè)數(shù)據(jù)比較

jgenext

;已經(jīng)是較大值,繼續(xù)下一個(gè)循環(huán)比較

moveax,[esi] ;EAX取得更大的數(shù)據(jù)next: loopagain

;計(jì)數(shù)循環(huán)

movmax,eax ;保存最大值49〔例4-16〕簡(jiǎn)單加密解密程序-1

;數(shù)據(jù)段key byte234bufnum =255buffer bytebufnum+1dup(0) ;定義鍵盤輸入需要的緩沖區(qū)msg1 byte'Entermessge:',0msg2 byte'Encryptedmessage:',0msg3 byte13,10,'Originalmessge:',0 ;代碼段

moveax,offsetmsg1 ;提示輸入字符串

calldispmsg

moveax,offsetbuffer ;設(shè)置入口參數(shù)EAX

callreadmsg ;調(diào)用輸入字符串子程序

pusheax ;字符個(gè)數(shù)保存進(jìn)入堆棧50〔例4-16〕簡(jiǎn)單加密解密程序-2

movecx,eax ;ECX=實(shí)際輸入的字符個(gè)數(shù),作為循環(huán)的次數(shù)

xorebx,ebx ;EBX指向輸入字符

moval,key ;AL=加密關(guān)鍵字encrypt: xorbuffer[ebx],al ;異或加密

incebx

dececx ;等同于:loopencrypt

jnzencrypt ;處理下一個(gè)字符

moveax,offsetmsg2 calldispmsg moveax,offsetbuffer ;顯示密文

calldispmsg51〔例4-16〕簡(jiǎn)單加密解密程序-3

popecx ;從堆棧彈出字符個(gè)數(shù),作為循環(huán)的次數(shù)

xorebx,ebx ;EBX指向輸入字符

moval,key ;AL=解密關(guān)鍵字decrypt: xorbuffer[ebx],al ;異或解密

incebx

dececx jnzdecrypt ;處理下一個(gè)字符

moveax,offsetmsg3 calldispmsg moveax,offsetbuffer ;顯示明文

calldispmsg示意圖52簡(jiǎn)單加密解密程序運(yùn)行實(shí)例返回534.3.3條件控制循環(huán)根據(jù)條件決定是否進(jìn)行循環(huán)需要使用有條件轉(zhuǎn)移指令實(shí)現(xiàn)多見(jiàn)“先判斷、后循環(huán)”結(jié)構(gòu)先行判斷的條件控制循環(huán)程序很像雙分支結(jié)構(gòu)主要分支需要重復(fù)執(zhí)行多次(JMP的目標(biāo)位置是循環(huán)開(kāi)始)另一個(gè)分支用于跳出這個(gè)循環(huán)先行循環(huán)的條件控制循環(huán)程序類似單分支結(jié)構(gòu),循環(huán)體就是分支體順序執(zhí)行就跳出循環(huán)54〔例4-17〕字符個(gè)數(shù)統(tǒng)計(jì)程序 ;數(shù)據(jù)段string byte‘DoyouhavefunwithAssembly?’,0 ;以0結(jié)尾的字符串 ;代碼段

xorebx,ebx ;EBX用于記錄字符個(gè)數(shù),也用于指向字符的指針again: moval,string[ebx]

cmpal,0 ;用指令“testal,al”更好

jzdone

incebx ;個(gè)數(shù)加1

jmpagain ;繼續(xù)循環(huán)done: moveax,ebx ;顯示個(gè)數(shù)

calldispuid55〔例4-18〕斐波那契數(shù)列程序 moveax,1 ;EAX=F(1)=1 calldispuid ;顯示第1個(gè)數(shù) calldispcrlf ;回車換行 calldispuid ;顯示第2個(gè)數(shù) calldispcrlf ;回車換行 movebx,eax ;EBX=F(2)=1again: addeax,ebx ;EAX=F(N)=F(N-2)+F(N-1)

溫馨提示

  • 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)論