控制轉(zhuǎn)移和程序結(jié)構(gòu)課件_第1頁
控制轉(zhuǎn)移和程序結(jié)構(gòu)課件_第2頁
控制轉(zhuǎn)移和程序結(jié)構(gòu)課件_第3頁
控制轉(zhuǎn)移和程序結(jié)構(gòu)課件_第4頁
控制轉(zhuǎn)移和程序結(jié)構(gòu)課件_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、微型計算機原理及應(yīng)用微型計算機原理及應(yīng)用20062006年年l5.1 5.1 目標(biāo)地址尋址方式目標(biāo)地址尋址方式l5.2 5.2 分支程序結(jié)構(gòu)分支程序結(jié)構(gòu)l5.3 5.3 循環(huán)程序結(jié)構(gòu)循環(huán)程序結(jié)構(gòu)l5.4 5.4 子程序結(jié)構(gòu)子程序結(jié)構(gòu)5.1 目標(biāo)地址的尋址方式l程序代碼在代碼段;程序代碼在代碼段;CSCS:指明代碼段在主存中的開始位置、即段基地址;:指明代碼段在主存中的開始位置、即段基地址;EIPEIP:給出將要執(zhí)行指令的偏移地址;:給出將要執(zhí)行指令的偏移地址;l程序順序執(zhí)行,微處理器自動增量程序順序執(zhí)行,微處理器自動增量EIPEIP;程序控制轉(zhuǎn);程序控制轉(zhuǎn)移,移,EIPEIP隨之改變;隨之改變

2、;l程序轉(zhuǎn)移到另外的代碼段,程序轉(zhuǎn)移到另外的代碼段, EIPEIP和和CSCS都將改變;都將改變;l控制轉(zhuǎn)移類指令:改變控制轉(zhuǎn)移類指令:改變EIPEIP(有時(有時CSCS),即改變程序),即改變程序執(zhí)行順序(實現(xiàn)程序控制轉(zhuǎn)移)的指令;執(zhí)行順序(實現(xiàn)程序控制轉(zhuǎn)移)的指令;l目標(biāo)地址尋址方式目標(biāo)地址尋址方式:指明目的地、即目標(biāo)地址的方法;:指明目的地、即目標(biāo)地址的方法;5.1.1 轉(zhuǎn)移范圍l1. 1. 段內(nèi)轉(zhuǎn)移段內(nèi)轉(zhuǎn)移在當(dāng)前代碼段范圍內(nèi)的程序轉(zhuǎn)移;在當(dāng)前代碼段范圍內(nèi)的程序轉(zhuǎn)移;不需更改不需更改CSCS,只改只改EIPEIP(偏移地址);(偏移地址);近轉(zhuǎn)移近轉(zhuǎn)移(NearNear):):1616

3、位段是位段是1616位近轉(zhuǎn)移位近轉(zhuǎn)移NEAR16NEAR16,3232位段是位段是3232位近轉(zhuǎn)移位近轉(zhuǎn)移NEAR32NEAR32;短轉(zhuǎn)移短轉(zhuǎn)移(ShortShort):轉(zhuǎn)移范圍在):轉(zhuǎn)移范圍在127127-128-128字節(jié);字節(jié);l2. 2. 段間轉(zhuǎn)移段間轉(zhuǎn)移需要更改需要更改CSCS(段地址)和(段地址)和EIPEIP(偏移地址);(偏移地址);遠轉(zhuǎn)移遠轉(zhuǎn)移(FarFar):):1616位段是位段是3232位遠轉(zhuǎn)移位遠轉(zhuǎn)移FAR16FAR16,3232位段是位段是4848位遠轉(zhuǎn)移位遠轉(zhuǎn)移FAR32FAR32;5.1.2 目標(biāo)地址尋址方式l1. 1. 相對尋址方式相對尋址方式提供目標(biāo)地址相對

