匯編語(yǔ)言 課件 第6章子程序結(jié)構(gòu)_第1頁(yè)
匯編語(yǔ)言 課件 第6章子程序結(jié)構(gòu)_第2頁(yè)
匯編語(yǔ)言 課件 第6章子程序結(jié)構(gòu)_第3頁(yè)
匯編語(yǔ)言 課件 第6章子程序結(jié)構(gòu)_第4頁(yè)
匯編語(yǔ)言 課件 第6章子程序結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第6章子程序結(jié)構(gòu)(jiégòu)講授(jiǎngshòu)要點(diǎn)子程序的定義、調(diào)用與返回。子程序的參數(shù)傳遞方法。精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)子程序調(diào)用(diàoyòng)和返回指令:code1segmentmainprocfar……

callfarptrsubp……retmainendpcode1endscode2segmentsubpprocfar……

retsubpendpcode2ends段間調(diào)用(diàoyòng)和返回codesegmentmainprocfar……callsubp……retmainendpsubpprocnear……

retsubpendpcodeends段內(nèi)調(diào)用和返回精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)CALL調(diào)用指令段內(nèi)直接近調(diào)用:CALLDST執(zhí)行操作:(SP)←(SP)-2((SP)+1,(SP))←(IP)(IP)←(IP)+16位位移(wèiyí)量段內(nèi)間接近調(diào)用:CALLDST執(zhí)行操作:(SP)←(SP)-2((SP)+1,(SP))←(IP)(IP)←(EA)精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)段間直接遠(yuǎn)調(diào)用:CALLDST執(zhí)行操作:(SP)←(SP)-2((SP)+1,(SP))←(CS)(SP)←(SP)-2((SP)+1,(SP))←(IP)(IP)←偏移(piānyí)地址(CS)←段地址段間間接遠(yuǎn)調(diào)用:CALLDST執(zhí)行操作:(SP)←(SP)-2((SP)+1,(SP))←(CS)(SP)←(SP)-2((SP)+1,(SP))←(IP)(IP)←(EA)(CS)←(EA+2)精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)RET返回指令段內(nèi)近返回:RET執(zhí)行操作(cāozuò):(IP)←((SP)+1,(SP))(SP)←(SP)+2段內(nèi)帶立即數(shù)近返回:RETEXP段間遠(yuǎn)返回:RET執(zhí)行操作(cāozuò):(IP)←((SP)+1,(SP))(SP)←(SP)+2(CS)←((SP)+1,(SP))(SP)←(SP)+2段間帶立即數(shù)遠(yuǎn)返回:RETEXP精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)例:帶立即(lìjí)數(shù)返回(SP)堆棧(duīzhàn)段codesegmentmainprocfar……pushaxpushbxpushcxcallsub……retmainendpsubprocnear……ret6subendpcodeends(IP)(cx)(bx)(ax)(SP)(SP)精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)6.1子程序概述

6.1.1過(guò)程(guòchéng)的定義過(guò)程定義由PROC與ENDP偽指令實(shí)現(xiàn),形式如下(rúxià): 過(guò)程名PROC[NEAR|FAR] <過(guò)程體> 過(guò)程名ENDP1.過(guò)程名在整個(gè)程序中必須是唯一的。2.過(guò)程名本質(zhì)上與標(biāo)號(hào)一樣,也具有3種屬性:段地址、偏移地址和類(lèi)型(NEAR或FAR)。3.PROC后用關(guān)鍵字NEAR、FAR或空,以表示過(guò)程的類(lèi)型(缺省為NEAR)。精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)6.1.2過(guò)程調(diào)用(diàoyòng)和返回1.過(guò)程調(diào)用和返回指令(1)CALL:過(guò)程調(diào)用與JMP指令類(lèi)似,CALL指令包括下列4種調(diào)用方式:段內(nèi)直接調(diào)用(Intrasegment/DirectCall)段間直接調(diào)用(Intersegment/DirectCall)段內(nèi)間接(jiànjiē)調(diào)用(Intrasegment/IndirectCall)段間間接(jiànjiē)調(diào)用(Intersegment/IndirectCall)段內(nèi)調(diào)用在同一代碼段內(nèi)進(jìn)行,又稱(chēng)近(Near)調(diào)用;段間調(diào)用可以在不同代碼段之間進(jìn)行,又稱(chēng)遠(yuǎn)(Far)調(diào)用。精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)語(yǔ)法格式: CALLProcName 段內(nèi)直接調(diào)用:IP進(jìn)棧,IP=label的偏移地址; 段間直接調(diào)用:CS:IP進(jìn)棧,CS:IP=label的分段地址

