新版匯編語言程序設(shè)計(jì)【課后習(xí)題答案】-錢曉捷-主編-電子工業(yè)出版社_第1頁
新版匯編語言程序設(shè)計(jì)【課后習(xí)題答案】-錢曉捷-主編-電子工業(yè)出版社_第2頁
新版匯編語言程序設(shè)計(jì)【課后習(xí)題答案】-錢曉捷-主編-電子工業(yè)出版社_第3頁
新版匯編語言程序設(shè)計(jì)【課后習(xí)題答案】-錢曉捷-主編-電子工業(yè)出版社_第4頁
新版匯編語言程序設(shè)計(jì)【課后習(xí)題答案】-錢曉捷-主編-電子工業(yè)出版社_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

新版匯編語言程序設(shè)計(jì)【課后習(xí)題答案】鈔票曉捷主編電子工業(yè)出版社第2章8086的指令系統(tǒng)〔全〕

第2章8086的指令系統(tǒng)

〔習(xí)題2.1〕DS=2000H、BX=0100H、SI=0002H,存儲(chǔ)單元[20210H]~[20213H]依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,講明以下每條指令執(zhí)行完后AX存放器的內(nèi)容?!?〕movax,1200h〔2〕movax,bx〔3〕movax,[1200h]〔4〕movax,[bx]〔5〕movax,[bx+1100h]〔6〕movax,[bx+si]〔7〕movax,[bx][si+1100h]〔解答〕〔1〕AX=1200H〔2〕AX=0100H〔3〕AX=4C2AH

;偏移地址=bx=0100h〔4〕AX=3412H

;偏移地址=bx=0100h〔5〕AX=4C2AH

;偏移地址=bx+1100h=1200h〔6〕AX=7856H

;偏移地址=bx+si=0100h+0002h=0102h〔7〕AX=65B7H

;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h

〔習(xí)題2.2〕指出以下指令的錯(cuò)誤〔1〕movcx,dl〔2〕movip,ax〔3〕moves,1234h〔4〕moves,ds〔5〕moval,300〔6〕mov[sp],ax〔7〕movax,bx+di〔8〕mov20h,ah〔解答〕〔1〕兩操作數(shù)類型不匹配〔2〕IP指令指針禁止用戶訪咨詢〔3〕立即數(shù)不準(zhǔn)許傳給段存放器〔4〕段存放器之間不準(zhǔn)許傳送〔5〕兩操作數(shù)類型不匹配〔6〕目的操作數(shù)應(yīng)為[SI]〔7〕源操作數(shù)應(yīng)為[BX+DI]

〔8〕立即數(shù)不能作目的操作數(shù)

〔習(xí)題2.3〕數(shù)字0~9對(duì)應(yīng)的格雷碼依次為:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table為首地址〔設(shè)為200H〕的連續(xù)區(qū)域中。請(qǐng)為如下程序段的每條指令加上注釋,講明每條指令的功能和執(zhí)行結(jié)果。leabx,tablemoval,8xlat〔解答〕leabx,table

;獵取table的首地址,BX=200Hmoval,8

;傳送欲轉(zhuǎn)換的數(shù)字,AL=8xlat

;轉(zhuǎn)換為格雷碼,AL=12H

P35

〔習(xí)題2.4〕什么是堆棧,它的工作原那么是什么,它的全然操作有哪兩個(gè),對(duì)應(yīng)哪兩種指令?〔解答〕堆棧是一種按“先進(jìn)后出〞原那么存取數(shù)據(jù)的存儲(chǔ)區(qū)域,位于堆棧段中,使用SS段存放器記錄其段地址;它的工作原那么是先進(jìn)后出;堆棧的兩種全然操作是壓棧和出棧,對(duì)應(yīng)的指令是PUSH和POP。

〔習(xí)題2.5〕SS=2200H、SP=00B0H,畫圖講明執(zhí)行下面指令序列時(shí),堆棧區(qū)和SP的內(nèi)容如何變化?movax,8057hpushaxmovax,0f79h

pushaxpopbxpop[bx]〔解答〕movax,8057hpushaxmovax,0f79hpushaxpopbx

;bx=0f79hpop[bx]

;DS:[0f79h]=8057h〔習(xí)題2.6〕給出以下各條指令執(zhí)行后AL值,以及CF、ZF、SF、OF和PF的狀態(tài):moval,89haddal,aladdal,9dhcmpal,0bchsubal,aldecalincal〔解答〕moval,89h

