第5章 汇编语言程序设计
一、填空题
1.段定义伪指令语句用 SEGMENT 语句表示开始,以 ENDS 语句表示结束。
2.ARRAY DW 10 DUP(5 DUP (4 DUP (20H,40H,60H))语句执行后共占 1200 字节存储单元。
3.汇编语句中,一个过程有NEAR和FAR两种属性。NEAR属性表示主程序和子程序 在同一个代码段中 ,FAR属性表示主程序和子程序不在同一个代码段中。 4.DOS系统功能号应放在 AH 寄存器中。
5.子程序又称 过程 ,它可以由 PROC 语句定义,由 ENDP 语句结束,属性可以是 NEAR 或 FAR 。
6.假设VAR为数据段中已定义的变量,则指令MOV BX,OFFSET VAR中源操作数的寻址方式是 立即数寻址 。 二、选择题
1.EXE文件产生在( D )之后。
A. 汇编 B. 编辑 C. 用软件转换 D. 连接 2.变量定义的伪指令助记符有( ABCEF )。 A. DB B. DW C. DD D. DF E. DQ F. DT 3.主程序与子程序之间传递参数可通过( ABC )进行。
A. 堆栈 B. 存储器单元 C. 通用寄存器 D. 指令队列 E. 其他 4.计算机系统软件中的汇编程序是一种(C)。 A. 汇编语言程序 B. 编辑程序
C. 翻译程序 D. 将高级语言转换成汇编程序的程序
5.若主程序段中数据段名为DATA,对数据段的初始化操作应为(B)。 A. MOV AX,DATA B. MOV AX,DATA MOV ES,AX MOV DS,AX C. PUSH DS D. MOV DS,DATA
6.8086宏汇编源程序中,若BUFF是字变量名,则执行指令MOV BX,BUFF后,BX中的值为BUFF单元的( A )。 A. 字数据值 B. 变量类型值 C. 段基址 D. 段内偏移量 三、综合题
1.下列标号为什么是非法的? (1) GET.DATA (2) 1_NUM (3) TEST-DATA (4) RET (5) NEW ITEM 答案:
(1)因为?.‘只允许是标号的第一个字符 (2)第一个字符不能为数字 (3)不允许出现?-‘ (4)不能是保留字,如助记符
11
(5)不能有空格
2.已知数据和符号定义
A1
A2 K1
DB DB EQU
100
? 8
判断下列指令的正误,并说明错误指令的原因。 (1)MOV K1,AX (2)MOV A2,AH (3)CMP A1,A2 (4)MOV BX,K1
MOV [BX],DX
EQU
200
(5)K1
答:(1)错误。K1 是符号,在此处相当于立即数100,故不能做目的操作数。
(2)正确。
(3)错误。A1、A2 都是字节变量,相当于两个存储器单元,故不能同时出现在一条指令中直接进行比较。 (4)正确。
(5)错误。用EQU 定义的符号不能重新赋值,除非已用PURGE 解除了原值。 3.若数据段中有定义
NUM1 EQU NUM2 DW
23H
0
则指令MOV NUM2,NUM1 的源、目操作数的寻址方式以及指令执行后NUM2+1单元的内容分别是什么? 答:指令MOV NUM2,NUM1 的源操作数使用立即数寻址,目的操作数使用直接寻址。指令执行后NUM2+1 单元的内容是0。
4.已知某数据段从物理地址03000H处开始,定义如下:
DSEG DSEG
SEGMENT ORG A1 A2 CNT A3 ENDS
2000H EQU
DD DB 20H DW
100 DUP(?)
2 DUP(7,1,?)
10 DUP(0,4,3 DUP(2),5)
请分别用分析运算符SEG、OFFSET、LENGTH、SIZE、TYPE求出A1、A2、A3的段基址、偏移量、类型及它们的LENGTH、SIZE。
答:(SEG A1)=0300H,(OFFSET A1)=2000H,(TYPE A1)=4, (LENGTH A1)=2,(SIZE A1)=2×3×4=24;
(SEG A2)=0300H,(OFFSET A2)=2018H,(TYPE A2)=1, (LENGTH A2)=10,(SIZE A2)=10×6×1=60;
(SEG A3)=0300H,(OFFSET A3)=2054H,(TYPE A3)=2, (LENGTH A3)=100,(SIZE A3)=100×2=200
12
DTSEG SEGMENT
ORG
10H
DATA1 DB 72H
DB 04H
DTSEG ENDS
5.下面两个数据段中偏移地址为10H和11H的两个存储单元中的数据一样吗?为什么?
DTSEG SEGMENT ORG 10H DATA1 DW 7204H DTSEG ENDS
答案:不一样。分别是72H, 04H和04H, 72H。存储字时低8位存在低字节,高8位存在高字节。
6.已知符号定义语句如下: ALPHA EQU 100 BETA
EQU 25
GAMMAEQU
2
分别求下列各表达式的值。 (1)ALPHA*4 GT BETA
(2)ALPHA MOD GAMMA+BETA (3)(BETA / 3)LE 5 (4)ALPHA AND BETA
(5)GAMMA XOR(BETA EQ 25)
答:(1)ALPHA*4 GT BETA = 100*4 GT 25 = 0FFFFH (2)ALPHA MOD GAMMA+BETA = 100 MOD 2+25 = 25 (3)(BETA / 3)LE 5 =(25 / 3)LE 5 = 0
(4)ALPHA AND BETA = 100 AND 25 = 64H & 19H = 0
(5)GAMMA XOR(BETA EQ 25)= 2⊕(25 EQ 25) = 0FFFDH
7.已知数据段定义如下:
DSEG
SEGMENT
ORG 6
VAR1 DB 2,18
ORG $ +2
VAR2 DW 569AH CONT EQU $–VAR2
DB ?AB‘
DSEG
ENDS
用示意图说明该数据段的分配情况。 答:有关存储单元的内容如下图所示。
13
8.判断以下说法是否正确,如有错,请说明原因并改正。 (1)伪指令在汇编过程中不会产生二进制代码。
(2)宏和过程的相同之处是都可用于简化源程序书写、精简目标代码。 (3)在计算机中,高级语言通常需要转换为汇编语言后才能执行。 (4)汇编语言程序上机一般包括编辑、汇编、链接和调试几个步骤。 答:(1)正确。 (2)错误。宏不能精简目标代码。 (3)错误。高级语言程序经编译或解释后直接转换为目标代码。 (4)正确。
9.执行下列指令后,AX寄存器中的内容是什么? TABLE DW 10,20,30,40,50
ENTRY DW
3
. . MOV
BX,OFFSET TABLE
ADD BX,ENTRY MOV
AX,[BX]
答:(AX)=1E00
10.指出下列程序中的错误: STAKSG SEGMENT
DB
100 DUP(?)
STA_SG ENDS DTSEG SEGMENT
DATA1 DB
? DTSEG END
CDSEG SEGMENT MAIN
PROC
FAR START: MOV DS,DATSEG MOV AL,34H ADD AL,4FH
MOV
DATA,AL
START ENDP CDSEG ENDS
END
答案: 改正后: STAKSG SEGMENT DB 100 DUP(?) STAKSG ENDS
14
DTSEG DATA DTSEG CDSEG MAIN ASSUME START: MOV MAIN CDSEG
SEGMENT DB ? ENDS
SEGMENT PROC FAR
CS: CDSEG, DS: DTSEG, SS: STAKSG AX, DTSEG MOV DS, AX MOV AL, 34H ADD AL, 4FH MOV DATA1, AL MOV AH, 4CH
INT 21H ENDP ENDS
END
START
11.请写出上述两条指令执行后,BX寄存器中的内容。
DATA DATA
┆
MOV LEA
BX, TABLE_ADDR BX, TABLE_ADDR
SEGMENT TABLE_ADDR ENDS
DW
1234H
答案: MOV BX,TABLE_ADDR ;执行后(BX)=1234H
LEA BX,TABLE_ADDR
12.读下面程序,在其中的空处添上适当内容。该程序完成了什么功能?程序运行后,变量RS的值是多少? DATA
BUF
SEGMENT DB CNT DB RS
DATA STACK
DB ENDS
SEGMENT PARA STACK DB ENDS SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START
PROC
FAR
DS AX,0 AX AX,DATA DS,AX BX,BUF CH,0 CL,
256 DUP(?) -13,24,5,-62 DB 77,20,-7,145,0 $ -BUF 0
;执行后(BX)=OFFSET TABLE_ADDR
STACK CODE
PUSH
MOV
MOV PUSH MOV MOV LEA MOV MOV
LP: AL,[BX]
15