第五章基本程序設(shè)計(jì)技術(shù)_第1頁(yè)
第五章基本程序設(shè)計(jì)技術(shù)_第2頁(yè)
第五章基本程序設(shè)計(jì)技術(shù)_第3頁(yè)
第五章基本程序設(shè)計(jì)技術(shù)_第4頁(yè)
第五章基本程序設(shè)計(jì)技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩102頁(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)介

一般源程序的基本結(jié)構(gòu):第五章程序控制結(jié)構(gòu)及其設(shè)計(jì)技術(shù)順序程序分支程序循環(huán)程序子程序15.1順序程序設(shè)計(jì)順序程序是指程序的結(jié)構(gòu)從開(kāi)始到結(jié)尾一直是順序執(zhí)行,中途沒(méi)有分支。例5.2.1試編寫程序計(jì)算以下表達(dá)式:

Z=(3X+Y-5)/2設(shè)X、Y的值放在字變量VARX、VARY中,結(jié)果存放在VARZ中。算法分析:1、乘2n和除2n可以使用算術(shù)左移和右移實(shí)現(xiàn)

2、其它非2n的乘除運(yùn)算可以用移位和加減組合運(yùn)算來(lái)實(shí)現(xiàn)。如3X可以分解成2X+X2TITLEEQUATIONCOMPUTEDATASEGMENTVARXDW15VARYDW10VARZDW?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTPROC1PROCFARASSUMECS:CODE,DS:DATA,SS:STACK13START:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVAX,VARXSHLAX,1;2*XADDAX,VARX;3*XADDAX,VARY;3X+YSUBAX,5;3*X+Y-5SARAX,1;(3*X+Y-5)/2MOVVARZ,AX;存結(jié)果

RETPROC1ENDPCODEENDSENDSTART4例5.2.2利用學(xué)號(hào)查學(xué)生的數(shù)學(xué)成績(jī)表。算法分析:首先在數(shù)據(jù)段中建立一個(gè)成績(jī)表TABLE,在表中各學(xué)生的成績(jī)按照學(xué)號(hào)從小到大的順序存放。要查的學(xué)號(hào)存放在變量NUM中,查表的結(jié)果放在變量MATH中。5

TITLETABLELOOKUPDATASEGMENTTABLEDB81,78,90,64,85,76,93,82,57,80DB73,62,87,77,74,86,95,91,82,71NUMDB8MATHDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK16START:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABLE;BX指向表首址

XORAH,AHMOVAL,NUMDECAL;實(shí)際學(xué)號(hào)是從1開(kāi)始的

ADDBX,AX;BX加上學(xué)號(hào)指向要查的成績(jī)

MOVAL,[BX];查到成績(jī)送ALMOVMATH,AL;存結(jié)果

MOVAH,4CH;返回DOSINT21HCOSEGENDSENDSTART7在上述程序中,如果使用換碼指令XLAT,可以簡(jiǎn)化程序。XLAT表首址;功能為:AL<=((BX)+(AL))換碼指令格式為:其中表首址可以省略。在XLAT指令執(zhí)行前,要求將表首址的偏移量送入BX中,待查項(xiàng)與表首址之間的字節(jié)距離(0~255)送入AL中。8一.轉(zhuǎn)移指令目標(biāo)是程序中的一個(gè)標(biāo)號(hào),表示轉(zhuǎn)移指令所轉(zhuǎn)移的目的地指令的地址。1.無(wú)條件轉(zhuǎn)移指令5.2分支程序設(shè)計(jì)分支程序結(jié)構(gòu)是指程序的執(zhí)行順序?qū)⒏鶕?jù)某些指令的執(zhí)行結(jié)果,選擇某些指令執(zhí)行或不執(zhí)行。分支程序的實(shí)現(xiàn)主要是由轉(zhuǎn)移指令完成。格式:JMP目標(biāo)9

:

JMPTARGET:TARGET:...........:根據(jù)目標(biāo)所在的位置,JMP指令分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移。(1)段內(nèi)轉(zhuǎn)移

JMP指令與轉(zhuǎn)移目標(biāo)位于同一個(gè)代碼段內(nèi)。轉(zhuǎn)移時(shí)IP寄存器內(nèi)容被改變,而CS保持不變。程序結(jié)構(gòu):10

..….

JMPLABEL1……LABEL1:……目標(biāo)地址可以有兩種提供方法:A.段內(nèi)轉(zhuǎn)移直接尋址----指令中直接給出轉(zhuǎn)移目的地標(biāo)號(hào)例如

..….LABEL2:…………JMPLABEL2或者11OPCODEDISP指令編碼:

OPCODE字段長(zhǎng)度為一個(gè)字節(jié),DISP字段根據(jù)OPCODE字段為不同編碼時(shí)分別為1個(gè)或2個(gè)字節(jié)。DISP為相對(duì)位移量,用補(bǔ)碼表示。7015/70指令的功能為:IP<=(IP)+DISP

0EBH時(shí),為短轉(zhuǎn)移,DISP為8位,轉(zhuǎn)移偏移量:

-128—+127字節(jié)OPCODE=

0E9H時(shí),為長(zhǎng)轉(zhuǎn)移,DISP為16位,轉(zhuǎn)移偏移量:

-32768—+3276712注意:轉(zhuǎn)移偏移量是相對(duì)轉(zhuǎn)移指令的下一條指令的起始地址如果是相對(duì)于該轉(zhuǎn)移指令的地址而言,則相對(duì)偏移量的值為:-126~+129字節(jié)或-32765~+3277013OPCODEMOD100R/M位移量B.段內(nèi)轉(zhuǎn)移間接尋址——指令中指定一個(gè)16位通用寄存器或字存儲(chǔ)單元,其內(nèi)容為轉(zhuǎn)移目標(biāo)地址。例如:JMPCX