4、于當(dāng)前指令指針提供目標(biāo)地址相對于當(dāng)前指令指針EIPEIP的位移量;的位移量;目標(biāo)地址(轉(zhuǎn)移后的目標(biāo)地址(轉(zhuǎn)移后的EIPEIP)當(dāng)前當(dāng)前EIPEIP位移量;位移量;相對尋址都是段內(nèi)轉(zhuǎn)移,最常用、最靈活;相對尋址都是段內(nèi)轉(zhuǎn)移,最常用、最靈活;l2. 2. 直接尋址方式直接尋址方式直接提供目標(biāo)地址;直接提供目標(biāo)地址;目標(biāo)地址(轉(zhuǎn)移后的目標(biāo)地址(轉(zhuǎn)移后的CSCS和和EIPEIP)指令操作數(shù);)指令操作數(shù);l3. 3. 間接尋址方式間接尋址方式由寄存器或存儲單元提供跳轉(zhuǎn)地址;由寄存器或存儲單元提供跳轉(zhuǎn)地址;目標(biāo)地址來自寄存器或存儲單元、間接獲得;目標(biāo)地址來自寄存器或存儲單元、間接獲得;寄存器間接尋址:用

5、寄存器保存目標(biāo)地址;寄存器間接尋址:用寄存器保存目標(biāo)地址;存儲器間接尋址:用存儲單元保存目標(biāo)地址;存儲器間接尋址:用存儲單元保存目標(biāo)地址;5.1.3 無條件轉(zhuǎn)移指令JMPl JMP labelJMP label; ;程序轉(zhuǎn)向程序轉(zhuǎn)向labellabel標(biāo)號指定的地址標(biāo)號指定的地址; ; ;有段內(nèi)相對尋址,段間直接尋址有段內(nèi)相對尋址,段間直接尋址; ;JMP reg16/reg32JMP reg16/reg32; ;程序轉(zhuǎn)向寄存器指定的地址程序轉(zhuǎn)向寄存器指定的地址; ; ;為寄存器間接尋址為寄存器間接尋址; ;JMP mem16/mem32JMP mem16/mem32; ;程序轉(zhuǎn)向存儲單元指定

6、的地址程序轉(zhuǎn)向存儲單元指定的地址; ; ;為存儲器間接尋址為存儲器間接尋址; ;JMP指令的4種類型1. 1. 段內(nèi)轉(zhuǎn)移、相對尋址段內(nèi)轉(zhuǎn)移、相對尋址標(biāo)號指明目標(biāo)地址,指令代碼包含位移量;標(biāo)號指明目標(biāo)地址,指令代碼包含位移量;2. 2. 段內(nèi)轉(zhuǎn)移、間接尋址段內(nèi)轉(zhuǎn)移、間接尋址通用寄存器或主存單元包含目標(biāo)指令的偏移地址;通用寄存器或主存單元包含目標(biāo)指令的偏移地址;3. 3. 段間轉(zhuǎn)移、直接尋址段間轉(zhuǎn)移、直接尋址標(biāo)號包含目標(biāo)指令的段地址和偏移地址;標(biāo)號包含目標(biāo)指令的段地址和偏移地址;4. 4. 段間轉(zhuǎn)移、間接尋址段間轉(zhuǎn)移、間接尋址1616位段用雙字存儲單元包含目標(biāo)地址;位段用雙字存儲單元包含目標(biāo)地址;

7、3232位段用位段用3 3字存儲單元包含目標(biāo)地址;字存儲單元包含目標(biāo)地址;例題5-1無條件轉(zhuǎn)移程序-1; ;數(shù)據(jù)段數(shù)據(jù)段00000000 0000 0000nvarnvardw ?dw ? ; ;代碼段代碼段00100010 EB 01 EB 01jmpjmp labl1 labl1;8 8位位移量位位移量00120012 90 90nopnop00130013 B8 FF02 B8 FF02labl1:labl1:mov ax,type labl1mov ax,type labl100160016 E9 0001 E9 0001jmpjmp near ptr labl2 near ptr l

8、abl2;1616位位位位移量移量00190019 90 90nopnop001A001A B8 0020 R B8 0020 Rlabl2:labl2:mov ax,offset labl3 mov ax,offset labl3 ;001D001D FF E0 FF E0jmpjmp ax ax001F001F 90 90nopnop00200020 B8 002B R B8 002B Rlabl3:labl3:mov ax,offset labl4mov ax,offset labl400230023 A3 0000 R A3 0000 Rmov nvar,axmov nvar,ax00

9、260026 FF 26 0000 R FF 26 0000 R jmpjmp nvar nvar002A002A 90 90nopnop 相對短轉(zhuǎn)移相對短轉(zhuǎn)移 相對近轉(zhuǎn)移相對近轉(zhuǎn)移 寄存器間接近轉(zhuǎn)移寄存器間接近轉(zhuǎn)移 存儲器間接近轉(zhuǎn)移存儲器間接近轉(zhuǎn)移5.2 分支程序結(jié)構(gòu)5.2.1 條件轉(zhuǎn)移指令Jcc J Jcccc label labell根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移;根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移;條件滿足,發(fā)生轉(zhuǎn)移;否則,順序執(zhí)行下一條指令;條件滿足,發(fā)生轉(zhuǎn)移;否則,順序執(zhí)行下一條指令;lLABELLABEL表示目標(biāo)地址,采用段內(nèi)相對尋址方式;表示目標(biāo)地址,采用段內(nèi)相對尋址方式;

10、1616位位CPUCPU:字節(jié)位移量(:字節(jié)位移量(-128-128+127+127短轉(zhuǎn)移);短轉(zhuǎn)移);3232位位CPU:CPU:多字節(jié)位移量(達到多字節(jié)位移量(達到3232位的全偏移量);位的全偏移量);l條件轉(zhuǎn)移指令不影響標(biāo)志,但要利用標(biāo)志;條件轉(zhuǎn)移指令不影響標(biāo)志,但要利用標(biāo)志;lcccc表示利用標(biāo)志判斷的條件,表示利用標(biāo)志判斷的條件,1616種、兩類;種、兩類;單個標(biāo)志狀態(tài)作為條件;單個標(biāo)志狀態(tài)作為條件;兩數(shù)大小關(guān)系作為條件;兩數(shù)大小關(guān)系作為條件;轉(zhuǎn)移條件cc:單個標(biāo)志狀態(tài)JZ/JEJZ/JEZF=1ZF=1 Jump if Zero/EqualJump if Zero/EqualJN

11、Z/JNEJNZ/JNEZF=0ZF=0 Jump if Not Zero/Not EqualJump if Not Zero/Not EqualJSJSSF=1SF=1 Jump if SignJump if SignJNSJNSSF=0SF=0 Jump if Not SignJump if Not SignJP/JPEJP/JPEPF=1PF=1 Jump if Parity/Parity EvenJump if Parity/Parity EvenJNP/JPOJNP/JPOPF=0PF=0 Jump if Not Parity/Parity OddJump if Not Parity

12、/Parity OddJOJOOF=1OF=1 Jump if OverflowJump if OverflowJNOJNOOF=0OF=0 Jump if Not OverflowJump if Not OverflowJCJCCF=1CF=1 Jump if CarryJump if CarryJNCJNCCF=0CF=0 Jump if Not CarryJump if Not Carry轉(zhuǎn)移條件cc:兩數(shù)大小關(guān)系JB/JNAEJB/JNAECF=1CF=1Jump if Below/Not Above or EqualJump if Below/Not Above or EqualJN

13、B/JAEJNB/JAECF=0CF=0Jump if Not Below/Above or EqualJump if Not Below/Above or EqualJBE/JNAJBE/JNACF=1CF=1或或ZF=1ZF=1Jump if Below/Not AboveJump if Below/Not AboveJNBE/JAJNBE/JACF=0CF=0且且ZF=0ZF=0Jump if Not Below or Jump if Not Below or Equal/AboveEqual/AboveJL/JNGEJL/JNGESFOFSFOFJump if Less/Not Gre

14、ater or Jump if Less/Not Greater or EqualEqualJNL/JGEJNL/JGESF=OFSF=OF Jump if Not Less/Greater or EqualJump if Not Less/Greater or EqualJLE/JNGJLE/JNGZFOFZFOF或或ZF=1ZF=1Jump if Less or Equal/Not Jump if Less or Equal/Not GreaterGreaterJNLE/JGJNLE/JGSF=OFSF=OF且且ZF=0ZF=0Jump if Not Less or Jump if Not

15、 Less or Equal/GreaterEqual/Greater例題5-2實現(xiàn)指令CBW功能的程序-1l80868086指令指令CBWCBW(等于(等于IA-32IA-32指令指令MOVSX AX,ALMOVSX AX,AL)如果如果ALAL最高位為最高位為0 0,則設(shè)置,則設(shè)置AHAH0 0;如果如果ALAL最高位為最高位為1 1,則設(shè)置,則設(shè)置AHAHFFHFFH;l如何判斷如何判斷ALAL最高位是最高位是“0”0”,還是,還是“1”1”;邏輯與邏輯與“80H”80H”結(jié)果為結(jié)果為0 0,ALAL最高位最高位0 0;否則是;否則是1 1運算結(jié)果是否為運算結(jié)果是否為0 0,零位標(biāo)志,零

16、位標(biāo)志ZFZF反映;反映;JZJZ或或JNZJNZ指令判斷并轉(zhuǎn)移;指令判斷并轉(zhuǎn)移;例題5-2實現(xiàn)指令CBW功能的程序-2 mov al,bvar mov al,bvar ; ;取出要判斷的數(shù)據(jù)取出要判斷的數(shù)據(jù) test al,80h test al,80h ; ;測試最高位測試最高位 jz jz next1 next1 ; ;最高位為最高位為0 0(ZFZF1 1)轉(zhuǎn)移到標(biāo)號)轉(zhuǎn)移到標(biāo)號NEXT1NEXT1; mov ah,0ffh mov ah,0ffh; ;最高位為最高位為1 1,順序執(zhí)行:設(shè)置,順序執(zhí)行:設(shè)置AHAHFFHFFH; jmp jmp done done ; ;無條件跳過另一

17、個分支無條件跳過另一個分支next1:mov ah,0next1:mov ah,0; ;最高位為最高位為0 0轉(zhuǎn)移到此執(zhí)行:設(shè)置轉(zhuǎn)移到此執(zhí)行:設(shè)置AHAH0 0 done: done:例題5-2實現(xiàn)指令CBW功能的程序-3mov al,bvarmov al,bvar; ;取出要判斷的數(shù)據(jù)取出要判斷的數(shù)據(jù)cmp al,0cmp al,0; ;與與0 0比較比較jnsjns next3 next3 ; ;最高位為最高位為0 0(SFSF0 0),轉(zhuǎn)移到標(biāo)號),轉(zhuǎn)移到標(biāo)號NEXT3NEXT3mov ah,0ffhmov ah,0ffh; ;最高位為最高位為1 1,順序執(zhí)行:設(shè)置,順序執(zhí)行:設(shè)置AHA

