汇编语言程序设计(第二版)课后习题答案第二章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)表示运算结果为O FLAGS(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)ADD DX,BX(2)ADD AL,[BX][SI](3)ADD[BX][0B2H],CX(4)MOV AX,2A59H ADD[0524H],AX(5)ADD AL,0B5H3.(1)寄存器间接寻址MOV BX,OFFSET[BLOCK][0AH]MOV DX,[BX](2)寄存器相对寻址MOV SI,OAHMOV DX,[BLOCK][SI](3)基址变址寻址MOV BX,BLOCKMOV SI,OAHMOV DX,[BX][SI]4.现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(2 1200)=2AH,(20201)=4CH,(21202)=B7H,(21203)=65H,试说明下列各条指令执行完后,AX寄存器的内容。
(1)MOV AX,1200H1200H(2)MOV AX,BX0100H(3)MOV AX,[1200]4C2AH注意,是字单元!!(4)MOV AX,[BX]3412H同上(5)MOV1100[BX]4C2AH(6)MOV AX,[BX][SI]7856H(7)MOV AX,1100[BX][SI]65B7H5.(1)7CD9H(2)0600H(3)098AH6.MOV BX,2000HLES DI,[BX]MOV AX,ES:DI7.转向地址OBJ的值分别为:(1)064DH(2)0691H(3)05E0H注意有符号数的符号位8.(1)MOV AX,0ABH立即数寻址无物理地址(2)MOV AX,BX寄存器寻址同上(3)MOV AX,[100]直接寻址20100H(4)MOV AX,VAL直接寻址20050H(5)MOV AX,[BX]寄存器间接寻址20100H(6)MOV AX,ES:[BX]直接寻址21100H(7)MOV AX,[BP]寄存器间接寻址20010H(8)MOV AX,[SI]同上200A0H(9)MOV AX,[BX+10]寄存器相对寻址20110H(10)MOV AX,VAL[BX]同上20150H(11)MOV AX,[BX][SI]基址变址寻址201A0H(12)MOV AX,VAL[BX][SI]相对基相变址寻址201F0H9.(1)的指令:MOV AX,[BX][0CH]MOV ZREO,AX(2)的指令:MOV AX,ARRAY[BX]MOV ZREO,AX10.MOV AX,TABLE是把符号地址TABLE里的内容送到AX里,指令执行完后,(AX)=1234HLEA AX,TABLE是把符号地址TABLE的有效地址(这里是偏移量)送到指定寄存器AX里,指令执行完后,(AX)=0032H11.执行完指令后,(AX)=1E00H12.LEA AX,CSTRINGMOV DL,AXMOV DH,[AX+6]13.课本上P51--P5314.LES BX,[2000]MOV AX,ES:[BX]一条指令的话为MOV AX,ES:[8000H]15.运算结果SF,ZF,CF,OF各位的值(从左至右依次往下)(1)74D4H0000(2)A5C1H1001(3)4240H0010(4)0000H011016.接上表(1)5D140000(2)A8701001(3)D8701000(4)34E4001017.(1)MOV AX,Z;把Z送到AXSUB AX,X;Z-XADD AX,W;W+(Z-X)MOV Z,AX;结果保存在Z中(2)MOV AX,R;R送到AX中ADD AX,9;R+9MOV BX,X;X送到BX中ADD BX,6;X+6ADD AX,BX;(R+9)+(X+6),结果保存在AX中MOV BX,W;W送到BX中SUB BX,AX;W-(R+9)-(X+6),连续减去两个数,相当于减去这两个数的和MOV Z,BX;最终结果送到Z中(3)MOV AX,W;把W送到AXIMUL X;W*X注意:低十六位保存在AX里,高十六位保存在DX里MOV BX,Y;把Y送到BX里ADD BX,6;Y+6IDIV BX;(W*X)/(Y+6)注意:商保存在AX里,余数保存在DX里MOV Z,AX;把商送到Z中,MOV R,DX;把余数送到R中(4)MOV AX,W;把W送到AX中SUB AX,X;W-XCWD;把AX中的十六位带符号数扩展成为32位,低十六位保存在AX中,高十六位保存在DX中MOV BX,5;把5送到BX中IDIV BX;(W-X)/5被除数为32位,除数为16位商为16位IMUL Y;上一步结果再乖以Y,积为32位MOV BX,2;把2送到BX中IMUL BX;上一步乘法所得的积再乘以2,各为64位MOV Z,EAX;把结果中低32位放入Z双字单元中MOV[Z+4],EDX;把结果中高32位放入Z+4双字单元中18.指令本条指令执行完后AX的内容执行完后CF,SF,ZF的值MOVAX,1234H1234H0 00MOVCL,41234H0 00ROLAX,CL2341H1 00DECAX2340H1 00MOVCX,42340H100MULCX8918H0 00INT20H程序结束后,(AX)=8918H(DX)=0000H19.指令执行完后AX的内容执行完后CF,SF,ZF和OF的值MOVAX,000010DECAX FFFFH0 100ADD7FFEH0000ADDAX,28000H0101 NOTAX7FFFH01 01SUB AX,0FFFFH8000H1101 ADD AX,8000H0000H1011 SUB AX,1FFFFH1 101AND AX,58D1H58D1H0000 SAL AX,1B1A2H0101 SAR AX,1D8D1H0100 NEG AX272FH1000 ROR AX,19397H1001 20.(1)MOV AX,DATAXADD DATAY,AX(2)MOV AX,DATAXADD DATAY,AXMOV AX,[DATAX+2]ADD[DATAY+2],AX(3)本組指令的作用是:BX<------[DATAX]+[DATAY]+[1](CF的值)帶進位加法~(4)MOV AX,DATAXMUL DATAY;結果的高十六位保存在DX裏,低十六位保存在AX 裏(5)MOV AX,DATAXMOV DX,[DATAX+2]MUL DWORD DATAY;結果的高三十二位保存在EDX裏,低三十二位保存在EAX裏(6)MOV AX,DATAXDIV17H;結果商保存在AL中,余數在AH中(7)MOV AX,DATAXCDWDIV DATAY21.NEG DXNEG AXSBB DX,022.MOV AX,A;把雙字長數的低字放到AX中MOV DX,[A+2];把雙字長數的高字放到DX中TEST DX,8000H;測試雙字長數的符號JZ RIGHT;如果是非負數,則直接保存NEG DX;如果是負數,則求補NEG AXSBB DX,0RIGHT:MOV B,AXMOV[B+2],DX23.每條指令單獨執行完後的結果依次為:(1)9AH(2)61H(3)0FBH(4)1CH(5)0(6)0E3H24.執行指令序列後,BX的內容為:0DAH25.(1)把53D乘以2的程序:MOV AX,35H;53D=35HSHL AX,1(2)把53除以2的程序:MOV AX,35HSHR AX,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的程序实现:LEA SI,CONAME;把CONAME中第一个字节的偏移地址送到SI中LEA DI,PRLINE;把PRLINE中第一个字节的偏移地址送到DI中MOV CX,20;把重复次数放到CX里CLD;让SI DI从低地址指向高地址(即从左到右传送)REP MOVSB;传送(2)从右到左把CONMAE中的字符串传送到PRLINE中的程序实现:LEA SI,CONAMELEA DI,PRLINEMOV CX,20STD;和上面唯一不同的就是这次是从右到左,所以要从高地址批向低地址REP MOVSB(3)把CONAME中的第三和第四個字節裝入AX的程序實現:LEA SI,[CONAME+3]LODSW(4)把AX寄存器的內容存入從PRLINE+5開始的字節中的程序實現:LEA DI,[PRLINE+5]STOSW(5)檢查CONAME字符串中有無空格字符,如有把它偉送給BH寄存器的程序實現:LEA DI,CONAME;把CONAME中第一個字符偏移地址放入DI中MOV CX,20;把重複次數放到CX中MOV AL,20H;把空格符的ASCII值放入AL中CLD;從低到高REPNE SCASB;比較MOV BH,[DI-1]R;把檢查到的空格符送到BH中30.MOV CX,12H;把重複次數放到CX中。