JMPWORDPTR[BX][SI]指令編碼格式:707015/70指令執(zhí)行時(shí),由MOD、R/M以及位移量確定一個(gè)寄存器或有效地址EA,將所指內(nèi)容送入IP中。IP<=(通用寄存器)或IP<=(EA)14(2)段間轉(zhuǎn)移——JMP指令與目標(biāo)地址不在同一個(gè)段內(nèi)COSEG1SEGMENTCOSEG2SEGMENT:JMPFARPTRTARGETTARGET:.........::COSEG1ENDSCOSEG2ENDSA、段間轉(zhuǎn)移直接尋址在JMP指令中,目標(biāo)地址符前面加屬性說(shuō)明為FAR。例如:執(zhí)行該轉(zhuǎn)移指令,將同時(shí)改變CS和IP的內(nèi)容。157070707070OPCODEOFFSET-LOWOFFSET-HIGHSEG-LOWSEG-HIGH指令執(zhí)行時(shí),將有:

IP<=目標(biāo)地址偏移量

CS<=目標(biāo)地址段基值指令編碼格式:16B.段間間接尋址——目標(biāo)地址存放在一個(gè)雙字存儲(chǔ)單元中低地址字單元內(nèi)容為偏移量,高地址字單元內(nèi)容為段基值。指令編碼格式:OPCODEMOD101R/M位移量707654321015/70指令執(zhí)行時(shí),將有:

IP<=(EA)EA字單元內(nèi)容

CS<=(EA+2)EA+2字單元內(nèi)容例:JMPDWORDPTRADDR1;雙字單元ADDR1的內(nèi)容為轉(zhuǎn)移目的地的偏移量和段基值。

JMPDWORDPTR[BX];由BX所指向的一個(gè)雙字存儲(chǔ)單元內(nèi)容為轉(zhuǎn)移目的地的偏移量和段基值。17其中:XX為1—2個(gè)字母組合,用來(lái)表示各種條件。執(zhí)行該指令時(shí),若指定的條件成立,則轉(zhuǎn)移至目標(biāo)處。否則順序執(zhí)行。條件用標(biāo)志寄存器中的一個(gè)或幾個(gè)標(biāo)志位的狀態(tài)來(lái)表示。指令格式與段內(nèi)無(wú)條件轉(zhuǎn)移直接尋址指令的情況相似.但是,該指令中的DISP的長(zhǎng)度為一個(gè)字節(jié)。因此轉(zhuǎn)移范圍為-128—+127字節(jié)。OPCODEDISP7070指令編碼格式:2.條件轉(zhuǎn)移指令8086/8088指令系統(tǒng)有18條條件轉(zhuǎn)移指令一般格式為:JXX目標(biāo)18

標(biāo)志位指令轉(zhuǎn)移條件含義

CFJCCF=1有進(jìn)位/借位轉(zhuǎn)移

JNCCF=0無(wú)進(jìn)位/借位轉(zhuǎn)移

ZFJE/JZZF=1相等/等于0轉(zhuǎn)移

JNE/JNZZF=0不相等/不等于0轉(zhuǎn)移

SFJSSF=1是負(fù)數(shù)轉(zhuǎn)移

JNSSF=0是正數(shù)轉(zhuǎn)移

OFJOOF=1有溢出轉(zhuǎn)移

JNOOF=0無(wú)溢出轉(zhuǎn)移

PFJP/JPEPF=1有偶數(shù)個(gè)1轉(zhuǎn)移

JNP/JPOPF=0有奇數(shù)個(gè)1轉(zhuǎn)移條件轉(zhuǎn)移指令分為三大類:(1)簡(jiǎn)單條件轉(zhuǎn)移指令——條件為單個(gè)標(biāo)志位的狀態(tài)19指令轉(zhuǎn)移條件含義

JA/JNBECF=0且ZF=0A>B轉(zhuǎn)移

JAE/JNBCF=0或ZF=1A≥B轉(zhuǎn)移

JB/JNAECF=1且ZF=0A<B轉(zhuǎn)移

JBE/JNACF=1或

ZF=1A≤B轉(zhuǎn)移(2)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移——在轉(zhuǎn)移指令前執(zhí)行了兩個(gè)無(wú)符號(hào)數(shù)A和B相減的指令(A—B)20指令轉(zhuǎn)移條件含義

JG/JNLESF=OF且ZF=0A>B轉(zhuǎn)移

JGE/JNLSF=OF或ZF=1A≥B轉(zhuǎn)移

JL/JNGESF≠OF且ZF=0A<B轉(zhuǎn)移

JLE/JNGSF≠OF或ZF=1A≤B轉(zhuǎn)移(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令——在轉(zhuǎn)移指令之前執(zhí)行了兩個(gè)帶符號(hào)數(shù)相減(A—B)的指令對(duì)于帶符號(hào)數(shù)的比較,需要使用符號(hào)標(biāo)志位SF、溢出標(biāo)志位OF和零標(biāo)志位ZF來(lái)判斷。下面以A>B的情況為例進(jìn)行分析。21A>B可以分為以下幾種情況:1.A和B都為負(fù)數(shù)若要A>B,則A-B的結(jié)果一定是正數(shù)(SF=0),也不會(huì)發(fā)生溢出(OF=0),且結(jié)果不為零(ZF=0)。2.A和B都為正數(shù)若要A>B,則A-B的結(jié)果一定是正數(shù)(SF=0),也不會(huì)發(fā)生溢出(OF=0),并且結(jié)果不為零(ZF=0)。3.A為正數(shù),B為負(fù)數(shù)執(zhí)行A-B的結(jié)果可能有兩種情況:(1)不發(fā)生溢出。這時(shí)結(jié)果為正數(shù)(SF=0),即有SF=OF。(2)發(fā)生溢出。這時(shí)結(jié)果變?yōu)樨?fù)數(shù)(SF=1),即有SF=OF。22二、分支程序設(shè)計(jì)分支程序的結(jié)構(gòu)有兩種常見(jiàn)結(jié)構(gòu):1、用比較/測(cè)試指令+條件轉(zhuǎn)移指令實(shí)現(xiàn)分支比較指令:CMPDEST,SRC該指令的功能與減法指令SUB相似,區(qū)別是(DEST)-(SRC)的差值不送入DEST。而其結(jié)果影響標(biāo)志位。23這種類型的分支程序有兩種結(jié)構(gòu)比較/測(cè)試判定條件程序段1程序段2滿足不滿足比較/測(cè)試判定條件程序段滿足不滿足一條條件轉(zhuǎn)移指令只能實(shí)現(xiàn)兩條分支程序的設(shè)計(jì)。要實(shí)現(xiàn)更多條分支的程序,需使用多條條件轉(zhuǎn)移指令。24例5.3.2數(shù)據(jù)段的ARY數(shù)組中存放有10個(gè)無(wú)符號(hào)數(shù),試找出其中最大者送入MAX單元。算法分析:依次比較相鄰兩數(shù)的大小,將較大的送入AL中。每次比較后,較大數(shù)存放在AL中,相當(dāng)于較大的數(shù)往下傳。比較一共要做9次。比較結(jié)束后,AL中存放的就是最大數(shù)。25DATASEGMENTARYDB17,5,40,0,67,12,34,78,32,10MAXDB?DATAENDS......MOVSI,OFFSETARY;SI指向ARY的第一個(gè)元素

