• 231.60 KB
  • 2022-04-22 11:38:13 发布

《汇编语言程序设计》习题答案(第二版 沈美明 温冬婵 清华大学出版社).pdf

  • 41页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'汇编语言程序设计(第二版)第二章1、答:直接由指令指定的I/O端口数为256个。2、答:3、答:字节单元:(30022H)=ABH,(30024H)=EFH字单元:(30021H)=AB34H,(30022H)=CDABH。4、答:3017:000A的存储单元的物理地址是3017AH,3015:002A的存储单元的物理地址是3017AH,3010:007A的存储单元的物理地址是3017AH。5、答:该程序的第一个字的物理地址是0AAA40H。6、答:条件标志OF、SF、ZF、CF的值依次分别为0、0、0、0。7、答:(1)AX、BX、CX、DX、AH、AL、BH、BL、CH、CL、DH、DL、SP、BP、DI、SI(注意:学生尽量不要用SP参与加减运算)(2)CX(3)DX、AX、AH、AL1(4)CS、DS、ES、SS(5)FLAGS(6)IP(7)SS、SP、BP8、答:可以用来指示存储器地址的寄存器有BX、SP、BP、DI、SI、IP、CS、DS、ES、SS。9、答:唯一正确的是D。第三章1。.(1)立即寻址没有(2)直接寻址7237H(3)使用BX的寄存器寻址没有(4)使用BX的间接寻址637DH(5)使用BX的寄存器相对寻址0D5F0H(6)基址变址寻址8E18H(7)相对基址变址004FHPage1of41 2。根据下列要求,写出相应的汇编指令。(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,1200H1200H2(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:DI7。转向地址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]寄存器间接寻址20010HPage2of41 (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。的指令: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],后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足~~~315。运算结果: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),连续减去两个数,相当于减去这两个数的和~~Page3of41 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,CL2341H100DECAX2340H100MOVCX,42340H100MULCX8918H000INT20H4程序结束后,(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],AXPage4of41 (3)本组指令的作用是:BX<------[DATAX]+[DATAY]+[1](CF的值)带进位加法~(4)MOVAX,DATAXMULDATAY;结果的高十六位保存在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,05RIGHT:MOVB,AXMOV[B+2],DX23。每条指令单独执行完后的结果依次为:(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中Page5of41 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;比较6MOVBH,[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中的字符是否为"_",找到第一个停下来Page6of41 CHECK:CMPAX,STUDENT_ADDR[SI];INCSILOOPNZCHECK(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再从高到低移上去~~7REPSTOSB(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_LESSPage7of41 。。。33。(1)CMPDX,CXJAEXCEED(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,LE8(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注:本题还有其他解法,请大家自己试试~~Page8of41 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)=0IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第三章答案39--5239。图,就不画了,呵呵~~自己看一下课本,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)9(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。程序实现:Page9of41 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,BLLOOPCHECK10STORE2INCBHMOVDOWN,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)合法~Page10of41 (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(?)FLD1WDW0FFF0HFLD2WDW01011001B11FLD3WDWFLD7BFLD4WDW5,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,AXCODE_SEGENDS12。(1)10025(2)19(3)2548(4)3Page11of41 (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;建立一个与下一存储单元有相同段地址和偏移地址的操作数12DATA_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-15926Page12of41 E_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;结束18。19。需要加上PTR伪操作的有:(2)(3)(4)第五章5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.modelsmall.stack100H.codemainprocfarStart:pushdx13movax,0pushaxmovah,01Hint21Hcmpal,61Hjllop1cmpal,7BHjgelop1subal,20Hmovdl,allop1:movah,2int21HretEndstartPage13of41 5.2编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符..modelsmall.386.codeMAINPROCFARstart:pushdssubax,axpushaxinput:movah,7Hint21Hcmpe:cmpal,20HJEexitcmpal,61HJLinputcmpal,7AH14JGinputprint:subal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21Haddal,01Hmovdl,almovah,02Hint21H;输出换行回车movdl,0AHmovah,02Hint21HPage14of41 jmpinputexit:retMAINENDPENDstart5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。.modelsmall.dataxDB4dup(?).stack100H.codeMAINPROCFARstart:pushdsandax,00Hpushaxmovax,1234Hmovcx,04Hmovsi,00Hlop:15pushcxmovcl,04Hrolax,clpushaxandal,0FHmovBYTEPTRx[si],alpopaxpopcxaddsi,2Looplopmoval,[X]movbl,[X+2]movcl,[X+4]movdl,[X+6]print:movah,02Hint21Hmovdl,almovah,02Hint21HPage15of41 movdl,blmovah,02Hint21Hmovdl,clmovah,02Hint21Hexit:retMAINENDPENDstart5.4编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH",若不同在显示:"NOMATCH"。.modelsmall.dataSTRING1DB"Imuststudyhard"STRING2DB"Imuststudyhard"XDB"MATCH.$"YDB"NOMATCH.$".stack100H.codemainprocfarStart:16pushdxmovax,0pushaxmovax,@datamovds,axmoves,axleasi,STRING1leadi,STRING2cldmovcx,(string2-string1)/typeSTRING2retEndstart5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07)。这题比较有意思,呵呵。modelsmall.codemainprocfarstart:Page16of41 pushdssubax,axpushaxinput:movah,01Hint21Hcmpal,20Hjeexitcmpal,30Hjleinputcmpal,3AHjgeinputsubal,30Hmovcx,axandcx,0FFHlop:movdl,07Hmovah,2Hint21Hlooplopjmpinputexit:ret17mainendpendstart5.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:PUSHdsANDax,0PUSHaxMOVax,@datamovds,axMOVbx,0MOVsi,0Page17of41 MOVdi,0MOVcx,20Dcmpe:CMPM[bx],0JLifLowhight:MOVal,byteptrM[bx]MOVbyteptrP[si],alincsiJMPcommonContrlifLow:MOVal,byteptrM[bx]MOVbyteptrN[di],alINCdicommonContrl:INCbxloopcmpemovax,sicallshowNumbercallprintCRmovax,dicallshowNumber18exit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:DAAMOVdx,axMOVcl,2Hshow:ROLdl,4HpushdxANDdl,0fHADDdl,30HMOVah,02Hint21HpopdxloopshowretshowNumberENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;printCRPROCNEARPage18of41 movdl,0aHmovah,02Hint21Hmovdl,0dHmovah,02Hint21HretprintCRENDPendstart5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA....dataaresegmentDATADW3322H,4555H,200H,3544H,1245HnumDB($-DATA)/2dataareendscodesegmentassumecs:code,ds:dataareMAINPROCFARstart:pushdsmovax,0Hpushax19movax,dataaremovds,axmovdx,0H;偶数数量计数movcx,Wordptr[num]movsi,0HisO:movbx,WORDPTRDATA[si]shrbx,1HjncaddDXjmpcommonControladdDX:ADDdx,1Hcmpdx,1HjefirstAXValuecompare:movbx,WORDPTRDATA[si]cmpbx,axjgecommonControlmovax,bxcommonControl:Page19of41 ADDsi,2HloopisOjmpexitfirstAXvalue:movax,WORDPTRDATA[si]jmpcompareexit:retMAINENDPcodeendsENDstart5.8没有做。。5.9编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等值的二进制数。.modelsmall.386.codemainprocfarstart:pushdsmovax,0pushaxmovax,020movcx,4movdx,0input:movah,1Hint21Hcmpal,30Hjlinputcmpal,39Hjlescmpal,61Hjlinputcmpal,66Hjginputsubal,27Hs:subal,30Hadddl,alcmpcx,1Hjefroldx,4Page20of41 f:loopinputexit:callprintretmainendpprintprocnearmovcx,10Hp:roldx,1pushdxanddx,1adddx,30Hmovah,2int21Hpopdxlooppretprintendpendstart5.10设有一段英文,其变量字符名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式"SUNXXXX"显示出次数。21.modelsmall.386.dataENGdb"SUN"sSUNJAVA",24H;;;;24H=$MESSAGEdb"SUN:","$".stack100H.codeMAINPROCFARstart:PUSHDSANDAX,0PUSHAXMOVAX,@dataMOVDS,AX;------------------------MOVAX,0HMOVSI,1HsubSI1:SUBSI,1HsubSI2:Page21of41 SUBSI,1HcompareS:ADDSI,1HMOVDL,ENG[SI]CMPDL,24HJEprintCMPDL,53HJNEcompareScompareU:ADDSI,1HMOVDL,ENG[SI]CMPDL,55HJNEsubSI2compareN:ADDSI,1HMOVDL,ENG[SI]CMPDL,4EHJNEsubSI1INCAXJMPcomparesprint:LEADX,MESSAGEPUSHAX22MOVAH,09HINT21HPOPAXcallshowNumberexit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:DAAMOVdx,axMOVcl,4Hshow:ROLdx,4HpushdxANDdx,0fHADDdx,30HMOVah,02Hint21HpopdxPage22of41 loopshowretshowNumberENDPENDstart5.11从键盘输入一系列以$为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。.modelsmall.386.codeMAINPROCFARstart:pushdsmovax,0pushaxmovcx,0input:movah,1Hint21Hcompare:cmpal,24Hjeprintcmpal,30H23jladdCountcmpal,39HjgaddCountaddCount:addax,1Hjmpinputprint:callshowNumberexit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:DAAMOVdx,axMOVcl,2Hshow:ROLdl,4HpushdxANDdl,0fHADDdl,30HPage23of41 MOVah,02Hint21HpopdxloopshowretshowNumberENDPENDstart5.12有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。.modelsmall.386.stack100H.datamemdw12,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:pushdsandax,0pushax24movax,@datamovds,ax;----------------------movax,0Hmovbx,64Hmovcx,64Hmovsi,0FFFEHrepeat:ADDsi,2HcmpMEM[si],0HJEcallslooprepeatcalls:INCaxcallsortcmpax,1HJElastValueDECcxjmprepeatexit:Page24of41 retlastValue:movmem[bx],0HDECcxjmprepeatMAINENDPsortPROCNEARpushcxpushsisubsi,2Hs:addsi,2Hmovdx,mem[si]movmem[si+2],dxloopsreturn:popsipopcxretsortENDPENDstart25第六章2、答:(1)NAME1NAMELIST<>(2)MOVAX,DATA;假设结构变量NAME1定义在数据段DATA中MOVDS,AXMOVES,AX;MOVAH,10LEADX,NAME1INT21H;MOVCL,NAME1.ACTLENMOVCH,0LEASI,NAME1.NAMEINLEADI,DISPFILECLDREPMOVSB6、答:SKIPLINESPROCNEARPUSHCXPUSHDXPage25of41 MOVCX,AXNEXT:MOVAH,2MOVDL,0AHINT21HMOVAH,2MOVDL,0DHINT21HLOOPNEXTPOPDXPOPCXRETSKIPLINESENDP7、答:dsegsegmentnumdw76,69,84,90,73,88,99,63,100,80ndw10s6dw0s7dw0s8dw0s9dw0s10dw0dsegends26codesegmentmainprocfarassumecs:code,ds:dsegstart:pushdssubax,axpushaxmovax,dsegmovds,axcallsub1retmainendpsub1procnearpushaxpushbxpushcxpushsiPage26of41 movsi,0movcx,nnext:movax,num[si]movbx,10divblmovbl,alcbwsubbx,6salbx,1incs6[bx]addsi,2loopnextpopsipopcxpopbxpopaxretsub1endpcodeendsendstart278、答:datasegmentmaxlendb40ndb?tabledb40dup(?)chardb"a";查找字符’a’evenaddrdw3dup(?)dataendscodesegmentassumecs:code,ds:datamainprocfarstart:pushdsmovax,0pushaxmovax,datamovds,axPage27of41 leadx,maxlenmovah,0ahint21h;从键盘接收字符串movaddr,offsettablemovaddr+2,offsetnmovaddr+4,offsetcharmovbx,offsetaddr;通过地址表传送变量地址callcount;计算CHAR的出现次数calldisplay;显示retmainendpcountprocnear;count子程序pushsipushdipushaxpushcxmovdi,[bx]movsi,[bx+2]28movcl,byteptr[si]movch,0movsi,[bx+4]moval,byteptr[si]movbx,0again:cmpal,byteptr[di]jnel1incbxl1:incdiloopagainpopcxpopaxpopdipopsiretcountendpdisplayprocnear;display子程序Page28of41 callcrlf;显示回车和换行movdl,charmovah,2int21hmovdl,20hmovah,2int21hmoval,blandal,0fhaddal,30hcmpal,3ahjlprintaddal,7print:movdl,alint21hcallcrlfretdisplayendp29crlfprocnear;crlf子程序movdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hretcrlfendpcodeendsendstart第七章1、答:CLRBMACRON,ARRAYCLDMOVCX,NMOVAL,20HLEADI,ARRAYREPSTOSBENDMPage29of41 2、答:WAGESMACRORATE,HOURMOVAL,RATEMOVBL,HOURMULBL;计算周工资;ADDAX,AXADDAX,AX;一个月有4周MOVWAG,AX;暂存中间结果ADDBL,BLADDBL,BL;计算月出工小时数MOVAL,BLMOVAH,0MOVBL,10DIVBLMOVBL,3MULBL;计算奖金ADDWAG,AX;计算工资总数ENDM宏展开:301MOVAL,R11MOVBL,421MULBL1ADDAX,AX1ADDAX,AX1MOVWAG,AX1ADDBL,BL1ADDBL,BL1MOVAL,BL1MOVAH,01MOVBL,101DIVBL1MOVBL,31MULBL1ADDWAG,AX3、答:(1)调用有效1PUSHAX2MOVAX,P12SUBAX,P2Page30of41 1CMPAX,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,EXITPUSHAX31PUSHSIMOVSI,0NEXT:MOVAL,SCHARS[SI]MOVDCHARS[SI],ALCMPAL,24HJZEXITINCSIJMPNEXTEXIT:POPSIPOPAXENDM5、答:BIN_SUBMACROOPERAND,COUNT,RESULTLOCALNEXTLEABX,OPERANDMOVCX,COUNTDECCXMOVAL,[BX]NEXT:INCBXPage31of41 SUBAL,[BX]LOOPNEXTMOVRESULT,ALENDM7、答:宏展开:2DATA0DW?2DATA1DW?9、答:1MOVTAB,01MOVTAB+1,11MOVTAB+2,21MOVTAB+3,31MOVTAB+4,41MOVTAB+5,51MOVTAB+6,610、答:32STOREMACROXIRPCX,0123456MOVTAB+&X,XENDMENDM12、答:FINSUMMACROX,Y,SUMMOVAX,XMOVBX,Y.IFAX>BXADDBX,BXADDAX,BXMOVSUM,AX.ELSEADDAX,AXADDAX,BXMOVSUM,AX.ENDIFENDMPage32of41 14、答:DOS21MACRODOSFUNC,BUFFIFNBáBUFF?MOVAH,DOSFUNCMOVDX,OFFSETBUFFINT21HELSEMOVAH,DOSFUNCINT21HENDIFENDM展开宏调用:1MOVAH,011INT21H1MOVAH,0AH1MOVDX,OFFSETIPFIELD1INT21H第八章1、答:(1)00048H(2)00020H2、答:33movah,02movdl,‘T’movbx,0movds,bxmovbx,21h*4callfarptr[bx]3、答:moval,12hout25h,al4、答:movdx,1000hinax,dx8、答:(SP)=00FA(SS)=0300(IP)=0040(FLAGS)=0040Page33of41 9、答:14H*4=50H,∴(00050H)=偏移地址,(00052H)=段地址10、答:pushdsmovax,segint_routmovds,axmovdx,offsetint_routmoval,09movah,25hint21hpopds12、答:D3→D2→D3→D4→D5→D1→D3→D513、答:D3→D2→D4→D5→D1→D3→D5第九章1、答:二者不同点是功能1输入字符可回显,功能8输入字符不回显。342、答:dsegsegmentscodedb7,5,9,1,3,6,8,0,2,4bufferdb10dup(?)dsegends;--------------------------------------------------------------------csegsegmentmainprocfarmovax,dsegmovds,axmovsi,0movcx,10leabx,scodeinput:movah,01;键盘输入int21handal,0fh;ASCII→数字xlat;换码movbuffer[si],al;存入缓冲区incsi;修改地址指针loopinput;输入下一个数字movax,4c00h;返回DOSPage34of41 int21hmainendpcsegendsendmain3、答:((24行×80)+40列)×2=3920=0F50H4、答:movdh,0ch;第12行movdl,08h;第8列movbh,0;0页movah,2;置光标int10h;BIOS调用5、答:movah,7;屏幕初始化moval,0;全屏为空格movbh,07h;正常属性movch,12;左上行movcl,0;左上列movdh,22;右下行movdl,39;右下列35int10h;BIOS调用6、答:(1)movah,3;读光标位置movbh,0;页号int10h;BIOS调用(2)movdh,18h;第25行movdl,0;第0列movbh,0;0页movah,2;置光标位置int10h;BIOS调用(3)movah,2;置光标位置movbh,0;0页movdx,0;0行0列int10h;BIOS调用movah,9;显示字符及属性moval,‘M’;字符movbh,0;0页movbl,7;正常属性movcx,1;显示次数int10h;BIOS调用Page35of41 7、答:messagedb‘Tryagain,youhave’Countdb‘n’db‘starfightersleft.$’;……addcl,30h;二进制数→ASCIImovcount,cl;存入COUNTleadx,message;字符串地址movah,09;显示字符串int21h;DOS调用9、答:messdb‘Whatisthedate(mm/dd/yy)’,07,‘$’datedb10,0,10dup(‘‘)…movah,09;显示字符串leadx,mess;字符串地址int21hmovah,0ah;键盘输入leadx,date;缓冲区地址int21h11、答:36MODECOM2:12,N,8,1第十章1。答:(1)EXYRNSUBPRO:FAR(2)PUBLICSUBPRO2、答:(1)PUBLICQTY,VALUE,PRICE(2)EXTRNQTY:BYTE,VALUE:WORD,PRICE:WORD3、答:模块1:PUBLICVAR1,VAR2,LAB3模块2:PUBLICVAR3,LAB2EXTRNVAR1:DWORD,VAR2:BYTE,LAB1:NEAR,LAB3:FAR模块3:PUBLICLAB3EXTRNVAR1:DWORD,VAR2:BYTE,LAB1:NEAR,LAB2:FARPage36of41 4、答:EXTRNSUBMUL:FARSSEGSEGMENTDW64DUP(?)SSEGENDS;--------------------------------------------DSEGSEGMENTQTYDW?PRICEDW?DSEGENDS;---------------------------------------------CSEG1SEGMENTASSUMECS:CSEG1,DS:DSEG,SS:SSEGCALLMULPROCFARMOVAX,DSEGMOVDS,AXMOVAX,PRICEMOVBX,QTYCALLFARPTRSUBMUL…CALLMULENDPCSEG1ENDSENDCALLMUL37;------------------------------------------------PUBLICSUBMULCSEG2SEGMENTASSUMECS:CSEG2SUBMULPROCFARMULBXRETSUBMULENDPCSEG2ENDSEND;--------------------------------------------------5、答:1D_SEGSEGMENT2XDW16DUP(?)3YDW16DUP(?)4D_SEGENDSPage37of41 ;--------------------------------------------5E_SEGSEGMENT6RDW16DUP(?)7E_SEGENDS;---------------------------------------------8C_SEGSEGMENT9ASSUMECS:C_SEG,DS:D_SEG,ES:E_SEG10MAINPROCFAR11MOVAX,D_SEG12MOVDS,AX13MOVAX,E_SEG14MOVES,AX15CALLCOMPUTE16…17MAINENDP;------------------------------------------------18COMPUTEPROCNEAR19MOVCX,1620MOVSI,021MOVDI,022MOVBX,023NEXT:MOVAX,X[SI]24ADDAX,Y[DI]3825SUBAX,326MOVES:R[BX],AX27INCSI28INCDI29INCBX30LOOPNEXT31RET32COMPUTEENDP33C_SEGENDS;---------------------------------------------------34ENDMAIN(1)D_SEGSEGMENT…D_SEGENDS;----------------------------------------E_SEGSEGMENT…E_SEGENDS;---------------------------------------C_SEG1SEGMENTPage38of41 ASSUMECS:C_SEG,DS:D_SEG,ES:E_SEGMAINPROCFARMOVAX,D_SEGMOVDS,AXMOVAX,E_SEGMOVES,AXCALLFARPTRCOMPUTE…MAINENDPC_SEG1ENDS;------------------------------------------------C_SEG2SEGMENTASSUMECS:C_SEG2,DS:D_SEG,ES:E_SEGCOMPUTEPROCFAR…COMPUTEENDPC_SEG2ENDS;--------------------------------------------------ENDMAIN(2)D_SEGSEGMENT…D_SEGENDS39;----------------------------------------E_SEGSEGMENT…E_SEGENDS;---------------------------------------EXTRNCOMPUTE:FARPUBLICX,Y,RC_SEG1SEGMENTASSUMECS:C_SEG,DS:D_SEG,ES:E_SEGMAINPROCFARMOVAX,D_SEGMOVDS,AXMOVAX,E_SEGMOVES,AXCALLFARPTRCOMPUTE…MAINENDPC_SEG1ENDSENDMAIN;--------------------------------------------------EXTRNX:WORD,Y:WORD,R:WORDPage39of41 PUBLICCOMPUTEC_SEG2SEGMENTASSUMECS:C_SEG2,DS:D_SEG,ES:E_SEGCOMPUTEPROCFARMOVAX,D_SEGMOVDS,AXMOVAX,E_SEGMOVES,AX…COMPUTEENDPC_SEG2ENDSEND;--------------------------------------------------6、答:.modelsmall.stack100h.datapublicdata1dw1228data2dw52400resultdd?40quotientdw?remainderdw?.codeextrndmul:far,ddiv:farstart:movax,@datamovds,axmovdx,data1movax,data2pushaxpushdxcallfarptrdmulcallfarptrddivmovah,4chint21hendstart;----------------------------------------------.modelsmallextrnresult:dword.codepublicdmuldmulprocfar__Page40of41 pushbpmovbp,spmovax,[bp+6]movbx,[bp+8]mulbxmovwordptrresult,axmovwordptrresult+2,dxpopbpretdmulendpend;---------------------------------------------------.modelsmallextrnquotient:word,remainder:word.codepublicddivddivprocfar__pushbpmovbp,spmovbx,[bp+6]movax,[bp+8]movdx,0divbx41movquotient,axmovremainder,dxpopbpretdmulendpendPage41of41'