首页 汇编语言课后答案分析解析

汇编语言课后答案分析解析

举报
开通vip

汇编语言课后答案分析解析IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第3章答案IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第三章答案1-1。.(1)立即寻址没有(2)直接寻址7237H(3)使用BX的寄存器寻址没有(4)使用BX的间接寻址637DH(5)使用BX的...

汇编语言课后答案分析解析
IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第3章答案IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第三章答案1-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: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]寄存器间接寻址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。接上 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf ~(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,CL2341H100DECAX2340H100MOVCX,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,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,0RIGHT: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中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];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再从高到低移上去~~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,CXJAEXCEED2)CMPBX,AXJGEXCEED(3)CMPCX,0JZZERO4)CMPBX,AXJOOVERFLOW5)CMPBX,AXJLEEQ_SMACMPDX,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,LE4)可以引起转移到L1的指令有:NB,NBE,NL,NLE5)可以引起转移到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)=02)当括号内是:LOOPE时,不循环,程序结束后AX)=02(BX)=04(CX)=03(DX)=023)当括号内是:LOOPNE时:循环三次,程序结束后AX)=04(BX)=11(CX)=01(DX)=0类别:ibm-pc汇编语言程序设计(第二版)课后习题答案|评论(7)|浏览(5855)IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第三章答案39--522006-11-0223:0239。图,就不画了,呵呵~~自己看一下课本,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)-325)POPDS(DS)<------((SP)+1,(SP))(SP)<------(SP)+2PUSH4(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;初始化SICHECK用来实现查找功能~CHECK:CMPAL,NUMBERS[SI]INCSIJBSTORE1;大于42H的数的个数存入UPJASTORE2;小于42H的的数的个数存入DOWN中~LOOPCHECK;相等继续循环~STORE1INCBL;找到一个大于42的数,BL值增加1~MOVUP,BLLOOPCHECKSTORE2INCBHMOVDOWN,BHLOOPCHECK52。图,也不用画了~~呵呵~好了,本章结束--------------------------------第4章答案IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第四章答案2006-11-0421:591。指令下列指令的错误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)DW5150H2)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_LIST3)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)100252)193)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;结束18。19。需要加上PTR伪操作的有:(2)(3)(4)--------------------------------第5章答案IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第五章答案这当然不是标准答案,希望对大家有用处。5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来.modelsmall.stack100H.codemainprocfarStart:pushdxmovax,0pushaxmovah,01Hint21Hcmpal,61Hjllop1cmpal,7BHjgelop1subal,20Hmovdl,allop1:movah,2int21HretEndstart5.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'XDB'MATCH.$'YDB'NOMATCH.$'.stack100H.codemainprocfarStart:pushdxmovax,0pushaxmovax,@datamovds,axmoves,axleasi,STRING1leadi,STRING2cldmovcx,(string2-string1)/typeSTRING2retEndstart5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07)。这题比较有意思,呵呵。modelsmall.codemainprocfarstart:pushdssubax,axpushaxinput:movah,01Hint21Hcmpal,20Hjeexitcmpal,30Hjleinputcmpal,3AHjgeinputsubal,30Hmovcx,axandcx,0FFHlop:movdl,07Hmovah,2Hint21Hlooplopjmpinputexit: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:PUSHdsANDax,0PUSHaxMOVmovMOVMOVMOVMOVax,@datads,axbx,0si,0di,0cx,20Dcmpe:CMPM[bx],0JLifLowhight:MOVal,byteptrM[bx]MOVbyteptrP[si],alincsiJMPcommonContrlifLow:MOVal,byteptrM[bx]MOVbyteptrN[di],alINCdicommonContrl:INCbxloopcmpemovax,sicallshowNumbercallprintCRmovax,dicallshowNumberexit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:DAAMOVdx,axMOVcl,2Hshow:ROLdl,4HpushdxANDdl,0fHADDdl,30HMOVah,02Hint21HpopdxloopshowretshowNumberENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;printCRPROCNEARmovdl,0aHmovah,02Hint21Hmovdl,0dHmovah,02Hint21HretprintCRENDPendstart5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA....dataaresegmentDATADW3322H,4555H,200H,3544H,1245HnumDB($-DATA)/2dataareendscodesegmentassumecs:code,ds:dataareMAINPROCFARstart:pushdsmovax,0Hpushaxmovax,dataaremovds,axmovdx,0H;偶数数量计数movcx,Wordptr[num]movsi,0HisO:movbx,WORDPTRDATA[si]shrbx,1HjncaddDXjmpcommonControladdDX:ADDdx,1Hcmpdx,1HjefirstAXValuecompare:movbx,WORDPTRDATA[si]cmpbx,axjgecommonControlmovax,bxcommonControl:ADDsi,2HloopisOjmpexitfirstAXvalue:movax,WORDPTRDATA[si]jmpcompareexit:retMAINENDPcodeendsENDstart5.8没有做。。5.9编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等值的二进制数。.modelsmall.386.codemainprocfarstart:pushdsmovax,0pushaxmovax,0movcx,4movdx,0input:movah,1Hint21Hcmpal,30Hjlinputcmpal,39Hjlescmpal,61Hjlinputcmpal,66Hjginputsubal,27Hs:subal,30Hadddl,alcmpcx,1Hjefroldx,4f:loopinputexit:callprintretmainendpprintprocnearmovcx,10Hp:roldx,1pushdxanddx,1adddx,30Hmovah,2int21Hpopdxlooppretprintendpendstart5.10设有一段英文,其变量字符名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式"SUNXXXX"显示出次数。.modelsmall.386.dataENGdb'SUN'sSUNJAVA',24H;;;;24H=$MESSAGEdb'SUN:','$'.stack100H.codeMAINPROCFARstart:PUSHDSANDAX,0PUSHAXMOVAX,@dataMOVDS,AX;------------------------MOVAX,0HMOVSI,1HsubSI1:SUBSI,1HsubSI2:SUBSI,1HcompareS:ADDSI,1HMOVDL,ENG[SI]CMPDL,24HJEprintCMPDL,53HJNEcompareScompareU:ADDSI,1HMOVDL,ENG[SI]CMPDL,55HJNEsubSI2compareN:ADDSI,1HMOVDL,ENG[SI]CMPDL,4EHJNEsubSI1INCAXJMPcomparesprint:LEADX,MESSAGEPUSHAXMOVAH,09HINT21HPOPAXcallshowNumberexit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:DAAMOVdx,axMOVcl,4Hshow:ROLdx,4HpushdxANDdx,0fHADDdx,30HMOVah,02Hint21HpopdxloopshowretshowNumberENDPENDstart5.11从键盘输入一系列以$为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。.modelsmall.386.codeMAINPROCFARstart:pushdsmovax,0pushaxmovcx,0input:movah,1Hint21Hcompare:cmpal,24Hjeprintcmpal,30HjladdCountcmpal,39HjgaddCountaddCount:addax,1Hjmpinputprint:callshowNumberexit:retMAINENDP;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;showNumberPROCNEARcovernum:DAAMOVdx,axMOVcl,2Hshow:ROLdl,4HpushdxANDdl,0fHADDdl,30HMOVah,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,0pushaxmovax,@datamovds,ax;----------------------movax,0Hmovbx,64Hmovcx,64Hmovsi,0FFFEHrepeat:ADDsi,2HcmpMEM[si],0HJEcallslooprepeatcalls:INCaxcallsortcmpax,1HJElastValueDECcxjmprepeatexit:retlastValue:movmem[bx],0HDECcxjmprepeatMAINENDPsortPROCNEARpushcxpushsisubsi,2Hs:addsi,2Hmovdx,mem[si]movmem[si+2],dxloopsreturn:popsipopcxretsortENDPENDstart--------------------------------第6章答案IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第六章答案NAME1NAMELIST<>MOVAX,DATA;假设结构变量NAME1定义在数据段DATA中MOVDS,AXMOVES,AX;MOVAH,10LEADX,NAME1INT21H;MOVCL,NAME1.ACTLENMOVCH,0LEASI,NAME1.NAMEINLEADI,DISPFILECLDREPMOVSB6、答:SKIPLINESPROCNEARPUSHCXPUSHDXMOVCX,AXNEXT:MOVAH,2MOVDL,0AHINT21HMOVAH,2MOVDL,0DHINT21HLOOPNEXTPOPDXPOPCXRETSKIPLINESENDP7、答:dsegsegmentnumdw76,69,84,90,73,88,99,63,100,80ndw10s6dw0s7dw0s8dw0s9dw0s10dw0dsegendscodesegmentmainprocfarassumecs:code,ds:dsegstart:pushdssubax,axpushaxmovax,dsegmovds,axcallsub1retmainendpsub1procnearpushaxpushbxpushcxpushsimovsi,0movcx,nnext:movax,num[si]movbx,10divblmovbl,alcbwsubbx,6salbx,1incs6[bx]addsi,2loopnextpopsipopcxpopbxpopaxretsub1endpcodeendsendstart8、答:datasegmentmaxlendb40ndb?tabledb40dup(?)chardb'a';查找字符’a’evenaddrdw3dup(?)dataendscodesegmentassumecs:code,ds:datamainprocfarstart:pushdsmovax,0pushaxmovax,datamovds,axleadx,maxlenmovah,0ahint21h;从键盘接收字符串movaddr,offsettablemovaddr+2,offsetnmovaddr+4,offsetcharmovbx,offsetaddr;通过地址表传送变量地址callcount;计算CHAR的出现次数calldisplay;显示retmainendpcountprocnear;count子程序pushsipushdipushaxpushcxmovdi,[bx]movsi,[bx+2]movcl,byteptr[si]movch,0movsi,[bx+4]moval,byteptr[si]movbx,0again:cmpal,byteptr[di]jnel1incbxl1:incdiloopagainpopcxpopaxpopdipopsiretcountendpdisplayprocnear;display子程序callcrlf;显示回车和换行movdl,charmovah,2int21hmovdl,20hmovah,2int21hmoval,blandal,0fhaddal,30hcmpal,3ahjlprintaddal,7print:movdl,alint21hcallcrlfretdisplayendpcrlfprocnear;crlf子程序movdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hretcrlfendpcodeendsendstart=============================第7章答案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宏展开:MOVAL,R1MOVBL,42MULBLADDAX,AXADDAX,AXMOVWAG,AXADDBL,BLADDBL,BLMOVAL,BLMOVAH,0MOVBL,10DIVBLMOVBL,3MULBLADDWAG,AX3、答:调用有效1PUSHAX2MOVAX,P12SUBAX,P21CMPAX,01JGE??00001NEGAX1??0000:MOVDISTANCE,AX1POPAX调用有效1PUSHAX2MOVAX,[BX]2SUBAX,[SI]1CMPAX,01JGE??00011NEGAX1??0001:MOVX[DI],AX1POPAX调用无效,有错误指令1??0002:MOV240H,AX调用有效,但无意义宏展开略。4、答:SENDMACROSCHARS,DCHARSLOCALNEXT,EXITPUSHAXPUSHSIMOVSI,0NEXT: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,0123456MOVTAB+&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类别:ibm-pc汇编语言程序--------------------------------第8章答案1、答:1)00048H(2)00020H2、答:movah,02movdl,‘T’movbx,0movds,bxmovbx,21h*4callfarptr[bx]3、答:
本文档为【汇编语言课后答案分析解析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_808969
暂无简介~
格式:doc
大小:196KB
软件:Word
页数:0
分类:
上传时间:2019-07-18
浏览量:24