MOVCX,9;CX作次數(shù)計(jì)數(shù)器

MOVAL,[SI];取第一個(gè)元素到ALLOP:INCSI;SI指向后一個(gè)元素

CMPAL,[SI];比較兩個(gè)數(shù)

JAEBIGER;前元素≥后元素轉(zhuǎn)移

MOVAL,[SI];取較大數(shù)到ALBIGER:DECCX;減1計(jì)數(shù)

JNZLOP;未比較完轉(zhuǎn)回去,否則順序執(zhí)行

MOVMAX,AL;存最大數(shù)

.........26例5.3.4編寫一程序,實(shí)現(xiàn)將存儲(chǔ)器中的源數(shù)據(jù)塊傳送到目的數(shù)據(jù)塊。兩個(gè)數(shù)據(jù)塊分離目的塊源塊0可以從首址或末址開(kāi)始傳送源塊首址<目的塊首址目的塊源塊0必須從數(shù)據(jù)塊末址開(kāi)始傳送源塊首址>目的塊首址目的塊源塊0必須從數(shù)據(jù)塊首址開(kāi)始傳送在存儲(chǔ)器中兩個(gè)數(shù)據(jù)塊的存放有三種情況:兩個(gè)數(shù)據(jù)塊分離和有部分重疊。27三種相對(duì)位置情況的傳送方法:因此,我們?cè)O(shè)定:當(dāng)源塊首地址<目的塊首地址時(shí),從數(shù)據(jù)塊末地址開(kāi)始傳送。反之,則從首地址開(kāi)始傳送。對(duì)于源塊和目的塊分離的情況,不論是從數(shù)據(jù)塊的首址還是末址開(kāi)始傳送都可以。對(duì)于源塊與目的塊有重疊且源塊首址>目的塊首址的情況,必須從數(shù)據(jù)塊首址開(kāi)始傳送。對(duì)于源塊與目的塊有重疊且源塊首址<目的塊首址的情況,必須從數(shù)據(jù)塊末址開(kāi)始傳送。28SI<=源數(shù)據(jù)塊首址DI<=目的數(shù)據(jù)塊首址CX<=傳送的字節(jié)數(shù)(SI)>(DI)?形成末址SI<=(SI)+(CX)-1DI<=(DI)+(CX)-1(DI)<=((SI))SI<=(SI)-1DI<=(DI)-1CX<=(CX)-1(CX)=0?(DI)<=((SI))SI<=(SI)+1DI<=(DI)+1CX<=(CX)-1(CX)=0?結(jié)束NYNYNYBOTTOMTOP開(kāi)始29

TITLEDATABLOCKMOVEDATASEGMENTORG$+20HSTRGDB‘ABCDEFGHIJ’;數(shù)據(jù)塊LENGEQU$-STRG;數(shù)據(jù)塊字節(jié)長(zhǎng)度BLOCK1DWSTRG;源塊首址BLOCK2DWSTRG-5;目的塊首址DATAENDSSTACK1SEGMENTSTACKDW20HDUP(0)STACK1ENDS30COSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1BEGIN:MOVAX,DATAMOVDS,AXMOVCX,LENG;設(shè)置計(jì)數(shù)器初值

MOVSI,BLOCK1;SI指向源塊首址

MOVDI,BLOCK2;DI指向目的塊首址

CMPSI,DI;源塊首址>目的塊首址嗎?

JATOP;大于則轉(zhuǎn)到TOP處,否則順序執(zhí)行

ADDSI,LENG-1;SI指向源塊末址

ADDDI,LENG-1;DI指向目的塊末址31BOTTOM:MOVAL,[SI];從末址開(kāi)始傳送

MOV[DI],ALDECSIDECDIDECCXJNEBOTTOMJMPEND1TOP:MOVAL,[SI];從首址開(kāi)始傳送

MOV[DI],ALINCSIINCDIDECCXJNETOPEND1:MOVAH,4CHINT21HCOSEGENDSENDBEGIN322、用跳轉(zhuǎn)表形成多路分支當(dāng)程序的分支數(shù)量較多時(shí),采用跳轉(zhuǎn)表的方法可以使程序長(zhǎng)度變短,跳轉(zhuǎn)表有兩種構(gòu)成方法:(1)跳轉(zhuǎn)表用入口地址構(gòu)成在程序中將各分支的入口地址組織成一個(gè)表放在數(shù)據(jù)段中,在程序中通過(guò)查表的方法獲得各分支的入口地址。33例5.3.5設(shè)某程序有10路分支,試根據(jù)變量N的值(1~10),將程序轉(zhuǎn)移到其中的一路分支去。設(shè)10路分支程序段的入口地址分別為:BRAN1、BRAN2......BRAN10。當(dāng)變量N為1時(shí),轉(zhuǎn)移到BRAN1;N為2時(shí),轉(zhuǎn)移到BRAN2,依次類推。在跳轉(zhuǎn)表中每?jī)蓚€(gè)字節(jié)存放一個(gè)入口地址的偏移量,如右圖所示。跳轉(zhuǎn)表程序中,先根據(jù)N的值形成查表地址:(N-1)×2+表首址。34開(kāi)始BX<=表首址求查表地址:BX<=(N-1)*2+(BX)獲得入口地址:CX<=((BX))(CX)=?結(jié)束N=1BRAN1N=2BRAN2N=10BRAN10……多路分支結(jié)構(gòu)流程圖35TITLEJUMPTABLEOFADDRESSDATASEGMENTATABLEDWBRAN1,BRAN2,BRAN3,...,BRAN10NDB3DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AX...