功能描述:(1)返回地址進(jìn)棧。 遠(yuǎn)調(diào)用:CS與IP(下一條指令(zhǐlìng)的地址)依次進(jìn)棧。 近調(diào)用:IP(下一條指令(zhǐlìng)的16位偏移地址)進(jìn)棧。(2)轉(zhuǎn)移到過(guò)程的第1條指令(zhǐlìng)去執(zhí)行。 遠(yuǎn)調(diào)用:根據(jù)操作數(shù),將32位地址送CS:IP。 近調(diào)用:根據(jù)操作數(shù),將16位偏移地址送IP。對(duì)標(biāo)志位的影響:無(wú)。精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)(2)RET指令RET(Return):過(guò)程返回語(yǔ)法格式: RET ;近返回或遠(yuǎn)返回 RET imm16 ;近返回或遠(yuǎn)返回,并調(diào)整堆棧:SP=SP+imm16功能描述(miáoshù): RET:返回地址出棧,從而實(shí)現(xiàn)轉(zhuǎn)移到返回地址處。其中, 遠(yuǎn)返回:POP1個(gè)雙字到CS:IP。 近返回:POP1個(gè)字到IP。 RETimm16:在返回地址出棧后,CPU立即將imm16加到堆棧指針SP。這種機(jī)制用來(lái)在返回前將參數(shù)從棧中移出。對(duì)標(biāo)志位的影響:無(wú)。說(shuō)明:RET由匯編程序根據(jù)其所在過(guò)程的類(lèi)型(NEAR或FAR)決定是近返回還是遠(yuǎn)返回。缺省為近返回。精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)2.使用(shǐyòng)過(guò)程應(yīng)注意的問(wèn)題在過(guò)程體內(nèi)必須有一條RET指令被執(zhí)行到。如果在過(guò)程內(nèi)沒(méi)有執(zhí)行到RET或其它轉(zhuǎn)移指令,程序?qū)⒗^續(xù)執(zhí)行ENDP后的指令。正確選擇過(guò)程的類(lèi)型。通?;谙铝性瓌t:若過(guò)程只在同一代碼段中被調(diào)用,則定義為NEAR。若過(guò)程可以在不同代碼段中被調(diào)用,則定義為FAR。通常要保證RET指令執(zhí)行前,棧頂內(nèi)容正好是返回地址。注意保護(hù)相關(guān)寄存器的值。通常,除了作為返回參數(shù)的寄存器外,過(guò)程不應(yīng)改變其它寄存器的值??梢詫⑦^(guò)程定義放在單獨(dú)的代碼段中。若過(guò)程定義與主程序處于同一代碼段,則要保證其只有被調(diào)用時(shí),才會(huì)執(zhí)行。精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)3.保存(bǎocún)和恢復(fù)寄存器例:SUBTPROCNEARPUSHAXPUSHBXPUSHCX……POPCXPOPBXPOPAXRETSUBTENDP精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)【例6.1】分析下列程序(chéngxù),描述它的功能。dsegSEGMENTbufDB80,81DUP(0)dsegENDSssegSEGMENTSTACKDW64DUP(0)ssegENDScsegSEGMENTASSUMECS:cseg,DS:dseg,SS:sseg精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)crPROC(NEAR)MOVAH,2MOVDL,13INT21HMOVDL,10INT21HRETcrENDP精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)main:MOVAX,dsegMOVDS,AXLEADX,bufMOVAH,10INT21H;輸入一個(gè)符號(hào)串CALLcrMOVAH,1INT21H;輸入一個(gè)字符(zìfú)MOVBL,AL;用BL保存讀入的字符(zìfú)LEASI,BUF+2MOVCX,BUF+1精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)lab2:MOVDL,[SI]CMPDL,BLJZlab1;等于(děngyú)第2次輸入的符號(hào)則轉(zhuǎn)MOVAH,2INT21HINCSILOOPlab2lab1:MOVAH,4CHINT21HcsegENDSENDmain精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)【例6.2】編寫(xiě)一個(gè)子程序,對(duì)一個(gè)無(wú)符號(hào)的字型數(shù)組的各元素(yuánsù)求和。在調(diào)用子程序之前,已把數(shù)組的段地址放在DS中,起始偏移地址放在寄存器SI中,數(shù)組元素(yuánsù)個(gè)數(shù)(>0)放在CX中。要求子程序把計(jì)算結(jié)果以雙字的形式存放,高位放在DX中,低位放在AX中。sumPROCNEARPUSHBX;保護(hù)(bǎohù)用到的寄存器BXXORAX,AXMOVDX,AX;求和前先把存放結(jié)果的DX,AX清0MOVBX,AX精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)s1:ADDAX,[BX+SI];把一個(gè)(yīɡè)元素加到AX中ADCDX,0;若有進(jìn)位,DX加1INCBXINCBX;BX加2,指向數(shù)組的下一元素LOOPs1POPBX;恢復(fù)寄存器BX的值RETsumENDP精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)6.2過(guò)程(guòchéng)的參數(shù)傳遞參數(shù)的分類(lèi):入口參數(shù):由調(diào)用者向過(guò)程傳遞的數(shù)據(jù),作為(zuòwéi)過(guò)程的輸入?yún)?shù)。出口參數(shù):由過(guò)程向調(diào)用者返回的數(shù)據(jù),作為(zuòwéi)過(guò)程的輸出參數(shù)。根據(jù)問(wèn)題的需要,過(guò)程可以只有入口參數(shù)或只有出口參數(shù),也可以二者兼有。對(duì)于過(guò)程與調(diào)用者之間的參數(shù)傳遞,可根據(jù)傳遞的數(shù)據(jù)量,選擇采用寄存器、變量或堆棧等方式。由于過(guò)程是相對(duì)獨(dú)立的功能塊,因此,在定義過(guò)程時(shí),通常要加上適當(dāng)?shù)淖⑨專(zhuān)饕üδ?、入口參?shù)與出口參數(shù)等。精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)6.2.1用變量傳遞(chuándì)參數(shù)在程序中定義全局變量,如放在數(shù)據(jù)(shùjù)段,過(guò)程直接按名訪問(wèn)該變量。過(guò)程直接以變量作為參數(shù),雖然方便,但通用性較差。