;AL=89h

CF

ZF

SF

OF

PFaddal,al

;AL=12h

1

0

0

1

1;10001001+10001001100010010addal,9dh

;AL=0afh

0

0

1

0

1;00010010+1001110110101111cmpal,0bch

;AL=0afh

1

0

1

0

1;10101111-10111100*01000011subal,al

;AL=00h

0

1

0

0

1decal

;AL=0ffh

0

0

1

0

1;00000000-00000001

*11111111incal

;AL=00h

0

1

0

0

1;11111111+00000001*11111111〔習(xí)題2.7〕設(shè)X、Y、Z均為雙字?jǐn)?shù)據(jù),分不存放在地址為X、X+2;Y、Y+2;Z、Z+2的存儲(chǔ)單元中,它們的運(yùn)算結(jié)果存進(jìn)W單元。閱讀如下程序段,給出運(yùn)算公式。movax,Xmovdx,X+2addax,Yadcdx,Y+2addax,24adcdx,0subax,Zsbbdx,Z+2movW,ax

movW+2,dx〔解答〕W=X+Y+24-Z

〔習(xí)題2.8〕請(qǐng)分不用一條匯編語言指令完成如下功能:〔1〕把BX存放器和DX存放器的內(nèi)容相加,結(jié)果存進(jìn)DX存放器?!?〕用存放器BX和SI的基址變址尋址方式把存儲(chǔ)器的一個(gè)字節(jié)與AL存放器的內(nèi)容相加,并把結(jié)果送到AL中?!?〕用BX和位移量0B2H的存放器相對(duì)尋址方式把存儲(chǔ)器中的一個(gè)字和CX存放器的內(nèi)容相加,并把結(jié)果送回存儲(chǔ)器中?!?〕用位移量為0520H的直截了當(dāng)尋址方式把存儲(chǔ)器中的一個(gè)字與數(shù)3412H相加,并把結(jié)果送回該存儲(chǔ)單元中?!?〕把數(shù)0A0H與AL存放器的內(nèi)容相加,并把結(jié)果送回AL中。〔解答〕〔1〕ADDDX,BX〔2〕ADDAL,[BX+SI]〔3〕ADD[BX+0B2H],CX〔4〕ADDWORDPTR[0520H],3412H〔5〕ADDAL,0A0H

〔習(xí)題2.9〕設(shè)X、Y、Z、V均為16位帶符號(hào)數(shù),分不裝在X、Y、Z、V存儲(chǔ)單元中,閱讀如下程序段,得出它的運(yùn)算公式,并講明運(yùn)算結(jié)果存于何處。movax,X

;ax=XimulY

;DX.AX=X*Ymovcx,ax

;cx=X*Y的低16位moxbx,dx

;bx=X*Y的高16位movax,Z

;ax=Zcwdaddcx,ax

;cx=Z的低16位+X*Y的低16位adcbx,dx

;bx=Z的高16位+X*Y的高16位+低位進(jìn)位subcx,540

;cx=Z的低16位+X*Y的低16位-540sbbbx,0

;bx=Z的高16位+X*Y的高16位+低位進(jìn)位-低位借位movax,V

;ax=Vcwdsubax,cx

;ax=V的低16位-〔Z的低16位+X*Y的低16位-540〕sbbdx,bx

;dx=V的高16位-〔Z的高16位+X*Y的高16位+低位進(jìn)位-低位借位〕-低位借位idivX;/X〔解答〕[V-(X*Y+Z-540)]/XAX存商,DX存余數(shù)

〔習(xí)題2.10〕指出以下指令的錯(cuò)誤:〔1〕xchg[si],30h〔2〕popcs〔3〕sub[si],[di]〔4〕pushah〔5〕adcax,ds〔6〕add[si],80h〔7〕inal,3fch〔8〕outdx,ah〔解答〕〔1〕xchg的操作數(shù)不能是立即數(shù)〔2〕不應(yīng)對(duì)CS直截了當(dāng)賦值〔3〕兩個(gè)操作數(shù)不能根基上存儲(chǔ)單元〔4〕堆棧的操作數(shù)不能是字節(jié)量〔5〕adc的操作數(shù)不能是段存放器〔6〕沒有確定是字節(jié)依舊字操作〔7〕in不支持超過FFH的直截了當(dāng)尋址〔8〕out只能以AL/AX為源操作數(shù)

