新版汇编语言程序设计钱晓捷第3章习题答文档格式.docx
- 文档编号:21260094
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:16
- 大小:22.49KB
新版汇编语言程序设计钱晓捷第3章习题答文档格式.docx
《新版汇编语言程序设计钱晓捷第3章习题答文档格式.docx》由会员分享,可在线阅读,更多相关《新版汇编语言程序设计钱晓捷第3章习题答文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
定义程序的存储模式(小模式)
.stack
定义堆栈段(默认1024个字节)
.data
定义数据段
str1
db'
InputNumber:
0~9:
'
0dh,0ah,'
$'
str2
Error!
'
.cade
定义代码段
.startup
说明程序的起始点,建立ds,ss的内容。
movah,09h
显示str1字符串
movdx,offsetstr1
int21h
getkey:
movah,1
调用DOS功能
cmp
al,'
0'
jberror
小于0,出错处理
cmpal,'
9'
jaerror
大于9,出错处理
movah,02h
调用DOS显示字符功能,显示该数字
movdl,al
.exit0
终止程序执行,返回DOS
error:
出错,调用DOS功能显示str2字符串
movdx,offsetstr2
jmpgetkey
返回按键
end
汇编结束
〔习题3.7〕将第2章习题2.37采用完整段定义格式编写成一个完整的源程序。
;
xt307.asm
stack
segment
dw512dup(?
)
ends
data
segment
array
db255
db0
array1
db255dup('
)
array2
db0dh,0ah,'
code
segment'
code'
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
movah,0ah
键盘输入字符串
movdx,offsetarray
movdx,offsetarray2
回车换行
movah,09h
movbx,offsetarray1
again:
moval,[bx]
jzdone
a'
小于a和大于z的字符不是小写字母
jbnext
z'
janext
subal,20h
在a和z之间的字符才是小写字母,转换为大写
mov[bx],al
保存到原位置
next:
incbx
jmpagain
done:
movdx,offsetarray1
movax,4c00h
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
)
;
为负数预留存储空间
count
equ32
字节数
〔习题3.13〕为第2章例题2.55定义相应变量,并形成一个完整的汇编语言程序。
lt239b.asm
.model
small
.stack
.data
string1
goodmorning!
两字符串可相同或不同,但字符数要求相同。
string2
Goodmorning!
result
db?
预留结果字节
count=14
字符数
.code
.startup
movax,ds
所有数据在同一个段,所以使es=ds
moves,ax
movsi,offsetstring1
movdi,offsetstring2
movcx,count
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
(2)从低地址开始,依次是(十六进制表达):
10
00
FB
FF
46
-
〔习题3.15〕请设置一个数据段mydataseg,按照如下要求定义变量:
(1)my1b为字符串变量:
PersonalComputer
(2)my2b为用十进制数表示的字节变量:
20
(3)my3b为用十六进制数表示的字节变量:
(4)my4b为用二进制数表示的字节变量:
(5)my5w为20个未赋值的字变量
(6)my6c为100的常量
(7)my7c表示字符串:
mydatasegsegment
my1b
db‘PersonalComputer’
my2b
db20
my3b
db14h
20h
my4b
db00010100b
my5w
dw20dup(?
my6c
equ100
my6c=100
my7c
equ<
PersonalComputer>
mydatasegends
〔习题3.16〕分析例题3.2的数据段,并上机观察数据的存储形式。
以字节为单位从低地址向高地址依次是:
16
00
12
FFH
FFH
FFH
00
1
2
3
4
5
45H
23H
‘a’
‘b’
‘c’
‘H’
‘e’
‘l’
‘o’
13
‘$’
12个字符串’month’,每个字符串从低地址到高地址依次是:
’m’
‘n’
‘t’
‘h’
25×
4个字节未定义初值的存储单元,操作系统设置为0
〔习题3.17〕修改例题3.3,现在用字定义伪指令dw、字串传送指令movsw和字符串显示9号功能调用实现。
.modelsmall
source
dw3433h,3635h
target
dw40dup(?
),'
movax,ds
cld
movsi,offsetsource
movdi,offsettarget
movcx,40
repmovsw
movsi,0
movdx,offsettarget
movah,9
.exit0
〔习题3.18〕变量和标号有什么属性?
段地址:
表示变量和标号所在代码段的段地址;
偏移地址:
表示变量和标号所在代码段的段内偏移地址;
类型:
引用变量时,表示是字节、字、双字等数据量。
引用该标号时,表示它所在同一个段――near类型,还是另外一个段――far类型。
〔习题3.19〕设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:
mydata
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
DATA'
DGROUP
.DATA?
_BSS
BSS'
.STACK
STACK
PARA
STACK'
〔习题3.23〕如何用指令代码代替.startup和.exit指令,使得例题3.1a能够在MASM5.x下汇编通过?
lt301a.asm(文件名)
.modelsmall
string
db‘Hello,Everybody!
’,0dh,0ah.’$’
.code
movax,@data
movds,ax
movdx,offsetstring
movax,4c00h
endstart
〔习题3.24〕创建一个COM程序完成例题3.1的功能。
lt301a,asm
.modeltiny
.code
movdx,offsetstring
Hello,Everybody!
0dh,0ah,'
〔习题3.25〕按下面要求写一个简化段定义格式的源程序
(1)定义常量num,其值为5;
数据段中定义字数组变量datalist,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;
(2)代码段中的程序将datalist中头num个数的累加和存入datalist的最后1个字单元中。
num
equ5
datalist
dw-1,0,2,5,4,?
movbx,offsetdatalist
movcx,num
xorax,ax
addax,[bx]
loopagain
mov[bx],ax
〔习题3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 新版 汇编语言 程序设计 钱晓捷第 习题