汇编语言程序设计第四版第3章课后答案.docx
《汇编语言程序设计第四版第3章课后答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计第四版第3章课后答案.docx(15页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计第四版第3章课后答案
汇编语言程序设计第四版
【课后习题答案】囮裑為檤
第3章汇编语言程序格式
〔习题3、1〕伪指令语句与硬指令语句得本质区别就是什么?
伪指令有什么主要作用?
〔解答〕
伪指令语句与硬指令语句得本质区别就是能不能产生CPU动作;
伪指令得作用就是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作得说明,并在程序执行前由汇编程序完成处理。
〔习题3、2〕什么就是标识符,汇编程序中标识符怎样组成?
〔解答〕
为了某种需要,每种程序语言都规定了在程序里如何描述名字,程序语言得名字通常被称为标识符;
汇编语言中得标识符一般最多由31个字母、数字及规定得特殊符号(如,$,?
)组成,不能以数字开头。
〔习题3、3〕 什么就是保留字,汇编语言得保留字有哪些类型,并举例说明。
〔解答
保留字就是在每种语言中规定了有特殊意义与功能得不允许再做其它用处得字符串;汇编语言得保留字主要有硬指令助记、伪指令助记符、运算符、寄存器名以及预定义符号等。
汇编语言对大小写不敏感。
如定义字节数与字符串得DB就就是伪指令助记符。
〔习题3、4〕汇编语句有哪两种,每个语句由哪4个部分组成?
〔解答〕
汇编语句有执行性语句与说明性语句;
执行性语句由标号、硬指令助记符、操作数与注释四部分组成;
说明性语句由名字、伪指令助记符、参数与注释四部分组成
〔习题3、5〕汇编语言程序得开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。
〔解答〕
⒈ 编辑 文本编辑程序 汇编语言源程序、asm
⒉ 汇编 汇编程序 目标模块文件、obj
⒊ 连接 连接程序 可执行文件、exe或、
⒋ 调试 调试程序 应用程序
〔习题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、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)从低地址开始,依次就是(十六进制表达):
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、11〕请设置一个数据段mydataseg,按照如下要求定义变量:
(1)my1b为字符串变量:
Personalputer
(2)my2b为用十进制数表示得字节变量:
20
(3)my3b为用十六进制数表示得字节变量:
20
(4)my4b为用二进制数表示得字节变量:
20
(5)my5w为20个未赋值得字变量
(6)my6c为100得常量
(7)my7c表示字符串:
Personalputer
〔解答〕
mydatasegsegment
my1b db‘Personalputer’
my2b db20
my3b db14h ;20h
my4b db00010100b
my5w dw20dup(?
)
my6c equ100 ;my6c=100
my7c equ
mydatasegends
〔习题3、12〕分析例题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、13〕修改例题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、14〕变量与标号有什么属性?
〔解答〕
段地址:
表示变量与标号所在代码段得段地址;
偏移地址:
表示变量与标号所在代码段得段内偏移地址;
类型:
引用变量时,表示就是字节、字、双字等数据量。
引用该标号时,表示它所在同一个段――near类型,还就是另外一个段――far类型。
〔习题3、15〕设在某个程序中有如下片段,请写出每条传送指令执行后寄存器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、16〕利用简化段定义格式,必须具有、MODEL语句。
MASM定义了哪7种存储模式,TINY与SMALL模式创建什么类型(EXE或)程序?
设计32位程序应该采用什么模式?
〔解答〕
MASM定义得7种存储模式就是TINY(微型模式、SMALL(小型模式)、PACT(紧凑模式)、MEDIUM(中型模式)、LARGE(大型模式)、HUGE(巨大模式)、FLAT(平展模式);TINY用于创建类型程序、一般程序都可以选用SMALL模式;设计32位得程序应该采用FLAT模式。
〔习题3、17〕源程序中如何指明执行得起始点?
源程序应该采用哪个DOS功能调用,实现程序返回DOS?
〔解答〕
源程序中运用STARTUP伪指令指明执行得起始点;源程序应该采用DOS功能调用得4CH子功能实现程序返回DOS得。
〔习题3、18〕在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、19〕如何用指令代码代替、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、20〕创建一个程序完成例题3、1得功能。
〔解答〕
;lt301a,asm
、modeltiny
、code
、startup
movdx,offsetstring
movah,9
int21h
、exit0
string db'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
、data
num equ5
datalist dw1,0,2,5,4,?
、code
、startup
movbx,offsetdatalist
movcx,num
xorax,ax
again:
addax,[bx]
incbx
incbx
loopagain
mov[bx],ax
、exit0
end
〔习题3、22〕按下面要求写一个完整段定义格式得源程序
(1)数据段从双字边界开始,其中定义一个100字节得数组,同时该段还作为附加段;
(2)堆栈段从节边界开始,组合类型为stack;
(3)代码段得类别就是’code’,指定段寄存器对应得逻辑段;主程序指定从100h开始,给有关段寄存器赋初值;将数组元素全部设置为64h。
〔解答〕
stack segmentpara‘stack’
dw 512dup(?
)
stack ends
data segment
array db100dup(?
)
data ends
code segment‘code’
assumecs:
code,ds:
data,es:
data,ss:
stack
org100h
start:
movax,data
movds,ax
moves,ax
movdi,offsetarray
moval,64h
movcx,100
cld
repstosb
movax,4c00h
int21h
code ends
endstart
〔习题3、23〕编制程序完成两个已知双精度数(4字节)A与B相加并将结果存入双精度变量单元SUM中(不考虑溢出)。
〔解答〕
;xt327、asm
、model small
、stack 256 ;定义堆栈段大小为256个字节
、data
A dd 11223344h ;定义两个双字得数(随意)
B dd 77553311h
sum dd ?
;定义结果,执行后为:
88776655h
、code
、startup
xor si,si ;相对于变量得位移量清零
mov cx,2 ;分高低字分别相加,共两次
clc ;清零cf
again:
movax,wordptrA[si] ;取第一个数得一个字(先低字后高字)
adcax,wordptrB[si] ;取第二个数得一个字(先低字后高字)
movwordptrsum[si],ax ;存与得一个字(先低字后高字)
incsi ;修改位移量指向下一个字(加2)
incsi
loop again ;cx=cx1,ifcx<>0,jumpagain
、exit0
end
〔习题3、24〕编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H与34H等10个字节数据之与,并将结果存入字节变量SUM中(不考虑溢出)。
〔解答〕
、startup
xor si,si ;位移量清零
moval,bdata[si] ;取第一个数
movcx,num1 ;累加次数
again:
inc si ;指向下一个数
adcal, bdata[si] ;累加
loop again ;如未完,继续累加
mov sum,al ;完了,存结果
、exit0
end
〔习题3、25〕结构数据类型如何说明、结构变量如何定义、结构字段如何引用?
〔解答〕
结构类型得说明使用一对伪指令STRUCT(MASM5、x就是STRUC,功能相同)与ENDS。
它们得格式为:
结构名STRUCT
… ;数据定义语句
结构名ENDS
结构变量定义得格式为:
变量名,结构名 〈字段初值表〉
引用结构字段,采用圆点“、”操作符,其格式就是:
结构变量名、结构字段名。
〔习题3、26〕记录数据类型如何说明,记录变量如何定义,width与mask操作符就是什么作用?
〔解答〕
记录类型得说明采用伪指令RECORD,它得格式为:
记录名RECORD位段[,位段…]
定义记录变量得格式:
记录变量名记录名〈段初值表〉
Width记录名/记录位段名操作符返回记录或记录位段所占用得位数。
mask记录位段名操作符返回一个8位或16位数值,其中对应该位段得个位为1,其余位为0。