新版汇编语言程序设计钱晓捷第3章习题答.docx

上传人:b****6 文档编号:8123850 上传时间:2023-01-28 格式:DOCX 页数:16 大小:22.49KB
下载 相关 举报
新版汇编语言程序设计钱晓捷第3章习题答.docx_第1页
第1页 / 共16页
新版汇编语言程序设计钱晓捷第3章习题答.docx_第2页
第2页 / 共16页
新版汇编语言程序设计钱晓捷第3章习题答.docx_第3页
第3页 / 共16页
新版汇编语言程序设计钱晓捷第3章习题答.docx_第4页
第4页 / 共16页
新版汇编语言程序设计钱晓捷第3章习题答.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

新版汇编语言程序设计钱晓捷第3章习题答.docx

《新版汇编语言程序设计钱晓捷第3章习题答.docx》由会员分享,可在线阅读,更多相关《新版汇编语言程序设计钱晓捷第3章习题答.docx(16页珍藏版)》请在冰豆网上搜索。

新版汇编语言程序设计钱晓捷第3章习题答.docx

新版汇编语言程序设计钱晓捷第3章习题答

第3章汇编语言程序格式

〔习题3.1〕伪指令语句与硬指令语句的本质区别是什么?

伪指令有什么主要作用?

〔解答〕

伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;

伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。

〔习题3.2〕什么是标识符,汇编程序中标识符怎样组成?

〔解答〕

为了某种需要,每种程序语言都规定了在程序里如何描述名字,程序语言的名字通常被称为标识符;

汇编语言中的标识符一般最多由31个字母、数字及规定的特殊符号(如-,$,?

,@)组成,不能以数字开头。

〔习题3.3〕 什么是保留字,汇编语言的保留字有哪些类型,并举例说明。

〔解答

保留字是在每种语言中规定了有特殊意义和功能的不允许再做其它用处的字符串;汇编语言的保留字主要有硬指令助记、伪指令助记符、运算符、寄存器名以及预定义符号等。

汇编语言对大小写不敏感。

如定义字节数和字符串的DB就是伪指令助记符。

〔习题3.4〕汇编语句有哪两种,每个语句由哪4个部分组成?

〔解答〕

汇编语句有执行性语句和说明性语句;

执行性语句由标号、硬指令助记符、操作数和注释四部分组成;

说明性语句由名字、伪指令助记符、参数和注释四部分组成

〔习题3.5〕汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。

〔解答〕

⒈ 编辑        文本编辑程序    汇编语言源程序.asm

⒉ 汇编        汇编程序           目标模块文件.obj

⒊ 连接        连接程序            可执行文件.exe或.com

⒋ 调试        调试程序           应用程序

〔习题3.6〕将第2章习题2.36采用简化段定义格式编写成一个完整的源程序。

〔解答〕

          ;简化段定义格式

          .modelsmall         ;定义程序的存储模式(小模式)

          .stack               ;定义堆栈段(默认1024个字节)

          .data                ;定义数据段

str1      db'InputNumber:

0~9:

',0dh,0ah,'$' 

str2      db'Error!

',0dh,0ah,'$'

          .cade                ;定义代码段

          .startup             ;说明程序的起始点,建立ds,ss的内容。

          movah,09h           ;显示str1字符串

          movdx,offsetstr1

          int21h

getkey:

   movah,1             ;调用DOS功能

            int21h

          cmp al,'0'

          jberror             ;小于0,出错处理

          cmpal,'9'

          jaerror             ;大于9,出错处理

          movah,02h           ;调用DOS显示字符功能,显示该数字

          movdl,al

          int21h

          .exit0              ;终止程序执行,返回DOS

error:

    movah,09h           ;出错,调用DOS功能显示str2字符串

          movdx,offsetstr2

          int21h

          jmpgetkey           ;返回按键

          end                  ;汇编结束

〔习题3.7〕将第2章习题2.37采用完整段定义格式编写成一个完整的源程序。

〔解答〕

 ;xt307.asm

