IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第二章1.解答:有256个2.解答:如下图.第一个络子为000B0H字单元,注意,是字单元,第五个格子为000B3H字单元E51E3C2A3.解答:30022H字节单元内容:ABH30024H字节单元内容:EFH30021H字单元内容:AB34H30022H字单元内容:CDABH4.解答:这三个物理地址都是3017AH,说明了不同的段地址和偏移地址对应同一物理地址5.解答:CS+IP第一个字的物理地址为:0AAA40H6.解答:条件标志OF,SF,ZF,CF,的值依次为:0,0,0,07.下列操作可使用那些寄存器?(1)加法和减法AX,BX,CX,DX,当然,还有这几个通用寄存器的高低位了,如AH,AL等(2)循环计数CX(3)乘法和除法DX,AX,AH,AL(4)保存段地址CS,DS,ES,SS(5)表示运算结果为OFLAGS(6)将要执行的指令地址IP(7)将要从堆栈取出数据的地址BP,SP,SS8.可以用来指示存储器地址的寄存器有:BX,SP,BP,DI,CS,DS,SI,ES,SS,IP9.一一对应;5--A4--B2--C3--D12--E9--F11--G10--H13--I8--J7--K6---L1--M15--N14--O第三章1.(1)立即寻址没有(2)直接寻址7237H(3)使用BX的寄存器寻址没有(4)使用BX的间接寻址637DH(5)使用BX的寄存器相对寻址0D5B4H(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)0600H(3)098AH6.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--P5314.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,CL2341H100DECAX2340H100MOVCX,42340H100MULCX8918H000INT20H程序结束后,(AX)=8918H(DX)=0000H19.指令执行完后AX的内容执行完后CF,SF,ZF和OF的值MOVAX,000010DECAXFFFFH0100ADD7FFEH0000ADDAX,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裏(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,126.這段程序完成的功能是:把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中第一个字符