18、HFFHFFHjmpjmp done done ; ;無條件跳過另一個分支無條件跳過另一個分支next3:next3: mov ah,0mov ah,0; ;最高位為最高位為0 0轉(zhuǎn)移到此執(zhí)行:設(shè)置轉(zhuǎn)移到此執(zhí)行:設(shè)置AHAH00H00Hdone:done:5.2.2 單分支結(jié)構(gòu)程序l條件成立轉(zhuǎn)移,否則順序執(zhí)行。條件成立轉(zhuǎn)移,否則順序執(zhí)行。例題5-6求絕對值程序; ;數(shù)據(jù)段數(shù)據(jù)段dvardvardd 0bd630422hdd 0bd630422h; ;有符號數(shù)據(jù)有符號數(shù)據(jù)resultresultdd ?dd ?; ;保存絕對值保存絕對值; ;代碼段代碼段mov eax,dvarmov eax,d

19、varcmp eax,0cmp eax,0; ;比較比較EAXEAX與與0 0jge nonnegjge nonneg; ;條件滿足:條件滿足:AX0AX0,轉(zhuǎn)移,轉(zhuǎn)移neg eaxneg eax; ;條件不滿足:條件不滿足:AXAX0 0,為負(fù)數(shù),需求補得正值,為負(fù)數(shù),需求補得正值nonnegnonneg: : mov result,eaxmov result,eax; ;分支結(jié)束,保存結(jié)果分支結(jié)束,保存結(jié)果IF-THEN結(jié)構(gòu)結(jié)構(gòu)5.2.3 雙分支結(jié)構(gòu)程序l非非A A即即B B例題5-8顯示數(shù)據(jù)最高位程序-1 ; ;數(shù)據(jù)段數(shù)據(jù)段dvardvardd 0bd630422hdd 0bd63042

20、2h; ;有符號數(shù)據(jù)有符號數(shù)據(jù); ;代碼段代碼段mov ebx,dvarmov ebx,dvarshl ebx,1shl ebx,1;EBX;EBX最高位移入最高位移入CFCF標(biāo)志標(biāo)志jc onejc one;CF;CF1 1,最高位為,最高位為1 1,轉(zhuǎn)移,轉(zhuǎn)移mov dl,0mov dl,0;CF;CF0 0,最高位為,最高位為0 0:DL0DL0jmp twojmp two; ;一定要跳過另一個分支體一定要跳過另一個分支體one:one:mov dl,1mov dl,1;DL1;DL1two:two:mov ah,2mov ah,2int 21hint 21h; ;顯示顯示在屏幕上顯示在

21、屏幕上顯示dvar變量的最高位的數(shù)(變量的最高位的數(shù)(0、1)。)。5.2.4 多分支結(jié)構(gòu)程序5.3 循環(huán)程序結(jié)構(gòu)設(shè)計l循環(huán)結(jié)構(gòu)程序構(gòu)成:循環(huán)結(jié)構(gòu)程序構(gòu)成:循環(huán)初始化循環(huán)初始化循環(huán)體循環(huán)體循環(huán)控制循環(huán)控制循環(huán)程序結(jié)構(gòu)循環(huán)的初始狀態(tài)循環(huán)的初始狀態(tài)循環(huán)的工作部分循環(huán)的工作部分及修改部分及修改部分計數(shù)控制循環(huán)計數(shù)控制循環(huán)條件控制循環(huán)條件控制循環(huán)初始化初始化循環(huán)體循環(huán)體修改部分修改部分Y YN N控制條件控制條件循環(huán)指令LOOP labelLOOP label;ECXECX;ECXECX1 1;若;若ECX0ECX0,循環(huán)到,循環(huán)到LABELLABEL;; ;否則,順序執(zhí)行否則,順序執(zhí)行JECXZ l

22、abelJECXZ label;ECX;ECX0 0,轉(zhuǎn)移;否則順序執(zhí)行,轉(zhuǎn)移;否則順序執(zhí)行JCXZ labelJCXZ label;CX;CX0 0,轉(zhuǎn)移;否則順序執(zhí)行,轉(zhuǎn)移;否則順序執(zhí)行l(wèi)3232位段使用位段使用ECXECX(1616位段使用位段使用CXCX)作為計數(shù)器)作為計數(shù)器l目標(biāo)地址采用相對短轉(zhuǎn)移目標(biāo)地址采用相對短轉(zhuǎn)移DEC ECXDEC ECXJNZ labelJNZ label例題5-11數(shù)組求和程序-1.data.data array dw 123,244,2467,335,5433 array dw 123,244,2467,335,5433mov ecx,lengthof

