IBM-PC匯編語言程序設(shè)計(jì)答案(第2版)_第1頁
IBM-PC匯編語言程序設(shè)計(jì)答案(第2版)_第2頁
IBM-PC匯編語言程序設(shè)計(jì)答案(第2版)_第3頁
IBM-PC匯編語言程序設(shè)計(jì)答案(第2版)_第4頁
IBM-PC匯編語言程序設(shè)計(jì)答案(第2版)_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

附錄:《IBM—PC匯編語言程序設(shè)計(jì)》習(xí)題參考答案習(xí)題用降冪法和除法將下列十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)和十六進(jìn)制數(shù):(1)369 (2)10000 (3)4095 (4)32767答:(1)369=101110001B=171H(2)10000=10011100010000B=2710H(3)4095=111111111111B=FFFH(4)32767=111111111111111B=7FFFH將下列二進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)和十進(jìn)制數(shù):(1)101101 (2)10000000 (3)1111111111111111 (4)11111111答:(1)101101B=2DH=45(2)10000000B=80H=128(3)1111111111111111B=FFFFH=65535(4)11111111B=FFH=255將下列十六進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)和十進(jìn)制數(shù):(1)FA (2)5B (3)FFFE (4)1234答:(1)FAH=11111010B=250(2)5BH=1011011B=91(3)FFFEH=1111111111111110B=65534(4)1234H=1001000110100B=4660完成下列十六進(jìn)制數(shù)的運(yùn)算,并轉(zhuǎn)換為十進(jìn)制數(shù)進(jìn)行校核:(1)3A+B7 (2)1234+AF (3)ABCD-FE (4)7AB×6F答:(1)3A+B7H=F1H=241(2)1234+AFH=12E3H=4835(3)ABCD-FEH=AACFH=43727(4)7AB×6FH=35325H=217893下列各數(shù)均為十進(jìn)制數(shù),請用8位二進(jìn)制補(bǔ)碼計(jì)算下列各題,并用十六進(jìn)制數(shù)表示其運(yùn)算結(jié)果。(1)(-85)+76(2)85+(-76)(3)85-76(4)85-(-76)(5)(-85)-76(6)-85-(-76)答:(1)(-85)+76=10101011B+01001100B=11110111B=0F7H;CF=0;OF=0(2)85+(-76)=01010101B+10110100B=00001001B=09H;CF=1;OF=0(3)85-76=01010101B-01001100B=01010101B+10110100B=00001001B=09H;CF=0;OF=0(4)85-(-76)=01010101B-10110100B=01010101B+01001100B=10100001B=0A1H;CF=0;OF=1(5)(-85)-76=10101011B-01001100B=10101011B+10110100B=01011111B=5FH;CF=0;OF=1(6)-85-(-76)=10101011B-10110100B=10101011B+01001100B=11110111B=0F7H;CF=0;OF=0習(xí)題E5H000B0HE5H000B0H1EH000B1H3CH000B3H2AH000B4H存儲器2.2題的信息存放情況…000B2H答:可直接由指令指定的I/O端口數(shù)為256個。有兩個16位字1EE5H和2A3CH分別存放在80x86微機(jī)的存儲器的000B0H和000B3H單元中,請用圖表示出它們在存儲器里的存放情況。答:存儲器里的存放情況如右上圖所示。在IBMPC機(jī)的存儲器中存放信息如右下圖所示。試讀出30022H和30024H字節(jié)單元的內(nèi)容,以及30021H和30022H字單元的內(nèi)容。34H30021H34H30021HABH30022HCDH30023HEFH30024H存儲器2.3題的信息存放情況12H30020H在實(shí)模式下,段地址和偏移地址為3017:000A的存儲單元的物理地址是什么?如果段地址和偏移地址是3015:002A和3010:007A呢?答:3017:000A、3015:002A和3010:007A的存儲單元的物理地址都是3017AH。如果在一個程序開始執(zhí)行以前(CS)=0A7F答:該程序的第一個字的物理地址是0AAA40H。10F4010F4010E4020F4020E4021F0031F0031FF041FF0附加段數(shù)據(jù)段堆棧段代碼段2.6題的存儲器分段示意圖C>debug-rAX=0000BX=0000CX=0079DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=10E4ES=10F4SS=21F0CS=31FFIP=0100NVUPDIPLNZNAPONC答:此時存儲器分段的示意圖如右圖所示。OF、SF、ZF、CF的值都為0。下列操作可使用那些寄存器?(1)加法和減法 數(shù)據(jù)寄存器等(2)循環(huán)計(jì)數(shù) CX(3)乘法和除法 AX、DX,乘數(shù)和除數(shù)用其他寄存器或存儲器(4)保存段地址 段寄存器(5)表示運(yùn)算結(jié)果為0 ZF=1(6)將要執(zhí)行的指令地址 CS:IP(7)將要從堆棧取出數(shù)據(jù)的地址 SS:SP答:答案見題目的右邊。習(xí)題給定(BX)=637DH,(SI)=2A9BH,位移量D=7237H,試確定在以下各種尋址方式下的有效地址是什么?(1)立即尋址(2)直接尋址(3)使用BX的寄存器尋址(4)使用BX的簡接尋址(5)使用BX的寄存器相對尋址(6)基址變址尋址(7)相對基址變址尋址答:(1)操作數(shù)在指令中,即立即數(shù);(2)EA=D=7237H;(3)無EA,操作數(shù)為(BX)=637DH;(4)EA=(BX)=637DH;(5)EA=(BX)+D=0D5B4H;(6)EA=(BX)+(SI)=8E18H;(7)EA=(BX)+(SI)+D=1004FH;超過了段的邊界,最高進(jìn)位位丟失,因此EA=004FH。試根據(jù)以下要求寫出相應(yīng)的匯編語言指令(1)把BX寄存器和DX寄存器的內(nèi)容相加,結(jié)果存入DX寄存器中。(2)用寄存器BX和SI的基址變址尋址方式把存儲器中的一個字節(jié)與AL寄存器的內(nèi)容相加,并把結(jié)果送到AL寄存器中。(3)用寄存器BX和位移量0B2H的寄存器相對尋址方式把存儲器中的一個字和(CX)相加,并把結(jié)果送回存儲器中。(4)用位移量為0524H的直接尋址方式把存儲器中的一個字與數(shù)2A59H相加,并把結(jié)果送回存儲單元中。(5)把數(shù)0B5H與(AL)相加,并把結(jié)果送回AL中。答:(1)ADDDX,BX(2)ADDAL,[BX][SI](3)ADD[BX+0B2H],CX(4)ADDWORDPTR[0524H],2A59H(5)ADDAL,0B5H寫出把首地址為BLOCK的字?jǐn)?shù)組的第6個字送到DX寄存器的指令。要求使用以下幾種尋址方式:(1)寄存器間接尋址(2)寄存器相對尋址(3)基址變址尋址答:(1)MOVBX,OFFSETBLOCKADDBX,(6–1)*2MOVDX,[BX](2)MOVBX,OFFSETBLOCK 改為: MOVBX,(6-1)*2MOVDX,[BX+(6–1)*2] 也可 MOVDX,BLOCK[BX](3)MOVBX,OFFSETBLOCKMOVSI,(6–1)*2MOVDX,[BX][SI]FFH00HFFH00H80H3.6題的作圖表示10H1B00:2000H1B00:2001H1B00:2002H1B00:2003H8000:FF10H8000:FF11H?→(AL)?→(AH)(1)MOVAX,1200H(2)MOVAX,BX(3)MOVAX,[1200H](4)MOVAX,[BX](5)MOVAX,1100[BX](6)MOVAX,[BX][SI](7)MOVAX,1100[BX][SI]答:(1)(AX)=1200H(2)(AX)=0100H(3)(AX)=4C2AH(4)(AX)=3412H(5)(AX)=4C2AH(6)(AX)=7856H(7)(AX)=65B7H給定(IP)=2BC0H,(CS)=0200H,位移量D=5119H,(BX)=1200H,(DS)=212AH,(224A0H)=0600H,(275B9H)=098AH,試為以下的轉(zhuǎn)移指令找出轉(zhuǎn)移的偏移地址。(1)段內(nèi)直接尋址(2)使用BX及寄存器間接尋址方式的段內(nèi)間接尋址(3)使用BX及寄存器相對尋址方式的段內(nèi)間接尋址答:(1)JMPNEARPTR5119H ;(IP)=5119H+((IP)+03H)=7CDCH,物理地址PA=09CDCH(IP)+03H是JMPNEARPTR5119H指令的下一條指令的首地址。(2)JMPWORDPTR[BX] ;(IP)=((DS)*10H+(BX))=0600H,PA=02600H(3)JMPD[BX] ;(IP)=((DS)*10H+(BX)+D)=098AH,PA=0298AH設(shè)當(dāng)前數(shù)據(jù)段寄存器的內(nèi)容為1B00H,在數(shù)據(jù)段的偏移地址2000H單元內(nèi),含有一個內(nèi)容為0FF10H和8000H的指針,它們是一個16位變量的偏移地址和段地址,試寫出把該變量裝入AX的指令序列,并畫圖表示出來。MOV BX,2000HLES BX,[BX]MOV BX,2000HLES BX,[BX]MOV AX,ES