36XORAH,AHMOVAL,NDECALSHLAL,1MOVBX,OFFSETATABLE;BX指向表首址ADDBX,AX;BX指向查表地址MOVCX,[BX];將N對(duì)應(yīng)的分支入口地址送到CX中JMPCX;轉(zhuǎn)移到N對(duì)應(yīng)的分支入口地址37BRAN1: JMPEND1 BRAN2:JMPEND1BRAN3:JMPEND1

BRAN10:END1:MOVAH,4CHINT21HCODEENDSENDSTART38跳轉(zhuǎn)表的每一個(gè)項(xiàng)目就是一條無(wú)條件轉(zhuǎn)移指令。這時(shí)跳轉(zhuǎn)表是代碼段中的一段程序。(2)跳轉(zhuǎn)表用無(wú)條件轉(zhuǎn)移指令構(gòu)成39TITLEJUMPTABLEOFINSTRUCTIONDATASEGMENTNDB3DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AX...MOVBH,0MOVBL,N例5.3.5的源程序可修改為如下程序:40DECBL;四條指令實(shí)現(xiàn)(N-1)*3

MOVAL,BL

SHLBL,1

ADDBL,AL

ADDBX,OFFSETITABLE;BX指向查表地址

JMPBX;轉(zhuǎn)移到N對(duì)應(yīng)的JMP指令

JMPBRAN1;JMP指令構(gòu)成的跳轉(zhuǎn)表JMPBRAN2

JMPBRAN3::JMPBRAN10ITABLE:41BRAN1:...:JMPEND1BRAN2:...:JMPEND1::BRAN10:...::END1:MOVAH,4CHINT21HCODEENDSENDSTART428086/8088指令系統(tǒng)中有4條循環(huán)控制指令,長(zhǎng)度都是2字節(jié)。OPCODEDISP

7070指令使用CX寄存器做循環(huán)計(jì)數(shù)。循環(huán)控制指令的執(zhí)行對(duì)標(biāo)志位沒(méi)有影響。

DISP:8位補(bǔ)碼表示本指令的下一條指令的首址與目標(biāo)單元之間的字節(jié)距離。指令中指定一定的條件,若條件滿足,則將DISP加入到IP中,即IP<=(IP)+DISP使程序轉(zhuǎn)移到目的指令執(zhí)行。5.3循環(huán)程序設(shè)計(jì)一、循環(huán)控制指令指令編碼格式為:43其中目標(biāo)是程序中的一個(gè)標(biāo)號(hào)。執(zhí)行一次LOOP指令將使:CX<=(CX)—1若(CX)≠0,則轉(zhuǎn)到目標(biāo)處執(zhí)行,否則順序執(zhí)行。

例5.4.1在例5.3.2中,數(shù)據(jù)段的ARY數(shù)組中存放有10個(gè)無(wú)符號(hào)數(shù),試找出其中最大者送入MAX單元。若使用循環(huán)指令,則程序可修改如下:1、LOOP指令格式:LOOP目標(biāo)44DATASEGMENTARYDB17,5,40,0,67,12,34,78,32,10MAXDB?DATAENDS......MOVSI,OFFSETARY;SI指向ARY的第一個(gè)元素

MOVCX,9;CX作次數(shù)計(jì)數(shù)器

MOVAL,[SI];取第一個(gè)元素到ALLOP:INCSI;SI指向后一個(gè)元素

CMPAL,[SI];比較兩個(gè)數(shù)

JAEBIGER;前元素≥后元素轉(zhuǎn)移

MOVAL,[SI];取較大數(shù)到ALBIGER:DECCX;減1計(jì)數(shù)

JNZLOP;未比較完轉(zhuǎn)回去,否則順序執(zhí)行

MOVMAX,AL;存最大數(shù)

.........LOOPLOP45指令執(zhí)行:CX<=(CX)—1,若(CX)≠0且ZF=1,則轉(zhuǎn)到目標(biāo)處執(zhí)行,否則順序執(zhí)行。

例5.4.2編寫一程序,在一字符串中查找第一個(gè)非空格字符,并將其在字符串中的序號(hào)(1~n)送入INDEX單元中。若未找到,則將INDEX單元置為全1。2、LOOPE/LOOPZ指令格式:LOOPE目標(biāo)或LOOPZ目標(biāo)46設(shè)置地址指針初值BX<=-1CX<=傳送的字節(jié)數(shù)(CX)!=0且

STRG[BX]=‘’?比較STRG[BX]與空格‘’BL<=0FEHBX<=(BX)+1CX<=(CX)-1STRG[BX]!=‘’?結(jié)束YN開(kāi)始NBL<=(BL)+1存結(jié)果:INDEX<=(BL)YMOVCX,LENGMOVBX,-1INCBXCMPSTRG[BX],''LOOPENEXTNEXTJNZFOUNDFOUNDMOVBL,0FEHINCBLMOVINDEX,BL47DATASEGMENTSTRGDB‘CHECKNO_SPACE’LENGEQU$-STRGINDEXDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDS48CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVCX,LENG;字符串長(zhǎng)度送入CXMOVBX,-1;設(shè)地址指針初值NEXT:INCBXCMPSTRG[BX],''LOOPENEXT;是空格字符且計(jì)數(shù)不為0,繼續(xù)查找

JNZFOUND;找到非空格字符,轉(zhuǎn)FOUNDMOVBL,0FEH;未找到非空格字符FOUND:INCBL;使位置序號(hào)從1開(kāi)始

MOVINDEX,BL;存結(jié)果

MOVAH,4CHINT21HCODEENDSENDSTART49指令執(zhí)行:CX<=(CX)—1,若(CX)≠0且ZF=0,則轉(zhuǎn)到目標(biāo)處執(zhí)行,否則順序執(zhí)行。