23、 arraymov ecx,lengthof arrayxor eax,eaxxor eax,eax; ;求和初值為求和初值為0 0mov ebx,eaxmov ebx,eax; ;數(shù)組指針為數(shù)組指針為0 0again:again:movzx edx,arrayebxmovzx edx,arrayebx* *(type array)(type array)add eax,edxadd eax,edx; ;求和求和 inc ebxinc ebxloop againloop againmov sum,eaxmov sum,eax; ;保存結(jié)果保存結(jié)果循環(huán)初始循環(huán)初始循環(huán)體循環(huán)體循環(huán)控制循環(huán)控制例題

24、5-11數(shù)組求和程序-2mov ecx,lengthof arraymov ecx,lengthof arrayxor eax,eaxxor eax,eax; ;求和初值為求和初值為0 0jecxz donejecxz done; ;數(shù)組元素為數(shù)組元素為0 0,不,不再進行求和再進行求和mov ebx,eaxmov ebx,eax; ;數(shù)組指針為數(shù)組指針為0 0again:again:movzx edx,arrayebxmovzx edx,arrayebx* *(type array)(type array)add eax,edxadd eax,edx; ;求和求和 inc ebxinc eb

25、xloop againloop againdone:done:mov sum,eaxmov sum,eax; ;保存結(jié)果保存結(jié)果循環(huán)控制l計數(shù)控制循環(huán)計數(shù)控制循環(huán)通過次數(shù)控制循環(huán),常用通過次數(shù)控制循環(huán),常用LOOPLOOP指令實現(xiàn)指令實現(xiàn)l條件控制循環(huán)條件控制循環(huán)根據(jù)條件決定是否進行循環(huán),需用條件轉(zhuǎn)移指令根據(jù)條件決定是否進行循環(huán),需用條件轉(zhuǎn)移指令l“先判斷、后循環(huán)先判斷、后循環(huán)”的循環(huán)程序結(jié)構(gòu)的循環(huán)程序結(jié)構(gòu)循環(huán)控制在進入循環(huán)之前進行循環(huán)控制在進入循環(huán)之前進行l(wèi)“先循環(huán)、后判斷先循環(huán)、后判斷”的循環(huán)程序結(jié)構(gòu)的循環(huán)程序結(jié)構(gòu)循環(huán)之后進行循環(huán)條件判斷循環(huán)之后進行循環(huán)條件判斷l(xiāng)排序程序排序程序例題5-1

26、3查找字符串特定字符個數(shù)程序 String db You are wellcom!,0 String db You are wellcom!,0 Space dd ? Space dd ? mov esi,offset string mov esi,offset stringxor ebx,ebxxor ebx,ebx;EBX;EBX用于記錄空格數(shù)用于記錄空格數(shù)again:again:mov al,esimov al,esicmp al,0cmp al,0jz donejz done;結(jié)束標(biāo)志;結(jié)束標(biāo)志cmp al,20hcmp al,20h; ;空格的空格的ASCIIASCII碼是碼是20H

27、20Hjne nextjne next; ;不相等、不是空格,轉(zhuǎn)移不相等、不是空格,轉(zhuǎn)移inc bxinc bx; ;相等、是空格,個數(shù)加相等、是空格,個數(shù)加1 1next:next:inc esiinc esijmp againjmp again; ;繼續(xù)循環(huán)繼續(xù)循環(huán)done:done:mov space,ebxmov space,ebx; ;保存結(jié)果保存結(jié)果5.4 子程序結(jié)構(gòu)程序設(shè)計子程序結(jié)構(gòu)l子程序子程序:與主程序分開的、完成特定功:與主程序分開的、完成特定功能的一段程序。能的一段程序。l當(dāng)當(dāng)主程序主程序(調(diào)用程序調(diào)用程序)執(zhí)行調(diào)用指令)執(zhí)行調(diào)用指令CALLCALL調(diào)用子程序。調(diào)用子程序

28、。l子程序(子程序(被調(diào)用程序被調(diào)用程序)執(zhí)行返回指令)執(zhí)行返回指令RETRET返回主程序返回主程序子程序調(diào)用指令CALLlCALLCALL指令用在主程序中,實現(xiàn)子程序的調(diào)用;指令用在主程序中,實現(xiàn)子程序的調(diào)用;l分成段內(nèi)調(diào)用(近調(diào)用)和段間調(diào)用(遠調(diào)用);分成段內(nèi)調(diào)用(近調(diào)用)和段間調(diào)用(遠調(diào)用);l目標(biāo)地址采用相對尋址、直接尋址或間接尋址;目標(biāo)地址采用相對尋址、直接尋址或間接尋址;l入棧返回地址:將入棧返回地址:將CALLCALL下一條指令的地址下一條指令的地址壓入堆棧;壓入堆棧;1616位段段內(nèi)位段段內(nèi):16:16位偏移地址,段間:再加位偏移地址,段間:再加1616位段地址位段地址323

29、2位段段內(nèi):位段段內(nèi):3232位偏移地址,段間:再將位偏移地址,段間:再將1616位段選擇器零位擴展為位段選擇器零位擴展為3232位保存到堆棧;位保存到堆棧;l指令調(diào)用形式指令調(diào)用形式CALL labelCALL label; ;入棧返回地址,調(diào)用標(biāo)號指定的子程序;入棧返回地址,調(diào)用標(biāo)號指定的子程序;CALL reg16/reg32CALL reg16/reg32; ;入棧返回地址,調(diào)用寄存器指定地址的子程序;入棧返回地址,調(diào)用寄存器指定地址的子程序;CALL mem16/mem32CALL mem16/mem32; ;入棧返回地址,調(diào)用存儲單元指定地址的子程序;入棧返回地址,調(diào)用存儲單元指定

30、地址的子程序;子程序返回指令RETlRETRET指令用在子程序結(jié)束,實現(xiàn)返回主程序指令用在子程序結(jié)束,實現(xiàn)返回主程序RETRET; ;無參數(shù)返回:出棧返回地址無參數(shù)返回:出棧返回地址RET i16RET i16; ;有參數(shù)返回:出棧返回地址,有參數(shù)返回:出棧返回地址,ESPESPESPESPi16i16子程序(過程)定義l格式:格式:過程名過程名 PROCPROC ; ;過程體過程體過程名過程名 ENDPENDPlPROCPROC后面可加參數(shù):后面可加參數(shù):NEARNEAR或或FARFARl簡化段定義源程序格式中,通常不需指定;簡化段定義源程序格式中,通常不需指定;微型、小型和緊湊存儲模式:默

