版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
計(jì)算機(jī)組成原理及匯編語言匯編程序設(shè)計(jì)及高級(jí)匯編語言技術(shù)6.1順序程序設(shè)計(jì)
分析題意確定算法。根據(jù)算法畫出程序框圖。根據(jù)框圖編寫程序。上機(jī)調(diào)試程序。
一般說來,編制一個(gè)匯編語言程序的步驟如下:1/79分支結(jié)構(gòu)
子程序結(jié)構(gòu)程序結(jié)構(gòu):
復(fù)合結(jié)構(gòu):多種程序結(jié)構(gòu)的組合…
順序結(jié)構(gòu)
循環(huán)結(jié)構(gòu)1/79例:從鍵盤鍵入0至9中任一自然數(shù)X,求其立方值。
STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTINPUTDB"PLEASEINPUTX(0....9):$"TABDW0,1,8,27,64,125,216,343,512,729XDB?XXXDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1/79BEGIN:MOVAX,DATAMOVDS,AXMOVAH,9LEADX,INPUTINT21HMOVAH,1INT21HANDAL,0FHMOVX,ALADDAL,ALMOVBL,ALMOVBH,0MOVAX,TAB[BX]MOVXXX,AXMOVAH,4CHINT21HCODEENDSENDBEGIN1/796.2分支程序設(shè)計(jì)
一、分支程序設(shè)計(jì)概述
分支程序結(jié)構(gòu)可以有兩種形式,如下圖所示。它們分別相當(dāng)于高級(jí)語言中的IF—THEN—ELSE語句和CASE語句,它們適用于要根據(jù)不同條件作不同處理的情況。IF—THEN—ELSE語句可以引出兩個(gè)分支,CASE語句則可以引出多個(gè)分支,不論哪一種形式,它們的共同特點(diǎn)是:運(yùn)行方向是向前的,在某一種確定條件下,只能執(zhí)行多個(gè)分支中的一個(gè)分支。1/79分支程序結(jié)構(gòu)圖
1/79二、分支程序設(shè)計(jì)
分支結(jié)構(gòu)程序設(shè)計(jì)的關(guān)鍵在于準(zhǔn)確地知道操作結(jié)果影響的標(biāo)志位狀態(tài)和正確地使用條件轉(zhuǎn)移指令。根據(jù)對(duì)條件的判斷而選擇不同的處理方法是人的基本智能體現(xiàn)。計(jì)算機(jī)根據(jù)對(duì)標(biāo)志位的判斷而決定程序流向的條件轉(zhuǎn)移指令表明計(jì)算機(jī)能實(shí)現(xiàn)這種智能。當(dāng)我們運(yùn)用條件轉(zhuǎn)移指令去解決具體問題時(shí),能否達(dá)到預(yù)期目的,主要取決于編程人員的思維是否符合邏輯,以及能否正確使用相應(yīng)的條件轉(zhuǎn)移指令。
1/79分支程序設(shè)計(jì)…case1case2casen??case1case2casen
CASE
結(jié)構(gòu)IF-THEN-ELSE
結(jié)構(gòu)(1)邏輯尺控制(2)條件控制(3)地址跳躍表(值與地址有對(duì)應(yīng)關(guān)系的表)1/79例:有數(shù)組x(x1,x2,……,x10)和y(y1,y2,……,y10),
編程計(jì)算z(z1,z2,……,z10)z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10
邏輯尺:00
11
0
111
001減法0加法1/79xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch
……
movbx,0movcx,10movdx,logic_rulenext:movax,x[bx]
shrdx,1jcsubtractaddax,y[bx]jmpshortresult;向前引用subtract:subax,y[bx]result:movz[bx],axaddbx,2loopnext……1/79datasegmentarraydw12,11,22,33,44,55,66,77,88,99,111,222,333numberdw55low_idxdw?high_idxdw?dataends例:折半查找算法1/79……
leadi,arraymovax,number
cmpax,[di+2]
;(ax)與第一個(gè)元素比較jachk_lastleasi,[di+2]jeexit;(ax)=第一個(gè)元素,找到退出stcjmpexit;(ax)<第一個(gè)元素,未找到退出chk_last:movsi,[di]shlsi,1addsi,di
cmpax,[si];(ax)與最后一個(gè)元素比較jbsearchjeexit;(ax)=最后一個(gè)元素,找到退出stcjmpexit;(ax)>最后一個(gè)元素,未找到退出算法11/79compare:
cmpax,[bx+si]jeexitjahigher
deccxmovhigh_idx,cxjmpmidhigher:
inccxmovlow_idx,cxjmpmidno_match:stcexit:……search:movlow_idx,1movbx,[di]movhigh_idx,bxmovbx,dimid:movcx,low_idxmovdx,high_idx
cmpcx,dxjano_match
addcx,dxshrcx,1movsi,cxshlsi,11/79
121122334455667788991112223330123456789101112(ax)=55low_idx1145
high_idx
12555(si)=0ahCf=0(ax)=90low_idx17789
high_idx
1212888(si)=10hCf=11/79算法2idx_ok:shrsi,1testsi,1jzsub_idxincsisub_idx:subdi,sijmpshortcomparehigher:
cmpsi,2jeno_matchshrsi,1jmpshorteven_idxall_done:movsi,diexit:……search:movsi,[di]even_idx:testsi,1jzadd_idxincsiadd_idx:adddi,sicompare:cmpax,[di]jeall_donejahigher
cmpsi,2jneidx_okno_match:stcjmpexit1/79
121122334455667788991112223330123456789101112(ax)=55di12610si
1264(si)=0ah(di)=0ahCf=0(ax)=90di12181416
si
12642(si)=2(di)=10hCf=11/79例:根據(jù)AL寄存器中哪一位為1(從低位到高位),把程序轉(zhuǎn)移到8個(gè)不同的程序分支branch_tabledwroutine1dwroutine2dwroutine3dwroutine4dwroutine5dwroutine6dwroutine7dwroutine81/79
……
cmpal,0jecontinue
leabx,
branch_tableL:shral,1;邏輯右移jnbadd1
;jnb=jnc
jmpwordptr[bx]
;段內(nèi)間接轉(zhuǎn)移add1:addbx,typebranch_tablejmpLcontinue:……routine1:……routine2:……(寄存器間接尋址)1/79(寄存器相對(duì)尋址)……cmpal,0jecontinuemovsi,0L:shral,1;邏輯右移jnbadd1
;jnb=jnc
jmpbranch_table[si];段內(nèi)間接轉(zhuǎn)移add1:
addsi,typebranch_tablejmpLcontinue:……routine1:……routine2:……1/79
……
cmpal,0je
continue
leabx,branch_table
movsi,7*typebranch_tablemovcx,8L:shlal,1;邏輯左移jnbsub1
;jnb=jnc
jmpwordptr[bx][si];段內(nèi)間接轉(zhuǎn)移sub1:subsi,typebranch_tableloopLcontinue:……routine1:……routine2:……(基址變址尋址)1/796.3循環(huán)程序設(shè)計(jì)
一、循環(huán)程序設(shè)計(jì)概述
循環(huán)程序一般由四個(gè)部分組成:(1)置循環(huán)初值部分:這是為了保證循環(huán)程序能正常進(jìn)行循環(huán)操作而必須做的準(zhǔn)備工作。(2)工作部分:即需要重復(fù)執(zhí)行的程序段。這是循環(huán)的中心,稱之為循環(huán)體。(3)修改部分:按一定規(guī)律修改操作數(shù)地址及控制變量,以便每次執(zhí)行循環(huán)體時(shí)得到新的數(shù)據(jù)。(4)控制部分:用來保證循環(huán)程序按規(guī)定的次數(shù)或特定條件正常循環(huán)。1/79循環(huán)程序常見的結(jié)構(gòu)形式如下圖所示。其中工作部分與修改部分有時(shí)互相包含、互相交叉,不一定能明顯分開。
循環(huán)程序的結(jié)構(gòu)圖
1/79二、循環(huán)程序設(shè)計(jì)循環(huán)的控制方法
(1)計(jì)數(shù)控制當(dāng)循環(huán)次數(shù)已知時(shí),通常使用計(jì)數(shù)控制法。先將循環(huán)次數(shù)n送入循環(huán)計(jì)數(shù)器中,然后,每循環(huán)一次,計(jì)數(shù)器減1,直至循環(huán)計(jì)數(shù)器中的內(nèi)容為0時(shí)結(jié)束循環(huán)。先將循環(huán)次數(shù)的負(fù)值送入循環(huán)計(jì)數(shù)器中,然后每循環(huán)一次,計(jì)數(shù)器加1,直至計(jì)數(shù)器中的內(nèi)容為零時(shí)結(jié)束循環(huán)。先將0送入循環(huán)計(jì)數(shù)器中,然后沒循環(huán)一次,計(jì)數(shù)器加1,直到循環(huán)計(jì)數(shù)器的內(nèi)容與循環(huán)次數(shù)n相等時(shí)退出循環(huán)。
1/79有些情況下,循環(huán)次數(shù)事先無法確定,但它與問題的某些條件有關(guān)。這些條件可以通過指令來測(cè)試。若測(cè)試比較的結(jié)果表明滿足循環(huán)條件,則繼續(xù)循環(huán),否則結(jié)束循環(huán)。(2)條件控制1/79所謂單重循環(huán),即其循環(huán)體內(nèi)不再包含循環(huán)結(jié)構(gòu)。下面分循環(huán)次數(shù)已知和未知兩種情況討論其程序設(shè)計(jì)方法
(1)循環(huán)次數(shù)已知的循環(huán)程序設(shè)計(jì)對(duì)于循環(huán)次數(shù)已知的情況,通常采用計(jì)數(shù)控制方法來實(shí)現(xiàn)循環(huán)。(2)最大循環(huán)次數(shù)未知的循環(huán)程序設(shè)計(jì)對(duì)于循環(huán)次數(shù)未知的情況,常用條件來控制循環(huán)。2.單重循環(huán)程序設(shè)計(jì)1/79
BX1234例:把BX中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕上1/79
……
movch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30h
;’0’~’9’ASCII30H~39Hcmpal,3ahjlprintit
addal,7h
;’A’~’F’ASCII41H~46Hprintit:movdl,almovah,2int21h
decchjnzrotate
……1/79
……
movbx,0newchar:movah,1int21hsubal,30hjlexit;<0退出cmpal,9jgexit;>9退出cbwxchgax,bxmovcx,10mulcxxchgax,bxaddbx,axjmpnewcharexit:……例:從鍵盤接收十進(jìn)制數(shù)并存入BX1/79
……movbx,0newchar:movah,1int21hsubal,30hjlexit;<0退出cmpal,10jladd_tosubal,27h;‘a(chǎn)’~‘f’cmpal,0ahjlexit;<‘a(chǎn)’退出cmpal,10hjgeexit;>’f’退出add_to:movcl,4
shlbx,clmovah,0
addbx,axjmpnewcharexit:……例:從鍵盤接收十六進(jìn)制數(shù)并存入BX1/79xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105ndw32例:將正數(shù)n插入一個(gè)已整序的正數(shù)字?jǐn)?shù)組……movax,n
movarray_head-2,0ffffh
movsi,0compare:cmparray_end[si],axjleinsertmovbx,array_end[si]movarray_end[si+2],bx
subsi,2
jmpshortcompareinsert:movarray_end[si+2],ax……35152337495265789910532-1array_headarray_endnx1/79多重循環(huán)即循環(huán)體內(nèi)套有循環(huán)。設(shè)計(jì)多重循環(huán)程序時(shí),可以從外層循環(huán)到內(nèi)層循環(huán)一層一層地進(jìn)行。通常在設(shè)計(jì)外層循環(huán)時(shí),僅把內(nèi)層循環(huán)看成一個(gè)處理粗框,然后再將該粗框細(xì)化,分成置初值、工作、修改和控制四個(gè)組成部分。當(dāng)內(nèi)層循環(huán)設(shè)計(jì)完之后,用其替換外層循環(huán)體中被視為一個(gè)處理粗框的對(duì)應(yīng)部分,這樣就構(gòu)成了一個(gè)多重循環(huán)。3.多重循環(huán)程序設(shè)計(jì)1/79例:將首地址為a的字?jǐn)?shù)組從大到小排序(起泡排序算法,多重循環(huán))10030789915-16645189256100789930156645189256
-11009978306645189256
15-110099786645189256
3015-1100997866189256
453015-11009978189256
66453015-110099189256
7866453015-1100189256
997866453015-1189256100997866453015-1256189100997866453015-11/79adw100,30,78,99,15,-1,66,45,189,256……movcx,10deccxloop1:movdi,cxmovbx,0loop2:movax,a[bx]cmpax,a[bx+2]jgecontinuexchgax,a[bx+2]mova[bx],axcontinue:addbx,2looploop2
movcx,dilooploop1
……1/796.4子程序設(shè)計(jì)一、子程序設(shè)計(jì)概述
在我們編寫解決實(shí)際問題的程序時(shí),往往會(huì)遇到多處使用相同功能的程序段,使用該程序段的唯一差別是對(duì)程序變量的賦值不同。如果把多次使用的功能程序編制為一個(gè)獨(dú)立的程序段,每當(dāng)用到這個(gè)功能時(shí),就將控制轉(zhuǎn)向它,完成后再返回到原來的程序,這就回大大減少編程的工作量。這種可以被其它程序使用的程序段,我們就叫它子程序。
1/791.過程定義偽操作過程名PROCNEAR
(FAR)過程名ENDP(1)NEAR屬性:調(diào)用程序和子程序在同一代碼段中(段內(nèi)調(diào)用)(2)FAR屬性:調(diào)用程序和子程序不在同一代碼段中(段間調(diào)用)...1/79codesegment
mainprocfar……call
subr1……retmainendpsubr1procnear……
retsubr1endpcodeendssegxsegmentsubtprocfar……
retsubtendp……
call
subt……segxendssegysegment……
call
subt……segyends1/79子程序調(diào)用:隱含使用堆棧保存返回地址
callnearptrsubp
(1)保存返回地址
(2)轉(zhuǎn)子程序
callfarptrsubp
(1)保存返回地址
(2)轉(zhuǎn)子程序子程序返回:ret2.子程序的調(diào)用與返回(SP)→(IP)(IP)(CS)(SP)→1/793.保存與恢復(fù)寄存器subtprocfar
pushaxpushbxpushcxpushdx…………popdxpopcxpopbxpopaxretsubtendp1/79(1)通過寄存器傳送參數(shù)(2)通過存儲(chǔ)器傳送參數(shù)(3)通過地址表傳送參數(shù)地址(4)通過堆棧傳送參數(shù)或參數(shù)地址(5)多個(gè)模塊之間的參數(shù)傳送4.子程序的參數(shù)傳送1/79例:十進(jìn)制到十六進(jìn)制的轉(zhuǎn)換(通過寄存器傳送參數(shù))decihexsegment;1016assumecs:decihexmainprocfarpushdssubax,axpushaxrepeat:calldecibin
;102callcrlf;回車換行callbinihex;216callcrlfjmprepeatretmainendp………………decihexendsendmain1/79decibinprocnear
movbx,0newchar:movah,1int21hsubal,30hjlexitcmpal,9jgexitcbwxchgax,bxmovcx,10mulcxxchgax,bxaddbx,axjmpnewcharexit:retdecibinendpbinihexprocnearmovch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30hcmpal,3ahjlprintitaddal,7printit:movdl,almovah,2int21hdecchjnzrotateretbinihexendpcrlfprocnearmovdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hretcrlfendp1/79例:十六進(jìn)制到十進(jìn)制的轉(zhuǎn)換(通過寄存器傳送參數(shù))hexidecsegment;1610assumecs:hexidecmainprocfarstart:pushdssubax,axpushaxrepeat:callhexibin;162callcrlfcallbinidec;210callcrlfjmprepeatretmainendp………………h(huán)exidecendsendstart1/79hexibinprocnear
movbx,0newchar:movah,1int21hsubal,30hjlexitcmpal,10jladd_tosubal,27hcmpal,0ahjlexitcmpal,10hjgeexitadd_to:movcl,4shlbx,clmovah,0addbx,axjmpnewcharexit:rethexibinendpbinidecprocnear
movcx,10000d
calldec_divmovcx,1000d
calldec_divmovcx,100d
calldec_divmovcx,10d
calldec_divmovcx,1d
calldec_divretbinidecendpdec_divprocnearmovax,bxmovdx,0divcxmovbx,dxmovdl,aladddl,30hmovah,2int21hretdec_divendp1/79例:累加數(shù)組中的元素(通過存儲(chǔ)器傳送參數(shù))datasegment
arydw1,2,3,4,5,6,7,8,9,10countdw10sumdw?dataendscodesegmentmainprocfarassumecs:code,ds:datapushdssubax,axpushaxmovax,datamovds,ax
callproaddretmainendpcodeendsendmainproaddprocnearpushaxpushcxpushsileasi,arymovcx,countxorax,axnext:addax,[si]addsi,2loopnextmovsum,axpopsipopcxpopaxretproaddendp1/79如果數(shù)據(jù)段定義如下:datasegment
arydw1,2,3,4,5,6,7,8,9,10countdw10sumdw?
ary1dw10,20,30,40,50,60,70,80,90,100count1dw10sum1dw?dataends
如果直接訪問內(nèi)存變量,那么累加數(shù)組ary和數(shù)組ary1中的元素不能用同一個(gè)子程序proadd。1/79例:累加數(shù)組中的元素(通過地址表傳送參數(shù)地址)datasegmentarydw10,20,30,40,50,60,70,80,90,100countdw10sumdw?
tabledw3dup(?);地址表dataendscodesegmentmainprocfarassumecs:code,ds:datapushdssubax,axpushaxmovax,datamovds,ax
movtable,offsetarymovtable+2,offsetcountmovtable+4,offsetsummovbx,offsettablecallproaddretmainendp1/79proaddprocnearpushaxpushcxpushsipushdi
movsi,[bx]movdi,[bx+2]movcx,[di]movdi,[bx+4]xorax,axnext:addax,[si]addsi,2loopnextmov[di],axpopdipopsipopcxpopaxretproaddendpcodeendsendmain30d40d50d60d70d80d90d100d10d
ary20d10dcountsumtable0000001400160018000000140016(bx)(si)(di)550d1/79stacksegmentdw100dup(?)toslabelwordstackendsstart:movax,stackmovss,axmovsp,offsettospushdssubax,axpushax……通過堆棧傳送參數(shù)或參數(shù)地址:PSPDSESSSCSPSPDSESSSCSstacksegmentstack
dw100dup(?)toslabelwordstackends1/79例:累加數(shù)組中的元素(通過堆棧傳送參數(shù)地址)datasegmentarydw10,20,30,40,50,60,70,80,90,100countdw10sumdw?dataendsstacksegmentdw100dup(?)toslabelwordstackends1/79code1segmentmainprocfarassumecs:code1,ds:data,ss:stackstart:
movax,stackmovss,axmovsp,offsettospushdssubax,axpushaxmovax,datamovds,ax
movbx,offsetarypushbxmovbx,offsetcountpushbxmovbx,offsetsumpushbxcallfarptrproaddretmainendpcode1ends1/79code2segmentassumecs:code2proaddprocfar
pushbpmovbp,sppushaxpushcxpushsipushdi
movsi,[bp+0ah]movdi,[bp+8]movcx,[di]movdi,[bp+6]code2endsendstartxorax,axnext:addax,[si]addsi,2loopnextmov[di],axpopdipopsipopcxpopaxpopbp
ret6proaddendp(ip)(cs)0016001400000(ds)
(di)(si)(cx)(ax)(sp)(bp)(bp)(bp)+0ah(bp)+8(bp)+61/79結(jié)構(gòu)偽操作STRUC:
定義一種可包含不同類型數(shù)據(jù)的結(jié)構(gòu)模式格式:結(jié)構(gòu)名
STRUC
字段名1
DB?
字段名2
DW?
字段名3
DD?……
結(jié)構(gòu)名
ENDS
例:學(xué)生個(gè)人信息
STUDENT_DATA
STRUC
NAMEDB5DUP(?)IDDW0AGEDB?DEPDB10DUP(?)
STUDENT_DATA
ENDS1/79例:累加數(shù)組中的元素(通過堆棧傳送參數(shù)地址)code2segmentassumecs:code2
stack_strc
struc
save_bpdw?save_cs_ipdw2dup(?)par3_addrdw?par2_addrdw?par1_addrdw?
stack_strc
endsproaddprocfar…………proaddendp
code2endsendstart1/79proaddprocfarpushbpmovbp,sppushaxpushcxpushsipushdi
movsi,[bp].par1_addrmovdi,[bp].par2_addrmovcx,[di]movdi,[bp].par3_addrxorax,axnext:addax,[si]addsi,2loopnextmov[di],axpopdipopsipopcxpopaxpopbpret6proaddendp(ip)(cs)0016001400000(ds)
(di)(si)(cx)(ax)(sp)(bp)(bp)par3_addrpar2_addrpar1_addr1/79二、子程序程序設(shè)計(jì)
1.子程序的嵌套我們已經(jīng)知道,一個(gè)子程序也可以作為調(diào)用程序去調(diào)用另一個(gè)子程序,這種情況就稱為子程序的嵌套。嵌套的層次不限,其層數(shù)稱為嵌套深度。
1/792.遞歸子程序在子程序嵌套的情況下,如果一個(gè)子程序調(diào)用的子程序就是它自身,這就稱為遞歸調(diào)用。這樣的子程序稱為遞歸子程序。遞歸子程序?qū)?yīng)于數(shù)學(xué)上對(duì)函數(shù)的遞歸定義,它往往能設(shè)計(jì)出效率較高的程序,可完成相當(dāng)復(fù)雜的計(jì)算,因而它是很有用的。
1/79子程序的嵌套:主程序
子程序A
子程序B遞歸子程序:n!子程序的嵌套與遞歸……callproc_A……proc_A
……callproc_B……retproc_B……ret1/79factprocnearpushaxpushbpmovbp,sp
movax,[bp+6]cmpax,0jnefact1incaxjmpexitfact1:decaxpushax
callfact
popaxmulwordptr[bp+6]exit:mov[bp+6],axpopbppopaxretfactendp例:計(jì)算n!movbx,n_vpushbxcallfactpopresult主程序:(BP)(AX)(IP)
0(BP)(AX)(IP)
1(BP)
(AX)(IP)
2(BP)(AX)(IP)
31/796.5宏匯編
使用子程序結(jié)構(gòu)具有很多優(yōu)點(diǎn),可以節(jié)省存儲(chǔ)空間及程序設(shè)計(jì)所花的時(shí)間,可提供模塊化程序設(shè)計(jì)的條件,便于程序的調(diào)試及修改等。但是,使用子程序也有一些缺點(diǎn):為轉(zhuǎn)子及返回、保存及恢復(fù)寄存器以及參量的傳送等都要增加程序的開銷,這些操作所消耗的時(shí)間以及它們所占用的存儲(chǔ)空間,都是為取得子程序結(jié)構(gòu)使程序模塊化的優(yōu)點(diǎn)而增加的額外開銷。因此,有時(shí)特別在子程序本身較短或者是需要傳送的參量較多的情況下使用宏匯編就更加有利。1/79一、宏的定義
宏:源程序中一段有獨(dú)立功能的程序代碼。宏指令:用戶自定義的指令。在編程時(shí),將多次使用的功能用一條宏指令來代替。匯編語言程序指令偽指令(偽操作)宏指令1/79二、宏的調(diào)用和展開
經(jīng)宏定義定義后的宏指令就可以在源程序中調(diào)用。這種對(duì)宏指令的調(diào)用稱為宏調(diào)用。當(dāng)源程序被匯編時(shí),匯編程序?qū)?duì)每個(gè)宏調(diào)用作宏展開。宏展開就是用宏定義體取代源程序中的宏指令名,而且用實(shí)元取代宏定義中的啞元。在取代時(shí),實(shí)元和啞元是一一對(duì)應(yīng)的。即第一個(gè)實(shí)元取代第一個(gè)啞元,第二個(gè)實(shí)元取代第二個(gè)啞元…依此類推。一般說來,實(shí)元的個(gè)數(shù)應(yīng)該和啞元的個(gè)數(shù)相等,但匯編程序并不要求它們必須相等。若實(shí)元個(gè)數(shù)大于啞元個(gè)數(shù),則多余的實(shí)元不予考慮,若實(shí)元個(gè)數(shù)小于啞元個(gè)數(shù),則多余的啞元作“空”處理。1/79宏展開:匯編程序把宏調(diào)用展開宏定義:
macro_nameMACRO
[啞元表]
;形參/虛參
[LOCAL標(biāo)號(hào)表]…………;宏定義體
ENDM宏調(diào)用:
(必須先定義后調(diào)用)
macro_name[實(shí)元表];實(shí)參1/79例:保存寄存器宏展開:1pushax1pushbx1pushcx1pushdx1pushsi1pushdi宏定義:savereg
MACROpushaxpushbxpushcxpushdxpushsipushdi
ENDM宏調(diào)用:
savereg1/79例:兩個(gè)字相乘宏定義:multiply
MACROopr1,opr2,resultpushdxpushaxmovax,opr1imulopr2movresult,axpopaxpopdx
ENDM宏調(diào)用:
multiplycx,var,xyz[bx]宏展開:1pushdx1pushax1movax,cx1imulvar1movxyz[bx],ax1popax1popdx1/79例:求絕對(duì)值宏定義:absolMACROoper
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年家具安裝售后流程培訓(xùn)
- 2026四川成都西北中學(xué)郫筒一小招聘考試備考題庫及答案解析
- 2026四川雅安市雨城區(qū)河北街道城鎮(zhèn)公益性崗位招聘9人筆試備考題庫及答案解析
- 2025年蛋糕石家莊學(xué)院招聘筆試及答案
- 2026中國僑聯(lián)直屬事業(yè)單位招聘9人考試備考題庫及答案解析
- 2025年大學(xué)美術(shù)老師筆試真題及答案
- 2025年南寧市事業(yè)單位人事考試及答案
- 2025年薊縣人事考試及答案
- 2025年鷹潭人事考試及答案
- 2025年中儲(chǔ)糧校園社會(huì)招聘筆試及答案
- 2025年宜昌市“招才興業(yè)”市直事業(yè)單位人才引進(jìn)47人·重慶大學(xué)站筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 上海市徐匯區(qū)上海中學(xué)2025-2026學(xué)年高三上學(xué)期期中考試英語試題(含答案)
- 2025秋滬科版(五四制)(新教材)初中科學(xué)六年級(jí)第一學(xué)期知識(shí)點(diǎn)及期末測(cè)試卷及答案
- 2025年地下礦山采掘工考試題庫(附答案)
- 孕婦貧血教學(xué)課件
- 5年(2021-2025)山東高考生物真題分類匯編:專題17 基因工程(解析版)
- 新華資產(chǎn)招聘筆試題庫2025
- 智能化項(xiàng)目驗(yàn)收流程指南
- 搶劫案件偵查課件
- 2026年遼寧軌道交通職業(yè)學(xué)院單招職業(yè)技能測(cè)試題庫必考題
- 雨課堂在線學(xué)堂《中國古代舞蹈史》單元考核測(cè)試答案
評(píng)論
0/150
提交評(píng)論