4章汇编语言程序设计
4-1己知如下定义:
VAR 1
DB
4
VAR2
DB
10
CNST1
EQU
12
试指出下列指令的错误原因:
(1)MOV CNST1, CX    (2) MOV VARI, AX
(3) CMP VARI, VAR2    (4) CNSTI EQU 24
答:
(1)目的操作数不能是立即数
(2)VARI单元定义为字节类型,而AX为字
(3)8086/8088中两个内存单元操作数不能直接比较
(4)同一符号名不允许用EQU重复定义
说明:注意CNSTI被赋值为常数,而VARIVAR2为变量名。
4-2某人定义了如下数据段:
DATA SEGMENT AT 1000H
ORG 100H
VAL1
DB
11H
VAL2
DW
22H,
33H
VAL3
DB
5 DUP (44H)
DATA
ENDS
试指明该数据段中偏移地址从100H109H的各存储单元的内容。
答:各存储单元的内容如下:
100H:    11H
101H:    22H
102H:    00H
103H:    33H
104H:    00H
105H:    44H
106H:    44H
107H:    44H
108H:    44H
109H:    44H
说明:注意ORG定位伪指令规定了数据存放的起始偏移地址为100H
4-3对于下面的数据定义,写出其后的各条指令执行后的结果:
DATA
SEGMENT
ORG
01 OOH
AAAA
DW
0A244H
BBBB
DB
33H, 66H ,92H , 29H
CCCC
EQU
WORD PTR BBBB
DDDD
DB
'ABCD'
EEEE
EQU $-DDDD
DATA
ENDS
(1) MOV
AX, AAAA
(2) MOV
BX, CCCC
(3) MOV
DX,
OFFSET
DDDD
(4) MOV
CL,
EEEE
答.
(l)MOV
AX,
AAAA
.AL= (44H )
(2) MOV
BX,
CCCC
BH= (66H)
⑶孔10V
DX,
OFFSET
DDDD    DL= ( 06H )
MOV
CL,
EEEE
CL= (04H)
说明:注意此题用EQU赋值伪指令对符号CCCCEEEE定义了具体的值(常数),它们不是变量名。
一、习题
1.选择题
4-1 8086汇编语言源程序采用段结构,每个源程序…。
A.至少要包含代码段、堆段
B.至少要包含代码段、数据段和堆段
C.至少要包含代码段、数据段
D.必须要包含代码段
4-2 8086汇编语言程序包含指令性语句和说明性语句(指示性语句),关于说明性语句,以下说法错 误的是…。
A.说明性语句不包含cpu的指令
B•说明性语句使用伪指令,也可以使用表达式
C说明性语句不产生可执行代码,也不占用内存空间
D.说明性语句可以包含注释
4-3关于堆栈段,以下说法中正确的是…。
A.定义了堆段,SP指针会自动地设置
B.如果源程序中没有定义堆栈段,就不可以使用堆栈
C.如果源程序中没有定义堆栈段,系统会提供一个64k的堆栈段
D如果源程序中没有定义堆栈段,汇编时会给出语法错误
4-4为了节省内存,段和段之间是可以重叠的。重叠后的段,最小容量…。
A.4KB
B.1 KB
c. 512 B
D. 16B
4-5 ASSUME伪指令是每个程序必须要用的。以下对ASSUME的使用,
A.ASSUME    CS:CODE;    DS:DATA;    SS:STACK
B.ASSUME    CS:CODE    DS:DATA
C.ASSUME    CS:CODE,    DS:CODE
正确的是    —
D.ASSUME    CS:CODE; DS:DATA
4-6汇编语言中可以使用字符和字符串。关于字符串,以下说法中正确的是.
A.字符串是用双引号括起来的字符组合,用DB伪指令定义
B.字符串是用单引号括起来的字符组合,用DB伪指令定义
C.字符串是用单引号括起来的字符组合,以$结束,用DB伪指令定义
D字符串是用单引号括起来的字符组合,以,\0结束,用DB伪指令定义
4-7汇编源程序经过汇编后,有一些段寄存器还没有被正确赋值,这些段寄存器是的
7ES■ • ■。
A CS DS
B CS SS
C DS ES
D DS SS
4-8定义堆校段时,段定义伪指令的有些选项不能省略。以下定义堆梭的段定义伪指令中正确的
...o
A. STACK
SEGMENT4STACK'
B. STACK
SEGMENT PAGESTACK
C. STACK
SEGMENT STACK
D. STACK
SEG [伍NT PAGE
4-9在汇编语言中,变量可以定义的类型中不包括的是…。
A.双字类型
B.字类型
C.字节类型
D.位类
4-10若己定义"VARI
DB4, 2, 1",以下说法中错误的是的是.
A指令“DIV
VARI”的源操作数采用直接寻址
B 指令“DIV
VAR1”的源操作是5
C指令“DIV
VAR1”是正确的
D指令“DIV
WORD PTR VARI”是正确的
2.填空题
4-11汇编语言源程序经过汇编后产生的目标文件的扩展名是…。
4-12在指令性语句中表示符号地址的标识符称为…。
4-13在说明性(指示性)语句中表示符号地址的标识符称为…。
4-14汇编语言中的变量有3个属性,即段属性、偏移属性和…。
4-15要获得变量的段属性(段地址)需要使用运算符…。
4-17若有CODEC0DE1两个代码段,SUB01汇编语言结束指令是CODE1段的一个过程名,在CODE段中要调用过程 SUB01,要用指令…。
4-18指令”LEA BXVAR1"传送变量VARI的偏移地址到BX,使用汇编运算符可以写出另一条功能相同 的指令是    …。
3.判断题
4-21汇编语言源程序结束汇编后,如果没有错误,就产生扩展名为" .EXE”的可执行程序。()
4-22一般程序设计中,都要求变量应该先定义后使用。因此,在汇编语言源程序中,定义变量的数 据段一定要写在代码段的前面。()
4-23逻辑上有区别的数据段、附加段,在物理上可以使用相同的段地址。()
4-24在代码段中也可以用伪指令定义变量。()
4-26字符串定义:STR DB lABCD'STR DW 'ABCD具有相同的效果。(    )
4-27 LENGTH运算符可以返回数据区中数据的数目。若己定义"BB DB 3, 2, 1, 0",表达式LENGTH BB的值是0
4-28 SIZE运算符可以返回数据区中数据占用的字节数。若己定义"BB DB 4 DUP(O), 3, 2",表达式
SIZE BB 的值是 4。()
4.简答和编程题
4-31己知某数据段中数据定义如下:
ORG
0100H
ARY
DW 3, $+4, 5, 6
CNT
EQU $ - ARY
DB7,
8, 9, 10
(1)写出内存分配,对每个存储单元写出偏移地址及所存数据。
(2)执行以下指令序列后,(AX)=? (BX)=?
MOV AX, CNT+10
MOV BX, ARY+10
4-32对于下面的数据定义,写出各条指令执行后的结果:
DATA SEGMENT
ORG 0300H
AAI
DB
23H
BBI
DW
33H
CC1
DB
5 DUP (77H)
DDI
EQU
OFFSET CC1
DATA
ENDS
(1) MOV
AL,
[302H]    (AL)=()
(2) MOV
BL,
BYTE PTR BBI (BL)=(    )
(3) MOV
DX,
WORD PTR AAI (DH)=(    )
(4) MOV
CX,
DDI    (CL)=(    )
4-38阅读下面的程序段,问本程序实现什么功能?
START:
IN
AL,
50H
MOV
BL,
AL
IN
AL,
80H
MOV
CL,
AL
MOV
AX,
0
LI:
ADD
AL,
BL
ADC
AH,
0
DEC
CL
JNZ
LI
HLT
一、习题解答
1.选择题
4-1答案:D
说明:一个汇编语言源程序,代码段是不能少的,否则,没有地方写指令。数据可以定义在代码 段中。其实,堆栈段一般也是不能少的。只有非常简单的程序才可能不使用堆栈。如果源程序 中没有定义堆栈段,系统会自动分配一个最小的堆段给用户使用。所以,只有选项D是正确的。
4-2答案:C
说明:说明性语句可以用伪指令来定义变量或者数据区。所定义的变量或者数据区都是要占用存 储空间的。如果是在代码段中定义变量或者数据,这些数据将占用代码段的空间。在程序执行的时 候,必须跳过这些数据所占用的区域。否则,系统会将这些数据”翻译”为指令,进行错误的操作。 但是,从伪指令本身来说,定义和产生的是数据,而不是指令。
4-3答案:A
说明:如果源程序中没有定义堆段,系统会提供一个最小的堆栈段给用户使用。但是,这个堆 栈段不是64 KB,而是16 B。所以,选项BCD都不对。选项A是对的。只要定义了堆栈段,系统 会根据所定义堆栈段的大小,自动设置SP的值。
4-4答案:D说明:两个段地址的最小差值是1。生成物理地址时,段地址要乘16。段 地址差值1也就变成了物理地址的差值16
4-5答案:C
说明:选项AD使用”;”作为段寄存器之间的分隔,选项B用空格来分隔,都是不对的。应该像 选项C那样用”,"分隔。选项C中代码段和数据段都是对应于段名CODE,这是可以的,也就是代码段 中又写指令,又定义数据。
4-6答案:B
说明:汇编语言本身对于字符串并没有特别的定义。单引号内是一个字符,就是字符常量:是多个字符, 就是字符串。没有字符串结束的规定。选项C用字符$作为字符串结束,只是DOS功能调用OAH的要 求,不是普遍的要求。选项D则是C语言对于字符串结束的规定,和汇编语言无关。选项A要用双引号, 是不对的。
4-7答案:C
说明:CSSS不用在程序中赋值。只有DSES,如果要使用的话,必须通过指令来赋值,确定它 们的段地址。
4-8答案:C
说明:定义堆栈段时,连接方式(组合类型)STACK不能省略。这样可以保证在定义多个堆栈段时, 这些堆栈段都用相同的段地址。如果没有使用STACK连接方式,汇编时没有错误:连接时会警告:没有 堆栈段。也就是说,程序中定义的堆栈段没有起作用。实际上是一种错误。
4-9答案:D
说明:不存在定义位类型的伪指令。
4-10答案:B
说明:在指令中直接使用变量名,就是使用变量的地址,所以是直接寻址,选项A正确。如果使用 包含变量名的表达式,也是地址的运算,仍然是直接寻也使用VAR1+1或者VAR1-1
都是合法的。但是, 都是根据加减后的地址来取操作数,而不是变量值的加减。VAR1+1取出的变量值是2,不是5。所以, 选项B是错误的。选项D是要强制改变VARI的类型,语法上没有问题。
2.填空题
4-11 答案:".obj"
4-12答案:标号
4-13答案:名字
说明:”名字”是一般的说法。实际使用的时候、可以是变量名、数据区名、段名、过程名等。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。