:[BX]MOVAX,[2000H+2]MOVES,AXMOVAX,ES:[BX]3.8假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,數(shù)據(jù)段中變量名VAL的偏移地址為0050H,試指出下列源操作數(shù)字段的尋址方式是什么?其物理地址值是多少?(1)MOV AX,0ABH (2)MOV AX,BX(3)MOV AX,[100H] (4)MOV AX,VAL(5)MOV AX,[BX] (6)MOV AX,ES:[BX](7)MOV AX,[BP] (8)MOV AX,[SI](9)MOV AX,[BX+10] (10)MOV AX,VAL[BX](11)MOV AX,[BX][SI] (12)MOV AX,VAL[BX][SI]答:(1)立即方式; 操作數(shù)在本條指令中(2)寄存器尋址方式; 操作數(shù)為(BX)=0100H(3)直接尋址方式; PA=20100H(4)直接尋址方式; PA=20050H(5)BX寄存器間接尋址方式; PA=20100H(6)附加段BX寄存器間接尋址方式; PA=21100H(7)BP寄存器間接尋址方式; PA=15010H(8)SI寄存器間接尋址方式; PA=200A0H(9)BX寄存器相對尋址方式; PA=20110H(10)BX寄存器相對尋址方式; PA=20150H(11)BX和SI寄存器基址變址尋址方式; PA=201A0H(12)BX和SI寄存器相對基址變址尋址方式; PA=201F0H3.9在ARRAY數(shù)組中依次存儲了七個字?jǐn)?shù)據(jù),緊接著是名為ZERO的字單元,表示如下:ARRAY DW23,36,2,100,32000,54,0ZERO DW?(1)如果BX包含數(shù)組ARRAY的初始地址,請編寫指令將數(shù)據(jù)0傳送給ZERO單元。(2)如果BX包含數(shù)據(jù)0在數(shù)組中的位移量,請編寫指令將數(shù)據(jù)0傳送給ZERO單元。答:(1)MOVAX,[BX+(7-1)*2]MOV[BX+(7)*2],AX(2)MOVAX,ARRAY[BX]MOVARRAY[BX+2],AX3.17寫出執(zhí)行以下計(jì)算的指令序列,其中X、Y、Z、R、W均為存放16位帶符號數(shù)單元的地址。(1)Z←W+(Z-X) (2)Z←W-(X+6)-(R+9)(3)Z←(W*X)/(Y+6),R←余數(shù) (4)Z←((W-X)/5*Y)*2答:(1)MOVAX,Z ;以下程序都未考慮帶符號數(shù)的溢出SUB AX,XADD AX,WMOV Z,AX(2)MOVBX,XADD BX,6MOVCX,RADD CR,9MOV AX,WSUB AX,BXSUB AX,CXMOV Z,AX(3)ADD Y,6MOV AX,WIMULXIDIV YMOV Z,AXMOV R,DX(4)MOVAX,WSUB AX,XCWDMOV BX,5IDIV BXIMUL YSHL AX,1 ;((DX),(AX))*2RCL DX,13.18已知程序段如下:MOV AX,1234H ;(AX)=1234H,標(biāo)志位不變MOV CL,4 ;(AX)和標(biāo)志位都不變ROL AX,CL ;(AX)=2341H,CF=1,SF和ZF不變DEC AX ;(AX)=2340H,CF=1不變,SF=0,ZF=0MOV CX,4 ;(AX)和標(biāo)志位都不變MUL CX ;(AX)=8D00H,CF=OF=0,其它標(biāo)志無定義INT 20H試問:(1)每條指令執(zhí)行完后,AX寄存器的內(nèi)容是什么?(2)每條指令執(zhí)行完后,進(jìn)位、符號和零標(biāo)志的值是什么?(3)程序結(jié)束時,AX和DX的內(nèi)容是什么?答:(1)見注釋;(2)見注釋;(3)(AX)=8D00H,(DX)=03.19下列程序段中的每條指令執(zhí)行完后,AX寄存器及CF、SF、ZF和OF的內(nèi)容是什么?MOV AX,0 ;(AX)=0, 標(biāo)志位不變DEC AX ;(AX)=0FFFFH, CF不變,SF=1,ZF=0,OF=0ADD AX,7FFFH ;(AX)=7FFEH, CF=1,SF=0,ZF=0,OF=0ADD AX,2 ;(AX)=8000H, CF=0,SF=1,ZF=0,OF=1NOT AX ;(AX)=7FFFH, 標(biāo)志位不變SUB AX,0FFFFH ;(AX)=8000H, CF=1,SF=1,ZF=0,OF=1ADD AX,8000H ;(AX)=0, CF=1,SF=0,ZF=1,OF=1SUB AX,1 ;(AX)=0FFFFH, CF=1,SF=1,ZF=0,OF=0AND AX,58D1H ;(AX)=58D1H, CF=0,SF=0,ZF=0,OF=0SAL AX,1 ;(AX)=0B1A2H, CF=0,SF=1,ZF=0,OF=1SAR AX,1 ;(AX)=0D8D1H, CF=0,SF=1,ZF=0,OF=0NEG AX ;(AX)=272FH, CF=1,SF=0,ZF=0,OF=0ROR AX,1 ;(AX)=9397H, CF=1,SF和ZF不變,OF=1答:見注釋。3.20變量DATAX和變量DATAY的定義如下:DATAX DW0148HDW2316HDATAY DW0237HDW4052H請按下列要求寫出指令序列:(1)DATAX和DATAY兩個字?jǐn)?shù)據(jù)相加,和存放在DATAY中。(2)DATAX和DATAY兩個雙字?jǐn)?shù)據(jù)相加,和存放在從DATAY開始的雙字單元中。(3)解釋下列指令的作用:STCMOV BX,DATAXADC BX,DATAY(4)DATAX和DATAY兩個字?jǐn)?shù)據(jù)相乘(用MUL)。(5)DATAX和DATAY兩個雙字?jǐn)?shù)據(jù)相乘(用MUL)。(6)DATAX除以23(用DIV)。(7)DATAX雙字除以字DATAY(用DIV)。答:(1)MOVAX,DATAXADDDATAY,AXMOVAX,DATAX+2ADDDATAY+2,AX(2)MOVAX,DATAXADDDATAY,AXMOVAX,DATAX+2ADC DATAY+2,AXMOVDATAY+4,0 ;用于存放進(jìn)位位ADC DATAY+4,0(3)DATAX和DATAY兩個字?jǐn)?shù)據(jù)之和加1,結(jié)果存入BX寄存器。(4)RESULT1 DW0DW0RESULT2 DW0DW0┇MOVAX,DATAXMULDATAYMOVRESULT1,AXMOVRESULT1+2,DXMOVAX,DATAX+2MULDATAY+2MOVRESULT2,AXMOVRESULT2+2,DX(5)AA DW0BB DW0CC DW0DD DW0┇MOVAX,DATAXMULDATAYMOVAA,AXMOVBB,DXMOVAX,DATAXMULDATAY+2ADDBB,AXADC CC,DXMOVAX,DATAX+2MULDATAYADDBB,AXADC CC,DXADC DD,0MOV AX,DATAX+2MULDATAY+2ADDCC,AXADC DD,DX(6)MOV AX,DATAXMOV BL,23DIV BL(7)MOV DX,DATAX+2MOV AX,DATAXDIV DATAY3.23假設(shè)(BX)=0E3H,變量VALUE中存放的內(nèi)容為79H,確定下列各條指令單獨(dú)執(zhí)行后的結(jié)果。(1)XOR BX,VALUE ;(BX)=9AH,CF、OF都為0,AF無定義,SF=1,ZF=0,PF=1(2)AND BX,VALUE ;(BX)=61H,CF、OF都為0,AF無定義,SF=0,ZF=0,PF=0(3)OR BX,VALUE ;(BX)=0FBH,CF、OF都為0,AF無定義,SF=1,ZF=0,PF=0(4)XOR BX,0FFH ;(BX)=1CH,CF、OF都為0,AF無定義,SF=0,ZF=0,PF=0(5)AND BX,0 ;(BX)=00H,CF、OF都為0,AF無定義,SF=0,ZF=1,PF=1(6)TEST BX,01H ;(BX)=0E3H,CF、OF都為0,AF無定義,SF=1,ZF=0,PF=0答:見注釋。3.24試寫出執(zhí)行下列指令序列后BX寄存器的內(nèi)容。執(zhí)行前(BX)=6D16H。MOV CL,7SHR BX,CL答:(BX)=00DAH。3.26試分析下面的程序段完成什么功能?MOV CL,04SHL DX,CLMOV BL,AHSHL AX,CLSHR BL,CLOR DL,BL答:本程序段將((DX),(AX))的雙字同時左移4位,即將此雙字乘以10H(16)。3.30編寫程序段,把字符串STRING中的‘&’字符用空格符代替。STRINGDB‘ThedateisFEB&03答:程序段如下:MOV CX,18MOV AL,‘&’CLDMOV DI,SEGSTRINGMOV ES,DILEA DI,STRINGREPNE SCASBJNE NEXTDEC DIMOV ES:BYTEPTR[DI],‘’ ;送空格符NEXT: ┇3.34試分析下列程序段:ADD AX,BXJNO L1JNC L2SUB AX,BXJNC L3JNO L4JMP SHORTL5如果AX和BX的內(nèi)容給定如下:AXBX(1)147BH 80DCH(2)B568H 42C8H(3)42C8H 608DH(4)D023H9FD0H(5)94B7HB568H問該程序分別在上面5種情況下執(zhí)行后,程序轉(zhuǎn)向哪里?答:(1)轉(zhuǎn)向L1(2)轉(zhuǎn)向L1(3)轉(zhuǎn)向L2(4)轉(zhuǎn)向L5 ;因?yàn)榧臃ㄖ噶詈驛X中已經(jīng)是6FF3H(5)轉(zhuǎn)向L5 ;因?yàn)榧臃ㄖ噶詈驛X中已經(jīng)是4A14H習(xí)題指出下列指令的錯誤:(1)MOVAH,BX ;寄存器類型不匹配(2)MOV[BX],[SI] ;不能都是存儲器操作數(shù)(3)MOVAX,[SI][DI] ;[SI]和[DI]不能一起使用(4)MOVMYDAT[BX][SI],ES:AX ;AX寄存器不能使用段超越(5)MOVBYTEPTR[BX],1000 ;1000超過了一個字節(jié)的范圍(6)MOVBX,OFFSETMYDAT[SI] ;MYDAT[SI]已經(jīng)是偏移地址,不能再使用OFFSET(7)MOVCS,AX ;CS不能用作目的寄存器(8)MOVECX,AX ;兩個操作數(shù)的數(shù)據(jù)類型不同答:見注釋。4.3假設(shè)下列指令中的所有標(biāo)識符均為類型屬性為字的變量,請指出下列哪些指令是非法的?它們的錯誤是什么?(1)MOVBP,AL ;錯,寄存器類型不匹配(2)MOVWORD_OP[BX+4*3][DI],SP(3)MOVWORD_OP1,WORD_OP2 ;錯,不能都是存儲器操作數(shù)(4)MOVAX,WORD_OP1[DX] ;錯,DX不能用于存儲器尋址(5)MOVSAVE_WORD,DS(6)MOVSP,SS:DATA_WORD[BX][SI](7)MOV[BX][SI],2 ;錯,[BX][SI]未指出數(shù)據(jù)類型(8)MOVAX,WORD_OP1+WORD_OP2(9)MOVAX,WORD_OP1-WORD_OP2+100(10)MOVWORD_OP1,WORD_OP1-WORD_OP2答:見注釋。4.4假設(shè)VAR1和VAR2為字變量,LAB為標(biāo)號,試指出下列指令的錯誤之處:(1)ADD VAR1,VAR2 ;不能都是存儲器操作數(shù)(2)SUB AL,VAR1 ;數(shù)據(jù)類型不匹配(3)JMP LAB[SI] ;LAB是標(biāo)號而不是變量名,后面不能加[SI](4)JNZ VAR1 ;VAR1是變量而不是標(biāo)號(5)JMP NEARLAB ;應(yīng)使用NEARPTR答:見注釋。4.5畫圖說明下列語句所分配的存儲空間及初始化的數(shù)據(jù)值。(1)BYTE_VAR DB‘BYTE’,12,-12H,3DUP(0,?,2DUP(1,2),?)(2)WORD_VAR DW5DUP(0,1,2),?,-5,‘BY’,‘TE’,256H答:答案如下圖所示。4.8假設(shè)程序中的數(shù)據(jù)定義如下:PARTNO DW ?PNAME DB 16DUP(?)COUNT DD ?PLENTH EQU $-PARTNO問PLENTH的值為多少?它表示什么意義?答:PLENTH=22=16H,它表示變量PARTNO、PNAME、COUNT總共占用的存儲單元數(shù)(字節(jié)數(shù))。4.10假設(shè)程序中的數(shù)據(jù)定義如下:LNAME DB30DUP(?)ADDRESS DB30DUP(?)CITY DB15DUP(?)CODE_LIST DB1,7,8,3,2(1)用一條MOV指令將LNAME的偏移地址放入AX。(2)用一條指令將CODE_LIST的頭兩個字節(jié)的內(nèi)容放入SI。(3)用一條偽操作使CODE_LENGTH的值等于CODE_LIST域的實(shí)際長度。答:(1)MOVAX,OFFSETLNAME(2)MOVSI,WORDPTRCODE_LIST(3)CODE_LENGTHEQU$-CODE_LIST;此語句必須放在CODE_LIST語句之后4.11試寫出一個完整的數(shù)據(jù)段DATA_SEG,它把整數(shù)5賦予一個字節(jié),并把整數(shù)-1,0,2,5和4放在10字?jǐn)?shù)組DATA_LIST的頭5個單元中。然后,寫出完整的代碼段,其功能為:把DATA_LIST中頭5個數(shù)中的最大值和最小值分別存入MAX和MIN單元中。答:DATA_SEG SEGMENTNUM DB5DATA_LIST DW-1,0,2,5,4,5DUP(?)MAX DW?MIN DW?DATA_SEG ENDS;----------------------------------------------------------------CODE_SEG SEGMENTMAIN PROC FARASSUMECS:CODE_SEG,DS:DATA_SEGSTART: PUSH DS ;設(shè)置返回DOSSUB AX,AXPUSH AXMOV AX,DATA_SEG ;給DS賦值MOV DS,AX;MOV CX,4 ;程序段開始LEA BX,DATA_LISTMOV AX,[BX]MOV MAX,AXMOV MIN,AXROUT1: ADD BX,2MOV AX,[BX]CMP AX,MAXJNGE ROUT2MOV MAX,AXROUT2: CMP AX,MINJNLE ROUT3MOV MIN,AXROUT3: LOOP ROUT1 ;程序段結(jié)束RETMAIN ENDPCODE_SEG ENDS;----------------------------------------------------------------END START習(xí)題試編寫一個匯編語言程序,要求對鍵盤輸入的小寫字母用大寫字母顯示出來。答:程序段如下:BEGIN: MOV AH,1 ;從鍵盤輸入一個字符的DOS調(diào)用INT 21HCMP AL,‘a(chǎn)’ ;輸入字符<‘a(chǎn)’嗎?JB STOPCMP AL,‘z’ ;輸入字符>‘z’嗎?JA STOPSUB AL,20H ;轉(zhuǎn)換為大寫字母,用ANDAL,11011111B也可MOV DL,AL ;顯示一個字符的DOS調(diào)用MOV AH,2INT 21HJMP BEGINSTOP: RET編寫程序,從鍵盤接收一個小寫字母,然后找出它的前導(dǎo)字符和后續(xù)字符,再按順序顯示這三個字符。答:程序段如下:BEGIN: MOV AH,1 ;從鍵盤輸入一個字符的DOS調(diào)用INT 21HCMP AL,‘a(chǎn)’ ;輸入字符<‘a(chǎn)’嗎?JB STOPCMP AL,‘z’ ;輸入字符>‘z’嗎?JA STOPDEC AL ;得到前導(dǎo)字符MOV DL,AL ;準(zhǔn)備顯示三個字符MOV CX,3DISPLAY: MOV AH,2 ;顯示一個字符的DOS調(diào)用INT 21HINC DLLOOP DISPLAYSTOP: RET5.4試編寫一程序,要求比較兩個字符串STRING1和STRING2所含字符是否完全相同,若相同則顯示‘MATCH’,若不相同則顯示‘NOMATCH’。答:程序如下:DSEG SEGMENTSTRING1 DB‘Iamastudent.’STRING2 DB‘Iamastudent!’YES DB‘MATCH’,0DH,0AH,‘$’NO DB‘NOMATCH’,0DH,0AH,‘$’DSEG ENDS;--------------------------------------------------------------------------CSEG SEGMENTMAIN PROC FARASSUMECS:CSEG,DS:DSEG,ES:DSEGSTART: PUSH DS ;設(shè)置返回DOSSUB AX,AXPUSH AXMOV AX,DSEGMOV DS,AX ;給DS賦值MOV ES,AX ;給ES賦值;BEGIN: LEA SI,STRING1 ;設(shè)置串比較指令的初值LEA DI,STRING2CLDMOV CX,STRING2-STRING1REPE CMPSB ;串比較JNE DISPNOLEA DX,YES ;顯示MATCHJMP DISPLAYDISPNO: LEA DX,NO ;顯示NOMATCHDISPLAY: MOV AH,9 ;顯示一個字符串的DOS調(diào)用INT 21HRETMAIN ENDPCSEG ENDS ;以上定義代碼段;--------------------------------------------------------------------------END START5.7試編寫一個匯編語言程序,求出首地址為DATA的100D字?jǐn)?shù)組中的最小偶數(shù),并把它存放在AX中。答:程序段如下:BEGIN: MOV BX,0MOV CX,100COMPARE: MOV AX,DATA[BX] ;取數(shù)組的第一個偶數(shù)ADD BX,2TEST AX,01H ;是偶數(shù)嗎?LOOPNZCOMPARE ;不是,比較下一個數(shù)JNZ STOP ;沒有偶數(shù),退出JCXZ STOP ;最后一個數(shù)是偶數(shù),即為最小偶數(shù),退出COMPARE1: MOV DX,DATA[BX] ;取數(shù)組的下一個偶數(shù)ADD BX,2TEST DX,01H ;是偶數(shù)嗎?JNZ NEXT ;不是,比較下一個數(shù)CMP AX,DX ;(AX)<(DX)嗎?JLE NEXTMOV AX,DX ;(AX)<(DX),則置換(AX)為最小偶數(shù)NEXT: LOOP COMPARE1STOP: RET5.8把AX中存放的16位二進(jìn)制數(shù)K看作是8個二進(jìn)制的“四分之一字節(jié)”。試編寫程序要求數(shù)一下值為3(即11B)的四分之一字節(jié)數(shù),并將該數(shù)(即11B的個數(shù))在終端上顯示出來。答:程序段如下:BEGIN: MOV DL,0 ;計(jì)數(shù)初始值MOV CX,8COMPARE: TEST AX,03H ;是數(shù)03嗎?JNZ NOEQUAL ;不是,轉(zhuǎn)走INC DL ;是,計(jì)數(shù)NOEQUAL: ROR AX,1 ;準(zhǔn)備判斷下一個數(shù)ROR AX,1LOOP COMPAREADD DL,‘0’MOV AH,2 ;進(jìn)行顯示INT 21HSTOP: RET5.9試編寫一個匯編語言程序,要求從鍵盤接收一個四位的16進(jìn)制數(shù),并在終端上顯示與它等值的二進(jìn)制數(shù)。答:程序段如下:BEGIN: MOV BX,0 ;用于存放四位的16進(jìn)制數(shù)MOV CH,4MOV CL,4INPUT: SHL BX,CL ;將前面輸入的數(shù)左移4位MOV AH,1 ;從鍵盤取數(shù)INT 21HCMP AL,30H ;<0嗎?JB INPUT ;不是‘0~F’的數(shù)重新輸入CMP AL,39H ;是‘0~9’JA AF ;不是,轉(zhuǎn)‘A~F’的處理AND AL,0FH ;轉(zhuǎn)換為:0000B~1001BJMP BINARYAF: AND AL,11011111B ;轉(zhuǎn)換為大寫字母CMP AL,41H ;又<A嗎?JB INPUT ;不是‘A~F’的數(shù)重新輸入CMP AL,46H ;>F嗎?JA INPUT ;不是‘A~F’的數(shù)重新輸入AND AL,0FH ;轉(zhuǎn)換為:1010B~1111BADD AL,9BINARY: OR BL,AL ;將鍵盤輸入的數(shù)進(jìn)行組合DEL CHJNZ INPUTDISPN: MOV CX,16 ;將16位二進(jìn)制數(shù)一位位地轉(zhuǎn)換成ASCII碼顯示DISP: MOV DL,0ROL BX,1RCL DL,1OR DL,30HMOV AH,2 ;進(jìn)行顯示INT 21HLOOP DISPSTOP: RET5.10設(shè)有一段英文,其字符變量名為ENG,并以$字符結(jié)束。試編寫一程序,查對單詞SUN在該文中的出現(xiàn)次數(shù),并以格式“SUN:xxxx”顯示出次數(shù)。答:程序如下:DSEG SEGMENTENG DB ‘Hereissun,sun,…,$’DISP DB‘SUN:’DAT DB‘0000’,0DH,0AH,‘$KEYWORD DB‘sun’DSEG ENDS;--------------------------------------------------------------------------CSEG SEGMENTMAIN PROC FARASSUMECS:CSEG,DS:DSEG,ES:DSEGSTART: PUSH DS ;設(shè)置返回DOSSUB AX,AXPUSH AXMOV AX,DSEGMOV DS,AX ;給DS賦值MOV ES,AX ;給ES賦值BEGIN: MOV AX,0MOV DX,DISP-ENG-2 ;計(jì)算ENG的長度(每次比較sun,因此比較次數(shù)-2)LEA BX,ENGCOMP: MOV DI,BXLEA SI,KEYWORDMOV CX,3REPE CMPSB ;串比較JNZ NOMATCHINC AX ;是,SUN的個數(shù)加1ADD BX,2NOMATCH: INC BX ;指向ENG的下一個字母DEC DXJNZ COMPDONE: MOV CH,4 ;將次數(shù)轉(zhuǎn)換為16進(jìn)制數(shù)的ASCII碼MOV CL,4LEA BX,DAT ;轉(zhuǎn)換結(jié)果存入DAT單元中DONE1: ROL AX,CLMOV DX,AXAND DL,0FH ;取一位16進(jìn)制數(shù)ADD DL,30HCMP DL,39HJLE STOREADD DL,07H ;是“A~F”所以要加7STORE: MOV [BX],DL ;轉(zhuǎn)換結(jié)果存入DAT單元中INC BXDEC CHJNZ DONE1DISPLAY: LEA DX,DISP ;顯示字符串程序(將DISP和DAT一起顯示)MOV AH,09HINT 21HRETMAIN ENDPCSEG ENDS ;以上定義代碼段;--------------------------------------------------------------------------END START5.11從鍵盤輸入一系列以$為結(jié)束符的字符串,然后對其中的非數(shù)字字符計(jì)數(shù),并顯示出計(jì)數(shù)結(jié)果。答:程序段如下:DSEG SEGMENTBUFF DB 50DUP(‘’)COUNT DW0DSEG ENDS┇BEGIN: LEA BX,BUFFMOV COUNT,0INPUT: MOV AH,01 ;從鍵盤輸入一個字符的功能調(diào)用INT 21HMOV [BX],ALINC BXCMP AL,‘$’ ;是$結(jié)束符嗎?JNZ INPUT ;不是,繼續(xù)輸入LEA BX,BUFF ;對非數(shù)字字符進(jìn)行計(jì)數(shù)NEXT: MOV CL,[BX]INC BXCMP CL,‘$’ ;是$結(jié)束符,則轉(zhuǎn)去顯示JZ DISPCMP CL,30H ;小于0是非數(shù)字字符JB NEXTCMP CL,39H ;大于9是非數(shù)字字符JA NEXTINC COUNT ;個數(shù)+1JMP NEXTDISP: ┇ ;16進(jìn)制數(shù)顯示程序段(省略)有一個首地址為MEM的100D字?jǐn)?shù)組,試編制程序刪除數(shù)組中所有為0的項(xiàng),并將后續(xù)項(xiàng)向前壓縮,最后將數(shù)組的剩余部分補(bǔ)上0。答:程序如下:DSEG SEGMENTMEM DW 100DUP(?)DSEG ENDS;--------------------------------------------------------------------------CSEG SEGMENTMAIN PROC FARASSUMECS:CSEG,DS:DSEGSTART: PUSH DS ;設(shè)置返回DOSSUB AX,AXPUSH AXMOV AX,DSEGMOV DS,AX ;給DS賦值BEGIN: MOV SI,(100-1)*2 ;(SI)指向MEM的末元素的首地址MOV BX,-2 ;地址指針的初值MOV CX,100COMP: ADD BX,2CMP MEM[BX],0JZ CONSLOOP COMPJMP FINISH ;比較完了,已無0則結(jié)束CONS: MOV DI,BXCONS1: CMP DI,SI ;到了最后單元碼?JAE NOMOVMOV AX,MEM[DI+2] ;后面的元素向前移位MOV MEM[DI],AXADD DI,2JMP CONS1NOMOV: MOV WORDPTR[SI],0 ;最后單元補(bǔ)0LOOP COMPFINISH: RETMAIN ENDPCSEG ENDS ;以上定義代碼段;--------------------------------------------------------------------------END START習(xí)題下面的程序段有錯嗎?若有,請指出錯誤。CRAY PROCPUSH AXADD AX,BXRETENDP CRAY答:程序有錯。改正如下:CRAY PROCADD AX,BXRETCRAY ENDP ;CRAY是過程名,應(yīng)放在ENDP的前面9BHF7H57H80HF0A9BHF7H57H80HF0A0:00B0H先PUSH,SP-2再PUSH,SP-2POP,SP+26.2題堆棧及SP內(nèi)容的變化過程答:變化過程如右圖所示:分析下面的程序,畫出堆棧最滿時各單元的地址及內(nèi)容。;********************************************S_SEG SEGMENTAT1000H ;定義堆棧段DW 200DUP(?) ;200*2=190HTOS LABEL WORDS_SEG ENDS;********************************************C_SEG SEGMENT ;定義代碼段ASSUMECS:C_SEG,SS:S_SEGSTART: MOV AX,S_SEG(FLAGS)(AX)(FLAGS)(AX)T_ADDR0000(DS)1000:0184:0186:0188:018A:018C:018ESP:01866.3題堆棧最滿時各單元的地址及內(nèi)容MOV SP,OFFSETTOSPUSH DSMOV AX,0PUSH AX┇PUSH T_ADDRPUSH AXPUSHF┇POPFPOP AXPOP T_ADDRRET;--------------------------------------------------------------------------C_SEG ENDS ;代碼段結(jié)束;******************************************END START ;程序結(jié)束答:堆棧最滿時各單元的地址及內(nèi)容如右圖所示:分析下面的程序,寫出堆棧最滿時各單元的地址及內(nèi)容。;********************************************STACK SEGMENTAT500H ;定義堆棧段DW 128DUP(?)TOS LABEL WORDSTACK ENDS;********************************************CODE SEGMENT ;定義代碼段MAIN PROC FAR ;主程序部分ASSUMECS:CODE,SS:STACKSTART: MOV AX,STACKMOV SS,AXMOV SP,OFFSETTOSPUSH DSSUB AX,AXPUSH AX;MAINPARTOFPROGRAMGOESHEREMOV AX,4321HCALL HTOARETMAIN ENDP ;主程序部分結(jié)束;--------------------------------------------------------------------HTOA PROC NEAR ;HTOA子程序CMP AX,15JLE B1PUSH AX0500:00EC:00EE0500:00EC:00EE:00F0:00F2:00F4:00F:00F:00FA:00FC:00FESP:00EE返回POPBP地址0003H返回POPBP地址0002H返回POPBP地址0001H主程序返回地址0000(DS)6.4題堆棧最滿時各單元的地址及內(nèi)容MOV BP,SPMOV BX,[BP+2]AND BX,000FHMOV [BP+2],BXPOP BPMOV CL,4SHR AX,CLCALL HTOAPOP BPB1: ADD AL,30HCMP AL,3AHJL PRINTITADD AL,7HPRINTIT:MOV DL,ALMOV AH,2INT 21HRETHOTA ENDP ;HOTA子程序結(jié)束;--------------------------------------------------------------------CODE ENDS ;代碼段結(jié)束;******************************************END START ;程序結(jié)束答:堆棧最滿時各單元的地址及內(nèi)容如右上圖所示:習(xí)題編寫一條宏指令CLRB,完成用空格符將一字符區(qū)中的字符取代的工作。字符區(qū)首地址及其長度為變元。答:宏定義如下:CLRB MACRO N,CFILMOV CX,NCLDMOV AL,‘’ ;;取空格符的ASCII碼LEA DI,CFILREP STOSBENDM某工廠計(jì)算周工資的方法是每小時的工資率RATE乘以工作時間HOUR,另外每工作滿10小時加獎金3元,工資總數(shù)存放在WAG中。請將周工資的計(jì)算編寫成一條宏指令WAGES,并展開宏調(diào)用:WAGES R1,42,SUM答:宏定義如下:WAGES MACRO RATE,HOUR,WAGMOV AL,HOUR ;;計(jì)算周工資(WAG),公式為:HOUR*RATEMOV BL,RATEMUL BLMOV WAG,AXMOV AL,HOUR ;;計(jì)算獎金存入(AX),公式為:HOUR/10的商*3MOV AH,0MOV BL,10DIV BLMOV BL,3MUL BLADD WAG,AX ;;計(jì)算周工資總數(shù)ENDM宏調(diào)用:WAGES R1,42,SUM宏展開:1 MOV AL,421 MOV BL,R11 MUL BL1 MOV SUM,AX1 MOV AL,421 MOV AH,01 MOV BL,101 DIV BL1 MOV BL,31 MUL BL1 ADD SUM,AX給定宏定義如下:(注意:此宏指令的功能是V3←|V1-V2|)DIF MACRO X,YMOV AX,XSUB AX,YENDMABSDIF MACRO V1,V2,V3LOCAL CONTPUSH AXDIF V1,V2CMP AX,0JGE CONTNEG AXCONT: MOV V3,AXPOP AXENDM試展開以下調(diào)用,并判定調(diào)用是否有效。(1)ABSDIFP1,P2,DISTANCE(2)ABSDIF[BX],[SI],X[DI],CX(3)ABSDIF[BX][SI],X[BX][SI],240H(4)ABSDIFAX,AX,AX答:(1)宏調(diào)用ABSDIFP1,P2,DISTANCE的宏展開如下:此宏調(diào)用有效。1 PUSH AX1 DIF P1,P21 MOV AX,P11 SUB AX,P21 CMP AX,01 JGE ??00001 NEG AX1 ??0000: MOV DISTANCE,AX1 POP AX(2)宏調(diào)用ABSDIF[BX],[SI],X[DI],CX的宏展開如下:此宏調(diào)用有效。1 PUSH AX1 DIF [BX],[SI]1 MOV AX,[BX]1 SUB AX,[SI]1 CMP AX,01 JGE ??00011 NEG AX1 ??0001: MOV X[DI],AX1 POP AX(3)宏調(diào)用ABSDIF[BX][SI],X[BX][SI],240H的宏展開如下:此宏調(diào)用無效。1 PUSH AX1 DIF [BX][SI],X[BX][SI]1 MOV AX,[BX][SI]1 SUB AX,X[BX][SI]1 CMP AX,01 JGE ??00021 NEG AX1 ??0002: MOV 240H,AX1 POP AX(4)宏調(diào)用ABSDIFAX,AX,AX的宏展開如下:此宏調(diào)用有效但無多大意義。1 PUSH AX1 DIF AX,AX1 MOV AX,AX1 SUB AX,AX1 CMP AX,01 JGE ??00031 NEG AX1 ??0003: MOV AX,AX1 POP AX7.6請用宏指令定義一個可顯示字符串GOOD:‘GOODSTUDENTS:CLASSXNAME’,其中X和NAME在宏調(diào)用時給出。答:宏定義如下:DISP_GOOD MACRO X,NAMEGOOD DB‘GOODSTUDENTS:CLASS&X&NAME’,0DH,0AH,‘$’ENDM7.7下面的宏指令CNT和INC1完成相繼字存儲。CNT MACRO A,BA&B DW?ENDMINC1 MACRO A,BCNT A,%BB=B+1ENDM請展開下列宏調(diào)用:C=0INC1 DATA,CINC1 DATA,C答:宏展開如下:C=0INC1 DATA,C1 DATA0 DW?INC1 DATA,C1 DATA0 DW? (注意:C為0沒有變)7.9宏指令STORE定義如下:STORE MACRO X,NMOV X+I,II=I+1IF I-NSTORE X,NENDIFENDM試展開下列宏調(diào)用:I=0STORE TAB,7答:宏展開如下:I=0STORE TAB,71 MOV TAB+0,01 MOV TAB+1,11 MOV TAB+2,21 MOV TAB+3,31 MOV TAB+4,41 MOV TAB+5,51 MOV TAB+6,6習(xí)題寫出分配給下列中斷類型號在中斷向量表中的物理地址。(1)INT12H(2)INT8答:(1)中斷類型號12H在中斷向量表中的物理地址為00048H、00049H、0004AH、0004BH;(2)中斷類型號8在中斷向量表中的物理地址為00020H、00021H、00022H、00023H。用CALL指令來模擬實(shí)現(xiàn)INT21H顯示字符T的功能。答:MOV AH,2MOV DL,‘T’PUSH DSPUSHF ;因中斷服務(wù)程序的返回指令是IRET,而不是RETMOV BX,0MOV DS,BXCALL DWORDPTR[21H*4] ;用CALL指令調(diào)用21H的中斷服務(wù)程序POP DS寫出指令將一個字節(jié)數(shù)據(jù)輸出到端口25H。答:指令為:OUT 25H,AL寫出指令將一個字?jǐn)?shù)據(jù)從端口1000H輸入。答:指令為: MOV DX,1000HIN AX,DX8.9類型14H的中斷向量在存儲器的哪些單元里?答:在0000:0050H,0000:0051H,0000:0052H,0000:0053H四個字節(jié)中。8.14試編制一程序,要求測出任一程序的運(yùn)行時間,并把結(jié)果打印出來。答:程序段如下:TITLE TEST_TIME.EXE ;測試程序運(yùn)行時間程序;******************************************DSEG SEGMENT ;定義數(shù)據(jù)段COUNT DW0 ;記錄系統(tǒng)時鐘(18.2次中斷/秒)的中斷次數(shù)SEC DW0 ;存放秒鐘數(shù)MIN DW0 ;存放分鐘數(shù)HOURS DW0 ;存放小時數(shù)PRINTTIME DB0DH,0AH,‘Thetimeofexectionprogramis:’CHAR_NO EQU$-PRINTTIMEDSEG ENDS ;以上定義數(shù)據(jù)段;******************************************CSEG SEGMENT ;定義代碼段MAIN PROC FARASSUMECS:CSEG,DS:DSEGSTART: PUSH

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論