版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第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ù)值運算、數(shù)組處理等示例程序掌握控制轉(zhuǎn)移指令以及編寫基本程序的方法4.1順序程序結(jié)構(gòu)按照指令書寫的前后順序執(zhí)行每條指令最基本的程序片段構(gòu)成復雜程序的基礎(chǔ)3個示例程序知道“1+2+3+……+N”等于多少嗎?知道處理器內(nèi)置的識別字符串是什么嗎?知道“01100100”代表什么嗎?〔例4-1〕自然數(shù)求和程序
;數(shù)據(jù)段num dword3456 ;假設(shè)一個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二進制形式十六進制形式十進制形式字符形式運行結(jié)果4.2分支程序結(jié)構(gòu)改變程序執(zhí)行順序、形成分支、循環(huán)、調(diào)用等程序結(jié)構(gòu)是很常見的程序設(shè)計問題高級語言采用IF等語句表達條件,并根據(jù)條件是否成立轉(zhuǎn)向不同的程序分支匯編語言需要首先利用比較CMP、測試TEST、加減運算、邏輯運算等影響狀態(tài)標志的指令形成條件然后利用條件轉(zhuǎn)移指令判斷由標志表達的條件,并根據(jù)標志狀態(tài)控制程序轉(zhuǎn)移到不同的程序段4.2.1無條件轉(zhuǎn)移指令程序代碼在代碼段CS:指明代碼段在主存中的段基地址EIP:給出將要執(zhí)行指令的偏移地址程序順序執(zhí)行,處理器自動增量EIP程序控制轉(zhuǎn)移,EIP隨之改變程序轉(zhuǎn)移到另外的代碼段,EIP和CS都改變控制轉(zhuǎn)移類指令:改變EIP(有些也改變CS),即改變程序執(zhí)行順序(實現(xiàn)程序控制轉(zhuǎn)移)的指令本章學習控制轉(zhuǎn)移類指令1.轉(zhuǎn)移范圍段內(nèi)轉(zhuǎn)移在當前代碼段范圍內(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)移從當前代碼段跳轉(zhuǎn)到另一個代碼段需要更改CS(段地址)和EIP(偏移地址)遠轉(zhuǎn)移(Far): 48位遠轉(zhuǎn)移FAR32、32位遠轉(zhuǎn)移FAR162.指令尋址方式相對尋址方式提供目標地址相對于當前指令指針EIP的位移量目標地址(轉(zhuǎn)移后的EIP)=當前EIP+位移量相對尋址都是段內(nèi)轉(zhuǎn)移,最常用、最靈活直接尋址方式直接提供目標地址目標地址(轉(zhuǎn)移后的CS和EIP)=指令操作數(shù)間接尋址方式指示寄存器或存儲單元目標地址來自寄存器或存儲單元、間接獲得寄存器間接尋址:用寄存器保存目標地址存儲器間接尋址:用存儲單元保存目標地址目標地址=目的地址=轉(zhuǎn)移地址3.JMP指令無條件轉(zhuǎn)移:程序無條件改變執(zhí)行順序JMP指令相當于高級語言的goto語句
JMPlabel ;程序轉(zhuǎn)向label標號指定的地址
;段內(nèi)相對尋址,段間直接尋址
JMPreg32/reg16 ;程序轉(zhuǎn)向寄存器指定的地址
;寄存器間接尋址
JMPmem48/mem32/mem16 ;程序轉(zhuǎn)向存儲單元指定的地址
;存儲器間接尋址JMP指令的4種類型1.段內(nèi)轉(zhuǎn)移、相對尋址標號指明目標地址,指令代碼包含位移量2.段內(nèi)轉(zhuǎn)移、間接尋址通用寄存器或主存單元包含目標指令偏移地址3.段間轉(zhuǎn)移、直接尋址標號包含目標指令的段地址和偏移地址4.段間轉(zhuǎn)移、間接尋址32位段用3字存儲單元包含目標地址16位段用雙字存儲單元包含目標地址MASM會根據(jù)存儲模式等信息自動識別〔例4-4〕無條件轉(zhuǎn)移程序-1
;數(shù)據(jù)段00000000 00000000 nvar dword?
;代碼段00000000 EB01 jmplabl1 ;相對尋址00000002 90
nop00000003 E900000001labl1: jmpnearptrlabl2 ;相對近轉(zhuǎn)移00000008 90
nop00000009 B800000011Rlabl2: moveax,offsetlabl30000000E FFE0
jmpeax ;寄存器間接尋址〔例4-4〕無條件轉(zhuǎn)移程序-200000010 90
nop00000011 B800000022Rlabl3: moveax,offsetlabl400000016 A300000000R
movnvar,eax0000001B FF2500000000R
jmpnvar ;存儲器間接尋址00000021 90
noplabl4:
movebx,offsetnvarjmpnearptr[ebx];數(shù)據(jù)的寄存器間接尋址數(shù)據(jù)的存儲器直接尋址4.2.2條件轉(zhuǎn)移指令根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移
Jcclabel ;條件滿足,發(fā)生轉(zhuǎn)移;否則,順序執(zhí)行下條指令LABEL表示目標地址,采用段內(nèi)相對尋址32位IA-32處理器:達到32位的全偏移量16位80x86處理器:-128~+127間的短轉(zhuǎn)移條件轉(zhuǎn)移指令不影響標志,但要利用標志cc表示利用標志判斷的條件,16種、兩類單個標志狀態(tài)作為條件兩數(shù)大小關(guān)系作為條件15轉(zhuǎn)移條件cc:單個標志狀態(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多個助記符方便記憶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.單個標志狀態(tài)作為條件的條件轉(zhuǎn)移指令JZ(JE)和JNZ(JNE):利用零位標志ZF判斷結(jié)果是零(相等)還是非零(不等)JS和JNS:利用符號標志SF判斷結(jié)果是負還是正JO和JNO:利用溢出標志OF判斷結(jié)果是溢出還是沒有溢出JP(JPE)和JNP(JPO):利用奇偶標志PF判斷結(jié)果低字節(jié)“1”的個數(shù)是偶數(shù)還是奇數(shù)JC和JNC:利用進位標志CF判斷結(jié)果是有進位(為1)還是無進位(為0)18〔例4-5〕個數(shù)折半程序-1
moveax,885 ;假設(shè)一個數(shù)據(jù)
shreax,1 ;數(shù)據(jù)右移進行折半
jncgoeven ;余數(shù)為0,即CF=0條件成立,轉(zhuǎn)移
addeax,1 ;否則余數(shù)為1,即CF=1,進行加1操作goeven: calldispuid ;顯示結(jié)果
443運行結(jié)果19〔例4-5〕個數(shù)折半程序-2
moveax,886 ;假設(shè)一個數(shù)據(jù)
shreax,1 ;數(shù)據(jù)右移進行折半
jcgoodd ;余數(shù)為1,即CF=1條件成立,轉(zhuǎn)移
jmpgoeven ;余數(shù)為0,即CF=0無需處理,轉(zhuǎn)移到顯示!goodd: addeax,1 ;進行加1操作goeven: calldispuid ;顯示結(jié)果jncgoeven
何不合二為一?20〔例4-5〕個數(shù)折半程序-3
moveax,887 ;假設(shè)一個數(shù)據(jù)
shreax,1 ;數(shù)據(jù)右移進行折半
adceax,0 ;余數(shù)=CF=1,進行加1操作
;余數(shù)=CF=0,沒有加1
calldispuid
;顯示結(jié)果
moveax,888 ;假設(shè)一個數(shù)據(jù)
addeax,1 ;個數(shù)加1
rcreax,1 ;數(shù)據(jù)右移進行折半
calldispuid ;顯示結(jié)果改進算法消除分支21〔例4-6〕位測試程序-1
;數(shù)據(jù)段no_msg byte'NotReady!',0yes_msg byte'ReadytoGo!',0 ;代碼段
moveax,56h ;假設(shè)一個數(shù)據(jù)
testeax,02h ;測試D1位(D1=1,其他位為0)
jznom ;D1=0條件成立,轉(zhuǎn)移
moveax,offsetyes_msg ;D1=1,顯示準備好
jmpdone
;跳轉(zhuǎn)過另一個分支體!nom: moveax,offsetno_msg ;顯示沒準備好done: calldispmsg22〔例4-6〕位測試程序-2
;數(shù)據(jù)段no_msg byte'NotReady!',0yes_msg byte'ReadytoGo!',0 ;代碼段
moveax,56h ;假設(shè)一個數(shù)據(jù)
testeax,02h ;測試D1位(D1=1,其他位為0)
jnzyesm ;D1=1條件成立,轉(zhuǎn)移
moveax,offsetno_msg ;D1=0,顯示沒準備好
jmpdone ;跳轉(zhuǎn)過另一個分支體!yesm: moveax,offsetyes_msg ;顯示準備好done: calldispmsg23〔例4-7〕奇校驗程序
callreadc ;鍵盤輸入,AL=返回值
calldispcrlf ;回車換行(用于分隔)
calldispbb ;以二進制形式顯示數(shù)據(jù)
calldispcrlf
;回車換行(用于分隔)
andal,7fh ;最高位置“0”、其他位不變
;同時標志PF反映“1”的個數(shù)
jnpnext ;個數(shù)為奇數(shù),不需處理,轉(zhuǎn)移
oral,80h ;個數(shù)為偶數(shù),最高位置“1”、其他位不變next: calldispbb ;顯示含校驗位的數(shù)據(jù)242.兩數(shù)大小關(guān)系作為條件的條件轉(zhuǎn)移指令無符號數(shù)用高(Above)、低(Below)低于(不高于等于):JB(JNAE)不低于(高于等于):JNB(JAE)低于等于(不高于):JBE(JNA)不低于等于(高于):JNBE(JA)有符號數(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 ;輸入第一個數(shù)據(jù)
movebx,eax ;保存到EBX
moveax,offsetin_msg2 ;提示輸入
calldispmsg callreadsid ;輸入第二個數(shù)據(jù)
movecx,eax ;保存到ECX26〔例4-8〕數(shù)據(jù)比較程序-2
cmpebx,ecx ;二個數(shù)據(jù)進行比較
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)只有一個分支的程序類似高級語言的IF-THEN語句結(jié)構(gòu)注意采用正確的條件轉(zhuǎn)移指令當條件滿足(成立),發(fā)生轉(zhuǎn)移,跳過分支體條件不滿足,順序向下執(zhí)行分支體條件轉(zhuǎn)移指令與高級語言的IF語句正好相反IF語句是條件成立,執(zhí)行分支體29〔例4-9〕求絕對值程序
;代碼段
callreadsid ;輸入一個有符號數(shù),從EAX返回值
cmpeax,0 ;比較EAX與0
jgenonneg ;條件滿足:EAX≥0,轉(zhuǎn)移
negeax ;條件不滿足:EAX<0,為負數(shù)
;需求補得正值nonneg: calldispuid ;分支結(jié)束,顯示結(jié)果示意圖30單分支結(jié)構(gòu)的流程圖返回31〔例4-10〕字母判斷程序
callreadc ;輸入一個字符,從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)有兩個分支,條件為真執(zhí)行一個分支;條件為假,執(zhí)行另一個分支相當于高級語言的IF-THEN-ELSE語句順序執(zhí)行的分支體1最后一定要有一條JMP指令跳過分支體2JMP指令必不可少,實現(xiàn)結(jié)束前一個分支回到共同的出口作用雙分支結(jié)構(gòu)有時可以改變?yōu)閱畏种ЫY(jié)構(gòu)事先執(zhí)行其中一個分支(選擇出現(xiàn)概率較高的分支)33〔例4-11〕顯示數(shù)據(jù)最高位程序-1
;數(shù)據(jù)段dvar dword0bd630422h ;假設(shè)一個數(shù)據(jù)
;代碼段
movebx,dvar shlebx,1 ;EBX最高位移入CF標志
jcone;CF=1,即最高位為1,轉(zhuǎn)移
moval,'0';CF=0,即最高位為0:AL←'0'
jmptwo ;一定要跳過另一個分支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標志
jnctwo ;CF=0,即最高位為0,轉(zhuǎn)移
moval,'1' ;CF=1,即最高位為1,AL←'1'two: calldispc ;顯示單分支結(jié)構(gòu)36〔例4-12〕有符號數(shù)運算溢出程序
;數(shù)據(jù)段dvar1 dword1234567890 ;假設(shè)兩個數(shù)據(jù)dvar2 dword-999999999dvar3 dword?okmsg byte'Correct!',0 ;正確信息errmsg byte'ERROR!Overflow!',0 ;錯誤信息
;代碼段
moveax,dvar1 subeax,dvar2 ;求差
joerror ;有溢出,轉(zhuǎn)移
movdvar3,eax ;無溢出,保存差值
moveax,offsetokmsg ;顯示正確
jmpdisperror: moveax,offseterrmsg ;顯示錯誤disp: calldispmsg
374.2.5多分支程序?qū)嶋H問題存在多分支結(jié)構(gòu)分支處理中又有分支具有多個分支走向利用單分支和雙分支這兩個基本結(jié)構(gòu),可以解決程序中多個分支結(jié)構(gòu)的問題熟悉了匯編語言編程思想,還可以采用其他技巧性的方法解決實際問題使用表結(jié)構(gòu)實現(xiàn)多分支38〔例4-13〕地址表程序-1
;數(shù)據(jù)段msg1 byte'Chapter1:Fundamentals',0dh,0ah,0 …… ;10個信息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ù)字對應(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)三個部分組成:循環(huán)初始——為開始循環(huán)準備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的初始值等;循環(huán)體——重復執(zhí)行的程序代碼,其中包括對循環(huán)條件的修改等;循環(huán)控制——判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán)“先判斷、后循環(huán)”的循環(huán)程序結(jié)構(gòu)對應(yīng)高級語言的WHILE語句“先循環(huán)、后判斷”的循環(huán)程序結(jié)構(gòu)對應(yīng)高級語言的DO語句示意圖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í)行目標地址采用相對短轉(zhuǎn)移實地址存儲模型使用CX作為計數(shù)器DECECXJNZlabelCMPECX,0JZlabel45〔例4-14〕數(shù)組求和程序
movecx,lengthofarray ;ECX=數(shù)組元素個數(shù)
xoreax,eax ;求和初值為0
movebx,eax ;數(shù)組指針為0again: addeax,array[ebx*(typearray)] ;求和
incebx ;指向下一個數(shù)組元素
loopagain
movsum,eax ;保存結(jié)果
calldispsid ;顯示結(jié)果循環(huán)體循環(huán)控制循環(huán)初始464.3.2計數(shù)控制循環(huán)通過次數(shù)控制循環(huán)利用LOOP指令屬于計數(shù)控制常見是“先循環(huán)、后判斷”循環(huán)結(jié)構(gòu)計數(shù)可以減量進行,即減到0結(jié)束計數(shù)可以增量進行,即達到規(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ù)組的元素個數(shù)max dword? ;存放最大值 ;代碼段
movecx,count-1
;元素個數(shù)減1是循環(huán)次數(shù)
movesi,offsetarray
moveax,[esi]
;取出第一個元素給EAX,用于暫存最大值48〔例4-15〕求最大值程序-2again: addesi,4 cmpeax,[esi] ;與下一個數(shù)據(jù)比較
jgenext
;已經(jīng)是較大值,繼續(xù)下一個循環(huán)比較
moveax,[esi] ;EAX取得更大的數(shù)據(jù)next: loopagain
;計數(shù)循環(huán)
movmax,eax ;保存最大值49〔例4-16〕簡單加密解密程序-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 ;字符個數(shù)保存進入堆棧50〔例4-16〕簡單加密解密程序-2
movecx,eax ;ECX=實際輸入的字符個數(shù),作為循環(huán)的次數(shù)
xorebx,ebx ;EBX指向輸入字符
moval,key ;AL=加密關(guān)鍵字encrypt: xorbuffer[ebx],al ;異或加密
incebx
dececx ;等同于:loopencrypt
jnzencrypt ;處理下一個字符
moveax,offsetmsg2 calldispmsg moveax,offsetbuffer ;顯示密文
calldispmsg51〔例4-16〕簡單加密解密程序-3
popecx ;從堆棧彈出字符個數(shù),作為循環(huán)的次數(shù)
xorebx,ebx ;EBX指向輸入字符
moval,key ;AL=解密關(guān)鍵字decrypt: xorbuffer[ebx],al ;異或解密
incebx
dececx jnzdecrypt ;處理下一個字符
moveax,offsetmsg3 calldispmsg moveax,offsetbuffer ;顯示明文
calldispmsg示意圖52簡單加密解密程序運行實例返回534.3.3條件控制循環(huán)根據(jù)條件決定是否進行循環(huán)需要使用有條件轉(zhuǎn)移指令實現(xiàn)多見“先判斷、后循環(huán)”結(jié)構(gòu)先行判斷的條件控制循環(huán)程序很像雙分支結(jié)構(gòu)主要分支需要重復執(zhí)行多次(JMP的目標位置是循環(huán)開始)另一個分支用于跳出這個循環(huán)先行循環(huán)的條件控制循環(huán)程序類似單分支結(jié)構(gòu),循環(huán)體就是分支體順序執(zhí)行就跳出循環(huán)54〔例4-17〕字符個數(shù)統(tǒng)計程序 ;數(shù)據(jù)段string byte‘DoyouhavefunwithAssembly?’,0 ;以0結(jié)尾的字符串 ;代碼段
xorebx,ebx ;EBX用于記錄字符個數(shù),也用于指向字符的指針again: moval,string[ebx]
cmpal,0 ;用指令“testal,al”更好
jzdone
incebx ;個數(shù)加1
jmpagain ;繼續(xù)循環(huán)done: moveax,ebx ;顯示個數(shù)
calldispuid55〔例4-18〕斐波那契數(shù)列程序 moveax,1 ;EAX=F(1)=1 calldispuid ;顯示第1個數(shù) calldispcrlf ;回車換行 calldispuid ;顯示第2個數(shù) calldispcrlf ;回車換行 movebx,eax ;EBX=F(2)=1again: addeax,ebx ;EAX=F(N)=F(N-2)+F(N-1)
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機器人課件-機器人控制
- 【物理課件】阿基米的原理課件
- 《情商訓練》課件
- 《企業(yè)安全知識演講》課件
- 單位管理制度展示合集【人事管理篇】十篇
- 單位管理制度展示大全【人力資源管理】十篇
- 豐田改善內(nèi)部課件.圖
- 單位管理制度品讀選集【員工管理篇】十篇
- 2024年汽車銷售工作計劃書(34篇)
- 食品安全監(jiān)管基礎(chǔ)與風險防控課件
- 江蘇省宿遷市沭陽縣2023-2024學年八年級上學期期末英語試題
- 安全隱患大排查大整治專項行動方案
- 藍軍戰(zhàn)略課件
- 科學計算語言Julia及MWORKS實踐 課件8 - 基本數(shù)據(jù)類型
- 湖北省黃岡市2023-2024學年高一上學期期末考試化學試題(含答案)
- 物流公司安全生產(chǎn)監(jiān)督檢查管理制度
- DB22T 277-2011 建筑電氣防火檢驗規(guī)程
- DB52T 1696-2022 口腔綜合治療臺用水衛(wèi)生管理規(guī)范
- 2025屆上海市復旦附中浦東分校物理高二上期末教學質(zhì)量檢測試題含解析
- 快樂讀書吧:童年(專項訓練)-2023-2024學年六年級語文上冊(統(tǒng)編版)(含答案)
- 2023-2024學年廣東省廣州市海珠區(qū)九年級(上)期末英語試卷
評論
0/150
提交評論