一、单项选择题(每小题1 分,共20 分)
1. 指令ADD AX,[3500H]中,源操作数使用的寻址方式是(A)。
A. 直接寻址 B. 寄存器寻址
C. 寄存器相当寻址 D. 立即寻址
2. 条件转移指令JZ 产生转移的测试条件是( )。
A. ZF=0 B. ZF=1
C. ZF=1 或CF=1 D. ZF=0 或CF=1
1 JZ就是JE
3. 在字符串操作指令中,源串操作数放在的寄存器是( )。
A. CS B. SS C. DS D. ES
1 字符串操作指令中,源串操作数在DS,目的操作数可以是DS 或者ES。
4. 使用DOS 系统功能调用终止当前程序并返回调用程序,应选用的指令是(C)。
A. MOV AH,01H B. MOV AH,00H
INT 21H INT 21H
C. MOV AH,4CH D. RET
INT 21H INT 21H
1 assume cs:code 2 code segment 3 start: 4 ... 5 mov ax,4c00h 6 int 21h 7 code ends 8 end start
5. 下列指令中,有语法错误的指令是( )。
A. MOV CS, AX B. MOV BL,[BX]
C. MOV SS, [BP+DI] D. MOV ES, AX
1 不能直接给CS代码段寄存器赋值,要用jmp 2 3 为其他段寄存器赋值的方法:mov ss,[bx,si,di,bp] mov ss,ax
6. 数据定义如下:
DA_BYTE DB 0ABH,?
DA_WORD DW ?,?
下面语句中错误的语句是(A)。
A. ADD DA_BYTE+2,AX
B. ADD BYTE PTR DA_WORD+1,AL
C. ADD WORD PTR DA1+1,AX
D. ADR1 DW DA_BYTE1
1 A. ADD DA_BYTE+2,AX ; 字节型数据,AX是16位寄存器 2 3 B. ADD BYTE PTR DA_WORD+1,AL ; 已经声明了是字节型数据,可以和AL相加 4 5 C. ADD WORD PTR DA1+1,AX ; 字型数据 6 7 D. ADR1 DW DA_BYTE1 ; 看不懂
7. 将CX 寄存器清零,下面指令中错误的指令是(C)。
A. SUB CX,CX B. XOR CX,CX
C. XOR CX,00H D. AND CX,00H
1 XOR 指令:两个寄存器的值相等,则将第一个寄存器清零
8. 已知(AX)=1111H,执行下述三条指令后,(AX)的值是(D)。
MOV BX,AX
NEG BX
ADD AX,BX
A. 1111 B. 2222 C. 1110CH D. 0000H
1 MOV BX,AX ; AX = 1111H,BX = 1111H 2 3 NEG BX ; 求补 BX = 0EEEFH 4 5 ADD AX,BX ; AX = AX + BX = 0000H
9. DA DW ‘AB’在存储器中的存储顺序是( )。
A. 41H,42H B. 42H,41H
C. 0041H,0042H D. 0042H,0041H
1 因为是字型数据,一个英文字符占一个字节,两个整好是一个字 2 在前面的在高位字节,后面的在低位字节
10. 假设数据段中数据定义如下:
DA_BYTE DB 56
DA_WORD DW 10 DUP(?)
实现将DA_BYTE 单元的内容与DA_WORD 开始的第三个字节单元内容相减的指令是( )。
A. SUB DA_BYTE,DA_WORD BYTE PTR DA_WORD+3
B. MOV AL,DA_BYTE
SUB AL,BYTE PTR DA_WORD+2
C. MOV AL,DA_BYTE
SUB AL,DA_WORD+2
D. MOV AL,DA_BYTE
SUB AL,DA_WORD+3
1 DA_WORD和DA_BYTE,代表当前的第一个字节/字
11. LOP: MOV DL,[SI]
MOV [DI],DL
INC SI
INC DI
LOOP LOP
与上述程序段完成同样功能的一条指令是(B)。
A. REP LODSB B. REP MOVSB
C. REP STOSB D. REP SCASB
12. 下面数据定义伪指令中错误的语句是( )。
A. DB ‘ABCD’ B. DW 0ABCDH
C. DW ‘ABCD’ D. DW ‘AB’
1 DW 后面的字符串,最多,只能是两个字符。 2 两个以上字符,只能用 DB。
13. DAR1 DB 10H,20H,30H
DB $ -DAR1
DAR2 DB 40H,50H,60H
…
MOV SI,OFFSET DAR1
MOV CL,4[SI]
MOV CH,LENGTH DAR2
上述指令序列运行后,CX 的内容是(D)。
A. 0103H B. 0304H
C. 0104H D. 0140H
1 SI = 0 2 3 CL = [4] =40H 4 5 CH = 1
14. MOV AL,96H
MOV BL,12H
MUL BL
执行上述指令后,结果是(B)。
A. AX=1152,OF=1,CF=1 B. AX=0A8CH,OF=1,CF=1
C. AX=0A82H,OF=0,CF=1 D. AX=F88CH,OF=1,CF=1
1 相乘的两个数:要么都是8位,要么都是16位。 2 3 8 位: AL中和 8位寄存器或内存字节单元中;结果保存在AX中。 4 5 16 位: AX中和 16 位寄存器或内存字单元中;结果保存在DX(高位)和AX(低位)中。
15. MOV BL,67
ADD BL,0BDH
上述指令执行后,相关标志的值为(A)。
A. CF=1,SF=0,ZF=1,OF=0 B. CF=0,SF=1,ZF=0,OF=1
C. CF=1,SF=1,ZF=0,OF=0 D. CF=0,SF=0,ZF=1,OF=0
1 MOV BL,67 ; 43H 2 3 ADD BL,0BDH ; BL=BL+BD=00H ==> CF=1,SF=0,OF=0,ZF=1
16. 下述指令中对标志寄存器PSW 中标志位不产生影响的指令是(D)。
A. INC SI B. TEST AL,0FH
C. SAR BL,1 D. JMP LOP
18. 数据定义如下:
X1 DB 10H,50,1 ; 0~2
X2 DW 10H,20,3 ; 3~8
X3 DD? ;9~12
COUNT EQU X3-X1
变量COUNT 的值是( )。
A. 6 B. 8 C. 9 D. 10
1 X1,X2,X3分别代表着每一个类型的第一个数据的内存地址 2 3 X1=0 4 5 X2=3 6 7 X3=9 8 9 COUNT=X3-X1=9
19. 下列指令中,语法正确的指令是(C)。
A. ADD [BX],5
B. DEC [BX]
C. MOV BYTE PTR[BX],8
D. MOV AL,BX
1 [BX]这种的要声明byte ptr/word ptr
20. 已定义变量ADR DW 200 DUP(0),则指令MOV CX,LENGTH ADR 的等效指令是(B)。
A. MOV CX,100 B. MOV CX,200
C. MOV CX,400 D. MOV CX,100 DUP(0) B
二、填空题(每空1 分,共5 分)
名词解释:请将1~3 小题的叙述与下面的词语联系起来,在括号内填入对应的A、B 或C。
1. 逻辑段的起始地址是(C)。
2. 相对于段起始地址的偏移量是(B)。
3. CPU 发出的访问存储器的地址是(A)。
词语:A. 物理地址 B. 偏移地址 C. 段地址
4. 若(SP)=0FFFEH,则指令POP AX 执行后,(SP)= 0000H 。
5. 回送变量或标号的偏移地址值,应使用 offset 伪指令。
三、简答题(每小题2 分,共6 分)
1. 有符号定义语句如下:
DAW DW ? 0~1
NAME DB 16 DUP(?) 2~17
COUNT DD ? 18~21
LENTH EQU $ -DAW 22
试问LENTH 的值为多少?
$=当前偏移地址=22,所以$-DAW=19
2. 根据要求写出汇编语言的指令。
(1)用寄存器BX 和位移量0ABH 的寄存器相对寻址方式,把存储器中的一个字与CX 寄存器相加,并把结果送回存储器单元中。
ADD [BX+0ABH],CX
(2)把数0F9H 与(AL)相加,结果送回AL 中。
ADD AL,0F9H
3. 请指出下述两条伪指令语句的区别:
COUNT1 EQU 16H
COUNT2=16H
COUNT1 不允许重复赋值
COUNT2 允许
四、程序分析题(每小题5 分,共35 分)
1. 有如下程序段:
1 DAT1 DB 30 DUP(?) 2 3 DAT2 DB 10 DUP(?) 4 5 … 6 MOV CX,10 ; 循环十次,将DTA1的后10个字节型数据,复制到DAT2中 7 8 MOV BX,20 9 10 MOV SI,0 11 12 MOV DI,0 13 14 NEXT: MOV AL,DAT1[BX][SI] ; (AL)=DAT1[20] 15 16 MOV DAT2[DI],AL ; DAT2[0]=(AL) 17 18 INC SI 19 20 INC DI 21 22 LOOP NEXT
试问:上述程序段完成什么功能?
2. 有如下代码段:
DATA SEGMENT
ORG 0100H
DAR DW 0FF00H
(1)MOV AX,DAR
(2)MOV AX,OFFSET DAR
试问:(1)上述两条指令有什么区别?
(1)将0100H位置的值赋给AX寄存器 (2)将0100H位置的偏移量赋给AX寄存器
(2)指令分别执行后,AX 寄存器的内容各是什么?
第1条指令:(AX)=0FF00H
第2条指令:(AX)=0100H
3. 若(AX)=0A33AH,(DX)=0F0FH
1 ; (AX)=1010 0011 0011 1010 (DX)=0000 1111 0000 1111 2 ; (AH)=1010 0011 (DL)=0000 1111 3 4 AND AH,DL ; (AH)=0000 0011=03H 5 6 XOR AL,DH ; (DH)=0000 1111 (AL)=0011 1010 ==> AL=0011 0101 7 8 NEG AH ; 求补 ==> FDH 9 10 NOT AL ; 取反 ==> CAH 11 12 so (AX) = 0FDCAH
上述程序段执行后,AX 寄存器中的内容是多少?
4. 设(AX)=0FC77H,(CX)=504H,(CF)= 1
SAR AX,CL
XCHG CH,CL
SHL AX,CL
1 SAR AX,CL ; 算数右移4位 ==> 1111 1111 1100 0111B 2 3 XCHG CH,CL ; 交换CH和CL的位置 4 5 SHL AX,CL ;逻辑左移5位 ==> 1111 1000 1110 0000 =F8E0
上述程序段执行后,(AX)= F8E0 ,(CF)= 1 。
5. 有如下程序段:因为是字型数据,所以它增加偏移量是一次+2,才到下一个数据
1 DATA SEGMENT 2 3 DA1 DW ? 4 5 DA2 DW 24 6 7 DA3 DW 340,60,50 8 9 DATA ENDS 10 11 … 12 13 MOV BX,OFFSET DA3 14 15 MOV AX,[BX] ; AX=340 16 17 MOV DA2,AX ; DA2 DW 340 18 19 MOV AX,2[BX] ; AX=60 20 21 ADD AX,DA2 ; AX=340+60=400 22 23 MOV DA1,AX ; ?=400
上述程序段执行后,DA1 单元的内容是什么?
6. 已知数据定义如下:
1 DA1 DW 1384H 2 3 DW 2578H 4 5 DA2 DW 9087H 6 7 DW 3456H 8 9 … 10 11 MOV DX,DAl+2 ; (DX)=2578H,被除数高位 12 13 MOV AX,DA1 ; (AX)=1384H,被除数低位 14 15 DIV DA2 ; 将双字数据DA1 除以字数据DA2
请问上述程序段完成什么功能?
7. 有如下程序段:
1 MOV AX,2 ; (AX=02H) 2 3 MOV BX,80H ; (BX=80H) 4 5 MOV CL,03H ; (CL=03H) 6 7 SHL AX,1 ; 逻辑左移一位 ==> (AX)=4H 8 9 SHR BX,1 ; 逻辑右移一位 ==> (BX)=40H 10 11 ROL AX,CL ; 循环左移3位(循环左移,将移出的补到低位)(AX)=0020H=0000 0000 0010 0000B 12 13 ROR BX,CL ; 循环右移3位 (BX)=0008H=0000 0000 0000 1000B 14 15 XOR AX,BX ; 亦或操作:同为0,异为1 (AX)=0000 0000 0010 1000B=0028H
问:上述程序段执行后,(AX)= 0028H 。
五、程序填空题(每小题6 分,共12 分)
1. 下列程序段实现1+2+3+…+100 的累加和。试在空白处填上适当的指令(每空白处只填一条指令)。
1 __mov cx,99__ 2 3 MOV AX,1 4 5 MOV BX,2 6 7 LOP: ADD AX,BX 8 9 INC BX 10 11 __loop lop__
2. 以ARRAY 为起始的单元数据区中存放N 个带符号的数字,分别统计其中正数和负数的个数,试在空白处填上适当的指令(每空白处只填一条指令)。
1 DATA SEGMENT 2 3 ARRAY DB 12H,94H,86H,78H,90H ; 0~4 4 5 DB 54H,0ABH,81H,34H,61H ; 5~9 6 7 CUNT EQU $ - ARRAY ; 10 cunt=10-0=10 8 9 DA1 DB ? ; 11 10 11 DA2 DB ? ; 12 12 13 DATA ENDS 14 15 … 16 MOV BX,OFFSET ARRAY ; (BX)=0 17 18 MOV CX,CUNT ; (CX)=10 19 20 LOP1: MOV AL,[BX] ; (AL)=[0]=12H 21 22 __CMP AL,0__ 23 24 JGE LOP2 ; jge 大于等于,jle小于等于 25 26 __INC DL__ 27 28 JMP LOP3 29 30 LOP2: JZ LOP3 31 INC DH 32 33 LOP3: DEC CX 34 35 __JNZ LOP1__ ; 不等于0的时候转移 36 37 MOV DA1,DL 38 39 MOV DA2,DH 40 41 HLT
六、编制程序题(本大题共3 小题,共22 分)
1. 已知存储器中有一个首地址为ARRAY 的200 个字数组,现在要求把数组中的每个数加1(不考虑溢出),试编写完成此功能的程序段。(5 分)
1 MOV CX,200 2 3 s:MOV BX,offset ARRAY 4 MOV AX,[BX] 5 INC AX 6 MOV [BX],AX 7 INC BX 8 INC BX 9 LOOP s
2. 编写程序段,将附加段中的一个字节变量COUNT 送给AL 寄存器。(5 分)
mov bx,offset count mov al,es:[bx]
3. 以ARAAY 为起始地址的字节存储单元中存放有N 个有符号数据,请编写程序找出其中最大值和最小值分别送入BL 和AL 寄存器中。(12 分)
1 ASSUME CS:CODE,DS: DATA 2 DATA SEGMENT 3 ARRAY DB 25,33,98,-2…… ;N 个有符号数字 4 COUT EQU $ -ARRAY 5 DATA ENDS 6 7 CODE SEGMENT 8 START:MOV AX,DATA 9 MOV DS,AX 10 11 LEA SI,ARRAY ; mov si,offset ARRAY 12 MOV CX,COUT ; 循环次数 13 XOR AX,AX ; mov ax,0 14 MOV BL,AL ; bl=al=00H 15 16 LOP1: CMP AL,[SI] 17 JGE LOP2 ; 大于等于跳到lop2 18 MOV AL,[SI] ; 否则将al修改为当前[si] 19 JMP LOP3 20 21 LOP2: CMP BL,[SI] ; 小于等于跳到lop3 22 JLE LOP3 23 MOV BL,[SI] ; 否则将bl修改为当前[si] 24 25 LOP3: INC SI 26 LOOP LOP1 27 28 MOV AH,4CH 29 INT 21H 30 CODE ENDS 31 END START
min=0,max=0 for i in array: if i > max: max = i elif i < min: min = i