〔習(xí)題2.11〕給出以下各條指令執(zhí)行后的結(jié)果,以及狀態(tài)標(biāo)志CF、OF、SF、ZF、PF的狀態(tài)。movax,1470handax,axorax,axxorax,axnotaxtestax,0f0f0h〔解答〕

movax,1470h

;AX=1470HCF

ZF

SF

OF

PFandax,ax

;AX=1470H0

0

0

0

0orax,ax

;AX=1470H0

0

0

0

0xorax,ax

;AX=0000H0

1

0

0

1notax

;AX=FFFFH0

1

0

0

1testax,0f0f0h

;AX=FFFFH0

0

1

0

1注重:MOV和NOT指令不礙事標(biāo)志位;其他邏輯指令使CF=OF=0,依據(jù)結(jié)果礙事其他標(biāo)志位。

〔習(xí)題2.12〕假設(shè)例題2.32的程序段中,AX=08H,BX=10H,請(qǐng)講明每條指令執(zhí)行后的結(jié)果和各個(gè)標(biāo)志位的狀態(tài)。〔解答〕指令

;執(zhí)行結(jié)果

CFOFSFZFPFmovsi,ax

;SI=AX=0008H

-

-

-

-

-shlsi,1

;SI=2*AX=0010H

0

0

0

0

0addsi,ax

;SI=3*AX=0018H

0

0

0

0

1movdx,bx

;DX=BX=0010H

0

0

0

0

1movcl,03h

;CL=03H

0

0

0

0

1shldx,cl

;DX=8*BX=0080H

0

u

0

0

0subdx,bx

;DX=7*BX=0070H

0

0

0

0

0adddx,si

;DX=7*BX+3*AX=0088H

0

0

0

0

1注重:邏輯左移N次相當(dāng)于無符號(hào)整數(shù)乘以2的N次方,邏輯右移N次相當(dāng)于無符號(hào)整數(shù)除以2的N次方。移位指令依據(jù)移位的數(shù)據(jù)設(shè)置CF,依據(jù)移位后的結(jié)果礙事SF,ZF,PF。在進(jìn)行一位移位時(shí),依據(jù)最高符號(hào)位是否改變?cè)O(shè)置OF,如改變那么OF=1。另外,程序注釋用“u〞表示標(biāo)志無定義〔不確定〕,“-〞表示無礙事。

〔習(xí)題2.13〕編寫程序段完成如下要求:〔1〕用位操作指令實(shí)現(xiàn)AL〔無符號(hào)數(shù)〕乘以10〔2〕用邏輯運(yùn)算指令實(shí)現(xiàn)數(shù)字0~9的ASCII碼與非壓縮BCD碼的互相轉(zhuǎn)換〔解答〕〔1〕

;不考慮進(jìn)位

movbl,almovcl,3shlal,cl

;*8addal,bl

;shlbl,1

addal,bl;考慮進(jìn)位xorah,ahmovbx,axmovcl,3shlax,claddax,bx

;shlbx,1addax,bx〔2〕數(shù)字0~9的ASCII碼是:30h~39h非壓縮BCD碼的0~9是:00h~09h方法一:andal,0fh

;實(shí)現(xiàn)ASCII到非壓縮BCD碼的轉(zhuǎn)換oral,30h

;實(shí)現(xiàn)非壓縮BCD碼到ASCII的轉(zhuǎn)換方法二:xoral,30h

;求反D5D4位,其他不變;即高4位為3,那么變?yōu)?;高4位為0,那么變?yōu)?〔3〕movcl,4again:

shrdx,1

;實(shí)現(xiàn)邏輯右移

;采納“sardx,1〞,那么實(shí)現(xiàn)算術(shù)右移

rcrax,1

deccljnzagain

〔習(xí)題2.14〕AL=F7H〔表示有符號(hào)數(shù)-9〕,分不編寫用SAR和IDIV指令實(shí)現(xiàn)的除以2的程序段,并講明各自執(zhí)行后,所得的商是什么?〔解答〕〔1〕用sar編寫moval,0f7h

;-9送AL11111001saral,1

;結(jié)果:AL=11111100B=0FBH

即-5〔2〕用idiv編寫moval,0f7h