31、認(rèn)屬性微型、小型和緊湊存儲模式:默認(rèn)屬性NEARNEAR;中型、大型和巨型存儲模式:默認(rèn)屬性中型、大型和巨型存儲模式:默認(rèn)屬性FARFAR;子程序設(shè)計l利用過程定義,獲得子程序名和調(diào)用屬性;利用過程定義,獲得子程序名和調(diào)用屬性;lCALLCALL指令調(diào)用子程序,指令調(diào)用子程序,RETRET指令返回主程序;指令返回主程序;l壓入和彈出操作要成對使用,保持堆棧平衡;壓入和彈出操作要成對使用,保持堆棧平衡;l子程序的開始保護寄存器,返回前相應(yīng)恢復(fù);子程序的開始保護寄存器,返回前相應(yīng)恢復(fù);l子程序安排在代碼段的主程序之外;子程序安排在代碼段的主程序之外;l子程序允許嵌套;子程序允許嵌套;l子程序可與主

32、程序共用一個數(shù)據(jù)段,也可具有獨立子程序可與主程序共用一個數(shù)據(jù)段,也可具有獨立數(shù)據(jù)段;數(shù)據(jù)段;例:l將一個字(將一個字(1616進制)分別轉(zhuǎn)換為進制)分別轉(zhuǎn)換為ASCIIASCII碼送顯碼送顯示(要轉(zhuǎn)換的字放在示(要轉(zhuǎn)換的字放在WVARWVAR變量中)。變量中)。子程序的參數(shù)傳遞l主程序與子程序間通過參數(shù)傳遞建立聯(lián)系主程序與子程序間通過參數(shù)傳遞建立聯(lián)系入口參數(shù)入口參數(shù)( (輸入?yún)?shù)輸入?yún)?shù)) ):主程序:主程序子程序子程序出口參數(shù)出口參數(shù)( (輸出參數(shù)輸出參數(shù)) ):子程序:子程序主程序主程序l參數(shù)的具體內(nèi)容參數(shù)的具體內(nèi)容數(shù)據(jù)本身(傳遞數(shù)值)數(shù)據(jù)本身(傳遞數(shù)值)數(shù)據(jù)的存儲地址(傳遞地址,傳遞引用

33、)數(shù)據(jù)的存儲地址(傳遞地址,傳遞引用)l參數(shù)傳遞方法:寄存器、變量或堆棧;參數(shù)傳遞方法:寄存器、變量或堆棧;寄存器傳遞參數(shù)l最簡單和常用的參數(shù)傳遞方法;最簡單和常用的參數(shù)傳遞方法;l把參數(shù)存于約定的寄存器;把參數(shù)存于約定的寄存器;少量數(shù)據(jù)直接傳遞數(shù)值;少量數(shù)據(jù)直接傳遞數(shù)值;大量數(shù)據(jù)只能傳遞地址;大量數(shù)據(jù)只能傳遞地址;l帶有出口參數(shù)的寄存器不能保護和恢復(fù);帶有出口參數(shù)的寄存器不能保護和恢復(fù);l帶有入口參數(shù)的寄存器可以保護、也可以不保帶有入口參數(shù)的寄存器可以保護、也可以不保護,但最好能夠保持一致;護,但最好能夠保持一致;l編寫程序?qū)崿F(xiàn)下列功能:編寫程序?qū)崿F(xiàn)下列功能:l將變量將變量BvarBvar中

34、中5 5個字節(jié)的壓縮個字節(jié)的壓縮BCDBCD碼數(shù)據(jù),分別碼數(shù)據(jù),分別轉(zhuǎn)換為分離轉(zhuǎn)換為分離BCDBCD數(shù),并存入變量數(shù),并存入變量BCDABCDA中。中。(采用寄存器傳遞參數(shù))(采用寄存器傳遞參數(shù))例題5-18有符號十進制數(shù)輸入程序-1l算法如下:算法如下:l 首先判斷輸入正數(shù)還是負(fù)數(shù),并用一個寄存器記首先判斷輸入正數(shù)還是負(fù)數(shù),并用一個寄存器記錄下來;錄下來;l 接著輸入接著輸入0 09 9數(shù)字(數(shù)字(ASCIIASCII碼),并減碼),并減30H30H轉(zhuǎn)換為轉(zhuǎn)換為二進制數(shù);二進制數(shù);l 然后將前面輸入的數(shù)值乘然后將前面輸入的數(shù)值乘1010,并與剛輸入的數(shù)字,并與剛輸入的數(shù)字相加得到新的數(shù)值;相

35、加得到新的數(shù)值;l 重復(fù)重復(fù)2 2、3 3步,直到輸入一個非數(shù)字字符結(jié)束;步,直到輸入一個非數(shù)字字符結(jié)束;1.1. 如果是負(fù)數(shù)進行求補,轉(zhuǎn)換成補碼;否則直接將如果是負(fù)數(shù)進行求補,轉(zhuǎn)換成補碼;否則直接將數(shù)值保存數(shù)值保存例題5-18有符號十進制數(shù)輸入程序-2mov ecx,countmov ecx,countmov ebx,offset arraymov ebx,offset arrayagain:again:call readsidcall readsid; ;輸入一個數(shù)據(jù)輸入一個數(shù)據(jù)mov ebx,mov ebx,eaxeax; ;存放出口參數(shù)存放出口參數(shù)add ebx,4add ebx,4c

36、all dpcrlfcall dpcrlf; ;光標(biāo)回車換行光標(biāo)回車換行l(wèi)oop againloop again子程序名子程序名 READSIDREADSID出口參數(shù)出口參數(shù) EAXEAX3232位二進制補碼位二進制補碼功能說明功能說明 有符號十進制數(shù)輸入有符號十進制數(shù)輸入例題5-18有符號十進制數(shù)輸入程序-3readsidreadsid procproc; ;輸入有符號十進制數(shù)子程序輸入有符號十進制數(shù)子程序push ebxpush ebx; ;說明:負(fù)數(shù)用說明:負(fù)數(shù)用“- -”引導(dǎo)引導(dǎo)push ecxpush ecxpush edxpush edxxor ebx,ebxxor ebx,ebx

