自测题
1 程序在数据段中定义的数组如下:
NAMES DB 'TOM.',20
DB 'ROSE.',30
DB 'KATE.',25
请指出下列指令是否正确,为什么?
(1) MOV BX,OFFSET NAMES
MOV AL,[BX+5]
(2) MOV AX,NAMES
(3) MOV AX,WORD PTR NAMES+1
(4) MOV AX,NAMES[BX][SI]
(5) MOV AX,OFFSET NAMES[BX][SI]
INC [AX]
(6) LEA DI,NAMES[BX][SI]
MOV AL,[DI]
答案
(1) 两条指令都合法。
(2) 这条指令不正确,因为NAMES的属性为字节,二目的寄存器是AX,所以类型不匹配。
(3) 为合法指令。指令中讲已定义的字节变量用伪操作PTR改变为字类型,所以避免了类型不匹配。
(4) 这条指令不正确,源操作数的数据类型伪字节型,目的操作数伪字类型,所以类型不匹配。
(5) 这条指令不正确,因为在汇编过程中,OFFSET操作将得到变量的便移值,但对相对基址变址寻址方式形成的值在汇编指令时还是未知的;在第二条指令中,AX不能作为基址寄存器用。
(6) 为合法指令。
2 假设程序中的数据定义如下:
PARTNO DW?
PNAME DB 16 DUP(?)
COUNT DD ?
PLENTH EQU $-PARTNO
问PLENTH的值为多少?它标是什么意义?
答案
PLENTH的值为22,它表示从当前位置到PAERNO处所占的字节。
3 若WORD1及WORD2均为字变量,ADDITON为标号.请说明下列指令的错误之处:
(1) JMP ADDITION[DI]
(2) JNZ WORD2
(3) JMP FAR ADDITION
答案
(1) 其错在于两个地址表达式不能相加;
(2) 其错在于条件转移指令只能进行8位的相对寻址,而WORD2确是一个字变量;
(3) 应该为:JMP FAR PTR ADDITION;
4 下面两个语句有何区别:
X1 EQU 1000H
X2=1000H
答案
X1不能多次赋值,X2能多次赋值。
5 对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?
FLDB DB ?
TABLEA DB 10 DUP(?)
TABLEB DB 'ABCD'
(1) MOV AX,TYPE FLDB
(2) MOV AX,TYPE TABLEA
(3) MOV CX,LENGTH TABLEA
(4) MOV DX,SIZE TABLEA
(5) MOV CX,LENGTH TABLEB
答案
(1) AX=1 (2) AX=1 (3) CX=10 (4) DX=10 (5) CX=1
6 已知堆栈段寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条PUSH指令把8057H和0F79H入栈,然后执行一条POP指令,试画出示意图,说明堆栈及SP内容的变化过程.
答案
见图答4.6
7 试设计一个数据段DSEG,定义下列字符变量或数据变量.请画出(1)~(5)题的内存分配图,并指明它们的初值。
(1) FIRST为十六进制数的字变量4020H;
(2) SECOND为二进制数的字节变量01011100B;
(3) THIRD为二进制数的字节变量64;
(4) STRING为字符串变量ADDITION;
(5) ASCDATA为ASCII数字变量‘46782';
(6) TABL为10个字的数组变量;
(7) REPDATA位数字0,2,3,0,6重复5次的字节变量;
(8) ZESULT为10个0的字节变量。
答案
数据段DSEG定义如下:
DSEG SEGMENT
FIRST DW 4020H
SECOND DB 0101100B
THIRD DB 64D
STRING DB ‘ADDITION’
ASCDATA DB ‘46782’
TABL DW 10 DUP(?)
REPDATA DB 5 DUP(0,2,3,0,6)
RESULT DB 10 DUP(0)
内存分配情况:
0100: 0000H 20H FIRST
40H
0002H 01011100B SECOND
0003H 64D THIRD
0004H 41H STRING
0005H 44H
0006H 44H
0007H 49H
0008H 54H
0009H 49H
000AH 4FH
OOOBH 4EH
000CH 34H ASCDATA
000DH 36H
000EH 37H
000FH 38H
0010H 32H
8 设有3个字变量的变量名及其内容如下:
VAR1 3C46H
VAR2 F678H
VAR3 0059H
试设计一个数据段定义这三个变量及其地址表变量ADDRTABL(包括段地址和偏移地址)。
答案
DATA SEGMENT
VAR1 DW 3C46H
VAR2 DW F678H
VAR3 DW 0059H
ADDRTABL DD VAR1
DD VAR2
DD VAR3
DATA ENDS
9 设有一个有符号数数组,共有M个字。试编一程序求其种最大的数;若需求绝对值最大的数,程序如何修改?又若数组元素为无符号数,求最大数的程序应如何修改?
答案
DSEG SEGMENT
DATA DW M DUP(?)
MAX DW ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START:MOV AX,DSEG
MOV DS,AX
MOV MAX,DATA
CLD
MOV SI,OFFSET DATA
MOV CX,M
L1:LODSW
CMP AX,MAX
JNG LAB
MOV MAX,AX
LAB:LOOP L1
MOV AH,4CH
INT 21H
CSEG ENDP
END START
若需要绝对值最大的数,则就需要将每个数最大绝对值求出后再比较,要在LODSB语句插入下面程序:
AND AX,AX
JNS LAB1
NEG AX
LAB1:CMP AX,MAX
且在程序初始化MAX的值时应送入0(最小的绝对值).
若要对无符号数求最大值,则只需改变判别条件,即将
CMP AX,MAX 改为:CMP AX,MAX
JNG LAB JBE LAB
10 试编写一程序统计一个字中的“1”的个数。
答案
STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT TW DB 1234H TWIS DW ? DATA ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP MOV AX,TW CALL FAR PTR BCNT1;调BCNT1子程序 PUSH BX MOV AL,AH CALL FAR PTR BCNT1 |
POP AX ADD AX,BX MOV TWIS,AX MOV AH,4CH INT 21H CODE1 ENDS CODE2 SEGMENT ASSUME CS:CODE2 BCNT1 PROC FAR MOV BX,0 MOV SI,0 BLOOP1:RCL AL,1 JNC BLOOP2 INC BX BLOOP2:INC SI CMP SI,8 RET BCNT1 ENDP CODE2 ENDS END START |
|
11 在首地址为DATA的字数组中存放了100H个补码数。试编写一个汇编语言程序,求出它们的平均值,放在AX寄存器中;同时求除数组中有多少个数小于此值,将结果放在BL中。
答案
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:MOV AX,CODE
MOV DS,AX
MOV SI,OFFSET DATA
MOV AX,0
MOV DX,0
CLC
LP:ADD AX,[SI]]
INC SI
INC SI
ADC DX,0
LOOP LP
MOV AX,DX
MOV CX,100H
MOV SI,OFFSET DATA
MOV BL,0
LP1:CMP [SI],AX
JGE GRT
INC BL
GRT:INC SI
INC SI
LOOP LP1
DATA DW 100 DUP(?)
CODE ENDS
END START
12 已知32为数存放在DX:AX中。试编写一个汇编语言程序将32为数左移4位,并将高4位存入CH中。
答案
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START:MOV CH,DH
MOV CL,4
SHR CH,CL
L1:SHL AX,1
RCL DX,1
LOOP L1
MOV AH,4CH
INT 21H
CSEG ENDS
END START
13 AX寄存器中存放着4位十六进制数。试编写一个汇编语言程序,将这4位十六进制数分别转换为相应的ASCII码,并依次存放到RESULT数组的4个字节中去,要求用调用子程序的方法实现。
答案
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:MOV BX,CODE
MOV DS,BX
MOV CL,4
MOV BL,4
MOV SI,OFFSET RESULT
LP:CALL HASC
MOV [SI],DL
INC SI
SHR AX,CL
DEC BL
JNZ LP
EXIT:MOV AH,4CH
INT 21H
HASC PROC NEAR
MOV DL,AL
AND DL,0FH
CMP DL,9
JA L2
ADD DL,30H
L1:RET
L2:ADD DL,37H
JMP L1
HASC ENDP
RESULT DB 4 DUP(?)
CODE ENDS
END START
14 设有两个等字长字节型字符串。试编写一个汇编语言子程序,比较它们是否完全相同;若相同,则将字幅“Y”送入AL中,否则,将字符“N”送入AL中。
答案
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:MOV AX,CODE
MOV DS,AX
CMPS STRING1,STRING2
JNZ NE
MOV AL,‘Y’
JMP EXIT
NE:MOV AL,‘N’
EXIT:MOV AH,4CH
INT 21H
STRING1 DB ‘...’
STRING2 DB ‘...’
CODE ENDS
END START
15 轻编写一程序,从附加段中一个未排序的字数组UNORDLST中,找出最大数和最小数,分别放在AL和BX寄存器中。
答案
ESEG SEGMENT
UNORDLST DW 50 DUP(?)
COUNT EQU ($-UNORDLST)/2
ESEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,ES:ESEG
START:MOV AX,ESEG
MOV ESD,AX
MOV CX,COUNT
DEC CX
LEA DI,UNORDLST
MOV BX,ES:[DI]
MOV AX,BX
CHKMIN:ADD DI,2
CMP ES:[DI],BX
JAE CHKMAX
JMP SHORT NEXTTEL
CHKMAX:CMP ES:[DI],AX
JBE NEXTTEL
MOV AX,ES:[DI]
NEXTTEL:LOOP CHKMIN
MOV AH,4CH
INT 21H
CSEG ENDS
END START
16 编写一个汇编语言子程序,实现将一组(设有N个)7位ASCII码变为偶校验码。
答案
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:MOV AX,CODE
MOV DS,AX
MOV SI,OFFSET NACSII
MOV CX,7
MOV DX,N
LP0:MOV BL,[SI]
LP1:SHR BL,1
ADC AL,0
LOOP LP1
AND AL,01H
ROR AL,1
OR BL,AL
DEC DX
JNZ LP0
MOV AH,4CH
INT 21H
CODE ENDS
END START
17 试问下列伪指令在存储区中分别为各变量分配多少字节?
VR1 DW10
VR2 DW 6 DUP(?),66,88
VR3 DD 10 DUP(?)
VR4 DB 2DUP(?,8DUP(0))
VR5 DB ‘Happy New Year!’
答案
VR1,VR2,VR3,VR4,VR5分别分配字节个数为:20,16,40,18,15。
18 对于给定的符号定义,指出下列指令的错误,说明原因。
A EQU 505
B DB ?
C DB 64H
(1) MOV A,AX;(2) MOV B,AX;(3) MOV AX,B
(4) CMP C,AX;(5) CMP A,C; (6) CMP AX,C
答案
(1) 错。因变量A已通过EQU伪指令赋值为505,故不能再用传送指令MOV对其赋值。
(2) 错。类型不匹配,变量B为字节型,AX为字型。
(3) 错。类型不匹配。
(4) 错。类型不匹配,C为字节型,AX为字型。
(5) 错。源操作数和目的操作数不能同位存储器类型,且类型也不匹配。
(6) 错。类型不匹配。
19 对于给定的数据定义,各条MOV指令单独执行后有关寄存器的内容是什么?
K1 DB ?
K2 DB 8 DUP(?)
K3 DW 6 DUP(?)
K4 DW ‘1234’
(1) MOV AX TYPE K1
(2) MOV AX,TYPE K3
(3) MOV CL,LENGTH K2
(4) MOV CX,LENGTH K3
(5) MOV CX,LENGTH K4
(6) MOV DX SIZE K3
答案
(1) (AX)=0001H TYPE是存储单元类型,字节型为1,字型为2,双字为4;
(2) (AX)=0002H LENGTH是存储区的单元数目,单元可以是字节、字或者双字;
(3) (CL)=08H SIZE存储区的字节数。
(4) (CX)=0006H
(5) (CX)=0004H
(6) (DX)=000CH
20 对于给定的数据定义,变量R1和R2的值分别是多少?
(1) A1 DB 1,2,3 ‘ABC’
A2 DB 0
R1 EQU A2-A1
(2) K1 DW ?
K2 DB 6 DUP(?)
K3 DD ?
R2 EQU $-K1
答案
(1) R1=6 $表示地址计数器的值
(2) R2=22
21 写出完成下述要求的变量定义语句:
(1) 为某缓冲区BUG留出200各字节的内存空间;
(2) 将字符串‘BYTE’,‘WORD’,‘DWORD’存放于某数据区;
(3) 在某数据区要求存入下列5个数据:
2040H,0300H,10H,0200H,1048H
答案
(1) BUG DB 200DUP(?)
(2) STR1 DB ‘BYTE’
STR2 DB ‘WORD’
STR3 DB ‘DWORD’
(3) DATA DW 2040H,0300H,10H,0200H,1048H
22 分别说明下列指令对的区别:
(1) MOV AX,VAR1和MOV AX OFFSET VAR1
(2) MOV AX,VAR1与LEA AX,VAR1
答案
(1) MOV AX,VAR1是将变量VAR1的内容送AX;
MOV AX,OFFSET VAR1是将变量VAR1的偏移量送AX。
(2) LEA AX,VAR1也是将变量VAR1的偏移量送AX,与(1)中不同的是采用专门取偏移量指令实现。
23 说明为什么有时候必须使用PTR属性操作符。
答案
PTR优先于隐含的类型属性,指定操作数的类型属性。因为在许多情况下,所使用的操作符类型与原指定的类型不同,又不希望改变原有的设定,只暂时改变操作符类型,则必须使用PTR属性操作符作为临时设定,这个临时设定类型只在本条指令有效。
24 假设VDT1和VDT2为字变量,TAL1和TAL2为标号,说明下列指令是否正确,若正确,说明其寻址方式;若有错误指出错误所在。
(1) JMP VDT1 (2) JMP NEAR TAL1 (3) JNZ VDT2
(4) JE TAL2 (5) JMP FAR PTR TAL1 (6) JMP TAL1[SI]
答案
(1) 错。条转地址应为标号,而非变量。
(2) 错。指令中缺少PTR.
(3) 错。条转地址应为标号,而非变量。
(4) 正确。相对寻址方式。
(5) 正确。直接需寻址方式。
(6) 正确。相对寻址方式。