;-9送alcbw

;字節(jié)符號(hào)擴(kuò)展位字movbl,2

;注重除數(shù)不可為立即數(shù)idivbl

;結(jié)果:商為al=fch

(-4);余數(shù):ah=ffh(-1)結(jié)論:符號(hào)數(shù)的除法用idiv正確。

〔習(xí)題2.15〕數(shù)據(jù)段500h~600h處存放了一個(gè)字符串,講明以下程序段執(zhí)行后的結(jié)果:movsi,600hmovdi,601hmovax,dsmoves,axmovcx,256stdrepmovsb〔解答〕

〔習(xí)題2.16〕講明以下程序段的功能cldmovax,0fefhmovcx,5movbx,3000hmoves,bxmovdi,2000hrepstosw〔解答〕

將es:di(即3000:2000h或32000h)開始的5個(gè)單元的內(nèi)容置為0fefh。

〔習(xí)題2.17〕指令指針I(yè)P是通用存放器依舊專用存放器?有指令能夠直截了當(dāng)它賦值嗎?哪類指令的執(zhí)行會(huì)改變它的值?〔解答〕指令指針I(yè)P不是通用存放器,不可直截了當(dāng)賦值,屬于專用存放器。有且僅有循環(huán)、轉(zhuǎn)移、子程序調(diào)用和返回、中斷類等指令能夠改變它的值。

〔習(xí)題2.18〕操縱轉(zhuǎn)移類指令中有哪三種尋址方式?〔解答〕操縱轉(zhuǎn)移類指令的尋址方式:相對(duì)尋址、直截了當(dāng)尋址方式和間接尋址方式〔又能夠分成存放器和存儲(chǔ)器間接尋址〕。

〔習(xí)題2.19〕什么是短轉(zhuǎn)移shortjump、近轉(zhuǎn)移nearjump和遠(yuǎn)轉(zhuǎn)移farjump?什么是段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移?8086有哪些指令能夠?qū)崿F(xiàn)段間轉(zhuǎn)移?〔解答〕短轉(zhuǎn)移:指段內(nèi)-128~127之間的轉(zhuǎn)移,位移量用一個(gè)字節(jié)表示近轉(zhuǎn)移:指段內(nèi)±32K之間的轉(zhuǎn)移,位移量用一個(gè)字表示遠(yuǎn)轉(zhuǎn)移:指段間1MB范圍的轉(zhuǎn)移段內(nèi)轉(zhuǎn)移:指在同一個(gè)代碼段內(nèi)的轉(zhuǎn)移,能夠是短轉(zhuǎn)移或者近轉(zhuǎn)移段間轉(zhuǎn)移:指轉(zhuǎn)移到另外一個(gè)代碼段,確實(shí)是根基遠(yuǎn)轉(zhuǎn)移8086/8088CPU的JMP、CALL和INTn指令能夠?qū)崿F(xiàn)段間轉(zhuǎn)移

〔習(xí)題2.20〕8086的條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍有多大?實(shí)際編程時(shí),你如何處理超出范圍的條件轉(zhuǎn)移?〔解答〕8086的條件轉(zhuǎn)移的轉(zhuǎn)移范圍:在當(dāng)前指令地址的+127~-128之內(nèi)。如條件轉(zhuǎn)移的轉(zhuǎn)移范圍超出此范圍,可在此范圍內(nèi)安排一條無條件轉(zhuǎn)移,再轉(zhuǎn)移到范圍外的目標(biāo)地址。

〔習(xí)題2.21〕假設(shè)DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,試咨詢執(zhí)行以下段內(nèi)間接尋址的轉(zhuǎn)移指令后,轉(zhuǎn)移的有效地址是什么?〔1〕JMPBX〔2〕JMPTABLE[BX]〔3〕JMP[BX][SI]〔解答〕〔1〕轉(zhuǎn)移的有效地址EA=BX=1256H〔2〕轉(zhuǎn)移的有效地址EA=[DS:20A1H+1256H]=[232F7]=3280H〔3〕轉(zhuǎn)移的有效地址EA=[DS:1256H+528FH]=264E5H=2450H

〔習(xí)題2.22〕判定以下程序段跳轉(zhuǎn)的條件〔1〕xorax,1e1eh

jeequal〔2〕testal,10000001b