37、;EBX;EBX保存結(jié)果保存結(jié)果xor ecx,ecxxor ecx,ecx;ECX;ECX為正負(fù)標(biāo)志為正負(fù)標(biāo)志:0 0為正,為正,- -1 1為負(fù)為負(fù)子程序名子程序名 READSIDREADSID出口參數(shù)出口參數(shù) EAXEAX3232位二進制補碼位二進制補碼功能說明功能說明 有符號十進制數(shù)輸入有符號十進制數(shù)輸入例題5-18有符號十進制數(shù)輸入程序-4mov ah,1mov ah,1; ;輸入一個字符輸入一個字符int 21hint 21hcmp al,+cmp al,+; ;是是“”,繼續(xù)輸入字符,繼續(xù)輸入字符jz rsid1jz rsid1cmp al,-cmp al,-; ;是是“”,設(shè)置

38、,設(shè)置1 1標(biāo)志標(biāo)志jnz rsid2jnz rsid2mov ecx,-1mov ecx,-1例題5-18有符號十進制數(shù)輸入程序-5rsid1:rsid1:mov ah,1mov ah,1; ;繼續(xù)輸入字符繼續(xù)輸入字符int 21hint 21hrsid2:rsid2:cmp al,0cmp al,0; ;不是不是0 09 9之間的字符,則輸入數(shù)據(jù)結(jié)束之間的字符,則輸入數(shù)據(jù)結(jié)束jb rsid3jb rsid3cmp al,9cmp al,9ja rsid3ja rsid3sub al,30hsub al,30h; ;是是0 09 9之間的字符,則轉(zhuǎn)換為二進制數(shù)之間的字符,則轉(zhuǎn)換為二進制數(shù)例題

39、5-18有符號十進制數(shù)輸入程序-6imul ebx,10imul ebx,10; ;數(shù)值乘數(shù)值乘1010:EBXEBXEBXEBX1010movzx eax,almovzx eax,aladd ebx,eaxadd ebx,eax; ;與新輸入數(shù)值相加與新輸入數(shù)值相加jmp rsid1jmp rsid1; ;繼續(xù)輸入字符繼續(xù)輸入字符rsid3:rsid3:cmp ecx,0cmp ecx,0; ;是負(fù)數(shù),進行求補是負(fù)數(shù),進行求補jz rsid4jz rsid4neg ebxneg ebxrsid4:rsid4:mov eax,ebxmov eax,ebx; ;設(shè)置出口參數(shù)設(shè)置出口參數(shù)pop e

40、dxpop edxpop ecxpop ecxpop ebxpop ebxretret; ;子程序返回子程序返回readsidreadsid endpendp例題5-18有符號十進制數(shù)輸入程序-7dpcrlfdpcrlfprocproc; ;光標(biāo)回車換行子程序光標(biāo)回車換行子程序push axpush axpush dxpush dxmov ah,2mov ah,2mov dl,0dhmov dl,0dhint 21hint 21hmov ah,2mov ah,2mov dl,0ahmov dl,0ahint 21hint 21hpop dxpop dxpop axpop axretretdpc

41、rlfdpcrlfendpendp共享變量傳遞參數(shù)l子程序和主程序使用同一個變量名存取數(shù)據(jù)子程序和主程序使用同一個變量名存取數(shù)據(jù)l變量定義和使用不在同一個源程序中,需要利變量定義和使用不在同一個源程序中,需要利用用PUBLICPUBLIC、EXTRENEXTREN聲明聲明l共享變量傳遞參數(shù),子程序的通用性較差共享變量傳遞參數(shù),子程序的通用性較差l特別適合在多個程序段間、尤其在不同的程序特別適合在多個程序段間、尤其在不同的程序模塊間傳遞數(shù)據(jù)模塊間傳遞數(shù)據(jù)例題5-19有符號十進制數(shù)輸出程序-1l算法如下:算法如下:首先判斷數(shù)據(jù)是零、正數(shù)或負(fù)數(shù),是零顯示首先判斷數(shù)據(jù)是零、正數(shù)或負(fù)數(shù),是零顯示“0”0

42、”退出;退出;是負(fù)數(shù),顯示是負(fù)數(shù),顯示“”,求數(shù)據(jù)的絕對值;,求數(shù)據(jù)的絕對值;接著數(shù)據(jù)除以接著數(shù)據(jù)除以1010,余數(shù)加,余數(shù)加30H30H轉(zhuǎn)換為轉(zhuǎn)換為ASCIIASCII碼壓入碼壓入堆棧;堆棧;重復(fù)第重復(fù)第3 3步,直到商為步,直到商為0 0結(jié)束;結(jié)束;1.1. 依次從堆棧彈出各位數(shù)字,進行顯示依次從堆棧彈出各位數(shù)字,進行顯示例題5-19有符號十進制數(shù)輸出程序-2mov ecx,countmov ecx,countmov ebx,0mov ebx,0again:again:mov eax,arrayebxmov eax,arrayebx* *44mov dtemp,eaxmov dtemp,e

43、ax; ;入口參數(shù)存放到共享變量入口參數(shù)存放到共享變量call dispsidcall dispsid; ;調(diào)用子程序顯示一個數(shù)據(jù)調(diào)用子程序顯示一個數(shù)據(jù)inc ebxinc ebxcall dpcrlfcall dpcrlf; ;光標(biāo)回車換行光標(biāo)回車換行l(wèi)oop againloop again子程序名子程序名 DISPSIDDISPSID入口參數(shù)入口參數(shù) DTEMPDTEMP3232位二進制補碼位二進制補碼功能說明功能說明 有符號十進制數(shù)顯示有符號十進制數(shù)顯示例題5-19有符號十進制數(shù)輸出程序-3dispsiddispsid procproc; ;顯示有符號十進制數(shù)子程序顯示有符號十進制數(shù)子程

44、序push eaxpush eax; ;入口參數(shù):共享變量入口參數(shù):共享變量DTEMPDTEMPpush ebxpush ebxpush edxpush edxmov eax,dtempmov eax,dtemp ; ;取出顯示數(shù)據(jù)取出顯示數(shù)據(jù)test eax,eaxtest eax,eax; ;判斷數(shù)據(jù)是零、正數(shù)或負(fù)數(shù)判斷數(shù)據(jù)是零、正數(shù)或負(fù)數(shù)jnz dsid1jnz dsid1mov dl,0mov dl,0 ; ;是零,顯示是零,顯示“0”“0”后退出后退出mov ah,2mov ah,2int 21hint 21hjmp dsid5jmp dsid5例題5-19有符號十進制數(shù)輸出程序-4

