-1-汇编语言程序设计第四版【课后习题答案】--囮裑為檤第3章汇编语言程序格式〔习题3.1〕伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用?〔解答〕伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。〔习题3.2〕什么是标识符,汇编程序中标识符怎样组成?〔解答〕为了某种需要,每种程序语言都规定了在程序里如何描述名字,程序语言的名字通常被称为标识符;汇编语言中的标识符一般最多由31个字母、数字及规定的特殊符号(如-,$,?,@)组成,不能以数字开头。〔习题3.3〕什么是保留字,汇编语言的保留字有哪些类型,并举例说明。〔解答保留字是在每种语言中规定了有特殊意义和功能的不允许再做其它用处的字符串;汇编语言的保留字主要有硬指令助记、伪指令助记符、运算符、寄存器名以及预定义符号等。汇编语言对大小写不敏感。如定义字节数和字符串的DB就是伪指令助记符。〔习题3.4〕汇编语句有哪两种,每个语句由哪4个部分组成?〔解答〕汇编语句有执行性语句和说明性语句;执行性语句由标号、硬指令助记符、操作数和注释四部分组成;说明性语句由名字、伪指令助记符、参数和注释四部分组成〔习题3.5〕汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。〔解答〕⒈编辑文本编辑程序汇编语言源程序.asm⒉汇编汇编程序目标模块文件.obj⒊连接连接程序可执行文件.exe或.com-2-⒋调试调试程序应用程序〔习题3.6〕区分下列概念:(1)变量和标号(2)数值表达式和地址表达式(3)符号常量和字符串常量〔解答〕(1)变量是在程序运行过程中,其值可以被改变的量;标号是由用户自定义的标识符,指向存储单元,表示其存储内容的逻辑地址。(2)数值表达式一般是由运算符连接的各种常数所构成的表达式,地址表达式是由名字、标号以及利用各种的操作符形成的表达式。(3)在程序中,为了使常量更便于使用和阅读,经常将一些常量用常量定义语句定义为符号常量,被一对双引号括起来的若干个字符组成的字符序列被称为字符串常量。〔习题3.7〕假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的错误原因。(1)movbyteptr[bx],1000(2)movbx,offsetmyword[si](3)cmpmybyte1,mybyte2(4)moval,mybyte1+mybyte2(5)subal,myword(6)jnzmyword〔解答〕(1)1000超出了一个字节范围(2)寄存器的值只有程序执行时才能确定,而offset是汇编过程计算的偏移地址,故无法确定,改为leabx,myword[si](3)两个都是存储单元,指令不允许(4)变量值只有执行时才确定,汇编过程不能计算(5)字节量AL与字量myword,类型不匹配(6)Jcc指令只有相对寻址方式,不支持间接寻址方式〔习题3.8〕OPR1是一个常量,问下列语句中两个AND操作有什么区别?ANDAL,OPR1AND0feh〔解答〕-3-前者为“与”操作硬指令助记符,可汇编成机器代码。后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。〔习题3.9〕给出下列语句中,指令立即数(数值表达式)的值:(1)moval,23hAND45hOR67h(2)movax,1234h/16+10h(3)movax,NOT(65535XOR1234h)(4)moval,LOW1234hORHIGH5678h(5)movax,23hSHL4(6)movax,1234hSHR6(7)moval,’a’AND(NOT(’a’-’A’))(8)moval,’H’OR00100000b(9)movax,(76543LT32768)XOR7654h〔解答〕注:对于逻辑运算,有关操作数可化为二进制数。(1)67h(2)133h(3)1234h(4)76h(5)0234h(6)0048h(7)41h(8)68h(9)7654h〔习题3.10〕画图说明下列语句分配的存储空间及初始化的数据值:(1)byte_varDB’ABC’,10,10h,’EF’,3DUP(-1,?,3DUP(4))(2)word_varDW10h,-5,’EF’,3DUP(?)〔解答〕(1)从低地址开始,依次是(十六进制表达):4142430a104546ff-040404ff-040404ff-040404-4-(2)从低地址开始,依次是(十六进制表达):1000FBFF4645------〔习题3.11〕请设置一个数据段mydataseg,按照如下要求定义变量:(1)my1b为字符串变量:PersonalComputer(2)my2b为用十进制数表示的字节变量:20(3)my3b为用十六进制数表示的字节变量:20(4)my4b为用二进制数表示的字节变量:20(5)my5w为20个未赋值的字变量(6)my6c为100的常量(7)my7c表示字符串:PersonalComputer〔解答〕mydatasegsegmentmy1bdb‘PersonalComputer’my2bdb20my3bdb14h;20hmy4bdb00010100bmy5wdw20dup(?)my6cequ100;my6c=100my7cequPersonalComputermydatasegends〔习题3.12〕分析例题3.2的数据段,并上机观察数据的存储形式。〔解答〕以字节为单位从低地址向高地址依次是:160012FFHFFHFFHFFH00000000000000001234545H23H0000000000000000-5-‘a’‘b’‘c’‘H’‘e’‘l’‘l’‘o’1310‘$’12个字符串’month’,每个字符串从低地址到高地址依次是:’m’‘o’‘n’‘t’‘h’25×4个字节未定义初值的存储单元,操作系统设置为0〔习题3.13〕修改例题3.3,现在用字定义伪指令dw、字串传送指令movsw和字符串显示9号功能调用实现。〔解答〕.modelsmall.stack.datasourcedw3433h,3635htargetdw40dup(?),'$'.code.startupmovax,dsmoves,axcldmovsi,offsetsourcemovdi,offsettargetmovcx,40repmovswmovsi,0movdx,offsettargetmovah,9int21h.exit0end〔习题3.14〕变量和标号有什么属性?〔解答〕段地址:表示变量和标号所在代码段的段地址;-6-偏移地址:表示变量和标号所在代码段的段内偏移地址;类型:引用变量时,表示是字节、字、双字等数据量。引用该标号时,表示它所在同一个段――near类型,还是另外一个段――far类型。〔习题3.15〕设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:mydatasegmentORG100HVARWDW1234H,5678HVARBDB3,4ALIGN4VARDDD12345678HEVENBUFFDB10DUP(?)MESSDB’HELLO’BEGIN:MOVAX,OFFSETMESSMOVAX,TYPEBUFF+TYPEMESS+TYPEVARDMOVAX,SIZEOFVARW+SIZEOFBUFF+SIZEOFMESSMOVAX,LENGTHOFVARW+LENGTHOFVARDMOVAX,LENGTHOFBUFF+SIZEOFVARWMOVAX,TYPEBEGINMOVAX,OFFSETBEGIN〔解答〕MOVAX,OFFSETMESS;AX=116HMOVAX,TYPEBUFF+TYPEMESS+TYPEVARD;AX=1+1+4=06HMOVAX,SIZEOFVARW+SIZEOFBUFF+SIZEOFMESS;AX=4+10+5=19=13HMOVAX,LENGTHOFVARW+LENGTHOFVARD;AX=2+1=03HMOVAX,LENGTHOFBUFF+SIZEOFVARW;AX=10+4=14=0EHMOVAX,TYPEBIGIN;AX=FF02H(近)MOVAX,OFFSETBEGIN;AX=1BH〔习题3.16〕利用简化段定义格式,必须具有.MODEL语句。MASM定义了哪7种存储模式,TINY和SMALL模式创建什么类型(EXE或COM)程序?设计32位程序应该采用什么模式?-7-〔解答〕MASM定义的7种存储模式是TINY(微型模式、SMALL(小型模式)、COMPACT(紧凑模式)、MEDIUM(中型模式)、LARGE(大型模式)、HUGE(巨大模式)、FLAT(平展模式);TINY用于创建COM类型程序、一般程序都可以选用SMALL模式;设计32位的程序应该采用FLAT模式。〔习题3.17〕源程序中如何指明执行的起始点?源程序应该采用哪个DOS功能调用,实现程序返回DOS?〔解答〕源程序中运用STARTUP伪指令指明执行的起始点;源程序应该采用DOS功能调用的4CH子功能实现程序返回DOS的。〔习题3.18〕在SMALL存储模式下,简化段定义格式的代码段、数据段和堆栈段的缺省段名、定位、组合以及类别属性分别是什么?〔解答〕段定义伪指令段名定位组合类别组名.CODE_TEXTWORDPUBLIC'CODE'.DATA_DATAWORDPUBLIC'DATA'DGROUP.DATA?_BSSWORDPUBLIC'BSS'DGROUP.STACKSTACKPARASTACK'STACK'DGROUP〔习题3.19〕如何用指令代码代替.startup和.exit指令,使得例题3.1a能够在MASM5.x下汇编通过?〔解答〕;lt301a.asm(文件名).modelsmall.stack.datastringdb‘Hello,Everybody!’,0dh,0ah.’$’.codestart:movax,@datamovds,axmovdx,offsetstringmovah,9int21hmovax,4c00h-8-int21hendstart〔习题3.20〕创建一个COM程序完成例题3.1的功能。〔解答〕;lt301a,asm.modeltiny.code.startupmovdx,offsetstringmovah,9int21h.exit0stringdb'Hello,Everybody!'0dh,0ah,'$';end〔习题3.21〕按下面要求写一个简化段定义格式的源程序(1)定义常量num,其值为5;数据段中定义字数组变量datalist,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;(2)代码段中的程序将datalist中头num个数的累加和存入datalist的最后1个字单元中。〔解答〕.modelsmall.stack.datanumequ5datalistdw-1,0,2,5,4,?.code.startupmovbx,offsetdatalistmovcx,numxorax,ax-9-again:addax,[bx]incbxincbxloopagainmov[bx],ax.exit0end〔习题3.22〕按下面要求写一个完整段定义格式的源程序(1)数据段从双字边界开始,其中定义一个100字节的数组,同时该段还作为附加段;(2)堆栈段从节边界开始,组合类型为stack;(3)代码段的类别是’code’,指定段寄存器对应的逻辑段;主程序指定从100h开始,给有关段寄存器赋初值;将数组元素全部设置为64h。〔解答〕stacksegmentpara‘stack’dw512dup(?)stackendsdatasegmentarraydb100dup(?)dataendscodesegment‘code’assumecs:code,ds:d