jnzthere〔3〕cmpcx,64hjbthere〔解答〕〔1〕AX=1e1eh〔異或后為0〕〔2〕AL的D0或D7至少有一位為1〔3〕CX〔無符號(hào)數(shù)〕<64h

〔習(xí)題2.23〕設(shè)置CX=0,那么LOOP指令將循環(huán)多少次?例如:

movcx,0delay:

loopdelay〔解答〕216次。

〔習(xí)題2.24〕假設(shè)AX和SI存放的是有符號(hào)數(shù),DX和DI存放的是無符號(hào)數(shù),請(qǐng)用對(duì)比指令和條件轉(zhuǎn)移指令實(shí)現(xiàn)以下判定:〔1〕假設(shè)DX>DI,轉(zhuǎn)到above執(zhí)行;〔2〕假設(shè)AX>SI,轉(zhuǎn)到greater執(zhí)行;〔3〕假設(shè)CX=0,轉(zhuǎn)到zero執(zhí)行;〔4〕假設(shè)AX-SI產(chǎn)生溢出,轉(zhuǎn)到overflow執(zhí)行;〔5〕假設(shè)SI≤AX,轉(zhuǎn)到less_eq執(zhí)行;〔6〕假設(shè)DI≤DX,轉(zhuǎn)到below_eq執(zhí)行。〔解答〕〔1〕假設(shè)DX>DI,轉(zhuǎn)到above執(zhí)行cmpdx,dijaabove

;=j(luò)nbeabove〔2〕假設(shè)AX>SI,轉(zhuǎn)到greater執(zhí)行cmpax,sijggreater

;=j(luò)nlegreater〔3〕假設(shè)CX=0,轉(zhuǎn)到zero執(zhí)行cmpcx,0jzzero

;=j(luò)cxzzero

〔4〕假設(shè)AX-SI產(chǎn)生溢出,轉(zhuǎn)到overflow執(zhí)行;cmpax,sijooverflow〔5〕假設(shè)SI≤AX,轉(zhuǎn)到less_eq執(zhí)行;cmpsi,ax

;cmpax,sijleless_eq

;jgeless_eq〔6〕假設(shè)DI≤DX,轉(zhuǎn)到below_eq執(zhí)行。cmpdi,dx

;cmpdx,dijbebelow_eq

;jaebelow_eq

〔習(xí)題2.25〕有一個(gè)首地址為array的20個(gè)字的數(shù)組,講明以下程序段的功能。movcx,20movax,0movsi,axsum_loop:

addax,array[si]addsi,2loopsum_loopmovtotal,ax〔解答〕將首地址為array得20個(gè)字的數(shù)組求和,并將結(jié)果存進(jìn)total單元中。

〔習(xí)題2.26〕按照以下要求,編寫相應(yīng)的程序段:〔1〕起始地址為string的主存單元中存放有一個(gè)字符串〔長度大于6〕,把該字符串中的第1個(gè)和第6個(gè)字符〔字節(jié)量〕傳送給DX存放器?!?〕從主存buffer開始的4個(gè)字節(jié)中保持了4個(gè)非壓縮BCD碼,現(xiàn)按低〔高〕地址對(duì)低〔高〕位的原那么,將它們合并到DX中?!?〕編寫一個(gè)程序段,在DX高4位全為0時(shí),使AX=0;否那么使AX=-1?!?〕有兩個(gè)64位數(shù)值,按“小端方式〞存放在兩個(gè)緩沖區(qū)buffer1和buffer2中,編寫程序段完成buffer1-buffer2功能?!?〕假設(shè)從B800h:0開始存放有100個(gè)16位無符號(hào)數(shù),編程求它們的和,并把32位的和保持在DX.AX中。〔6〕字符串string包含有32KB內(nèi)容,將其中的’$’符號(hào)替換成空格?!?〕有一個(gè)100個(gè)字節(jié)元素的數(shù)組,其首地址為array,將每個(gè)元素減1〔不考慮溢出〕存于原處?!?〕統(tǒng)計(jì)以’$’結(jié)尾的字符串srting的字符個(gè)數(shù)?!步獯稹场?〕解答:movsi,0movdl,string[si]

;第1個(gè)字符送dl存放器:movdl,stirng[0]movsi,5movdh,string[si]

;第6個(gè)字符送dh存放器:movdl,stirng[5]〔2〕解答:xorsi,si