例5.4.3編寫程序,計(jì)算兩個(gè)字節(jié)數(shù)組ARY1和ARY2對(duì)應(yīng)元素之和,一直計(jì)算到兩數(shù)之和為0或數(shù)組結(jié)束為止。并將和存入數(shù)組SUM中,將該數(shù)組的長(zhǎng)度存放在NUM單元中。3、LOOPNE/LOOPNZ指令使用格式:LOOPNE目標(biāo)或LOOPNZ目標(biāo)50設(shè)置地址指針初值BX<=-1CX<=某個(gè)數(shù)組的長(zhǎng)度(CX)!=0且

SUM[BX]!=0?SUM[BX]<=ARY1[BX]+ARY2[BX]BL<=(BL)+1BX<=(BX)+1CX<=(CX)-1SUM[BX]=0?結(jié)束YN開(kāi)始N存結(jié)果:NUM<=(BL)YINCBLMOVCX,LENGMOVBX,-1INCBXMOVAL,ARY1[BX]ADDAL,ARY2[BX]MOVSUM[BX],ALLOOPNENZEROJZZEROMOVNUM,BLNZEROZERO51源程序如下:DATASEGMENTARY1DB12,10,3,5,-1,7,34,8,9,10ARY2DB14,23,6,-2,1,9,45,21,8,24LENGEQUARY2-ARY1SUMDBLENGDUP(?)NUMDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDS

CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1BEGIN:MOVAX,DATA52

MOVDS,AXMOVCX,LENGMOVBX,-1;設(shè)置指針初值NZERO:INCBXMOVAL,ARY1[BX];取被加數(shù)

ADDAL,ARY2[BX]MOVSUM[BX],ALLOOPNENZERO;和不為0轉(zhuǎn)到NZERO處

JZZERO;和為0轉(zhuǎn)到ZERO處

INCBLZERO:MOVNUM,BL;存結(jié)果

MOVAH,4CHINT21HCODEENDSENDBEGIN534、JCXZ指令指令格式:JCXZ目標(biāo)該指令測(cè)試CX的內(nèi)容是否為0,如果(CX)=0,則轉(zhuǎn)移到目標(biāo)處指令,否則順序執(zhí)行。該指令相當(dāng)于條件轉(zhuǎn)移指令。它一般用在一個(gè)循環(huán)的開(kāi)始,當(dāng)一個(gè)循環(huán)的循環(huán)次數(shù)為0時(shí),就不執(zhí)行該循環(huán)。如果沒(méi)有這個(gè)控制,將使得循環(huán)次數(shù)變得非常大(0-1=0FFFFH),從而產(chǎn)生錯(cuò)誤結(jié)果。54程序結(jié)構(gòu)為:

..........

MOVCX,COUNTJCXZNEXTLOP:..........LOOPLOPNEXT:..............55二、循環(huán)程序的結(jié)構(gòu)循環(huán)程序有兩種結(jié)構(gòu)形式1、先執(zhí)行后判斷結(jié)構(gòu)2、先判斷后執(zhí)行結(jié)構(gòu)循環(huán)初始化部分循環(huán)體控制條件結(jié)束處理部分NY循環(huán)初始化部分控制條件結(jié)束處理部分循環(huán)體NY56在循環(huán)程序中主要包括以下四個(gè)部分:用于建立循環(huán)的初始狀態(tài)。包括:循環(huán)次數(shù)計(jì)數(shù)器、地址指針以及其他循環(huán)參數(shù)的初始設(shè)定。循環(huán)程序完成的主要任務(wù)。包括工作部分和修改部分。工作部分:是完成循環(huán)程序任務(wù)的主要程序段。修改部分:為循環(huán)的重復(fù)執(zhí)行,完成某些參數(shù)的修改。1、初始化部分2、循環(huán)體57判斷循環(huán)條件是否成立??梢杂幸韵聝煞N判斷方法:(1)用計(jì)數(shù)控制循環(huán)——循環(huán)次數(shù)已知(2)用條件控制循環(huán)——循環(huán)次數(shù)未知處理循環(huán)結(jié)束后的結(jié)果。如存儲(chǔ)結(jié)果等。3、循環(huán)控制部分4、結(jié)束處理部分58三、單重循環(huán)程序設(shè)計(jì)單重循環(huán)程序的循環(huán)體由順序結(jié)構(gòu)或分支結(jié)構(gòu)組成常選用CX作計(jì)數(shù)器,可選用LOOP、LOOPE或LOOPNE等循環(huán)控制指令。1、計(jì)數(shù)控制循環(huán)59

由于循環(huán)體中有“+”和“-”兩種可能的運(yùn)算,通過(guò)設(shè)置標(biāo)志0和1來(lái)判斷。八個(gè)運(yùn)算表達(dá)式由8位邏輯尺:10011010B來(lái)識(shí)別。

例5.4.4設(shè)有兩個(gè)數(shù)組X和Y,它們都有8個(gè)元素,其元素按下標(biāo)從小到大的順序存放在數(shù)據(jù)段中。試編寫程序完成下列計(jì)算:Z1=X1+Y1Z2=X2-Y2Z3=X3+Y3Z4=X4-Y4Z5=X5-Y5Z6=X6+Y6Z7=X7+Y7Z8=X8-Y8開(kāi)始初始化:置指針SI<=0;CX<=計(jì)數(shù)初值BL<=邏輯尺BL右移一位到CFCF=?Xi—YiXi+YiZi<=結(jié)果修改指針:SI<=(SI)+1CX<=(CX)-1(cx)=0?結(jié)束=1=0NYMOVCX,LENMOVSI,0MOVBL,LOGRSHRBL,1JCSUB1INCSILOOPLOPMOVAL,X[SI]SUBAL,Y[SI]MOVAL,X[SI]ADDAL,Y[SI]MOVZ[SI],AL60DATASEGMENTXDB0A2H,7CH,34H,9FH,0F4H,10H,39H,5BHYDB14H,05BH,28H,7AH,0EH,13H,46H,2CHLENEQU$—YZDBLENDUP(?)LOGRDB10011010BDATAENDSSTACK0SEGMENTPARASTACKDW20HDUP(0)STACK0ENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK0BEGIN:MOVAX,DATAMOVDS,AXMOVCX,LEN;初始化計(jì)數(shù)器

