汇编课后题答案.docx 31页

  • 41.44 KB
  • 2022-04-22 11:45:24 发布

汇编课后题答案.docx

  • 31页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第一章1.1(如果十六进制数的最高位是字母(如:A,B),则应在其前面加0(零),如本题(3))(1)   369D=101110001B=171H(2)   10000D=10011100010000B=2710H(3)   4095D=111111111111B=0FFFH(4)   32767D=111111111111111B=7FFFH1.2(1)   101101B=2DH=45D(2)   10000000B=80H=128D(3)   1111111111111111B=0FFFFH=65535D(4)   11111111B=0FFH=255D1.3(1)   0FAH=11111010B=250D(2)   5BH=1011011B=91D(3)   0FFFEH=1111111111111110B=65534D(4)   1234H=1001000110100B=4660D1.4(1)3AH+0B7H=0F1H(2)1234H+0AFH=12E3H(3)0ABCDH-0FEH=0AACFH(5)   7AB×6FH=35325H1.5(1)(-85D)+76D=10101011B+01001100B=11110111B=0F7H(2)85D+(-76D)=01010101B+10110100B=00001001B=09H(3)85D-76D=01010101B+10110100B=00001001B=09H(4)85D-(-76D)=01010101B+01001100B=10100001B=0A1H(5)(-85D)-76D=10101010B+10110100B=01011111B=5FH(6)   -85D-(-76D)=10101011B+01001100B=11110111B=0F7H1.6(1)   0D8H如果它被看作带符号数,则它表示-40D;如果它被看作无符号数,则它216D。(2)   0FFH如果它被看作带符号数,则它表示-1D;如果它被看作无符号数,则它255D。1.7(1)   4FH,79D,’O’(2)   2BH,43D,‘+’(3)   73H,115D,‘s’(4)   59H,89D,‘Y’1.8(1)   Forexample,46H6FH72H20H65H78H61H6DH70H6CH65H2CH(2)   Thisisanumber3692. 54H68H69H73H20H69H73H20H61H20H6EH75H6DH62H65H72H20H33H36H39H32H2EH第二章2.1256个2.2E5H000B0H1EH000B1H000B2H3CH000B3H2AH000B4H2.330022H和30024H字节单元的内容分别为(30022H)=0ABH(30024H)=0EFH30021H和30022H字单元的内容分别为(30021H)=0AB34H(30022H)=0CDABH2.4逻辑地址为3017:000A的存储单元的物理地址为3017AH。逻辑地址为3015:002A的存储单元的物理地址为3017AH。逻辑地址为3010:007A的存储单元的物理地址为3017AH。2.50AAA40H2.7(1)        AX,BX,CX,DX,SI,DI(2)        CX(3)        AX,BX,CX,DX,SI,DI(4)        CS,DS,SS,ES(5)        FLAGS(6)        CS,IP(7)        SS,SP,BP2.8指示存储器地址的寄存器如下所示段偏移CSIPSSSP,BPDSBX,DI,SIESDI2.91.(M)2.(C)3.(D)4.(B)5.(A)6.(L)7.(K)8.(J)9.(F)10.(H)11.(G)12.(E)13.(I)14.(O)15.(N) 第三章1(1)立即寻址没有(2)直接寻址7237H(3)使用BX的寄存器寻址没有(4)使用BX的间接寻址637DH(5)使用BX的寄存器相对寻址0D5F0H(6)基址变址寻址8E18H(7)相对基址变址004FH2。根据下列要求,写出相应的汇编指令。(1)ADDDX,BX(2)ADDAL,[BX][SI](3)ADD[BX][0B2H],CX(4)MOVAX,2A59HADD[0524H],AX(5)ADDAL,0B5H3。(1)寄存器间接寻址MOVBX,OFFSET[BLOCK][0AH]MOVDX,[BX](2)寄存器相对寻址MOVSI,OAHMOVDX,[BLOCK][SI](3)基址变址寻址MOVBX,BLOCKMOVSI,OAHMOVDX,[BX][SI]4。现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后,AX寄存器的内容。(1)MOVAX,1200H1200H(2)MOVAX,BX0100H(3)MOVAX,[1200]4C2AH注意,是字单元!!(4)MOVAX,[BX]3412H同上(5)MOV1100[BX]4C2AH(6)MOVAX,[BX][SI]7856H(7)MOVAX,1100[BX][SI]65B7H5。(1)7CD9H(2)1200H(3)6319H6。MOVBX,2000HLESDI,[BX]MOVAX,ES:DI 7。转向地址OBJ的值分别为:(1)064DH(2)0691H(3)05E0H注意有符号数的符号位~~8。(1)MOVAX,0ABH立即数寻址无物理地址(2)MOVAX,BX寄存器寻址同上(3)MOVAX,[100]直接寻址20100H(4)MOVAX,VAL直接寻址20050H(5)MOVAX,[BX]寄存器间接寻址20100H(6)MOVAX,ES:[BX]直接寻址21100H(7)MOVAX,[BP]寄存器间接寻址20010H(8)MOVAX,[SI]同上200A0H(9)MOVAX,[BX+10]寄存器相对寻址20110H(10)MOVAX,VAL[BX]同上20150H(11)MOVAX,[BX][SI]基址变址寻址201A0H(12)MOVAX,VAL[BX][SI]相对基相变址寻址201F0H9。(1)的指令:MOVAX,[BX][0CH]MOVZREO,AX(2)的指令:MOVAX,ARRAY[BX]MOVZREO,AX10。MOVAX,TABLE是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234HLEAAX,TABLE是把符号地址TABLE的有效地址(这里是偏移量)送到指定寄存器AX里,指令执行完后,(AX)=0032H11。执行完指令后,(AX)=1E00H12。LEAAX,CSTRINGMOVDL,AXMOVDH,[AX+6]13。这个,,图,很麻烦了,所以就不画了~~大家可以看一下课本上P51--P53,很清楚,看完了这道韪也会了~~~14。LESBX,[2000]MOVAX,ES:[BX]注意:一开始我写的是:MOVAX,ES:[8000H],后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足~~~15。运算结果SF,ZF,CF,OF各位的值(从左至右依次往下~)(1)74D4H0000(2)A5C1H1001(3)4240H0010(4)0000H011016。接上表~(1)5D140000(2)A8701001(3)D8701000(4)34E4001017。 (1).MOVAX,Z;把Z送到AXSUBAX,X;Z-XADDAX,W;W+(Z-X)MOVZ,AX;结果保存在Z中(2).MOVAX,R;R送到AX中ADDAX,9;R+9MOVBX,X;X送到BX中ADDBX,6;X+6ADDAX,BX;(R+9)+(X+6),结果保存在AX中MOVBX,W;W送到BX中SUBBX,AX;W-(R+9)-(X+6),连续减去两个数,相当于减去这两个数的和~~MOVZ,BX;最终结果送到Z中(3)MOVAX,W;把W送到AXIMULX;W*X注意:低十六位保存在AX里,高十六位保存在DX里MOVBX,Y;把Y送到BX里ADDBX,6;Y+6IDIVBX;(W*X)/(Y+6)注意:商保存在AX里,余数保存在DX里MOVZ,AX;把商送到Z中,MOVR,DX;把余数送到R中(4)MOVAX,W;把W送到AX中SUBAX,X;W-XCWD;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,高十六位保在DX中MOVBX,5;把5送到BX中IDIVBX;(W-X)/5被除数为32位,除数为16位商为16位IMULY;上一步结果再乖以Y,积为32位MOVBX,2;把2送到BX中IMULBX;上一步乘法所得的积再乘以2,各为64位MOVZ,EAX;把结果中低32位放入Z双字单元中MOV[Z+4],EDX;把结果中高32位放入Z+4双字单元中18。指令本条指令执行完后AX的内容执行完后CF,SF,ZF的值MOVAX,1234H1234H000MOVCL,41234H000ROLAX,CL2341H100DECAX2340H100 MOVCX,42340H100MULCX8918H000INT20H程序结束后,(AX)=8918H(DX)=0000H19。指令执行完后AX的内容执行完后CF,SF,ZF和OF的值MOVAX,000010DECAXFFFFH0100ADDAX,7FFFH7FFEH0000ADDAX,28000H0101NOTAX7FFFH0101SUBAX,0FFFFH8000H1101ADDAX,8000H0000H1011SUBAX,1FFFFH1101ANDAX,58D1H58D1H0000SALAX,1B1A2H0101SARAX,1D8D1H0100NEGAX272FH1000RORAX,19397H100120。(1)MOVAX,DATAXADDDATAY,AX(2)MOVAX,DATAXADDDATAY,AXMOVAX,[DATAX+2]ADD[DATAY+2],AX(3)本組指令的作用是:BX<------[DATAX]+[DATAY]+[1](CF的值)帶進位加法~(4)MOVAX,DATAX MULDATAY;結果的高十六位保存在DX裏,低十六位保存在AX裏(5)MOVAX,DATAXMOVDX,[DATAX+2]MULDWORDDATAY;結果的高三十二位保存在EDX裏,低三十二位保存在EAX裏;這裏所用的DWORD為一屬性操作符,在第四章會學到~~(6)MOVAX,DATAXDIV17H;結果商保存在AL中,余數在AH中(7)MOVAX,DATAXCDWDIVDATAY21。NEGDXNEGAXSBBDX,022。MOVAX,A;把雙字長數的低字放到AX中MOVDX,[A+2];把雙字長數的高字放到DX中TESTDX,8000H;測試雙字長數的符號JZRIGHT;如果是非負數,則直接保存NEGDX;如果是負數,則求補NEGAXSBBDX,0RIGHT:MOVB,AXMOV[B+2],DX2006-12-0711:4823。每條指令單獨執行完後的結果依次為:(1)9AH(2)61H(3)0FBH(4)1CH(5)0(6)0E3H24。執行指令序列後,BX的內容為:0DAH25。(1)把53D乘以2的程序:MOVAX,35H;53D=35HSHLAX,1(2)把53除以2的程序:MOVAX,35HSHRAX,1其他的同理~~26。這段程序完成的功能是:把DX:AX中的雙字數據左移4位(相當於乘以16D)27。各條指令單獨執行後,DX的值依次為:(1)5CH(2)17H(3)05C8H(4)72H(5)2017H(6)0CDH(7)0172H(8)05CCH(9)0DCH28。該程序段執行完後,BX寄存器的內容是:C02DH29。(1)从左到右把CONMAE中的字符串伟送到PRLINE的程序实现:LEASI,CONAME;把CONAME中第一个字节的偏移地址送到SI中LEADI,PRLINE;把PRLINE中第一个字节的偏移地址送到DI中MOVCX,20;把重复次数放到CX里 CLD;让SIDI从低地址指向高地址(即从左到右传送)REPMOVSB;传送(2)从右到左把CONMAE中的字符串传送到PRLINE中的程序实现:LEASI,CONAMELEADI,PRLINEMOVCX,20STD;和上面唯一不同的就是这次是从右到左,所以要从高地址批向低地址REPMOVSB(3)把CONAME中的第三和第四個字節裝入AX的程序實現:LEASI,[CONAME+3]LODSW(4)把AX寄存器的內容存入從PRLINE+5開始的字節中的程序實現:LEADI,[PRLINE+5]STOSW(5)檢查CONAME字符串中有無空格字符,如有把它偉送給BH寄存器的程序實現:LEADI,CONAME;把CONAME中第一個字符偏移地址放入DI中MOVCX,20;把重複次數放到CX中MOVAL,20H;把空格符的ASCII值放入AL中CLD;從低到高REPNESCASB;比較MOVBH,[DI-1]R;把檢查到的空格符送到BH中30。MOVCX,12H;把重複次數放到CX中。這裏用十六進制表示MOVSI,0;初始化SIMOVAX,26H;把&字符的ASCII值放入AXCHECK:CMPAX,STRING[SI];依次查找INCSILOOPNECHECK;找到了就退出MOVAX,20H;把空格符的ASCII值勤放入AX中MOVSTRING[SI-1],AX;用空格符代替&31。(1)用空格符清除PRINT_LINE域的程序实现:MOVAL,20HLEADI,PRINT_LINEMOVCX,132CLDREPSTOSB(2)在STUDENT_ADDR中查找第一个’_‘的程序实现:MOVAX,2DH;把“—”的ASCII值放入AXMOVSI,0;初始化SIMOVCX,9;把重複次數放入CX中;依次檢查STUDENT-ADDR中的字符是否為"_",找到第一个停下来CHECK:CMPAX,STUDENT_ADDR[SI];INCSI LOOPNZCHECK(3)在STUDENT_ADDR中查找最后一个”_“的程序实现:;和第二題不同的就是這次是從右到左查詢,所以SI的初始化為9MOVAX,2DHMOVSI,9MOVCX,9CHECK:CMPAX,STUDENT_ADDR[SI]DECSILOOPNZCHECK(4)程序實現:MOVAL,2OH;把空格符的ASCII值放入AL中LEADI,STUDENT_NAME;把STUDENT_NAME中第一个字符偏移地址放到DI中MOVCX,30;把重复次数放到CX中CLD;让DI从低位移到高位REPZSCASB;如果有不是空格符的,就退出JZSTORE;如果全是空格符,就转到STORE中;用*代替空格STORE:MOVAL2AHMOVCX,30STD;注意,这里是把前面从低到高移动的DI再从高到低移上去~~REPSTOSB(5)程序实现:;把STUDENT_NAME移到PRINT_LINE的前30个字节中LEASI,STUDENT_NAMELEADI,PRINT_LINEMOVCX,30CLDREPMOVSB;把STUDENT_ADDR移到PRINT_LINE的后9个字节中LEASI,[STUDENT_ADDR+9]LEADI,[PRINT_LINE+132]MOVCX,9STDREPMOVSB32。程序实现:。。。LEASI,OLDSLEADI,NEWSMOVCX,5REPZCMPSBJNZNEW_LESS。。。33。(1)CMPDX,CX JAEXCEED(2)CMPBX,AXJGEXCEED(3)CMPCX,0JZZERO(4)CMPBX,AXJOOVERFLOW(5)CMPBX,AXJLEEQ_SMA(6)CMPDX,CXJBEEQ_CX34。(1)跳转到:L1(2)跳转到L1(3)跳转到L2(4)跳转到L5(5)跳转到L535。(1)可以引起转移到L1的指令有:NB,BE,NL,LE(2)可以引起转移到L1的指令有:同上(3)可以引起转移到L1的指令有:B,BE,L,LE(4)可以引起转移到L1的指令有:NB,NBE,NL,NLE(5)可以引起转移到L1的指令有:同上(6)可以引起转移到L1的指令有:同(3)(7)可以引起转移到L1的指令有:同上36。37。程序流程图就不画了,呵呵,程序如下~~MOVAL,STAUS[SI];把要测试的字节放到AL中ANDAL,2AH;把第一,三,五位为一其他位为0的数--2AH,与这个字节比较,结果放到AL中JZROUTINE_4;如果结果为0,则三位都为0XORAL,2AH;前面相与的结果再与2AH异或JZROUTINE_1;如果结果为0,则三位都为1BSFBL,AL;BSRBL,ALCMPBL,CL;如果向前和向后测试后,第一个1的位置相同,说明只有一个1,则异或运算前有AL中有两个1JEROUTINE_2ROUTINE_1注:本题还有其他解法,请大家自己试试~~38。(1)当括号内是:LOOP时,循环四次,程序结束后(AX)=05(BX)=16(CX)=0(DX)=0(2)当括号内是:LOOPE时,不循环,程序结束后(AX)=02(BX)=04(CX)=03(DX)=02(3)当括号内是:LOOPNE时:循环三次,程序结束后 (AX)=04(BX)=11(CX)=01(DX)=039。图,就不画了,呵呵~~自己看一下课本,P101~~40.。(1)00003100H(2)5100H(3)7100H41。(1)目的地址:2004H内容依次为:56HF4H23H98H(2)目的地址:384CH内容依次为:91H34HF2H01H(3)目的地址:寄存器,无物理地址~内容依次为:92H6DHA2H4CH42。(1)PUSHAX  (SP)<------(SP)-2(SP+1)<-----(AH)(SP)<------(AL)(2)POPESI(ESI)<-------((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(ESP)<-------(ESP)+4(3)PUSH[BX] (SP)<------(SP)-2(SP+1)<-----([BX+1])(SP)<------([BX])(4)PUSHAD(ESP)<-------(EAX)(ESP-4)<-------(ECX)(ESP-8)<-------(EDX)(ESP-12)<-------(EBX)(ESP-16)<-------(ESP);这里指的是指令执行前的ESP(ESP-20)<-------(EBP)(ESP-24)<-------(ESI)(ESP-28)<-------(EDI)(ESP)<-------(ESP)-32(5)POPDS(DS)<------((SP)+1,(SP))(SP)<------(SP)+2(6)PUSH4(SP)<-------(SP)-2(SP+1)<-----0(SP)<------443。(1)2CEFF93H(2)24B76A0H(3)9090804H(4)6F13ADH44。(1)0FFFFFFFCH(2)0FFFFFFF8H(3)00000007H(4)00000099H45。(EAX)=0(EBX)=25d46。(AX)=3d(DX)=7d47。ADDECX,EDXADDECX,ESIMOVEDI,ECX48。IMULBX,DX,100H执行的操作是:(BX)<-------(DX)*100H49。程序实现: MOVAL,BLCBWIDIVCLIMUL2MOVDX,AX50。JMPDI是直接跳转,执行的操作是:(IP)<-----(IP)+(DI)JMP[DI]是间接跳转,执行的操作是:(IP)<----(IP)+([DI])跳转到DI中所指向的内存单元中的指令地址~51。假设数组名为NUMBERS,程序如下~MOVBX,0;后面用到~MOVCX,100H;把循环次数放入CXMOVAL,42HMOVSI,0;初始化SI;CHECK用来实现查找功能~CHECK:CMPAL,NUMBERS[SI]INCSIJBSTORE1;大于42H的数的个数存入UPJASTORE2;小于42H的的数的个数存入DOWN中~LOOPCHECK;相等继续循环~STORE1INCBL;找到一个大于42的数,BL值增加1~MOVUP,BLLOOPCHECKSTORE2INCBHMOVDOWN,BHLOOPCHECK52。图,也不用画了~第四章1.(1)MOVAH,BX源操作数与目的操作数长度不相同~(2)MOV[BX],[SI]这是两个内存单元在传递数据,而这在汇编语言中是不允许的~~~(3)MOVAX,[SI][DI]不能用两个变址连用,其中一个应为基址~(4)MOVMYDAT[BX][SI],ES:AX同(2)(5)MOVBYTEPTR[BX],1000必须有一个为寄存器(6)MOVBX,OFFSETMYDAT[SI]OFFSET不能与复杂操作数相连~(7)MOVCS,AX不能对CS赋值~(8)MOVECX,AX操作数类型不同~2。(1)合法(2)非法(3)非法(4)非法3。(1)非法,操作数类型不同(2)合法(3)非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?~~~呵~(4)合法~(5)合法~(6)合法 (7)非法~,必须有一个寄存器~~把CPU放哪了?~~(8)非法,两个内存单元地址相加没有意义~(9)合法(10)非法,同(3)4。(1)两内存单元传递数据(2)操作数类型不同(3)跳转指令只能跳转到符号地址(4)转移指令后不能为变量,只能为标号(5)格式不对,应为NEARPTR。。。5。图,就不画了~~6。(1)DW5150H(2)MOVAX,5150HMOVADDRESS,AX等,写出几个就可以~~7。DATASGSEGMENTFLD1BDB"personalcomputer"FLD2BDB10DUP(32)FLD3BDB20HFLD4BDB01011001BFLD5BDB"32654"FLD6BDB10DUP(0)FLD7BDB"PART1",DUP20(?),"PART2",DUP50(?),"PART3",DUP14(?)FLD1WDW0FFF0HFLD2WDW01011001BFLD3WDWFLD7BFLD4WDW5,6,7,8,9FLD5WDW5DUP(0)FLD6WDW(FLD6W-FLD1W)-(FLD7B-FLD1B)8。PLENTH的值为22,GE表示该数据段的长度~9。L的值为710。(1)MOVAX,OFFSETLNAME(2)MOVSI,WORDPTRCODE_LIST(3)CODE_LENGHTEQU$-CODE_LIST11。代码如下:DATA_SEGSEGMENTDB5DATA_LISTDW0FFFFH,0,2,5,4,5DUP(?)DATA_SEGENDSCODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEGMOVAX,5MOVMAX,AXMOVAX,0FFFFHMOVMIN,AX CODE_SEGENDS12。(1)10025(2)19(3)2548(4)3(5)103(6)0FFFFH(7)1(8)313。分别汇编成为:MOVAX,0AHMOVBL,0AHMOVCL,114。(1)(AX)=1(2)(AX)=2(3)(CX)=14H(4)(DX)=32H(5)(CX)=1]15。(1)操作符错误改为:DATA_SEGSEGMENT(2)缺少段名在前面加个段名(3)引用应该从;开始把那个“/”改成“;”(4)结构混乱改为:MAIN_PROCPROCFAR。。。。MAIN_PROCENDPEND16。程序框架如下:DATA_SEGSEGMENT;定義數據段ORG0E000H;讓下一字節地址為0E000HFIRST_TYPEEQUTHISWORD;建立一個與下一存儲單元有相同段地址和偏移地址的操作數DATA_GROUPDB100DUP(?);給DATA_GROUP分配100個字節的空間DATA_SEGENDS;數據段結束STACK_SEGSEGMENT;定義堆棧段ALIGN16;讓下一字節從小段首地址開始STACKDB100DUP(?);為堆棧分配空間STACK_SEGENDS;CODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGORG1000H;讓下條指令的第一個字節從1000H開始START:MOVAX,DATA_SEGMOVDS,AXMOVAX,STACK_SEGMOVSS,AX.......CODE_SEGENDSENDSTART;結束~17。程序如下: D_SEGSEGMENT;数据段定义AUGENDDD99251D_SEGENDSE_SEGSEGMENT;附加段定义ADDENDDD-15926E_SEGENDSC_SEGSEGMENT;代码段定义ASSUMECS:C_SEG,DS:D_SEG,ES:E_SEGSTART:MOVAX,D_SEGMOVDS,AXMOVAX,E_SEGMOVES,AXMOVEAX,DS:AUGENDADDEAX,ES:ADDENDMOVDS:SUM,EAXC_SEGENDSENDSTART;结束19。需要加上PTR伪操作的有:(2)(3)(4)第五章5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.modelsmall.stack100H.codemainprocfarStart:pushdxmovax,0pushaxmovah,01Hint21Hcmpal,61Hjllop1cmpal,7BHjgelop1subal,20Hmovdl,allop1:movah,2 int21HretEndstart5.2编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符..modelsmall.386.codeMAINPROCFARstart:pushdssubax,axpushaxinput:movah,7Hint21Hcmpe:cmpal,20HJEexitcmpal,61HJLinputcmpal,7AHJGinputprint:subal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21H ;输出换行回车movdl,0AHmovah,02Hint21Hjmpinputexit:retMAINENDPENDstart5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。.modelsmall.dataxDB4dup(?).stack100H.codeMAINPROCFARstart:pushdsandax,00Hpushaxmovax,1234Hmovcx,04Hmovsi,00Hlop:pushcxmovcl,04Hrolax,clpushaxandal,0FHmovBYTEPTRx[si],alpopaxpopcxaddsi,2Looplopmoval,[X]movbl,[X+2]movcl,[X+4]movdl,[X+6] print:movah,02Hint21Hmovdl,almovah,02Hint21Hmovdl,blmovah,02Hint21Hmovdl,clmovah,02Hint21Hexit:retMAINENDPENDstart5.4编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH",若不同在显示:"NOMATCH"。.modelsmall.dataSTRING1DB"Imuststudyhard"STRING2DB"Imuststudyhard"X      DB"MATCH.$"Y      DB"NOMATCH.$".stack100H.codemainprocfarStart:pushdxmovax,0pushaxmovax,@datamovds,axmoves,axleasi,STRING1leadi,STRING2 cldmovcx,(string2-string1)/typeSTRING2retEndstart5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07)。这题比较有意思,呵呵。modelsmall.codemainprocfarstart:pushdssubax,axpushaxinput:        movah,01H        int21H        cmpal,20H        jeexit        cmpal,30H        jleinput        cmpal,3AH        jgeinput        subal,30H        movcx,ax        andcx,0FFHlop:        movdl,07H        movah,2H        int21H        looplop        jmpinputexit:        retmainendpendstart5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组和负数数组N,并分别把这两个数组中的数据个数显示出来。 .modelsmall.386.dataMDB1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10PDB20dup(?)NDB20dup(?).codeMAINPROCFARstart:  PUSHds  ANDax,0  PUSHax    MOVax,@data  movds,ax  MOVbx,0  MOVsi,0  MOVdi,0  MOVcx,20D  cmpe:  CMPM[bx],0  JLifLowhight:  MOVal,byteptrM[bx]  MOVbyteptrP[si],al  incsi  JMPcommonContrlifLow:  MOVal,byteptrM[bx]  MOVbyteptrN[di],al  INCdicommonContrl:  INCbx  loopcmpe  movax,si  callshowNumber  callprintCR  movax,di  callshowNumberexit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;; showNumberPROCNEARcovernum:  DAA  MOVdx,ax  MOVcl,2Hshow:  ROLdl,4H  pushdx  ANDdl,0fH  ADDdl,30H  MOVah,02H  int21H  popdx  loopshow  retshowNumberENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;printCRPROCNEAR  movdl,0aH  movah,02H  int21H  movdl,0dH  movah,02H  int21H  retprintCRENDPendstart5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。    此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA....dataaresegmentDATADW3322H,4555H,200H,3544H,1245HnumDB($-DATA)/2dataareendscodesegmentassumecs:code,ds:dataareMAINPROCFARstart:   pushds  movax,0H  pushax    movax,dataare  movds,ax  movdx,0H              ;偶数数量计数  movcx,Wordptr[num]  movsi,0HisO:  movbx,WORDPTRDATA[si]  shrbx,1H  jncaddDX  jmpcommonControladdDX:  ADDdx,1H  cmpdx,1H  je  firstAXValuecompare:  movbx,WORDPTRDATA[si]  cmpbx,ax  jgecommonControl  movax,bxcommonControl:  ADDsi,2H  loopisO  jmpexitfirstAXvalue:  movax,WORDPTRDATA[si]  jmpcompareexit:  retMAINENDPcodeendsENDstart5.8没有做。。5.9编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等值的二进制数。.modelsmall.386.codemainprocfarstart:pushds movax,0pushaxmovax,0movcx,4movdx,0input:movah,1Hint21Hcmpal,30Hjl  input   cmpal,39H   jlescmpal,61Hjl  inputcmpal,66Hjg  inputsubal,27Hs:subal,30Hadddl,alcmpcx,1Hje  froldx,4f:loopinputexit:callprintretmainendpprintprocnearmovcx,10Hp:            roldx,1pushdxanddx,1adddx,30Hmovah,2int21Hpopdxlooppretprintendp endstart5.10设有一段英文,其变量字符名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式"SUNXXXX"显示出次数。.modelsmall.386.dataENG    db"SUN"sSUNJAVA",24H;;;;24H=$MESSAGEdb"SUN:","$".stack100H.codeMAINPROCFARstart:  PUSHDS  ANDAX,0  PUSHAX    MOVAX,@data  MOVDS,AX  ;------------------------  MOVAX,0H  MOVSI,1HsubSI1:  SUBSI,1HsubSI2:  SUBSI,1HcompareS:  ADDSI,1H  MOVDL,ENG[SI]  CMPDL,24H  JE  print  CMPDL,53H  JNEcompareScompareU:  ADDSI,1H  MOVDL,ENG[SI]  CMPDL,55H  JNEsubSI2compareN:  ADDSI,1H  MOVDL,ENG[SI]  CMPDL,4EH  JNEsubSI1  INCAX   JMPcomparesprint:  LEADX,MESSAGE  PUSHAX  MOVAH,09H  INT21H  POPAX  callshowNumberexit:  retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:  DAA  MOVdx,ax  MOVcl,4Hshow:  ROLdx,4H  pushdx  ANDdx,0fH  ADDdx,30H  MOVah,02H  int21H  popdx  loopshow  retshowNumberENDPENDstart5.11从键盘输入一系列以$为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。.modelsmall.386.codeMAINPROCFARstart:  pushds  movax,0  pushax    movcx,0input:   movah,1H  int21Hcompare:  cmpal,24H  je  print  cmpal,30H  jl  addCount  cmpal,39H  jg  addCountaddCount:  addax,1H  jmpinputprint:  callshowNumberexit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:  DAA  MOVdx,ax  MOVcl,2Hshow:  ROLdl,4H  pushdx  ANDdl,0fH  ADDdl,30H  MOVah,02H  int21H  popdx  loopshow  retshowNumberENDPENDstart5.12有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。.modelsmall.386.stack100H.datamemdw 12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,45,7,5,1,2,0,2,4,0,2.codeMAINPROCFARstart:  pushds  andax,0  pushax    movax,@data  movds,ax;----------------------  movax,0H  movbx,64H  movcx,64H  movsi,0FFFEHrepeat:  ADDsi,2H  cmpMEM[si],0H  JE  calls  looprepeatcalls:  INCax  callsort  cmpax,1H  JE  lastValue  DECcx  jmprepeatexit:  retlastValue:  movmem[bx],0H  DECcx  jmprepeat  MAINENDPsortPROCNEARpushcxpushsisubsi,2Hs:addsi,2H movdx,mem[si]movmem[si+2],dxloopsreturn:popsipopcxretsortENDPENDstart第七章1、     答:CLRBMACRON,ARRAYCLDMOVCX,NMOVAL,20HLEADI,ARRAYREPSTOSBENDM2、答:WAGESMACRORATE,HOURMOVAL,RATEMOVBL,HOURMULBL;计算周工资;ADDAX,AXADDAX,AX;一个月有4周MOVWAG,AX;暂存中间结果ADDBL,BLADDBL,BL;计算月出工小时数MOVAL,BLMOVAH,0MOVBL,10DIVBLMOVBL,3MULBL;计算奖金ADDWAG,AX;计算工资总数ENDM宏展开:1MOVAL,R11MOVBL,42 1MULBL1ADDAX,AX1ADDAX,AX1MOVWAG,AX1ADDBL,BL1ADDBL,BL1MOVAL,BL1MOVAH,01MOVBL,101DIVBL1MOVBL,31MULBL1ADDWAG,AX3、答:(1)调用有效1PUSHAX2MOVAX,P12SUBAX,P21CMPAX,01JGE??00001NEGAX1??0000:MOVDISTANCE,AX1POPAX(2)调用有效1PUSHAX2MOVAX,[BX]2SUBAX,[SI]1CMPAX,01JGE??00011NEGAX1??0001:MOVX[DI],AX1POPAX(3)调用无效,有错误指令1??0002:MOV240H,AX(4)调用有效,但无意义宏展开略。4、答:SENDMACROSCHARS,DCHARSLOCALNEXT,EXITPUSHAXPUSHSIMOVSI,0 NEXT:MOVAL,SCHARS[SI]MOVDCHARS[SI],ALCMPAL,24HJZEXITINCSIJMPNEXTEXIT:POPSIPOPAXENDM5、答:BIN_SUBMACROOPERAND,COUNT,RESULTLOCALNEXTLEABX,OPERANDMOVCX,COUNTDECCXMOVAL,[BX]NEXT:INCBXSUBAL,[BX]LOOPNEXTMOVRESULT,ALENDM7、答:宏展开:2DATA0DW?2DATA1DW?9、答:1MOVTAB,01MOVTAB+1,11MOVTAB+2,21MOVTAB+3,31MOVTAB+4,41MOVTAB+5,51MOVTAB+6,610、答:STOREMACROXIRPCX,0123456 MOVTAB+&X,XENDMENDM12、答:FINSUMMACROX,Y,SUMMOVAX,XMOVBX,Y.IFAX>BXADDBX,BXADDAX,BXMOVSUM,AX.ELSEADDAX,AXADDAX,BXMOVSUM,AX.ENDIFENDM14、答:DOS21MACRODOSFUNC,BUFFIFNBáBUFF?MOVAH,DOSFUNCMOVDX,OFFSETBUFFINT21HELSEMOVAH,DOSFUNCINT21HENDIFENDM展开宏调用:1MOVAH,011INT21H1MOVAH,0AH1MOVDX,OFFSETIPFIELD1INT21H   '