45、dsid1:dsid1:jns dsid2jns dsid2; ;是負(fù)數(shù),顯示是負(fù)數(shù),顯示“- -”mov ebx,eaxmov ebx,eax;EAX;EAX數(shù)據(jù)暫存于數(shù)據(jù)暫存于EBXEBXmov dl,-mov dl,-mov ah,2mov ah,2int 21hint 21hmov eax,ebxmov eax,ebxneg eaxneg eax; ;數(shù)據(jù)求補(絕對值)數(shù)據(jù)求補(絕對值)子程序名子程序名 DISPSIDDISPSID入口參數(shù)入口參數(shù) DTEMPDTEMP3232位二進制補碼位二進制補碼功能說明功能說明 有符號十進制數(shù)顯示有符號十進制數(shù)顯示例題5-19有符號十進制數(shù)輸出程

46、序-5dsid2:dsid2:mov ebx,10mov ebx,10push bxpush bx;10;10壓入堆棧,作為退出標(biāo)志壓入堆棧,作為退出標(biāo)志dsid3:dsid3:cmp eax,0cmp eax,0; ;數(shù)據(jù)(商)為零,轉(zhuǎn)向顯示數(shù)據(jù)(商)為零,轉(zhuǎn)向顯示jz dsid4jz dsid4sub edx,edxsub edx,edx; ;擴展被除數(shù)擴展被除數(shù)EDX.EAXEDX.EAXdiv ebxdiv ebx; ;數(shù)據(jù)除以數(shù)據(jù)除以1010:EDX.EAXEDX.EAX1010add dl,30hadd dl,30h; ;余數(shù)(余數(shù)(0 09 9)轉(zhuǎn)換為)轉(zhuǎn)換為ASCIIASCII

47、碼碼push dxpush dx; ;數(shù)據(jù)先低位后高位壓入堆棧數(shù)據(jù)先低位后高位壓入堆棧jmp dsid3jmp dsid3例題5-19有符號十進制數(shù)輸出程序-6dsid4:dsid4:pop dxpop dx; ;數(shù)據(jù)先高位后低位彈出堆棧數(shù)據(jù)先高位后低位彈出堆棧cmp dl,10cmp dl,10; ;是結(jié)束標(biāo)志是結(jié)束標(biāo)志1010,則退出,則退出je dsid5je dsid5mov ah,2mov ah,2; ;進行顯示進行顯示int 21hint 21hjmp dsid4jmp dsid4dsid5:dsid5:pop edxpop edxpop ebxpop ebxpop eaxpop

48、eaxretret; ;子程序返回子程序返回dispsiddispsid endpendp堆棧傳遞參數(shù)l主程序?qū)⑷肟趨?shù)壓入堆棧,子程序從堆棧中主程序?qū)⑷肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù)取出參數(shù)l子程序?qū)⒊隹趨?shù)壓入堆棧,主程序彈出堆棧子程序?qū)⒊隹趨?shù)壓入堆棧,主程序彈出堆棧取得它們?nèi)〉盟鼈僱采用堆棧傳遞參數(shù)是程式化的,它是編譯程序采用堆棧傳遞參數(shù)是程式化的,它是編譯程序處理參數(shù)傳遞、以及匯編語言與高級語言混合處理參數(shù)傳遞、以及匯編語言與高級語言混合編程時的常規(guī)方法編程時的常規(guī)方法例題5-20計算有符號數(shù)平均值程序-1l算法如下:算法如下:被加數(shù)進行符號擴展被加數(shù)進行符號擴展求和求和除以