MOVSI,0;初始化指針

MOVBL,LOGR;初始化邏輯尺61LOP:MOVAL,X[SI]SHRBL,1;標(biāo)志位送CFJCSUB1;為1,轉(zhuǎn)做減法

ADDAL,Y[SI];為0,做加法

JMPRESSUB1:SUBAL,Y[SI]RES:MOVZ[SI],AL;存結(jié)果

INCSI;修改指針

LOOPLOPMOVAH,4CHINT21HCOSEGENDSENDBEGIN622、條件控制循環(huán)

例5.4.5編寫一程序,將字單元VARW中含1的個(gè)數(shù)統(tǒng)計(jì)出來(lái),存入CONT單元中。

本例中通過(guò)將字單元各位逐位移入最高位來(lái)判斷。為了減少循環(huán)次數(shù),循環(huán)中加上了判斷各位是否全為0,這樣可使低位為全0時(shí)的循環(huán)次數(shù)減少。MOVCL,0MOVAX,VARWTESTAX,0FFFFHJZEND0JNSSHIFTSHLAX,1JMPLOPMOVCONT,CLINCCL開(kāi)始計(jì)數(shù)器CL置0AX<=(VARW)(AX)=0?計(jì)1的個(gè)數(shù):CL<=(CL)+1AX左移一位存結(jié)果:CUNT<=(CL)結(jié)束(AX)15=1?YNNYEND0SHIFTLOP63DATASEGMENTVARWDW1101010010001000BCONTDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1BEGIN:MOVAX,DATAMOVDS,AXMOVCL,0MOVAX,VARWLOP:TESTAX,0FFFFH;測(cè)試(AX)是否為0

JZEND0;為0,循環(huán)結(jié)束

JNSSHIFT;判最高位,為0則轉(zhuǎn)SHIFTINCCL;最高位為1,計(jì)數(shù)64

SHIFT:SHLAX,1JMPLOPEND0:MOVCONT,CL;存結(jié)果

MOVAH,4CHINT21HCODEENDSENDBEGIN65四、多重循環(huán)程序設(shè)計(jì)多重循環(huán)結(jié)構(gòu)是指循環(huán)程序的循環(huán)體中又包含了另一個(gè)循環(huán)

例5.4.6編寫一程序,求級(jí)數(shù)12+22+32+…的前N項(xiàng)和。對(duì)于N2的計(jì)算采用連加的方法,即是:N2=N×N=N+N+…+NN

本題程序采用雙重循環(huán)。內(nèi)循環(huán)計(jì)算級(jí)數(shù)各項(xiàng)的值,外循環(huán)計(jì)算各級(jí)數(shù)項(xiàng)之和。MOVDX,0MOVCX,0MOVCL,NMOVAX,0MOVBX,CXADDAX,CXDECBXJNZLOP2ADDDX,AXLOOPLOP1開(kāi)始外循環(huán)初始化:DX<=0CX<=級(jí)數(shù)項(xiàng)數(shù)N內(nèi)循環(huán)初始化:AX<=0BX<=(CX)求級(jí)數(shù)項(xiàng):AX<=(AX)+(CX)BX<=(BX)-1(BX)=0?求級(jí)數(shù)和:DX<=(DX)+(AX)CX<=(CX)-1(CX)=0?存結(jié)果:SUM<=(DX)結(jié)束NYNYLOP2LOP1MOVSUM,DX66DATASEGMENTSUMDW?NDB20DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVDX,0MOVCX,0MOVCL,N;設(shè)置外循環(huán)次數(shù)LOP1:MOVAX,0MOVBX,CX;設(shè)置內(nèi)循環(huán)次數(shù)67LOP2:ADDAX,CX;求級(jí)數(shù)項(xiàng)的值

DECBX

JNZLOP2;BX計(jì)數(shù)不為0,繼續(xù)內(nèi)循環(huán)

ADDDX,AX;累加級(jí)數(shù)項(xiàng)

LOOPLOP1;CX計(jì)數(shù)不為0,繼續(xù)循環(huán)

MOVSUM,DX;存級(jí)數(shù)和

MOVAH,4CH

INT21H

CODEENDS

ENDSTART685.4子程序設(shè)計(jì)子程序--在一個(gè)程序的不同的地方需要多次使用的某個(gè)程序段,將其進(jìn)行獨(dú)立編制。調(diào)用與返回:在主程序中需要使用該功能時(shí),就轉(zhuǎn)移到子程序執(zhí)行,執(zhí)行完后又返回原程序繼續(xù)執(zhí)行。這樣的程序結(jié)構(gòu)稱為子程序設(shè)計(jì)。一、調(diào)用與返回指令1、子程序的調(diào)用與返回在匯編語(yǔ)言中,子程序是以“過(guò)程”的形式表示。根據(jù)被調(diào)用過(guò)程與調(diào)用程序是否在同一個(gè)段內(nèi),可以分為兩種情況。69主程序與子程序同在一個(gè)段內(nèi)。這時(shí),子程序的調(diào)用與返回只需修改指令指針I(yè)P。CODEASEGMENT...CALLPROCAAAA:......PROCAPROC...RET...PROCAENDP...CODEAENDS(1)段內(nèi)調(diào)用與返回右圖中指令CALLPROCA就是段內(nèi)調(diào)用。70下面CODEB段中的CALLFARPTRPROCB就是段間調(diào)用。CODEASEGMENTCODEBSEGMENT......PROCBPROC...CALLFARPTRPROCB...BBB:......RETPROCBENDPCODEBENDS...CODEAENDS(2)段間調(diào)用與返回調(diào)用指令與子程序分別在不同的段,這時(shí),需要同時(shí)修改CS和IP。71兩者都是無(wú)條件轉(zhuǎn)移到目標(biāo)單元,但CALL指令要保存“斷點(diǎn)”,而JMP指令不保存斷點(diǎn)。(3)子程序調(diào)用指令與轉(zhuǎn)移指令JMP的區(qū)別前述程序結(jié)構(gòu)圖中,AAA和BBB就是兩條調(diào)用子程序指令的斷點(diǎn)。斷點(diǎn)是調(diào)用子程序指令CALL的下一條指令的地址。72執(zhí)行CALL指令時(shí),先將斷點(diǎn)壓入堆棧中保存,然后轉(zhuǎn)移到目標(biāo)單元。

