您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > CH4-汇编语言程序格式-习题
第四章习题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.2下面哪些指令是非法的?(假设OP1,OP2是已经用DB定义的变量)(1)CMP15,BX;错,立即数不能作为目的操作数(2)CMPOP1,25(3)CMPOP1,OP2;错,不能都是存储器操作数(4)CMPAX,OP1;错,类型不匹配,应为CMPax,wordptrop1答:见注释。4.3假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列哪些指令是非法的?它们的错误是什么?(1)MOVBP,AL;错,寄存器类型不匹配(2)MOVWORD_OP[BX+4*3][DI],SP(3)MOVWORD_OP1,WORD_OP2;错,不能都是存储器操作数(4)MOVAX,WORD_OP1[DX];错,DX不能用于存储器寻址(5)MOVSAVE_WORD,DS(6)MOVSP,SS:DATA_WORD[BX][SI](7)MOV[BX][SI],2;错,[BX][SI]未指出数据类型(8)MOVAX,WORD_OP1+WORD_OP2(9)MOVAX,WORD_OP1-WORD_OP2+100(10)MOVWORD_OP1,WORD_OP1-WORD_OP2答:见注释。4.4假设VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处:(1)ADDVAR1,VAR2;不能都是存储器操作数(2)SUBAL,VAR1;数据类型不匹配(3)JMPLAB[SI];LAB是标号而不是变量名,后面不能加[SI](4)JNZVAR1;VAR1是变量而不是标号(5)JMPNEARLAB;应使用NEARPTR答:见注释。4.5画图说明下列语句所分配的存储空间及初始化的数据值。(1)BYTE_VARDB‘BYTE’,12,-12H,3DUP(0,?,2DUP(1,2),?)(2)WORD_VARDW5DUP(0,1,2),?,-5,‘BY’,‘TE’,256H答:答案如下图所示。4.6试列出各种方法,使汇编程序把5150H存入一个存储器字中(如:DW5150H)。答:DW5150HDB50H,51HDB‘PQ’DW‘QP’ORG5150HDW$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’,14FLD1WDW0FFF0HFLD2WDW01011001B4.5题答案42H59H54H45H0DHEEH00H-01H02H01H02H-00H-01H02H01H02H-BYTE_VAR00H00H01H00H02H00H┇┇┇--FBHFFH00H59H42H45H54H56H02HWORD_VAR将上面内容再重复4次FLD3WDWFLD7BFLD4WDW5,6,7,8,9FLD5WDW5DUP(0)FLD6WDWFLD1W-FLD1BDATASGENDS4.8假设程序中的数据定义如下:PARTNODW?PNAMEDB16DUP(?)COUNTDD?PLENTHEQU$-PARTNO问PLENTH的值为多少?它表示什么意义?答:PLENTH=22=16H,它表示变量PARTNO、PNAME、COUNT总共占用的存储单元数(字节数)。4.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,OFFSETLNAME(2)MOVSI,WORDPTRCODE_LIST(3)CODE_LENGTHEQU$-CODE_LIST;此语句必须放在CODE_LIST语句之后4.11试写出一个完整的数据段DATA_SEG,它把整数5赋予一个字节,并把整数-1,0,2,5和4放在10字数组DATA_LIST的头5个单元中。然后,写出完整的代码段,其功能为:把DATA_LIST中头5个数中的最大值和最小值分别存入MAX和MIN单元中。答:DATA_SEGSEGMENTNUMDB5DATA_LISTDW-1,0,2,5,4,5DUP(?)MAXDW?MINDW?DATA_SEGENDS;----------------------------------------------------------------CODE_SEGSEGMENTMAINPROCFARASSUMECS:CODE_SEG,DS:DATA_SEGSTART:PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DATA_SEG;给DS赋值MOVDS,AX;MOVCX,4;程序段开始LEABX,DATA_LISTMOVAX,[BX]MOVMAX,AXMOVMIN,AXROUT1:ADDBX,2MOVAX,[BX]CMPAX,MAXJNGEROUT2MOVMAX,AXROUT2:CMPAX,MINJNLEROUT3MOVMIN,AXROUT3:LOOPROUT1;程序段结束RETMAINENDPCODE_SEGENDS;----------------------------------------------------------------ENDSTART4.12给出等值语句如下:ALPHAEQU100BETAEQU25GAMMAEQU2下列表达式的值是多少?(1)ALPHA*100+BETA;=2729H(2)ALPHAMODGAMMA+BETA;=19H(3)(ALPHA+2)*BETA–2;=9F4H(4)(BETA/3)MOD5;=3H(5)(ALPHA+3)*(BETAMODGAMMA);=67H(6)ALPHAGEGAMMA;=0FFFFH(7)BETAAND7;=01H(8)GAMMAOR3;=03H答:见注释。4.13对于下面的数据定义,三条MOV指令分别汇编成什么?(可用立即数方式表示)TABLEADW10DUP(?)TABLEBDB10DUP(?)TABLECDB‘1234’┇MOVAX,LENGTHTABLEA;汇编成MOVAX,000AHMOVBL,LENGTHTABLEB;汇编成MOVBL,000AHMOVCL,LENGTHTABLEC;汇编成MOVCL,0001H答:见注释。4.14对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?FLDBDB?TABLEADW20DUP(?)TABLEBDB‘ABCD’(1)MOVAX,TYPEFLDB;(AX)=0001H(2)MOVAX,TYPETABLEA;(AX)=0002H(3)MOVCX,LENGTHTABLEA;(CX)=0014H(4)MOVDX,SIZETABLEA;(DX)=0028H(5)MOVCX,LENGTHTABLEB;(CX)=0001H答:见注释。4.15指出下列伪操作表达方式的错误,并改正之。(1)DATA_SEGSEG;DATA_SEGSEGMENT(伪操作错)(2)SEGMENT‘CODE’;SEGNAMESEGMENT‘CODE’(缺少段名字)(3)MYDATASEGMENT/DATA;MYDATASEGMENT┇ENDS;MYDATAENDS(缺少段名字)(4)MAIN_PROCPROCFAR;删除ENDMAIN_PROC也可以┇ENDMAIN_PROC;MAIN_PROCENDP;上下两句交换位置MAIN_PROCENDP;ENDMAIN_PROC答:见注释。4.16按下面的要求写出程序的框架(1)数据段的位置从0E000H开始,数据段中定义一个100字节的数组,其类型属性既是字又是字节;(2)堆栈段从小段开始,段组名为STACK;(3)代码段中指定段寄存器,指定主程序从1000H开始,给有关段寄存器赋值;(4)程序结束。答:程序的框架如下:DATA_SEGSEGMENTAT0E000HARRAY_BLABELBYTEARRAY_WDW50DUP(?)DATA_SEGENDS;以上定义数据段;----------------------------------------------------------------STACK_SEGSEGMENTPARASTACK‘STACK’DW100HDUP(?)TOSLABELWORDSTACK_SEGENDS;以上定义堆栈段;----------------------------------------------------------------CODE_SEGSEGMENTMAINPROCFARASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGORG1000HSTART:MOVAX,STACK_SEGMOVSS,AX;给SS赋值MOVSP,OFFSETTOS;给SP赋值PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DATA_SEGMOVDS,AX;给DS赋值┇;程序段部分RETMAINENDPCODE_SEGENDS;以上定义代码段;----------------------------------------------------------------ENDSTART4.17写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AUGEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG段中的SUM中。其中AUGEND、ADDEND和SUM均为双精度数,AUGEND赋值为99251,ADDEND赋值为-15962。答:程序如下:D_SEGSEGMENTAUGWLABELWORDAUGENDDD99251SUMDD?D_SEGENDS;以上定义数据段;----------------------------------------------------------------
本文标题:CH4-汇编语言程序格式-习题
链接地址:https://www.777doc.com/doc-4633032 .html