;si清零moval,buffer[si]

;第一字節(jié)incsimovah,buffer[si]

;第二字節(jié)movcl,4shlah,cl

;BCD碼移到高半字節(jié)oral,ah

;組合成壓縮BCD碼movdl,al

;存進(jìn)dl寄..incsimoval,buffer[si]

;第三字節(jié)incsimovah,buffer[si]

;第四字節(jié)movcl,4shlah,cl

;BCD碼移到高半字節(jié)oral,ah

;組合成壓縮BCD碼movdh,al

;存進(jìn)dh寄..〔3〕解答:testdx,0f000h

;testdh,0f0hjznext

;jnznextmovax,-1

;movax,0jmpagainnext:

movax,0

;movax,0ffffhagain:

...〔4〕解答:movax,wordptrbuffer1subax,wordptrbuffer2

;先減低16位movdx,wordptrbuffer1+2sbbdx,wordptrbuffer2+2

;后減高16位,需減低16位的借位〔5〕解答:movax,0b800h

movds,ax

;段地址

xorsi,si

;地址偏移量si=0

xordx,dx

;和的高字dx=0

movcx,99

;加的次數(shù)

movax,[si]

;第一個(gè)數(shù)again:

incsi

;指向下一個(gè)字單元

incsi

addax,[si]

;加下一個(gè)數(shù)

jnc

noc

;無進(jìn)位轉(zhuǎn)

incdx

;有進(jìn)位dx=dx+1noc:

deccx

;次數(shù)-1

jnzcx,again

;非0接著加〔6〕解答1:不使用串操作指令〔更好〕movsi,offsetstringmovcx,8000h

;32k=2^15=8000hagain:

cmpbyteptr[si],‘$’

;‘$’=24hjnznext

;不要采納jz進(jìn)行分支movbyteptr[si],‘

;‘’=20hnext:

incsiloopagain

;deccx;jnzagain〔6〕解答2:使用串操作指令movdi,offsetstringmoval,’$’movcx,8000hcldagain:

scasbjnznextmovbyteptres:[di-1],‘

’next:

loopagain〔7〕解答1:movsi,offsetarray

movcx,100again:

decbyteptr[si]incsiloopagain〔7〕解答2:xorsi,si

;si<--0movcx,100

;循環(huán)次數(shù)

again:

decarray[si]incsiloopagain〔7〕解答3:movsi,offsetarraymovdi,simovax,ds

moves,axmovcx,100cldagain:

lodsb

decalstosbloopagain〔8〕解答:xorsi,si

;si<--0coun:

cmpstring[si],'$'je

doneincsijmpcoundone:

...

〔習(xí)題2.27〕對(duì)下面要求,分不給出3種方法,每種方法只用一條指令?!?〕使CF=0

〔2〕使AX=0

〔3〕同時(shí)使AX=0和CF=0〔解答〕〔1〕解答:clcandax,axorax,ax〔2〕解答:xorax,axandax,0movax,0〔3〕解答:andax,0xorax,axsubax,ax

〔習(xí)題2.28〕參照本習(xí)題的示意圖,分析調(diào)用序列,畫出每次調(diào)用及返回時(shí)的堆棧狀態(tài)。其中CALL前是該指令所在的邏輯地址;另外,段內(nèi)直截了當(dāng)調(diào)用指令的機(jī)器代碼的字節(jié)數(shù)為3,段間直截了當(dāng)調(diào)用指令那么為5個(gè)字節(jié)?!步獯稹持鞒绦蜣D(zhuǎn)子suba時(shí)段內(nèi)調(diào)用:斷點(diǎn)1為2000h:0400h+3,轉(zhuǎn)子是只將IP壓棧。suba轉(zhuǎn)子subb時(shí)段間調(diào)用:斷點(diǎn)2為2000h:0840h+5,轉(zhuǎn)子時(shí)須將cs段地址和IP壓棧suba轉(zhuǎn)子subc時(shí)段內(nèi)調(diào)用:斷點(diǎn)3為2000h:0c021h+3,轉(zhuǎn)子是只將IP壓棧。注:壓棧時(shí)先修改sp再壓進(jìn)斷點(diǎn),彈棧時(shí)先彈出斷點(diǎn)再修改sp。

