第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被赋值为常数,而VARI及VAR2为变量名。
4-2某人定义了如下数据段:
DATA SEGMENT AT 1000H
ORG 100H | |||
VAL1 | DB | 11H | |
VAL2 | DW | 22H, | 33H |
VAL3 | DB | 5 DUP (44H) | |
DATA | ENDS | ||
试指明该数据段中偏移地址从100H到109H的各存储单元的内容。
答:各存储单元的内容如下:
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赋值伪指令对符号CCCC及EEEE定义了具体的值(常数),它们不是变量名。
一、习题
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 PAGE,STACK, |
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若有CODE和C0DE1两个代码段,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。所以,选项B、C、D都不对。选项A是对的。只要定义了堆栈段,系统 会根据所定义堆栈段的大小,自动设置SP的值。
4-4答案:D说明:两个段地址的最小差值是1。生成物理地址时,段地址要乘16。段 地址差值1也就变成了物理地址的差值16。
4-5答案:C
说明:选项A和D使用”;”作为段寄存器之间的分隔,选项B用空格来分隔,都是不对的。应该像 选项C那样用”,"分隔。选项C中代码段和数据段都是对应于段名CODE,这是可以的,也就是代码段 中又写指令,又定义数据。
4-6答案:B
说明:汇编语言本身对于字符串并没有特别的定义。单引号内是一个字符,就是字符常量:是多个字符, 就是字符串。没有字符串结束的规定。选项C用字符$作为字符串结束,只是DOS功能调用OAH的要 求,不是普遍的要求。选项D则是C语言对于字符串结束的规定,和汇编语言无关。选项A要用双引号, 是不对的。
4-7答案:C
说明:CS和SS不用在程序中赋值。只有DS和ES,如果要使用的话,必须通过指令来赋值,确定它 们的段地址。
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小时内删除。
发表评论