版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
3.6子程序設(shè)計(jì)把功能相對(duì)獨(dú)立的程序段單獨(dú)編寫和調(diào)試,作為一個(gè)相對(duì)獨(dú)立的模塊供程序使用,就形成子程序子程序可以實(shí)現(xiàn)源程序的模塊化,可簡(jiǎn)化源程序結(jié)構(gòu),可以提高編程效率主程序(調(diào)用程序)需要利用CALL指令調(diào)用子程序(被調(diào)用程序)子程序需要利用RET指令返回主程序3.6.1過(guò)程定義和子程序編寫匯編語(yǔ)言中,子程序要用一對(duì)過(guò)程偽指令PROC和ENDP聲明,格式如下:
過(guò)程名
PROC
[NEAR|FAR] …… ;過(guò)程體
過(guò)程名
ENDP可選的參數(shù)指定過(guò)程的調(diào)用屬性。沒(méi)有指定過(guò)程屬性,則采用默認(rèn)屬性NEAR屬性(段內(nèi)近調(diào)用)的過(guò)程只能被相同代碼段的其他程序調(diào)用FAR屬性(段間遠(yuǎn)調(diào)用)的過(guò)程可以被相同或不同代碼段的程序調(diào)用子程序編寫注意事項(xiàng)⑴子程序要利用過(guò)程定義偽指令聲明⑵子程序最后利用RET指令返回主程序,主程序執(zhí)行CALL指令調(diào)用子程序⑶子程序中對(duì)堆棧的壓入和彈出操作要成對(duì)使用,保持堆棧的平衡⑷子程序開始應(yīng)該保護(hù)使用到的寄存器內(nèi)容,子程序返回前相應(yīng)進(jìn)行恢復(fù)⑸子程序應(yīng)安排在代碼段的主程序之外,最好放在主程序執(zhí)行終止后的位置(返回DOS后、匯編結(jié)束END偽指令前),也可以放在主程序開始執(zhí)行之前的位置例3.15用顯示器功能調(diào)用輸出一個(gè)字符的子程序
;主程序 moval,‘?’ ;主程序提供顯示字符
calldpchar
;調(diào)用子程序
;子程序:顯示AL中的字符dpchar proc
;過(guò)程定義,過(guò)程名為dpchar
pushax
;順序入棧,保護(hù)寄存器
pushbx movbx,0 movah,0eh ;顯示器0EH號(hào)輸出一個(gè)字符功能 int10h
popbx
;逆序出棧,恢復(fù)寄存器
popax ret ;子程序返回dpchar endp
;過(guò)程結(jié)束例3.15源程序;wj0315.asm .modelsmall .stack .codestart: movax,@data movds,ax
moval,‘?’
;主程序提供顯示字符
calldpchar
;調(diào)用子程序 movax,4c00h int21h主程序部分本程序不需要數(shù)據(jù)段例3.15源程序(續(xù))dpchar proc
;過(guò)程定義,過(guò)程名為dpchar pushax ;順序入棧,保護(hù)寄存器 pushbx movbx,0 movah,0eh ;顯示器0EH號(hào)輸出一個(gè)字符功能 int10h popbx ;逆序出棧,恢復(fù)寄存器 popax
ret ;子程序返回dpchar endp
;過(guò)程結(jié)束 endstart子程序安排在主程序執(zhí)行終止后的位置子程序編寫注意事項(xiàng)(續(xù))⑹子程序允許嵌套和遞歸⑺子程序可以與主程序共用一個(gè)數(shù)據(jù)段,也可以使用不同的數(shù)據(jù)段(注意修改DS),還可以在子程序最后設(shè)置數(shù)據(jù)區(qū)(利用CS尋址)⑻子程序的編寫可以很靈活,例如具有多個(gè)出口(多個(gè)RET指令)和入口,但一定要保證堆棧操作的正確性⑼處理好子程序與主程序間的參數(shù)傳遞問(wèn)題⑽提供必要的子程序說(shuō)明信息例3.16顯示以“0”結(jié)尾字符串的嵌套子程序
;數(shù)據(jù)段msg db'Well,Imadeit!',0
;代碼段(主程序) movsi,offsetmsg
;主程序提供顯示字符串
calldpstri
;調(diào)用子程序例3.16子程序;子程序dpstri:顯示DS:SI指向的字符串(以0結(jié)尾)
dpstri proc pushaxdps1: moval,[si] ;取顯示字符 incsi cmpal,0 ;是結(jié)尾,則顯示結(jié)束 jzdps2
calldpchar
;調(diào)用字符顯示子程序 jmpdps1dps2: popax retdpstri endp;子程序dpchar:顯示AL中的字符(同例題3.15)含數(shù)據(jù)區(qū)的子程序;子程序HTOASC:十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼HTOASC proc pushbx movbx,offsetASCII andal,0fh xlatCS:ASCII ;換碼:AL←CS:[BX+AL] popbx
ret;數(shù)據(jù)區(qū)ASCII db30h,31h,32h,33h,34h,35h,36h,37h,38h,39h db41h,42h,43h,44h,45h,46hHTOASC endp多出口子程序;子程序HTOASC:十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼
HTOASC proc andal,0fh cmpal,9 jbehtoasc1 addal,37h ;是A~F,加37H
ret
;子程序返回htoasc1: add,30h ;是0~9,加30H
ret
;子程序返回HTOASC endp參數(shù)傳遞主程序與子程序間一個(gè)主要問(wèn)題是參數(shù)傳遞入口參數(shù)(輸入?yún)?shù)):主程序調(diào)用子程序時(shí),提供給子程序的參數(shù)出口參數(shù)(輸出參數(shù)):子程序執(zhí)行結(jié)束返回給主程序的參數(shù)參數(shù)的具體內(nèi)容傳數(shù)值:傳送數(shù)據(jù)本身傳地址:傳送數(shù)據(jù)的主存地址常用的參數(shù)傳遞方法寄存器共享變量堆棧3.6.2用寄存器傳遞參數(shù)最簡(jiǎn)單和常用的參數(shù)傳遞方法是通過(guò)寄存器,只要把參數(shù)存于約定的寄存器中就可以了由于通用寄存器個(gè)數(shù)有限,這種方法對(duì)少量數(shù)據(jù)可以直接傳遞數(shù)值,而對(duì)大量數(shù)據(jù)只能傳遞地址采用寄存器傳遞參數(shù),注意帶有出口參數(shù)的寄存器不能保護(hù)和恢復(fù),帶有入口參數(shù)的寄存器可以保護(hù)、也可以不保護(hù),但最好能夠保持一致dpchardpstriHTOASC例3.17用寄存器傳遞參數(shù)顯示字符串
;數(shù)據(jù)段msg db'Well,Imadeit!',0
;代碼段(主程序)
movsi,offsetmsg
;SI寄存器傳遞參數(shù):字符串地址
calldpstri
;調(diào)用子程序例3.17用寄存器傳遞參數(shù)顯示字符串(續(xù))
;代碼段(子程序)
dpstri proc ;顯示以0結(jié)尾的字符處 pushax ;入口參數(shù):SI=字符串地址 pushdxdps1: movdl,[si]
;通過(guò)SI使用參數(shù) cmpdl,0 jzdps2 movah,2 int21h incsi jmpdps1dps2: popdx popax retdpstri endp例3.18從鍵盤輸入有符號(hào)十進(jìn)制數(shù)
;數(shù)據(jù)段count =10array dwcountdup(0)
;代碼段(主程序)
movcx,count movbx,offsetarrayagain: callread ;調(diào)用子程序,輸入一個(gè)數(shù)據(jù) mov[bx],ax ;存放出口參數(shù)
incbx incbx calldpcrlf
;調(diào)用子程序:光標(biāo)回車
loopagain將ASCII碼轉(zhuǎn)換為二進(jìn)制數(shù)的算法①首先判斷輸入正數(shù)還是負(fù)數(shù),并用一個(gè)寄存器記錄下來(lái);②接著輸入0~9數(shù)字(ASCII碼),并減30H轉(zhuǎn)換為二進(jìn)制數(shù);③然后將前面輸入的數(shù)值乘10,并與剛輸入的數(shù)字相加得到新的數(shù)值;④重復(fù)②、③步,直到輸入一個(gè)非數(shù)字字符結(jié)束;⑤如果是負(fù)數(shù)進(jìn)行求補(bǔ),轉(zhuǎn)換成補(bǔ)碼;否則直接將數(shù)值保存。例3.18從鍵盤輸入有符號(hào)十進(jìn)制數(shù)(續(xù)1)read proc ;輸入有符號(hào)十進(jìn)制數(shù)
pushbx ;出口參數(shù):AX
pushcx ;說(shuō)明:負(fù)數(shù)用“-”引導(dǎo)
pushdx xorbx,bx ;BX保存結(jié)果
xorcx,cx ;CX為正負(fù)標(biāo)志,0為正,-1為負(fù)
movah,1 ;輸入一個(gè)字符
int21h
cmpal,'+' ;是“+”,繼續(xù)輸入字符
jzread1
cmpal,'-' ;是“-”,設(shè)置-1標(biāo)志
jnzread2
movcx,-1例3.18從鍵盤輸入有符號(hào)十進(jìn)制數(shù)(續(xù)2)read1: movah,1 ;繼續(xù)輸入字符 int21hread2: cmpal,‘0’ ;不是0~9之間的字符,輸入結(jié)束 jbread3 cmpal,'9' jaread3
subal,30h ;是0~9之間的字符,轉(zhuǎn)換為二進(jìn)制數(shù) ;利用移位指令,實(shí)現(xiàn)數(shù)值乘10:BX←BX×10
shlbx,1 movdx,bx shlbx,1 shlbx,1 addbx,dx例3.18從鍵盤輸入有符號(hào)十進(jìn)制數(shù)(續(xù)3) movah,0 addbx,ax ;已輸入數(shù)值乘10后,與新輸入數(shù)值相加
jmpread1 ;繼續(xù)輸入字符read3: cmpcx,0 ;是負(fù)數(shù),進(jìn)行求補(bǔ) jzread4 negbxread4: movax,bx ;設(shè)置出口參數(shù)
popdx popcx popbx ret ;子程序返回read endp例3.18從鍵盤輸入有符號(hào)十進(jìn)制數(shù)(續(xù)4)dpcrlf proc
;使光標(biāo)回車換行的子程序 pushax pushdx movah,2 movdl,0dh int21h movah,2 movdl,0ah int21h popdx popax retdpcrlf endp3.6.3用共享變量傳遞參數(shù)子程序和主程序使用同一個(gè)變量名存取數(shù)據(jù)就是利用共享變量(全局變量)進(jìn)行參數(shù)傳遞如果變量定義和使用不在同一個(gè)源程序中,需要利用PUBLIC、EXTREN聲明如果主程序還要利用原來(lái)的變量值,則需要保護(hù)和恢復(fù)利用共享變量傳遞參數(shù),子程序的通用性較差,但特別適合在多個(gè)程序段間、尤其在不同的程序模塊間傳遞數(shù)據(jù)例3.19用共享變量傳遞參數(shù)顯示字符串
;數(shù)據(jù)段msg db'Well,Imadeit!',0temp dw? ;**共享變量
;代碼段(主程序) movsi,offsetmsg
movtemp,si ;**共享變量傳遞參數(shù)
calldpstri
;調(diào)用子程序例3.19用共享變量傳遞參數(shù)顯示字符串(續(xù))
;代碼段(子程序)
dpstri proc ;顯示以0結(jié)尾的字符處 pushax ;入口參數(shù):temp=字符串地址 pushdx
movsi,temp
;**通過(guò)temp獲得參數(shù) …… ;后同例3.16A程序例3.20向顯示器輸出有符號(hào)十進(jìn)制數(shù)
;數(shù)據(jù)段count =10array dw1234,-1234,0…wtemp dw?
;代碼段(主程序) movcx,count movbx,offsetarrayagain: movax,[bx]
movwtemp,ax ;將入口參數(shù)存放到共享變量
callwrite ;調(diào)用子程序,顯示一個(gè)數(shù)據(jù) incbx incbx calldpcrlf ;光標(biāo)回車換行 loopagain將二進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼的算法①首先判斷數(shù)據(jù)是零、正數(shù)或負(fù)數(shù),是零顯示“0”退出;②是負(fù)數(shù),顯示“-”,求數(shù)據(jù)的絕對(duì)值;③接著數(shù)據(jù)除以10,余數(shù)加30H轉(zhuǎn)換為ASCII碼壓入堆棧;④重復(fù)③步,直到商為0結(jié)束;⑤依次從堆棧彈出各位數(shù)字,進(jìn)行顯示。例3.20向顯示器輸出有符號(hào)十進(jìn)制數(shù)(續(xù)1)write proc ;顯示有符號(hào)10進(jìn)制數(shù)的通用子程序
pushax ;入口參數(shù):共享變量wtemp
pushbx pushdx
movax,wtemp ;取出顯示數(shù)據(jù)
testax,ax ;判斷數(shù)據(jù)是零、正數(shù)或負(fù)數(shù)
jnzwrite1 movdl,'0' ;是零,顯示“0”后退出
movah,2 int21h jmpwrite5例3.20向顯示器輸出有符號(hào)十進(jìn)制數(shù)(續(xù)2)write1: jnswrite2 ;是負(fù)數(shù),顯示“-”
movbx,ax ;AX數(shù)據(jù)暫存于BX
movdl,'-' movah,2 int21h movax,bx negax ;數(shù)據(jù)求補(bǔ)(絕對(duì)值)write2: movbx,10 pushbx ;10壓入堆棧,作為退出標(biāo)志例3.20向顯示器輸出有符號(hào)十進(jìn)制數(shù)(續(xù)3)write3: cmpax,0 ;數(shù)據(jù)(商)為零,轉(zhuǎn)向顯示
jzwrite4 subdx,dx ;擴(kuò)展被除數(shù)DX.AX
divbx ;數(shù)據(jù)除以10:DX.AX÷10
adddl,30h ;余數(shù)(0~9)轉(zhuǎn)換為ASCII碼
pushdx ;數(shù)據(jù)各位先低位后高位壓入堆棧
jmpwrite3write4: popdx ;數(shù)據(jù)各位先高位后低位彈出堆棧
cmpdl,10 ;是結(jié)束標(biāo)志10,則退出
jewrite5例3.20向顯示器輸出有符號(hào)十進(jìn)制數(shù)(續(xù)4)
movah,2 ;進(jìn)行顯示
int21h jmpwrite4write5: popdx popbx popax ret ;子程序返回write endp3.6.4用堆棧傳遞參數(shù)參數(shù)傳遞還可以通過(guò)堆棧這個(gè)臨時(shí)存儲(chǔ)區(qū)。主程序?qū)⑷肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù);子程序?qū)⒊隹趨?shù)壓入堆棧,主程序彈出堆棧取得它們采用堆棧傳遞參數(shù)是程式化的,它是編譯程序處理參數(shù)傳遞、以及匯編語(yǔ)言與高級(jí)語(yǔ)言混合編程時(shí)的常規(guī)方法例3.21用堆棧傳遞參數(shù)顯示字符串
;數(shù)據(jù)段msg db'Well,Imadeit!',0
;代碼段(主程序) movsi,offsetmsg
pushsi
;**入口參數(shù)壓入堆棧
calldpstri
;調(diào)用子程序
addsp,2
;**平衡堆棧例3.21用堆棧傳遞參數(shù)顯示字符串(續(xù))dpstri proc ;顯示以0結(jié)尾的字符處
pushbp ;**入口參數(shù):堆棧=字符串地址
movbp,sp ;**通過(guò)BP獲得堆棧內(nèi)的參數(shù)
pushax pushdx
movsi,[bp+4] ;**通過(guò)BP指針獲得參數(shù) …dps2: popdx popax
popbp
;**恢復(fù)BP寄存器 retdpstri endp例3.22計(jì)算有符號(hào)數(shù)平均值
;數(shù)據(jù)段count =10array dw1234,-1234,0…wmed dw?
;代碼段(主程序) movax,count
pushax
;壓入數(shù)據(jù)個(gè)數(shù) movax,offsetarray
pushax
;壓入數(shù)據(jù)緩沖區(qū)的偏移地址
callmean
;調(diào)用子程序,求平均值
addsp,4
;平衡堆棧
movwmed,ax
;保存出口參數(shù)例3.22計(jì)算有符號(hào)數(shù)平均值(續(xù)1)mean proc ;計(jì)算16位有符號(hào)數(shù)平均值子程序 ;入口參數(shù):順序壓入數(shù)據(jù)個(gè)數(shù)和數(shù)據(jù)緩沖區(qū)偏移地址
pushbp ;出口參數(shù):AX=平均值
movbp,sp
pushbx
pushcx pushdx pushsi pushdi
movbx,[bp+4] ;從堆棧中取出緩沖區(qū)偏移地址→BX
movcx,[bp+6] ;從堆棧中數(shù)據(jù)個(gè)數(shù)→CX例3.22計(jì)算有符號(hào)數(shù)平均值(續(xù)2)
xorsi,si ;SI保存求和的低16位值
movdi,si ;DI保存求和的高16位值mean1: movax,[bx] ;取出一個(gè)數(shù)據(jù)→AX
cwd ;符號(hào)擴(kuò)展→DX
addsi,ax ;求和低16位
adcdi,dx ;求和高16位
incbx ;指向下一個(gè)數(shù)據(jù)
incbx loopmean1 ;循環(huán)例3.22計(jì)算有符號(hào)數(shù)平均值(續(xù)3)
movax,si ;累加和在DX.AX
movdx,di
movcx,[bp+6] ;數(shù)據(jù)個(gè)數(shù)在CX
idivcx ;有符號(hào)數(shù)除法,AX=平均值
popdi ;恢復(fù)寄存器
popsi popdx popcx popbx
popbp retmean endp3.6.5子程序模塊將子程序單獨(dú)編寫成一個(gè)源程序文件,經(jīng)過(guò)匯編之后形成目標(biāo)模塊OBJ文件,連接時(shí)應(yīng)用⑴使用偽指令PUBLIC和EXTERN聲明共享 PUBLIC標(biāo)識(shí)符[,標(biāo)識(shí)符…] ;定義標(biāo)識(shí)符的模塊使用
EXTERN標(biāo)識(shí)符:類型[,標(biāo)識(shí)符:類型…] ;調(diào)用標(biāo)識(shí)符的模塊使用⑵子程序在代碼段中,但沒(méi)有開始和結(jié)束點(diǎn)。⑶子程序、主程序文件的存儲(chǔ)模式要一致。⑷處理好子程序與主程序之間的參數(shù)傳遞。例3.23輸入有符號(hào)十進(jìn)制數(shù)、求平均值輸出 ;子程序文件 .modelsmall ;相同的存儲(chǔ)模式
publicread,write,mean
;子程序共用
externwtemp:word
;聲明外部變量 .code ;代碼段 …… ;子程序代碼
;主程序文件 .modelsmall ;相同的存儲(chǔ)模式
externread:near,write:near,mean:near
;聲明外部子程序
publicwtemp
;變量共用 …… ;輸入、計(jì)算和輸出3.6.6子程序庫(kù)利用庫(kù)管理工具程序LIB.EXE將子程序模塊統(tǒng)一管理,存入子程序庫(kù)文件(.LIB)使用子程序庫(kù)中的子程序方法1:在連接過(guò)程中指明子程序庫(kù)方法2:主程序使用子程序庫(kù)文件包含偽指令I(lǐng)NCLUDELIB指明子程序庫(kù)的子程序的編寫與子程序模塊中的要求一樣,只是為方便調(diào)用,更加嚴(yán)格,最好遵循一致的規(guī)則。3.7宏匯編宏是具有宏名的一段匯編語(yǔ)句序列宏需要先定義,然后在程序中進(jìn)行宏調(diào)用由于形式上類似其他指令,所以常稱其為宏指令宏指令實(shí)際上是一段代碼序列的縮寫;在匯編時(shí),匯編程序用對(duì)應(yīng)的代碼序列替代宏指令因?yàn)槭窃趨R編過(guò)程中實(shí)現(xiàn)的宏展開,所以常稱為宏匯編1.宏定義宏定義由一對(duì)宏匯編偽指令MACRO和ENDM來(lái)完成,格式如下:
宏名 MACRO[形參表]
…… ;宏定義體
ENDM其中宏名是符合語(yǔ)法的標(biāo)識(shí)符,同一源程序中該名字定義唯一。宏定義體中不僅可以是硬指令序列,還可以是偽指令語(yǔ)句序列可選的形參表給出了宏定義中用到的形式參數(shù),每個(gè)形式參數(shù)之間用逗號(hào)分隔2.宏調(diào)用宏定義之后就可以使用它,即宏調(diào)用:
宏名[實(shí)參表]宏調(diào)用的格式同一般指令一樣:在使用宏指令的位置寫下宏名,后跟實(shí)體參數(shù);如果有多個(gè)參數(shù),應(yīng)按形參順序填入實(shí)參,也用逗號(hào)分隔在匯編時(shí),宏指令被匯編程序用對(duì)應(yīng)的代碼序列替代,這就是宏展開宏展開的具體過(guò)程是:當(dāng)匯編程序掃描源程序遇到已有定義的宏調(diào)用時(shí),即用相應(yīng)的宏定義體完全替代源程序的宏指令,同時(shí)用位置匹配的實(shí)參對(duì)形參進(jìn)行取代宏的實(shí)例1dispchar macrochar ;;宏定義
movah,2 ;;宏定義體
movdl,char int21h
endm
…
dispchar‘?’ ;宏調(diào)用(宏指令)
…
1
movah,2 ;宏展開
1
movdl,’?’1 int21h宏的實(shí)例2dispmsg macromessage ;;宏定義
movah,9 ;;宏定義體
leadx,message int21h
endm
…
dispmsgstring ;宏調(diào)用(宏指令)
…
1
movah,9 ;宏展開
1
leadx,string1 int21h宏與子程序的比較比較僅是源程序級(jí)的簡(jiǎn)化:宏調(diào)用在匯編時(shí)進(jìn)行程序語(yǔ)句的展開,不需要返回;不減小目標(biāo)程序,執(zhí)行速度沒(méi)有改變通過(guò)形參、實(shí)參結(jié)合實(shí)現(xiàn)參數(shù)傳遞,簡(jiǎn)捷直觀、靈活多變還是目標(biāo)程序級(jí)的簡(jiǎn)化:子程序調(diào)用在執(zhí)行時(shí)由CALL指令轉(zhuǎn)向、RET指令返回;形成的目標(biāo)代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲(chǔ)單元或堆棧等傳遞參數(shù)宏子程序宏與子程序的比較結(jié)論宏與子程序具有各自的特點(diǎn),程序員應(yīng)該根據(jù)具體問(wèn)題選擇使用那種方法通常,當(dāng)程序段較短或要求較快執(zhí)行時(shí),應(yīng)選用宏;當(dāng)程序段較長(zhǎng)或?yàn)闇p小目標(biāo)代碼時(shí),要選用子程序比較
結(jié)論宏子程序3.局部標(biāo)號(hào)宏定義體中的標(biāo)號(hào)必須用LOCAL偽指令聲明為局部標(biāo)號(hào)局部標(biāo)號(hào)偽指令LOCAL只能用在宏定義體內(nèi),而且是宏定義MACRO語(yǔ)句之后的第一條語(yǔ)句:
LOCAL標(biāo)號(hào)列表標(biāo)號(hào)列表由宏定義體內(nèi)使用的標(biāo)號(hào)組成,用逗號(hào)分隔每次宏展開時(shí)匯編程序?qū)?duì)其中的標(biāo)號(hào)自動(dòng)產(chǎn)生一個(gè)唯一的標(biāo)識(shí)符(其形式為“??0000”到“??FFFF”),避免宏展開后的標(biāo)號(hào)重復(fù)將十六進(jìn)制字符轉(zhuǎn)換為十六進(jìn)制數(shù)的宏ASCTOH macro
localasctoh1,asctoh2 cmpal,'9' jbeasctoh1 ;;‘0’~‘9’,減去30H
cmpal,'a' jbasctoh2 ;;‘A’~‘F’,還要減7
subal,20h ;;‘a(chǎn)’~‘f’,再減去20Hasctoh2: subal,7asctoh1: subal,30h endm將一個(gè)字量數(shù)據(jù)按十六進(jìn)制數(shù)顯示出來(lái)的宏disphex macrohexdata
localdisphex1 pushax ;保護(hù)寄存器 pushbx pushcx pushdx movbx,hexdata movcx,0404h ;CH=4,作為循環(huán)次數(shù) ;CL=4,作為循環(huán)移位次數(shù)將一個(gè)字量數(shù)據(jù)按十六進(jìn)制數(shù)顯示出來(lái)的宏(續(xù))disphex1: rolbx,cl ;高4位循環(huán)移位到低4位 moval,bl andal,0fh callhtoasc ;轉(zhuǎn)換成ASCII碼 dispcharal ;顯示該位數(shù)值 decch jnzdisphex1 popdx ;恢復(fù)寄存器 popcx popbx popax endm4.文件包含包含偽指令I(lǐng)NCLUDE可以將任何文本文件內(nèi)容插入源程序,與其他部分同時(shí)匯編
INCLUDE文件名包含的文件可以是.MAC宏庫(kù)文件:常用的或有價(jià)值的宏定義.INC包含文件:各種常量定義、聲明語(yǔ)句等.ASM匯編語(yǔ)言源文件:常用的子程序等利用INCLUDE偽指令包含其他文件,其實(shí)質(zhì)仍然是一個(gè)源程序,只不過(guò)是分在了幾個(gè)文件書寫;被包含的文件不能獨(dú)立匯編,是依附主程序而存在的例3.24輸入中斷向量號(hào),顯示其入口地址
includewj0324.mac ;前面4個(gè)宏定義 ;數(shù)據(jù)段msg1 db'Enternumber(XX):$'msg2 db'TheInterruptProgramAddress:$'crlf db0dh,0ah,'$' ;代碼段
dispmsgmsg1 ;提示輸入一個(gè)兩位十六進(jìn)制數(shù)
movah,1 ;接受高位
in
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024技術(shù)服務(wù)咨詢合同
- 2024年貨物搬運(yùn)及裝卸合作協(xié)議2篇
- 機(jī)械制造業(yè)衛(wèi)生保障
- 《常用定位元件》課件
- 2024年離職員工保密合同
- 2024年火鍋店創(chuàng)業(yè)聯(lián)盟協(xié)議書
- 冶金行業(yè)銷售員工作報(bào)告
- 教育機(jī)構(gòu)代理合同三篇
- 2024年綜合性能源管理服務(wù)協(xié)議范本版B版
- 二零二五年度2025版?zhèn)€人承包體育賽事運(yùn)營(yíng)合同范本3篇
- 廣東省廣州市2025屆高三上學(xué)期12月調(diào)研測(cè)試語(yǔ)文試卷(含答案)
- 【9歷期末】安徽省利辛縣部分學(xué)校2023~2024學(xué)年九年級(jí)上學(xué)期期末考試歷史試卷
- GB/T 44949-2024智能熱沖壓成形生產(chǎn)線
- 阜陽(yáng)市重點(diǎn)中學(xué)2025屆高考數(shù)學(xué)全真模擬密押卷含解析
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳海報(bào)
- 2024-2025學(xué)年統(tǒng)編版七年級(jí)語(yǔ)文上學(xué)期期末真題復(fù)習(xí) 專題01 古詩(shī)文名篇名句默寫
- 2024-2030年中國(guó)企業(yè)大學(xué)建設(shè)行業(yè)轉(zhuǎn)型升級(jí)模式及投資規(guī)劃分析報(bào)告
- 醫(yī)院培訓(xùn)課件:《病歷書寫基本規(guī)范(醫(yī)療核心制度)》
- 2024年“中銀杯”安徽省職業(yè)院校技能大賽(高職組)花藝賽項(xiàng)競(jìng)賽規(guī)程
- 部隊(duì)年度安全規(guī)劃方案
- 2024-2025學(xué)年七年級(jí)上學(xué)期歷史觀點(diǎn)及論述題總結(jié)(統(tǒng)編版)
評(píng)論
0/150
提交評(píng)論