〔習(xí)題2.29〕AX、BX存放的是4位壓縮BCD表示的十進(jìn)制數(shù),請(qǐng)講明如下子程序的功能和出口參數(shù)。addal,bldaaxchgal,ahadcal,bhdaaxchgal,ahret〔解答〕壓縮BCD碼加法:AX←AX+BX出口參數(shù):AX=BCD碼和

〔習(xí)題2.30〕AAD指令是用于除法指令之前,進(jìn)行非壓縮BCD碼調(diào)整的。實(shí)際上,處理器的調(diào)整過程是:AL←AH×10+AL,AH←0。要是指令系統(tǒng)沒有AAD指令,請(qǐng)用一個(gè)子程序完成那個(gè)調(diào)整工作?!步獯稹硈hlah,1

;ah=2*a

(設(shè)原ah=a)

movdl,ah

;dl=2*a

movcl,2

;設(shè)定移位次數(shù)

shlah,cl

;ah=8*a

addah,dl

;ah=10*a

addal,ah

;al=10*a+al

xorah,ah

;清零ah

int3

;返回DOS注重:進(jìn)口:AX中存放有“和〞〔兩非壓縮BCD碼〕出口:AL中已為調(diào)整后的二進(jìn)制數(shù)

〔習(xí)題2.31〕解釋如下有關(guān)中斷的概念:〔1〕內(nèi)部中斷和外部中斷〔2〕單步中斷和斷點(diǎn)中斷〔3〕除法錯(cuò)中斷和溢出中斷〔4〕中斷向量號(hào)和中斷向量表〔解答〕〔1〕內(nèi)部中斷是由于8086CPU內(nèi)部執(zhí)行程序引起的程序中斷;外部中斷是來自8086CPU之外的緣故引起的程序中斷;〔2〕單步中斷是假設(shè)單步標(biāo)志TF為1,那么在每條指令執(zhí)行結(jié)束后產(chǎn)生的中斷;斷點(diǎn)中斷是供調(diào)試程序使用的,它的中斷類型號(hào)為3通常調(diào)試程序時(shí),把程序按程序的任務(wù)分成幾段,然后,每段設(shè)一個(gè)段點(diǎn);〔3〕除法錯(cuò)中斷是在執(zhí)行除法指令時(shí),假設(shè)除數(shù)為0或商超過了存放器所能表達(dá)的范圍產(chǎn)生的中斷;溢出中斷是在執(zhí)行溢出中斷指令I(lǐng)NTO時(shí),假設(shè)溢出標(biāo)志OF為1時(shí)產(chǎn)生的中斷;〔4〕中斷向量號(hào)是中斷類型號(hào);中斷向量表是中斷向量號(hào)與它所對(duì)應(yīng)的中斷效勞程序起始地址的轉(zhuǎn)換表。

〔習(xí)題2.32〕試對(duì)比INTn和段間CALL指令、IRET和段間RET指令的功能。〔解答〕INTn響應(yīng)中斷時(shí),除象CALL保衛(wèi)斷點(diǎn)外,還應(yīng)保衛(wèi)FR;段間CALL指令用在主程序中實(shí)現(xiàn)子程序的調(diào)用。IRET返回時(shí),除象RET恢復(fù)斷點(diǎn)外,還應(yīng)恢復(fù)FR;子程序執(zhí)行完成后,應(yīng)返回主程序中接著執(zhí)行,這一功能由RET指令完成。

〔習(xí)題2.33〕什么是系統(tǒng)功能調(diào)用?匯編語言中,它的一般格式是如何樣的?〔解答〕系統(tǒng)功能調(diào)用是用戶在程序一級(jí)請(qǐng)示操作系統(tǒng)效勞的一種手段,它不是一條簡(jiǎn)單的硬指令,而是帶有一定功能號(hào)的“訪指令〞,它的功能并非由硬件直截了當(dāng)提供,而是由操作系統(tǒng)操作系統(tǒng)中的一段程序完成的,即由軟件方法實(shí)現(xiàn)的匯編語言中,它的一般格式是分如下四步進(jìn)行:〔1〕在AH存放器置系統(tǒng)功能調(diào)用號(hào);〔2〕在指定的存放器中設(shè)置進(jìn)口參數(shù);〔3〕用INT21H(或ROM—BIOS的中斷向量號(hào))指令執(zhí)行功能調(diào)用;〔4〕據(jù)出口參數(shù)分析功能調(diào)用運(yùn)行情況。

