微機(jī)原理教程03-2_第1頁(yè)
微機(jī)原理教程03-2_第2頁(yè)
微機(jī)原理教程03-2_第3頁(yè)
微機(jī)原理教程03-2_第4頁(yè)
微機(jī)原理教程03-2_第5頁(yè)
已閱讀5頁(yè),還剩50頁(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)介

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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論