CALL指令的執(zhí)行對(duì)各標(biāo)志位無(wú)影響。匯編指令書寫格式為在CALL之后直接書寫過(guò)程名2、調(diào)用指令指令格式:CALL過(guò)程名(1)段內(nèi)調(diào)用(a)段內(nèi)直接調(diào)用例如:CALLSUB173例如:CALLBXCALLCXCALLWORDPTR30H[BX][SI](b)段內(nèi)間接調(diào)用

子程序的起始地址(偏移量)由一個(gè)通用寄存器或一個(gè)字存儲(chǔ)單元提供。74調(diào)用指令提供一個(gè)雙字存儲(chǔ)單元的地址,它所指向的雙字存儲(chǔ)單元內(nèi)容為被調(diào)用過(guò)程的起始地址。其中,兩個(gè)低字節(jié)存放偏移量,兩個(gè)高字節(jié)存放段基值。(b)段間間接調(diào)用例如:CALLDWORDPTRDISP[BX][DI]由于在定義過(guò)程時(shí),對(duì)提供段間調(diào)用的過(guò)程,已經(jīng)說(shuō)明其屬性為FAR。因此調(diào)用時(shí),在CALL后直接書寫過(guò)程名,也可以在過(guò)程名前面加FAR屬性修飾。(2)段間調(diào)用(a)段間直接調(diào)用例如:CALLPROC_NAMECALLFARPTRPROC_NAME753、返回指令(2)段間返回——指令編碼為CBH

執(zhí)行該指令,將從堆棧頂部彈出兩個(gè)字分別送IP和CS中。根據(jù)子程序調(diào)用指令的使用情況,返回指令也分為段內(nèi)返回和段間返回。其匯編指令書寫形式都是RET,但它們的編碼是不相同的。一個(gè)子程序最后執(zhí)行的指令一定是返回指令,但不一定是最后一條指令。(1)段內(nèi)返回——指令編碼為C3H

執(zhí)行該指令,將從堆棧頂部彈出一個(gè)字送入IP。76匯編指令格式為:RETn

其中n為一個(gè)立即數(shù),長(zhǎng)度為2字節(jié)。并且是一個(gè)偶數(shù)。(1)從堆棧彈出1個(gè)字送IP(段內(nèi)返回)或2個(gè)字送IP和CS;(2)執(zhí)行SP<=(SP)+n。將堆棧中已經(jīng)用過(guò)的參數(shù)(n個(gè)字節(jié))彈出舍去.指令執(zhí)行過(guò)程:(3)帶彈出值的返回指令這條指令既可用于段內(nèi)返回也可以用于段間返回,但它們的指令編碼不同,分別為C2n和CAn。77二、編制子程序的基本要求1、具有一定的通用性2、選擇適當(dāng)?shù)膮?shù)傳遞方法在主程序與子程序之間傳遞參數(shù),可以選擇的方法有:

A、使用通用寄存器

B、使用指定的存儲(chǔ)單元

C、使用堆棧選擇和設(shè)計(jì)好子程序所需的各種入口參數(shù)和出口參數(shù)。78A、在主程序中保存子程序中將要使用的一些寄存器的內(nèi)容...PUSHBXPUSHCXCALLSUB1POPCXPOPBX...3、注意信息保護(hù)

信息的保護(hù)可以有兩種方法:79

B、在子程序中保存將要使用的一些寄存器的內(nèi)容SUB2PROCPUSHBXPUSHCX......;完成子程序功能指令序列

POPCXPOPBXRETSUB2ENDP4、正確使用堆棧由于堆棧中保存著主程序調(diào)用子程序時(shí)的斷點(diǎn)地址。若在子程序中也使用了堆棧,注意對(duì)各個(gè)數(shù)據(jù)壓棧和出棧的順序不能錯(cuò)誤,否則將導(dǎo)致數(shù)據(jù)的錯(cuò)誤使用和子程序返回的地址錯(cuò)誤。80子程序名子程序功能描述子程序的入口參數(shù)與出口參數(shù)使用哪些寄存器和存儲(chǔ)單元本子程序是否又調(diào)用其他子程序子程序的調(diào)用形式、舉例5、編制子程序文件子程序文件應(yīng)包括文字說(shuō)明與子程序本身兩個(gè)部分。而文字說(shuō)明一般包括:81源程序的數(shù)據(jù)段和堆棧安排如下:DATASEGMENTBIN1DB35HBIN2DW0AB48HASCBUFDB20HDUP(?)DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDS三、子程序設(shè)計(jì)舉例例5.5.1將兩個(gè)給定的二進(jìn)制數(shù)(8位和16位)轉(zhuǎn)換為ASCII碼字符串。82主程序提供被轉(zhuǎn)換的數(shù)據(jù)和轉(zhuǎn)換后的ASCII碼字符串的存儲(chǔ)區(qū)的首地址開(kāi)始取出待轉(zhuǎn)換數(shù)據(jù)給出存放結(jié)果首址給出轉(zhuǎn)換的位數(shù)調(diào)用轉(zhuǎn)換子程序取出待轉(zhuǎn)換數(shù)據(jù)給出存放結(jié)果首址給出轉(zhuǎn)換的位數(shù)調(diào)用轉(zhuǎn)換子程序結(jié)束主程序框圖LEADI,ASCBUFMOVDH,BIN1MOVAX,8CALLBINASCMOVDX,BIN2MOVAX,16ADDDI,8CALLBINASC83子程序完成二進(jìn)制數(shù)與ASCII碼字符串的轉(zhuǎn)換。子程序的入口參量有:被轉(zhuǎn)換的數(shù)據(jù)、存儲(chǔ)ASCII碼字符串的首址和轉(zhuǎn)換后的位數(shù)。無(wú)出口參量。子程序框圖:‘0’的ASCII碼為30H,’1’的ASCII碼為31H。ROLDX,1MOVAL,DLANDAL,1ADDAL,30HMOV[DI],ALINCDILOOPLOPBINASC待轉(zhuǎn)換的一位二進(jìn)制數(shù)送AL的第0位DX<=待轉(zhuǎn)換數(shù)據(jù)DI<=存放ASCII碼首址CX<=轉(zhuǎn)換的位數(shù)AL<=(AL)^01HAL<=(AL)+30H存ASCII碼:(DI)<=(AL)修改指針:DI<=(DI)+1計(jì)數(shù):CX<=(CX)-1(CX)=0?返回NYLOP84*用寄存器傳遞參量*用堆棧傳遞參量*用地址表傳遞參量由于參量的傳遞方式有多種形式,其相應(yīng)地在子程序中取入口參量的方法也有所不同。下面介紹三種參量的傳遞方法:851、用寄存器傳遞參量設(shè)調(diào)用子程序時(shí),入口參量為:被轉(zhuǎn)換的數(shù)在DX中,若數(shù)位<16,則從高到低地存放,待轉(zhuǎn)換的二進(jìn)制數(shù)的位數(shù)存在放AX中,轉(zhuǎn)換后的ASCII碼的存放首址在DI中。信息的保存由主程序完成。COSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXXORDX,DXLEADI,ASCBUF;存放ASCII碼的單元首址送DIMOVDH,BIN1;待轉(zhuǎn)換的第1個(gè)數(shù)據(jù)送DHMOVAX,8;待轉(zhuǎn)換的二進(jìn)制數(shù)的位數(shù)