〔習(xí)題2.34〕補(bǔ)充例2.40,當(dāng)有溢出時(shí)顯示“Error!Overflow!〞,無溢出時(shí)顯示“OK〞?!步獯稹硂kmsg

db‘OK’,‘$’errmsg

db‘Error!Overflow!’,‘$’…

movax,Xsubax,Yjooverflowmovdx,offsetokmsgjmpnextoverflow:

movdx,errmsgnext:

movah,9

int21h錯(cuò)誤解答:movax,Xsubax,Yjooverflowmovdx,offsetokmsg

okmsg

db‘OK’,‘$’

movdx,errmsg

;錯(cuò)誤1:數(shù)據(jù)定義在代碼中movah,9int21hoverflow:

errmsgdb‘Error!Overflow!’,‘$’

movdx,errmsg

;錯(cuò)誤2:缺少JMP指令movah,9int21h

〔習(xí)題2.35〕補(bǔ)充例2.42,顯示“1〞的個(gè)數(shù);注重首先將個(gè)數(shù)轉(zhuǎn)換為ASCII碼。〔解答〕andal,7fh

;使d7=0movdl,al

;轉(zhuǎn)存于dljnpnext

;奇數(shù)個(gè)1轉(zhuǎn)

oral,80h

;偶數(shù)個(gè)1使d7=1next:

xorbl,bl

;紀(jì)錄1的個(gè)數(shù)dl=0movcx,8

;移位次數(shù)again:

shldl,1

;邏輯左移1次jncdesp

;如cf=0轉(zhuǎn)incbl

;否那么cf=1個(gè)數(shù)加1desp:

loopagain

;cx=cx-1如cx不等于0,循環(huán)orbl,30h

;個(gè)數(shù)變?yōu)锳SCII碼movah,02h

;在CRT上顯示個(gè)數(shù)movdl,blint21hret

〔習(xí)題2.36〕先提示輸進(jìn)數(shù)字“InputNumber:0~9〞,然后在下一行顯示輸進(jìn)的數(shù)字,結(jié)束;要是不是鍵進(jìn)了0~9數(shù)字,就提示錯(cuò)誤“Error!〞,接著等待輸進(jìn)數(shù)字?!步獯稹?數(shù)據(jù)段str1

db'InputNumber:0~9:',0dh,0ah,'$'

str2

db'Error!',0dh,0ah,'$';代碼段movah,09h

;顯示str1字符串movdx,offsetstr1int21hgetkey:

movah,1

;調(diào)用DOS功能int21hcmp

al,'0'jberror

;小于0,出錯(cuò)處理cmpal,'9'jaerror

;大于9,出錯(cuò)處理movah,02h

;調(diào)用DOS顯示字符功能,顯示該數(shù)字movdl,alint21h...

;終止程序執(zhí)行,返回DOSerror:

movah,09h

;出錯(cuò),調(diào)用DOS功能顯示str2字符串movdx,offsetstr2int21hjmpgetkey

;返回按鍵

〔習(xí)題2.37〕從鍵盤輸進(jìn)一個(gè)字符串〔不超過255個(gè)〕,將其中的小寫字母轉(zhuǎn)換成大寫字母,然后按原來的順序在屏幕上顯示。〔解答〕思路:參考P67例2.52用0ah號(hào)DOS系統(tǒng)功能調(diào)用,從鍵盤輸進(jìn)一個(gè)字符串,然后從鍵盤緩沖區(qū)逐個(gè)取字符,在“a〞與“z〞之間的字符為小寫字母,需要轉(zhuǎn)換為大寫字母〔減往20h〕,其他不變。.modelsmall.stack.dataarray

db255db0array1

db255dup('$')array2

db0dh,0ah,'$'.code.startupmovah,0ah

;鍵盤輸進(jìn)字符串movdx,offsetarrayint21hmovdx,offsetarray2

;回車換行movah,09hint21hmovbx,offsetarray1again:

moval,[bx]cmpal,'$'jzdonecmpal,'a'

;小于a和大于z的字符不是小寫字母jbnextcmpal,'z'janextsubal,20h

;在a和z之間的字符才是小寫字母,轉(zhuǎn)換為大寫mov[bx],al

;保持到原位置next:

incbxjmpagaindone:

mo

溫馨提示

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

評(píng)論

0/150

提交評(píng)論