汇编语言程序设计第3章文档格式.docx
《汇编语言程序设计第3章文档格式.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计第3章文档格式.docx(11页珍藏版)》请在冰点文库上搜索。
![汇编语言程序设计第3章文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/12/cc59ae3a-33a8-46a0-9946-787039dda5de/cc59ae3a-33a8-46a0-9946-787039dda5de1.gif)
(2)数值表达式一般是由运算符连接的各种常数所构成的表达式,地址表达式是由名字、标号以及利用各种的操作符形成的表达式。
(3)在程序中,为了使常量更便于使用和阅读,经常将一些常量用常量定义语句定义为符号常量,被一对双引号括起来的若干个字符组成的字符序列被称为字符串常量。
〔习题〕假设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指令只有相对寻址方式,不支持间接寻址方式
〔习题〕OPR1是一个常量,问下列语句中两个AND操作有什么区别
ANDAL,OPR1AND0feh
前者为“与”操作硬指令助记符,可汇编成机器代码。
后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。
〔习题〕给出下列语句中,指令立即数(数值表达式)的值:
(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
〔习题〕画图说明下列语句分配的存储空间及初始化的数据值:
(1)byte_varDB’ABC’,10,10h,’EF’,3DUP(-1,,3DUP(4))
(2)word_varDW10h,-5,’EF’,3DUP()
(1)从低地址开始,依次是(十六进制表达):
4142430a104546ff-04
040404ff-0404040404ff-
(2)从低地址开始,依次是(十六进制表达):
1000FBFF4645------
〔习题〕请设置一个数据段mydataseg,按照如下要求定义变量:
(1)my1b为字符串变量:
PersonalComputer
(2)my2b为用十进制数表示的字节变量:
20
(3)my3b为用十六进制数表示的字节变量:
(4)my4b为用二进制数表示的字节变量:
(5)my5w为20个未赋值的字变量
(6)my6c为100的常量
(7)my7c表示字符串:
mydatasegsegment
my1bdb‘PersonalComputer’
my2bdb20
my3bdb14h;
20h
my4bdb00010100b
my5wdw20dup()
my6cequ100;
my6c=100
my7cequ<
PersonalComputer>
mydatasegends
〔习题〕分析例题的数据段,并上机观察数据的存储形式。
以字节为单位从低地址向高地址依次是:
16
0012
FFHFFHFFHFFH
0000000000000000
12345
45H23H0000000000000000
‘a’‘b’‘c’
‘H’‘e’‘l’‘l’‘o’1310‘$’
12个字符串’month’,每个字符串从低地址到高地址依次是:
’m’‘o’‘n’‘t’‘h’
25×
4个字节未定义初值的存储单元,操作系统设置为0
〔习题〕修改例题,现在用字定义伪指令dw、字串传送指令movsw和字符串显示9号功能调用实现。
.modelsmall
.stack
.data
sourcedw3433h,3635h
targetdw40dup(),'
$'
.code
.startup
movax,ds
moves,ax
cld
movsi,offsetsource
movdi,offsettarget
movcx,40
repmovsw
movsi,0
movdx,offsettarget
movah,9
int21h
.exit0
end
〔习题〕变量和标号有什么属性
段地址:
表示变量和标号所在代码段的段地址;
偏移地址:
表示变量和标号所在代码段的段内偏移地址;
类型:
引用变量时,表示是字节、字、双字等数据量。
引用该标号时,表示它所在同一个段――near类型,还是另外一个段――far类型。
〔习题〕设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:
mydatasegment
ORG100H
VARWDW1234H,5678H
VARBDB3,4
ALIGN4
VARDDDH
EVEN
BUFFDB10DUP()
MESSDB’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
(近)
BEGIN
1BHMOVAX,TYPEBIGIN;
AX=FF02HMOV
;
AX,OFFSET
AX=〔习题〕利用简化段定义格式,必须具有.MODEL语句。
MASM定义了哪7种存储模式,TINY和SMALL模式创建什么类型(EXE或COM)程序设计32位程序应该采用什么模式
MASM定义的7种存储模式是TINY(微型模式、SMALL(小型模式)、COMPACT(紧凑模式)、MEDIUM(中型模式)、LARGE(大型模式)、HUGE(巨大模式)、FLAT(平展模式);
TINY用于创建COM类型程序、一般程序都可以选用SMALL模式;
设计32位的程序应该采用FLAT模式。
〔习题〕源程序中如何指明执行的起始点源程序应该采用哪个DOS功能调用,实现程序返回DOS〔解答〕
源程序中运用STARTUP伪指令指明执行的起始点;
源程序应该采用DOS功能调用的4CH子功能实现程序返回DOS的。
〔习题〕在SMALL存储模式下,简化段定义格式的代码段、数据段和堆栈段的缺省段名、定位、组合以及类别属性分别是什么
段定义伪指令xx定位组合类别组名
.CODE_TEXTWORDPUBLIC'
CODE'
.DATA_DATAWORDPUBLIC'
DATA'
DGROUP.DATA_BSSWORDPUBLIC'
BSS'
DGROUP
.STACKSTACKPARASTACK'
STACK'
DGROUP〔习题〕如何用指令代码代替.startup和.exit指令,使得例题能够在MASM下汇编通过
;
(文件名)
stringdb‘Hello,Everybody!
’,0dh,0ah.’$’
start:
movax,@data
movds,ax
movdx,offsetstring
movax,4c00h
endstart
〔习题〕创建一个COM程序完成例题的功能。
lt301a,asm
.modeltiny
stringdb'
Hello,Everybody!
'
0dh,0ah,'
〔习题〕按下面要求写一个简化段定义格式的源程序
(1)定义常量num,其值为5;
数据段中定义字数组变量datalist,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;
(2)代码段中的程序将datalist中头num个数的累加和存入datalist的最后1个字单元中。
numequ5
datalistdw-1,0,2,5,4,
movbx,offsetdatalist
movcx,num
xorax,ax
again:
addax,[bx]
incbx
loopagain
mov[bx],ax
〔习题〕按下面要求写一个完整段定义格式的源程序
(1)数据段从双字边界开始,其中定义一个100字节的数组,同时该段还作为附加段;
(2)堆栈段从节边界开始,组合类型为stack;
(3)代码段的类别是’code’,指定段寄存器对应的逻辑段;
主程序指定从100h开始,给有关段寄存器赋初值;
将数组元素全部设置为64h。
stacksegmentpara‘stack’
dw512dup()
stackends
datasegment
arraydb100dup()
dataends
codesegment‘code’
assumecs:
code,ds:
data,es:
data,ss:
stack
org100h
movax,data
movdi,offsetarray
moval,64h
movcx,100
repstosb
movax,4c00h
codeends
〔习题〕编制程序完成两个已知双精度数(4字节)A和B相加并将结果存入双精度变量单元SUM中(不考虑溢出)。
.modelsmall
.stack256;
定义堆栈段大小为256个字节.data
Addh;
定义两个双字的数(随意)
Bddh
sumdd;
定义结果,执行后为:
h.code
xorsi,si;
相对于变量的位移量清零movcx,2;
分高低字分别相加,共两次clc;
清零cf
movax,wordptrA[si];
取第一个数的一个字(先低字后高字)adcax,wordptrB[si];
取第二个数的一个字(先低字后高字)
movwordptrsum[si],ax;
存和的一个字(先低字后高字)incsi;
修改位移量指向下一个字(加2)
incsi
loopagain;
cx=cx-1,ifcx<
>
0,jumpagain.exit0
〔习题〕编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出)。
位移量清零
moval,bdata[si];
取第一个数
movcx,num-1;
累加次数
incsi;
指向下一个数
adcal,bdata[si];
累加
如未完,继续累加
movsum,al;
完了,存结果
〔习题〕结构数据类型如何说明、结构变量如何定义、结构字段如何引用
结构类型的说明使用一对伪指令STRUCT(是STRUC,功能相同)和ENDS。
它们的格式为:
结构名STRUCT
…;
数据定义语句
结构名ENDS
结构变量定义的格式为:
变量名,结构名〈字段初值表〉
引用结构字段,采用圆点“.”操作符,其格式是:
结构变量名.结构字段名。
〔习题〕记录数据类型如何说明,记录变量如何定义,width和mask操作符是什么作用
记录类型的说明采用伪指令RECORD,它的格式为:
记录名RECORD位段[,位段…]
定义记录变量的格式:
记录变量名记录名〈段初值表〉
Width记录名/记录位段名操作符返回记录或记录位段所占用的位数。
mask记录位段名操作符返回一个8位或16位数值,其中对应该位段的个位为1,其余位为0。