【例6.3】編寫(xiě)一個(gè)子程序,以放在DS段中year的公元年份為入口參數(shù),判斷該年是否為閏年。另有一個(gè)應(yīng)用程序,它已定義了一個(gè)字節(jié)型數(shù)組t,依次存放著12個(gè)月的每月天數(shù),其中2月份的天數(shù)是28。應(yīng)用程序已經(jīng)在DS段中存放了年份值,利用前面編寫(xiě)的子程序,編寫(xiě)程序段調(diào)整數(shù)組t中2月份的天數(shù)。精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)【解】;功能:根據(jù)一個(gè)年份是否為閏年,設(shè)置該年2月份的天數(shù);入口(rùkǒu):DS段中的字型變量year=公元年份;出口:DS段中的字節(jié)型變量t+1=該年2月份天數(shù);破壞寄存器:無(wú)jud1PROCNEARPUSHAXPUSHBXPUSHCXPUSHDXMOVBYTEPTR[t+1],28MOVAX,[year]精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)MOVDX,0MOVBX,4DIVBX;除以4CMPDX,0JNZlab1;不能整除4則不是閏年,轉(zhuǎn)MOVAX,[year];取回(qǔhuí)年份值MOVBX,100DIVBX;除以100CMPDX,0JNZlab2;不能整除100則是閏年,轉(zhuǎn)MOVAX,[year]MOVBX,400DIVBX;除以400精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)CMPDX,0JNZlab1lab2:INCBYTEPTR[t+1];是閏年(rùnnián),把天數(shù)加1,設(shè)置出口參數(shù)lab1:POPDXPOPCXPOPBXPOPAXRETJud1ENDP精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)6.2.2用寄存器傳遞(chuándì)參數(shù)通過(guò)寄存器傳遞數(shù)據(jù)或數(shù)據(jù)地址。通常選擇AL、AX、DX:AX(或EAX)傳遞字節(jié)、字或雙字。傳遞16位偏移(piānyí)地址最好選擇SI、DI或BX,傳遞32位地址可以用DS:BX、DS:SI、DS:DI、ES:BX、ES:SI或ES:DI等。精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)【例6.4】用寄存器傳遞參數(shù),編寫(xiě)例6.3要求的子程序。【解】;功能:判斷一個(gè)年份是否為閏年;入口:AX=公元年份;出口(chūkǒu):CF,1表示是閏年,0表示非閏年;破壞寄存器:AXjudPROCNEARPUSHBXPUSHCXPUSHDXMOVCX,AX;臨時(shí)保存年份值MOVDX,0MOVBX,4精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)DIVBX;除以4,為預(yù)防溢出(yìchū),用雙字除以字CMPDX,0JNZlab1;不能整除4則不是閏年,轉(zhuǎn)MOVAX,CX;取回年份值MOVBX,100DIVBX;除以100CMPDX,0JNZlab2;不能整除100則是閏年,轉(zhuǎn)MOVAX,CXMOVBX,400DIVBX;除以400CMPDX,0JZlab2精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)lab1:CLC;把CF清0表示非閏年,設(shè)置出口參數(shù)JMPlab3lab2:STC;把CF置1表示是閏年,設(shè)置出口參數(shù)lab3:POPDXPOPCXPOPBXRETjudENDP對(duì)于DX中存放的年份值,需要先放到AX中,才能調(diào)用子程序jud,然后(ránhòu)以調(diào)用返回后的CF值決定是否把t數(shù)組中表示2月份天數(shù)的[t+1]加1。程序段如下:MOVAX,DXCALLjudADCBYTEPTR[t+1],0;原值+0+CF精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)6.2.3用地址表傳遞(chuándì)參數(shù)建立一個(gè)(yīɡè)地址表,存放所有參數(shù)的地址,傳遞地址表的首地址給過(guò)程。這種方法特別適合于參數(shù)較多的情況。精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)6.2.4用堆棧(duīzhàn)傳遞參數(shù)過(guò)程(guòchéng)從堆棧得到入口參數(shù),返回前將出口參數(shù)寫(xiě)入堆棧;調(diào)用者通過(guò)出棧得到返回參數(shù)。過(guò)程(guòchéng)從堆棧存取參數(shù)時(shí),通常使用BP,因?yàn)槠潆[含的段地址在SS中。采用堆棧傳遞參數(shù)時(shí),典型的過(guò)程(guòchéng)結(jié)構(gòu)如下: StdProc proc near push bp mov bp,sp ;BP指向當(dāng)前棧頂,用于取入口參數(shù) ... pop bp ret ParmSize;返回前從堆棧移出入口參數(shù) StdProcendp其中,ParmSize是過(guò)程(guòchéng)被調(diào)用前進(jìn)棧的入口參數(shù)的字節(jié)數(shù)。精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)【例6.5】用堆棧傳遞入口參數(shù),編寫(xiě)子程序,把接收的兩個(gè)(liǎnɡɡè)帶符號(hào)整數(shù)中大的一個(gè)作為結(jié)果,出口參數(shù)放在AX中?!窘狻?功能:求兩個(gè)(liǎnɡɡè)帶符號(hào)整數(shù)中大的一個(gè);入口參數(shù):調(diào)用前把兩個(gè)(liǎnɡɡè)帶符號(hào)整數(shù)入棧;出口參數(shù):AX;破壞寄存器:AX精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)_maxPROCNEARPUSHBP;暫時(shí)保存寄存器BP的值MOVBP,SPMOVAX,WORDPTR[BP+6];取第1個(gè)參數(shù)(cānshù)到AXCMPAX,WORDPTR[BP+4];與第2個(gè)參數(shù)(cānshù)比較JGElabMOVAX,WORDPTR[BP+4];取第2個(gè)參數(shù)(cānshù)到AXlab:POPBP;恢復(fù)寄存器BP的原值RET_maxENDP精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)6.3子程序舉例(jǔlì)【例】編寫(xiě)子程序write,把整型數(shù)據(jù)以十進(jìn)制形式顯示到屏幕上?!痉治觥繀⒄崭呒?jí)語(yǔ)言中輸出語(yǔ)句的功能,write子程序應(yīng)具備這樣(zhèyàng)一些特點(diǎn):被顯示的整數(shù)可以是無(wú)符號(hào)的,也可以是帶符號(hào)的,但需要明確指出是哪一種情況;整數(shù)在計(jì)算機(jī)內(nèi)部是字型數(shù)據(jù),范圍為-32768~+65535;被輸出的數(shù)據(jù)是帶符號(hào)數(shù)時(shí),負(fù)號(hào)“-”必須輸出,而正號(hào)“+”總是省略;輸出數(shù)據(jù)的最大位數(shù)是十進(jìn)制的5位,當(dāng)計(jì)算出5位中的某一位是0時(shí),需要判斷這個(gè)0是否應(yīng)該輸出,輸出條件是前面已經(jīng)輸出過(guò)非0數(shù)字或者這個(gè)0是個(gè)位數(shù)。輸出的數(shù)必須是以ASCII碼形式存放在DL中。精品資料2/4/202380x86匯編語(yǔ)言程序設(shè)計(jì)【解】;功能:在屏幕上輸出整數(shù)值;入口:AX=待輸出的整數(shù);CF=為0表示輸出無(wú)符號(hào)數(shù),為1則輸出帶符號(hào)數(shù);出口:無(wú);破壞寄存器:無(wú);DX、AX-存放整數(shù),BX-分離各整數(shù)位(shùwèi)時(shí)除數(shù),CX-分離各數(shù)位(shùwèi)次數(shù),;SI-表示是否輸出過(guò)非0數(shù)字,DI-暫存輸出的整數(shù)writePROCNEARPUSHBXPUSHCXPUSHDXPUSHSI精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)PUSHDIMOVSI,0;SI清0表示還沒(méi)有輸出過(guò)非0數(shù)字MOVDI,AX ;保存(bǎocún)待輸出的數(shù)值到DI中JNCw1 ;作為無(wú)符號(hào)數(shù)輸出轉(zhuǎn)CMPAX,0JGEw1;AX是正數(shù)轉(zhuǎn)MOVDL,'-'MOVAH,2INT21H ;輸出負(fù)號(hào)NEGDI ;取絕對(duì)值放在DI中精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)w1:MOVBX,10000;第一次的除數(shù)MOVCX,5;重復(fù)次數(shù)w2:MOVAX,DI;取回待輸出數(shù)值MOVDX,0;被除數(shù)高位清0DIVBX ;做雙字除以字的除法MOVDI,DX;余數(shù)保存(bǎocún)在DI中CMPAL,0JNEw3 ;商非0轉(zhuǎn)CMPSI,0 ;商是0,判斷前面是否輸出過(guò)數(shù)字JNEw3 ;前面已輸出過(guò)數(shù)字,則當(dāng)前的0應(yīng)該輸出,轉(zhuǎn)CMPCX,1 ;判斷是否是個(gè)位JNEw4 ;不是個(gè)位則不輸出當(dāng)前的0,轉(zhuǎn)精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)w3:MOVDL,ALADDDL,30HMOVAH,2INT21H ;輸出當(dāng)前這一位數(shù)字(shùzì)MOVSI,1 ;用SI記載已輸出過(guò)數(shù)字(shùzì)w4:MOVAX,BXMOVDX,0MOVBX,10DIVBXMOVBX,AX;bx/10=>bx,計(jì)算下一次的除數(shù)LOOPw2精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)POPDIPOPSIPOPDXPOPCXPOPBXRETwriteENDP精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)【例6.11】編寫(xiě)子程序read,從鍵盤(pán)上讀入一個(gè)整數(shù)。【分析】為了盡可能與高級(jí)語(yǔ)言中整數(shù)輸入的情況一致,子程序不僅要能讀入正確輸入時(shí)的數(shù)據(jù),還要能對(duì)不正確的輸入做出適當(dāng)?shù)姆磻?yīng),因此設(shè)計(jì)上要注意幾個(gè)問(wèn)題:首先是要用字符串輸入方式(DOS的10號(hào)子功能),因?yàn)檫@種方式支持退格鍵修改(xiūgǎi)功能,因而需要準(zhǔn)備相應(yīng)的輸入緩沖區(qū);出口參數(shù)需要兩個(gè),以CF的設(shè)置表示輸入是否正確,當(dāng)輸入正確時(shí)把整數(shù)值放在AX中作為輸入結(jié)果;要能夠跳過(guò)若干個(gè)連續(xù)的空格符;要能夠處理正負(fù)號(hào)。精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)【解】;功能:從鍵盤(pán)讀入整數(shù)值;入口:CF=為0表示廢棄多余符號(hào)(fúhào)。;為1則把多余符號(hào)(fúhào)留作下一次輸入。;出口:CF=0表示正常讀入,1表示輸入有錯(cuò);破壞寄存器:無(wú)readPROCNEARPUSHBXPUSHCXPUSHDXPUSHSIPUSHDS;以上為寄存器保護(hù)精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)PUSHFPUSHCSPOPDS;令DS取CS的值rd1:MOVBX,CS:[point];取上次(shànɡcì)輸入后已讀取到輸入串的位置rd2:INCBXCMPCS:[bufin+BX+1],''JErd2;跳過(guò)空格CMPCS:[bufin+BX+1],13JNZrd4;不是回車(chē)鍵,轉(zhuǎn)讀入數(shù)值處理精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)rd3:LEADX,CS:[bufin]MOVAH,10INT21H;遇回車(chē)鍵要求再次輸入MOVAH,2MOVDL,10INT21H;換行MOVCS:[point],0JMPrd1;對(duì)新的輸入再轉(zhuǎn)去(zhuǎnqù)跳過(guò)前導(dǎo)空格rd4:MOVSI,BXDECSI;令SI指向輸入串的第一個(gè)有效字符MOVAX,0MOVBX,10MOVCX,0精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)rd5:CMPCS:[bufin+SI+2],'+'JNZrd6;不是正號(hào)轉(zhuǎn)CMPCL,1JErd10;已讀到正確(zhèngquè)數(shù)值后,遇正號(hào)轉(zhuǎn)CMPCL,0JErd8;正號(hào)是第一個(gè)有效字符轉(zhuǎn)STC;輸入有錯(cuò)JMPrd13精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)rd6:CMPCS:[bufin+SI+2],'-'JNZrd9CMPCL,1;已讀到正確數(shù)值后,遇負(fù)號(hào)(fùhào)轉(zhuǎn)JErd10CMPCL,0JErd7;負(fù)號(hào)(fùhào)是第一個(gè)有效字符轉(zhuǎn)STC;輸入有錯(cuò)JMPrd13精品資料2/4/202380x86匯編語(yǔ)言(huìbiānyǔyán)程序設(shè)計(jì)rd7:MOVCH,1;記下(jìxià)讀入的是負(fù)數(shù)rd8:MOVCL,2;記下(jìxià)已讀入正/負(fù)號(hào)INCSI;指向下一字符JMPrd5rd9:CMPCS:[bufin+SI+2],'0'JBrd10;不是數(shù)字轉(zhuǎn)CMPCS:[bufin+SI+2],'9'JArd10

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論