PUSHDI;保護(hù)信息

CALLBINASC;調(diào)用轉(zhuǎn)換子程序

POPDI;恢復(fù)信息

MOVDX,BIN2;待轉(zhuǎn)換的第二個(gè)數(shù)據(jù)送DX

MOVAX,16ADDDI,8;設(shè)置下一個(gè)數(shù)的存放首址

CALLBINASCMOVAH,4CHINT21H主程序:86BINASCPROCMOVCX,AXLOP:ROLDX,1;最高位移入最低位

MOVAL,DLANDAL,1;保留最低位,屏蔽其它位

ADDAL,30H;AL中即為該數(shù)字符(0或1)的ASCII碼

MOV[DI],AL;存結(jié)果

INCDI;修改地址指針

LOOPLOPRETBINASCENDPCOSEGENDSENDSTART轉(zhuǎn)換子程序872、用堆棧傳遞參量(2)在子程序中保存信息。如果使用堆棧傳遞參量,一般應(yīng)包括:(1)在主程序中,將待轉(zhuǎn)換的數(shù)據(jù)、存放ASCII碼的首址和轉(zhuǎn)換的位數(shù)壓入堆棧;88;主程序COSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1BEGIN:MOVAX,DATAMOVDS,AX

MOVAH,BIN1

PUSHAX;待轉(zhuǎn)換數(shù)據(jù)壓棧

MOVAX,8

PUSHAX;轉(zhuǎn)換位數(shù)壓棧

LEADI,ASCBUF

PUSHDI;存放ASCII碼的首址壓棧

CALLBINASC;調(diào)用轉(zhuǎn)換子程序

MOVAX,BIN2

PUSHAX MOVAX,10H

PUSHAXADDDI,8

PUSHDICALLBINASC MOVAH,4CHINT21HASCII碼首址位數(shù)待轉(zhuǎn)換數(shù)據(jù)執(zhí)行CALL指令前堆棧情況SP+2SP+4SP執(zhí)行CALL指令后堆棧情況SP+2SP+4SP待轉(zhuǎn)換數(shù)據(jù)位數(shù)ASCII碼首址返回地址SP+689;轉(zhuǎn)換子程序BINASCPROC

PUSHAXPUSHCXPUSHDXPUSHDIPUSHBPMOVBP,SPMOVDI,[BP+12];從堆棧取入口參數(shù)

MOVCX,[BP+14]MOVDX,[BP+16];LOP:ROLDX,1MOVAL,DLANDAL,1ADDAL,30HMOV[DI],ALINCDILOOPLOPDIDXCXAX返回地址ASCII碼首址位數(shù)待轉(zhuǎn)換數(shù)據(jù)子程序中保存信息并執(zhí)行MOVBP,SP后SP+2SP+4SP+6SP+8SP+10BPBPSP90POPBPPOPDIPOPDXPOPCXPOPAXRET6;返回并從堆棧中彈出6個(gè)字節(jié)BINASCENDPCOSEGENDBEGINDIDXCXAX返回地址ASCII碼首址位數(shù)待轉(zhuǎn)換數(shù)據(jù)執(zhí)行RET6前SPBPDIDXCXAX返回地址ASCII碼首址位數(shù)待轉(zhuǎn)換數(shù)據(jù)執(zhí)行RET6后SPBP913、用地址表傳遞參量在調(diào)用子程序前,將所有參量的地址依次存放在一個(gè)地址表中,將該表的首地址傳送給子程序。數(shù)據(jù)段部分改為:DATASEGMENTBIN1DB35HBIN2DW0AB48HCUNTDB8,16ASCBUPDB20HDUP(?)ADR_TABDW3DUP(0);存放參量地址表DATAENDS傳遞參數(shù)也可以采用傳遞參量的地址來(lái)實(shí)現(xiàn)。92主程序中有關(guān)指令序列修改為:......MOVADR_TAB,OFFSETBIN1;存參量地址MOVADR_TAB+2,OFFSETCUNTMOVADR_TAB+4,OFFSETASCBUPMOVBX,OFFSETADR_TAB;傳表首址CALLBINASC8MOVADR_TAB,OFFSETBIN2MOVADR_TAB+2,OFFSETCUNT+1MOVADR_TAB+4,OFFSETASCBUP+8MOVBX,OFFSETADR_TAB;傳表首址CALLBINASC16......93BINASCPROCBINASC8:MOVDI,[BX];取待轉(zhuǎn)換8位數(shù)據(jù)

溫馨提示

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