所有十二种寻址方式必须必须必须牢牢记住,按照以往的经验是百分百会考,20分;指出程序的错误,百分百会考,16或者20分;说明程序的功能,课后习题就三四道,一定会考至少一到两道题,5-10分;应该会有补充程序题,也是课后题,所以就自己多注意。选择题和最后的编程就看自己的本事了。红色黄底的必须全部记住,死死地,百分百保证记住,标红的也要全部记住,必须全部记住。后边没标红的程序,一般会考两道程序题,但是不敢确定是哪几道,所以程序题属于看自己的水平,能记住的就多记几道,否则自求多福。学霸自重!我这只是当时的复习内容,现在一定要对一下有没有漏掉的,自行补充。或者找一个比较认真的同学整理一份大家共享。2.3在IBMPC机的存储器中存放信息如右下图所示。试读出30022H和30024H字节单元的内容,以及30021H和30022H字单元的内容。答:30022H字节单元的内容为ABH;30024H字节单元的内容为EFH。30021H字单元的内容为AB34H;30022H字单元的内容为CDABH。2.4在实模式下,段地址和偏移地址为3017:000A的存储单元的物理地址是什么?如果段地址和偏移地址是3015:002A和3010:007A呢?答:3017:000A、3015:002A和3010:007A的存储单元的物理地址都是3017AH。2.6在实模式下,存储器中每一段最多可有10000H个字节。如果用调试程序DEBUG的r命令在终端上显示出当前各寄存器的内容如下,请画出此时存储器分段的示意图,以及条件标志OF、SF、ZF、CF的值。Cdebug-rAX=0000BX=0000CX=0079DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=10E4ES=10F4SS=21F0CS=31FFIP=0100NVUPDIPLNZNAPONC答:此时存储器分段的示意图如右图所示。OF、SF、ZF、CF的值都为0。3.2试根据以下要求写出相应的汇编语言指令(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器中。(2)用寄存器BX和SI的基址变址寻址方式把存储器中的一个字节与AL寄存器的内容相加,并把结果送到AL寄存器中。(3)用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和(CX)相加,并把结果送回存储器中。(4)用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回存储单元中。(5)把数0B5H与(AL)相加,并把结果送回AL中。答:(1)ADDDX,BX(2)ADDAL,[BX][SI](3)ADD[BX+0B2H],CX(4)ADDWORDPTR[0524H],2A59H(5)ADDAL,0B5H34H30021HABH30022HCDH30023HEFH30024H存储器2.3题的信息存放情况12H30020H10F4010E4020F4020E4021F0031F0031FF041FF0附加段数据段堆栈段代码段2.6题的存储器分段示意图3.3写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。要求使用以下几种寻址方式:(1)寄存器间接寻址(2)寄存器相对寻址(3)基址变址寻址答:(1)MOVBX,OFFSETBLOCKADDBX,(6–1)*2MOVDX,[BX](2)MOVBX,OFFSETBLOCK改为:MOVBX,(6-1)*2MOVDX,[BX+(6–1)*2]也可MOVDX,BLOCK[BX](3)MOVBX,OFFSETBLOCKMOVSI,(6–1)*2MOVDX,[BX][SI]3.4现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,试说明下列各条指令执行完后AX寄存器的内容。(1)MOVAX,1200H(AX)=1200H(2)MOVAX,BX(AX)=0100H(3)MOVAX,[1200H](AX)=4C2AH(4)MOVAX,[BX](AX)=3412H(5)MOVAX,1100[BX](AX)=4C2AH(6)MOVAX,[BX][SI](AX)=7856H(7)MOVAX,1100[BX][SI](AX)=65B7H3.8假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,数据段中变量名VAL的偏移地址为0050H,试指出下列源操作数字段的寻址方式是什么?其物理地址值是多少?(1)MOVAX,0ABH(2)MOVAX,BX(3)MOVAX,[100H](4)MOVAX,VAL(5)MOVAX,[BX](6)MOVAX,ES:[BX](7)MOVAX,[BP](8)MOVAX,[SI](9)MOVAX,[BX+10](10)MOVAX,VAL[BX](11)MOVAX,[BX][SI](12)MOVAX,VAL[BX][SI]答:(1)立即方式;操作数在本条指令中(2)寄存器寻址方式;操作数为(BX)=0100H(3)直接寻址方式;PA=20100H(4)直接寻址方式;PA=20050H(5)BX寄存器间接寻址方式;PA=20100H(6)附加段BX寄存器间接寻址方式;PA=21100H(7)BP寄存器间接寻址方式;PA=15010H(8)SI寄存器间接寻址方式;PA=200A0H(9)BX寄存器相对寻址方式;PA=20110H(10)BX寄存器相对寻址方式;PA=20150H(11)BX和SI寄存器基址变址寻址方式;PA=201A0H(12)BX和SI寄存器相对基址变址寻址方式;PA=201F0H3.10在ABLE为数据段中0032单元的符号名,其中存放的内容为1234H,试问以下两条指令有什么区别?指令执行完后AX寄存器的内容是什么?MOVAX,TABLELEAAX,TABLE答:MOVAX,TABLE是将TABLE单元的内容送到AX,(AX)=1234HLEAAX,TABLE是将TABLE单元的有效地址送到AX,(AX)=0032H3.11执行下列指令后AX寄存器中的内容是什么?TABLEDW10,20,30,40,50;000AH,0014H,001EH,0028H,0032HENTRYDW3┇MOVBX,OFFSETTABLEADDBX,ENTRYMOVAX,[BX]答:(AX)=1E00H(TABLE的存储方式如右图所示)3.12下列ASCII码串(包括空格符)依次存储在起始地址为CSTRING的字节单元中:CSTRINGDB‘BASEDADDRESSING’请编写指令将字符串中的第1个和第7个字符传送给DX寄存器。答:MOVDH,CSTRINGMOVDL,CSTRING+7-13.25试用移位指令把十进制数+53和-49分别乘以2。它们应该用什么指令?得到的结果是什么?如果要除以2呢?答:MOVAL,53SALAL,1;(AL)=(+53*2)=6AHMOVAL,-49SALAL,1;(AL)=(-49*2)=9EHMOVAL,53SARAL,1;(AL)=(53/2)=1AHMOVAL,-49SARAL,1;(AL)=(-49/2)=0E7H3.26试分析下面的程序段完成什么功能?MOVCL,04SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BL答:本程序段将((DX),(AX))的双字同时左移4位,即将此双字乘以10H(16)。3.30编写程序段,把字符串STRING中的‘&’字符用空格符代替。STRINGDB‘ThedateisFEB&03’答:程序段如下:MOVCX,180AH00H14H00H1EH00H28H00H32H00HTABLETABLE+33.11题的TABLE存储方式MOVAL,‘&’CLDMOVDI,SEGSTRINGMOVES,DILEADI,STRINGREPNESCASBJNENEXTDECDIMOVES:BYTEPTR[DI],‘’;送空格符NEXT:┇3.32编写一程序段:比较两个5字节的字符串OLDS和NEWS,如果OLDS字符串不同于NEWS字符串则执行NEW_LESS;否则顺序执行程序。答:程序段如下:MOVCX,5CLDMOVDI,SEGOLDSMOVDS,DIMOVES,DILEASI,OLDSLEADI,NEWSREPECMPSBJNENEW_LESS┇NEW_LESS:┇3.36假设X和X+2单元的内容为双精度数p,Y和Y+2单元的内容为双精度数q,(X和Y为低位字)试说明下列程序段做什么工作?MOVDX,X+2MOVAX,XADDAX,XADCDX,X+2CMPDX,Y+2JLL2JGL1CMPAX,YJBEL2L1:MOVAX,1JMPSHORTEXITL2:MOVAX,2EXIT:INT20H答:此程序段判断p*2>q,则使(AX)=1后退出;p*2≤q,则使(AX)=2后退出。4.1指出下列指令的错误:(1)MOVAH,BX;寄存器类型不匹配(2)MOV[BX],[SI];不能都是存储器操作数(3)MOVAX,[SI][DI];[SI]和[DI]不能一起使用(4)MOVMYDAT[BX][SI],ES:AX;AX寄存器不能使用段超越(5)MOVBYTEPTR[BX],1000;1000超过了一个字节的范围(6)MOVBX,OFFSETMYDAT[SI];MYDAT[SI]已经是偏移地址,不能再使用OFFSET(7)MOVCS,AX;CS不能用作目的寄存器(8)MOVECX,AX;两个操作数的数据类型不同答:见注释。4.7请设置一个数据段DATASG,其中定义以下字符变量或数据变量。(1)FLD1B为字符串变量:‘personalcomputer’;(2)FLD2B为十进制数字节变量:32;(3)FLD3B为十六进制数字节变量:20;(4)FLD4B为二进制数字节变量:01011001;(5)FLD5B为数字的ASCII字符字节变量:32654;(6)FLD6B为10个零的字节变量;(7)FLD7B为零件名(ASCII码)及其数量(十进制数)的表格:PART120PART250PART314(8)FLD1W为十六进制数字变量:FFF0;(9)FLD2W为二进制数的字变量:01011001;(10)FLD3W为(7)零件表的地址变量;(11)FLD4W为包括5个十进制数的字变量:5,6,7,8,9;(12)FLD5W为5个零的字变量;(13)FLD6W为本段中字数据变量和字节数据变量之间的地址差。答:DATASGSEGMENTFLD1BDB‘personalcomputer’FLD2BDB32FLD3BDB20HFLD4BDB01011001BFLD5BDB‘32654’FLD6BDB10DUP(0)FLD7BDB‘PART1’,20DB‘PART2’,50DB‘PART3’,14FLD1WDW0FFF0HFLD2WDW01011001BFLD3WDWFLD7BFLD4WDW5,6,7,8,9FLD5WDW5DUP(0)FLD6WDWFLD1W-FLD1BDATASGENDS4.9有符号定义语句如下:BUFFDB1,2,3,‘123’EBUFFDB0LEQUEBUFF-BUFF问L的值是多少?答:L=6。4.10假设程序中的数据定义如下:LNAMEDB30DUP(?)ADDRESSDB30DUP(?)CITYDB15DUP(?)CODE_LISTDB1,7,8,3,2(1)用一条MOV指令将LNAME的偏移地址放入AX。(2)用一条指令将CODE_LIST的头两个字节的内容放入SI。(3)用一条伪操作使CODE_LENGTH的值等于CODE_LIST域的实际长度。答:(1)MOVAX,OFFSETLNAM