stack     segment

          dw512dup(?

stack     ends

data      segment

array     db255

          db0

array1    db255dup('$')

array2    db0dh,0ah,'$'

data      ends

code      segment'code'

assumecs:

code,ds:

data,ss:

stack

start:

    movax,data

          movds,ax

          movah,0ah              ;键盘输入字符串

          movdx,offsetarray

          int21h

          movdx,offsetarray2     ;回车换行

          movah,09h

          int21h

          movbx,offsetarray1

again:

    moval,[bx]

          cmpal,'$'

          jzdone

          cmpal,'a'               ;小于a和大于z的字符不是小写字母

          jbnext

          cmpal,'z'

          janext

          subal,20h               ;在a和z之间的字符才是小写字母,转换为大写

          mov[bx],al               ;保存到原位置

next:

     incbx

          jmpagain

done:

     movdx,offsetarray1

          movah,09h

          int21h

          movax,4c00h

          int21h

code      ends

          endstart

〔习题3.8〕区分下列概念:

(1)变量和标号

(2)数值表达式和地址表达式

(3)符号常量和字符串常量

〔解答〕

(1)变量是在程序运行过程中,其值可以被改变的量;标号是由用户自定义的标识符,指向存储单元,表示其存储内容的逻辑地址。

(2)数值表达式一般是由运算符连接的各种常数所构成的表达式,地址表达式是由名字、标号以及利用各种的操作符形成的表达式。

(3)在程序中,为了使常量更便于使用和阅读,经常将一些常量用常量定义语句定义为符号常量,被一对双引号括起来的若干个字符组成的字符序列被称为字符串常量。

〔习题3.9〕假设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.10〕OPR1是一个常量,问下列语句中两个AND操作有什么区别?

      ANDAL,OPR1AND0feh

〔解答〕

前者为“与”操作硬指令助记符,可汇编成机器代码。

后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。

〔习题3.11〕给出下列语句中,指令立即数(数值表达式)的值:

(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.12〕为第2章例题2.54定义变量count、block、dplus和dminus。

〔解答〕

假设block开始的数据块有32个字节数据:

16个正数+100(64h)、16个负数-48(0d0h)

分别连续分布:

block   db16dup(100),16dup(-48);也可以是任意字节数据,随意分布。

dplus   db32dup(?

)                   ;为正数预留存储空间

dminus  db32dup(?

)                  ;为负数预留存储空间

count  equ32                         ;字节数

〔习题3.13〕为第2章例题2.55定义相应变量,并形成一个完整的汇编语言程序。

〔解答〕

  ;lt239b.asm

           .model small

           .stack

           .data

string1   db'goodmorning!

';两字符串可相同或不同,但字符数要求相同。

string2   db'Goodmorning!

'

result    db?

                  ;预留结果字节

    count=14                  ;字符数

         .code

         .startup

         movax,ds              ;所有数据在同一个段,所以使es=ds

         moves,ax

         movsi,offsetstring1

         movdi,offsetstring2

         movcx,count

 again:

  cmpsb

         jnzunmat

         deccx

         jnzagain

         moval,0

         jmpoutput

unmat:

   moval,0ffh

output:

 movresult,al

         .exit0

         end

〔习题3.14〕画图说明下列语句分配的存储空间及初始化的数据值:

(1)byte_varDB’ABC’,10,10h,’EF’,3DUP(-1,?

3DUP(4))

(2)word_varDW10h,-5,’EF’,3DUP(?

〔解答〕

(1)从低地址开始,依次是(十六进制表达):

41 42 43 0a 10 45 46 ff - 04 04 04 ff -04 04 04 ff -04 04 04

(2)从低地址开始,依次是(十六进制表达):

10 00 FB FF 46 45 - - - - - -

〔习题3.15〕请设置一个数据段mydataseg,按照如下要求定义变量:

(1)my1b为字符串变量:

PersonalComputer

(2)my2b为用十进制数表示的字节变量:

20

(3)my3b为用十六进制数表示的字节变量:

20

(4)my4b为用二进制数表示的字节变量:

20

(5)my5w为20个未赋值的字变量

(6)my6c为100的常量

(7)my7c表示字符串:

PersonalComputer

〔解答〕

mydatasegsegment

my1b     db‘PersonalComputer’

my2b     db20

my3b     db14h          ;20h

my4b     db00010100b

my5w     dw20dup(?

my6c     equ100         ;my6c=100

my7c     equ

mydatasegends

〔习题3.16〕分析例题3.2的数据段,并上机观察数据的存储形式。

〔解答〕

以字节为单位从低地址向高地址依次是:

16

00 12

FFH FFH FFH FFH

00 00 00 00 00 00 00 00

1 2 3 4 5

45H 23H 00 00 00 00 00 00 00 00

‘a’ ‘b’ ‘c’

‘H’ ‘e’ ‘l’ ‘l’ ‘o’ 13 10 ‘$’

12个字符串’month’,每个字符串从低地址到高地址依次是:

’m’ ‘o’ ‘n’ ‘t’ ‘h’

25×4个字节未定义初值的存储单元,操作系统设置为0

〔习题3.17〕修改例题3.3,现在用字定义伪指令dw、字串传送指令movsw和字符串显示9号功能调用实现。

〔解答〕

          .modelsmall

          .stack

          .data

source    dw3433h,3635h

target    dw40dup(?

),'$'

          .code

          .startup

          movax,ds

          moves,ax

          cld

          movsi,offsetsource

          movdi,offsettarget

          movcx,40

          repmovsw

          movsi,0

          movdx,offsettarget

          movah,9

          int21h

          .exit0

          end

〔习题3.18〕变量和标号有什么属性?

〔解答〕

段地址:

表示变量和标号所在代码段的段地址;

偏移地址:

表示变量和标号所在代码段的段内偏移地址;

类型:

引用变量时,表示是字节、字、双字等数据量。

引用该标号时,表示它所在同一个段――near类型,还是另外一个段――far类型。

〔习题3.19〕设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:

mydata   segment

              ORG100H

VARW    DW1234H,5678H

VARB      DB3,4

              ALIGN4

VARD     DD12345678H

             EVEN

BUFF     DB10DUP(?

MESS     DB’HELLO’

BEGIN:

    MOVAX,OFFSETMESS

              MOVAX,TYPEBUFF+TYPEMESS+TYPEVARD

              MOVAX,SIZEOFVARW+SIZEOFBUFF+SIZEOFMESS

              MOVAX,LENGTHOFVARW+LENGTHOFVARD

              MOVAX,LENGTHOFBUFF+SIZEOFVARW

              MOVAX,TYPEBEGIN

             MOVAX,OFFSETBEGIN

〔解答〕

         MOVAX,OFFSETMESS                            ;AX=116H

         MOVAX,TYPEBUFF+TYPEMESS+TYPEVARD          ;AX=1+1+4=06H

         MOVAX,SIZEOFVARW+SIZEOFBUFF+SIZEOFMESS     ;AX=4+10+5=19=13H

         MOVAX,LENGTHOFVARW+LENGTHOFVARD             ;AX=2+1=03H

         MOVAX,LENGTHOFBUFF+SIZEOFVARW                ;AX=10+4=14=0EH

         MOVAX,TYPEBIGIN                                    ;AX=FF02H(近)

         MOVAX,OFFSETBEGIN                                  ;AX=1BH            

〔习题3.20〕利用简化段定义格式,必须具有.MODEL语句。

MASM定义了哪7种存储模式,TINY和SMALL模式创建什么类型(EXE或COM)程序?

设计32位程序应该采用什么模式?

〔解答〕

MASM定义的7种存储模式是TINY(微型模式、SMALL(小型模式)、COMPACT(紧凑模式)、MEDIUM(中型模式)、LARGE(大型模式)、HUGE(巨大模式)、FLAT(平展模式);TINY用于创建COM类型程序、一般程序都可以选用SMALL模式;设计32位的程序应该采用FLAT模式。

〔习题3.21〕源程序中如何指明执行的起始点?

源程序应该采用哪个DOS功能调用,实现程序返回DOS?

〔解答〕

源程序中运用STARTUP伪指令指明执行的起始点;源程序应该采用DOS功能调用的4CH子功能实现程序返回DOS的。

〔习题3.22〕在SMALL存储模式下,简化段定义格式的代码段、数据段和堆栈段的缺省段名、定位、组合以及类别属性分别是什么?

〔解答〕

段定义伪指令      段名      定位      组合      类别      组名

.CODE         _TEXT    WORD   PUBLIC 'CODE'   

.DATA        _DATA     WORD   PUBLIC 'DATA'   DGROUP

.DATA?

     _BSS    WORD PUBLIC 'BSS'  DGROUP

.STACK      STACK     PARA    STACK  'STACK' DGROUP

〔习题3.23〕如何用指令代码代替.startup和.exit指令,使得例题3.1a能够在MASM5.x下汇编通过?

〔解答〕

;lt301a.asm(文件名)

.modelsmall

        .stack

        .data

string    db‘Hello,Everybody!

’,0dh,0ah.’$’

        .code

start:

   movax,@data

        movds,ax

        movdx,offsetstring

        movah,9

        int21h

        movax,4c00h

        int21h

        endstart

〔习题3.24〕创建一个COM程序完成例题3.1的功能。

〔解答〕

;lt301a,asm  

       .modeltiny   

       .code        

       .startup

        movdx,offsetstring

        movah,9

        int21h

       .exit0

string db'Hello,Everybody!

'0dh,0ah,'$' ;

       end

〔习题3.25〕按下面要求写一个简化段定义格式的源程序

(1)定义常量num,其值为5;数据段中定义字数组变量datalist,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;

(2)代码段中的程序将datalist中头num个数的累加和存入datalist的最后1个字单元中。

〔解答〕

          .modelsmall

          .stack

          .data

num       equ5

datalist  dw-1,0,2,5,4,?

          .code

          .startup

          movbx,offsetdatalist

          movcx,num

          xorax,ax

 

again:

    addax,[bx]

          incbx

          incbx

          loopagain

          mov[bx],ax

          .exit0

          end

〔习题3

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1