49、數(shù)據(jù)個數(shù)得到平均值除以數(shù)據(jù)個數(shù)得到平均值1.1.3232位有符號數(shù)擴展到位有符號數(shù)擴展到6464位,位,3232位表示數(shù)據(jù)個位表示數(shù)據(jù)個數(shù)(最大數(shù)(最大2 232 32 ) ,不會溢出,不會溢出子程序名子程序名 MEANMEAN入口參數(shù)入口參數(shù) 3232位數(shù)據(jù)個數(shù)和偏移地址壓入堆棧位數(shù)據(jù)個數(shù)和偏移地址壓入堆棧出口參數(shù)出口參數(shù) EAXEAX平均值平均值功能說明功能說明 計算有符號數(shù)平均值計算有符號數(shù)平均值例題5-20計算有符號數(shù)平均值程序-2mov eax,countmov eax,countpush eaxpush eax; ;壓入數(shù)據(jù)個數(shù)壓入數(shù)據(jù)個數(shù)(0(0表示表示2 23232個個) )m

50、ov ebx,offset arraymov ebx,offset arraypush ebxpush ebx; ;壓入緩沖區(qū)的偏移地址壓入緩沖區(qū)的偏移地址call meancall mean; ;調(diào)用子程序,求平均值調(diào)用子程序,求平均值add esp,8add esp,8; ;平衡堆棧平衡堆棧mov dmed,eaxmov dmed,eax; ;保存出口參數(shù)保存出口參數(shù)子程序名子程序名 MEANMEAN入口參數(shù)入口參數(shù) 3232位數(shù)據(jù)個數(shù)和偏移地址壓入堆棧位數(shù)據(jù)個數(shù)和偏移地址壓入堆棧出口參數(shù)出口參數(shù) EAXEAX平均值平均值功能說明功能說明 計算有符號數(shù)平均值計算有符號數(shù)平均值例題5-20計

51、算有符號數(shù)平均值程序-3meanmeanprocproc; ;計算有符號數(shù)平均值計算有符號數(shù)平均值push ebppush ebpmov ebp,espmov ebp,esppush ebxpush ebx; ;保護寄存器保護寄存器push ecxpush ecxpush edxpush edxpush esipush esipush edipush edimov ebx,mov ebx,ebp+6ebp+6; ;從堆棧取偏移地址從堆棧取偏移地址mov ecx,mov ecx,ebp+10ebp+10; ;從堆棧取數(shù)據(jù)個數(shù)從堆棧取數(shù)據(jù)個數(shù)例題5-20計算有符號數(shù)平均值程序-4xor esi,e

52、sixor esi,esi;ESI;ESI保存求和的低保存求和的低3232位值位值mov edi,esimov edi,esi;EDI;EDI保存求和的高保存求和的高3232位值位值mean1:mean1:mov eax,ebxmov eax,ebx; ;取出一個數(shù)據(jù)取出一個數(shù)據(jù)EAXEAXcdqcdq; ;符號擴展符號擴展EDX.EAXEDX.EAXadd esi,eaxadd esi,eax; ;求和低求和低3232位位adc edi,edxadc edi,edx; ;求和高求和高3232位位add ebx,4add ebx,4; ;指向下一個數(shù)據(jù)指向下一個數(shù)據(jù)dec ecxdec ecx

53、; ;數(shù)據(jù)個數(shù)減少一個數(shù)據(jù)個數(shù)減少一個jnz mean1jnz mean1; ;循環(huán)循環(huán)mov eax,esimov eax,esi; ;累加和在累加和在EDX.EAXEDX.EAXmov edx,edimov edx,edi例題5-20計算有符號數(shù)平均值程序-5mov ecx,ebp+10mov ecx,ebp+10; ;數(shù)據(jù)個數(shù)在數(shù)據(jù)個數(shù)在CXCXidiv ecxidiv ecx; ;有符號數(shù)除法,有符號數(shù)除法,E EAXAX平均值(平均值(E EDXDX余數(shù))余數(shù))pop edipop edi; ;恢復(fù)寄存器恢復(fù)寄存器pop esipop esipop edxpop edxpop ecx

54、pop ecxpop ebxpop ebxpop ebppop ebpretretmeanmeanendpendp宏匯編l宏(宏(MacroMacro):具有宏名的一段匯編語句序列):具有宏名的一段匯編語句序列l(wèi)宏需要先定義宏需要先定義宏名宏名MACROMACRO 形參表形參表 ; ;宏定義體宏定義體ENDMENDMl然后程序中進行宏調(diào)用然后程序中進行宏調(diào)用宏名宏名 實體參數(shù)實體參數(shù)l宏定義體的標(biāo)號必須用宏定義體的標(biāo)號必須用LOCALLOCAL偽指令聲明偽指令聲明LOCAL LOCAL 標(biāo)號標(biāo)號1,1,標(biāo)號標(biāo)號2,2,例題5-21十六進制數(shù)輸入程序-1; ;宏定義宏定義dispmsgdispm

55、sgmacro messagemacro message;message;message是形式參數(shù)是形式參數(shù)push axpush axpush dxpush dxmov ah,9mov ah,9lea dx,messagelea dx,messageint 21hint 21hpop dxpop dxpop axpop axendmendm例題5-21十六進制數(shù)輸入程序-2asctohasctohmacromacrolocal asctoh1,asctoh2local asctoh1,asctoh2cmp al,9cmp al,9jbe asctoh1jbe asctoh1;小于等于小于等于

56、99,是,是0 09 9,只需減去,只需減去30H30Hcmp al,acmp al,ajb asctoh2jb asctoh2;大于大于99小于小于aa,是,是A AF F,還要減,還要減7 7sub al,20hsub al,20h;大于等于大于等于aa,是,是a af f,再減去,再減去20H20Hasctoh2:asctoh2:sub al,7sub al,7asctoh1:asctoh1:sub al,30hsub al,30hendmendm例題5-21十六進制數(shù)輸入程序-3; ;數(shù)據(jù)段數(shù)據(jù)段msgmsgdb Please input,13,10,$db Please input,

57、13,10,$wvarwvardw ?dw ?; ;代碼段代碼段dispmsg msgdispmsg msg; ;提示輸入提示輸入push axpush axpush dxpush dxmov ah,9mov ah,9lea dx,msglea dx,msgint 21hint 21hpop dxpop dxpop axpop ax宏調(diào)用宏調(diào)用宏展開宏展開例題5-21十六進制數(shù)輸入程序-4mov cx,4mov cx,4mov bx,0mov bx,0;BX;BX保存轉(zhuǎn)換后的結(jié)果保存轉(zhuǎn)換后的結(jié)果again:again:mov ah,6mov ah,6; ;輸入字符但不顯示輸入字符但不顯示mov

58、 dl,0ffh mov dl,0ffh int 21hint 21hjz againjz again; ;沒有輸入字符繼續(xù)沒有輸入字符繼續(xù)功能編號功能編號 AHAH06H06H入口參數(shù)入口參數(shù) DLDLFFHFFH(輸入功能)(輸入功能)DLDL欲顯示的欲顯示的ASCIIASCII字符(輸出功能)字符(輸出功能) 出口參數(shù)出口參數(shù) ALALASCIIASCII字符字符功能說明功能說明 輸入功能:按鍵檢測,無回顯輸入輸入功能:按鍵檢測,無回顯輸入標(biāo)志標(biāo)志ZFZF反映是否按鍵:為零條件反映是否按鍵:為零條件Z Z(ZFZF1 1)無按鍵,不為零條件無按鍵,不為零條件NZNZ(ZFZF0 0)有按

59、鍵;)有按鍵;ALAL輸入字符的輸入字符的ASCIIASCII碼碼輸出功能:與輸出功能:與02H02H功能調(diào)用一樣功能調(diào)用一樣例題5-21十六進制數(shù)輸入程序-5cmp al,0cmp al,0; ;測試是否是合法字符測試是否是合法字符jb jb againagain; ;沒有輸入合法字符,重新輸入沒有輸入合法字符,重新輸入cmp al,9cmp al,9jbe jbe nextnext; ;輸入合法字符就顯示輸入合法字符就顯示cmp al,Acmp al,Ajb againjb againcmp al,Fcmp al,Fjbe nextjbe nextcmp al,acmp al,ajb ag

60、ainjb againcmp al,fcmp al,fja againja again; ;測試結(jié)束測試結(jié)束例題5-21十六進制數(shù)輸入程序-6next:next:mov ah,6mov ah,6; ;顯示輸入字符顯示輸入字符mov dl,almov dl,alint 21hint 21hasctohasctoh; ;轉(zhuǎn)換為十六進制數(shù)轉(zhuǎn)換為十六進制數(shù)shl bx,4shl bx,4; ;將上次輸入左移二進制將上次輸入左移二進制4 4位位add bl,aladd bl,al; ;加上本次輸入的數(shù)碼加上本次輸入的數(shù)碼loop againloop againmov wvar,bxmov wvar,bx

溫馨提示

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

評論

0/150

提交評論