《汇编语言程序设计》期末复习题及答案
一、选择(30题)
1.下列是8位带符号二进制数的补码,其中最大的是( B )。
A、10001000
B、00000001
C、00000000
D、11111111
2.在一段汇编语言程序中多次调用另一段程序,用宏指令比用子程序实现。
( C )
A、占内存空间小,但速度慢
B、占内存空间相同,速度快
C、占内存空间大,但速度快
D、占内存空间相同,速度慢
3.数据定义为:EE DB 3,4
CC DW 3456H,6789H
执行指令“MOV CX,WORD PTR EE+1”后,(CX)= ( B )
A、0304H
B、5604H
C、3404H
D、3456H
4.有如下指令序列:
MOV AL,95H
MOV CL,2
SAR AL,CL
上述指令序列执行后,AL的内容是( D )
A、05H
B、25H
C、24H
D、0E5H
5.设A=18610,B=2738,C=0BB16,把这三个数看成无符号数,则它们之间的关系是( D )。
A、A>B>C
B、 A
C、A=B=C
D、A
6.用一条指令实现寄存器BX和SI的内容相加,并将结果送入AX中,这条指令是( D )。
A、ADD AX,[BX][SI]
B、MOV AX,[BX][SI]
C、AND AX,[BX][SI]
D、LEA AX,[BX][SI]
7.要从端口1234H中读入8位数据,其指令应是( C )。
A、MOV DX,1234H
OUT DX,AL
B、IN AX,1234H
C、MOV DX,1234H
IN AL,DX
D、OUT DX,1234H
8.循环控制指令LOOPNZ/LOOPNE继续执行循环的条件是( B )。
A、CX≠0且ZF=1
B、CX≠0且ZF=0
C、CX≠0或ZF=1
D、CX≠0或ZF=0
9.8088/8086存储器分段,每个段不超过( D )。
A、64K个字
B、32K个字节
C、1M个字节
D、64K个字节
10.表示过程定义结束的伪指令是( A )。
A、ENDP
B、ENDS
C、END
D、ENDM
11.用来存放下一条将要执行的指令代码段地址的段寄存器是( D )。
A、SP
B、DS
C、ES
D、CS
12.假定(SS)=1000H,(SP)=0100H,(AX)=5609H,执行指令PUSH AX后,存放数据56H的物理地址是( D )。
A、10102H
B、10101H
C、100FEH
D、100FFH
13.执行“SUB AX,[BP][DI]”指令,取源操作数时,使用的物理地址表达式是( A )。
A、16*SS+BP+DI
B、16*ES+BP+DI
C、16*DS+BP+DI
D、16*CS+BP+DI
14.设AX中有一带符号数8520H,执行“SAR AX,1”指令后,AX中的值是( C )。
A、4290H
B、0A40H
C、0C290H
D、0C260H
15.设(BX)=1234H,(DS)=2000H,(21234H)=5678H,则指令“LEA SI,[BX]”执行后的结果是:( B )。
A、SI=5678H
B、SI=1234H
C、SI=2000H
D、SI=3234H
16.测试BL中的数是否为负数,若为负数则转移至AA1处,横线处的指令应为( A ) TEST BL,80H
AA1
A、JNE
B、JZ
C、JC
D、JNC
17.设DF=0,(SI)=20H,(CX)=10,执行“REP LODSW”指令后,SI中的内容是( C )。
A、20H
B、30H
C、34H
D、40H
18.在程序执行过程中,IP寄存器中始终保存的是( B )。
A、上一条指令的首地址
B、下一条指令的首地址
C、正在执行指令的首地址
D、需计算有效地址后才能确定地址
19.设SP初值为2000H,执行指令“POP AX”后,SP的值是( A )。
A、2002H
B、1998H
C、1FFFH
D、1FFEH
20.若AX=3500H,CX=56B8H,当AND AX,CX指令执行后,AX=( A )。
A、1400H
B、77F8H
C、0000H
D、0FFFFH
21.汇编源程序时,出现语法错误的语句是( A )。
A、MOV DS,1200H
B、MOV AX,[BP+DI]
C、MOV [BX],BX
D、MOV ES,AX
22.将数据1234H存放在存储单元中的伪指令是( C )。
A、DATA1 DW 3412H
B、DATA1 EQU 1234H
C、DATA1 DB 34H,12H
D、DATA1 DB 34H,00H,12H,00H
23.下面指令执行后,可能改变AL寄存器内容的指令是( D )。
A、TEST AL,02H
B、OR AL,AL
C、CMP AL,BL
D、AND AL,BL
24.操作数地址存放在寄存器的寻址方式称为( B )。
A、立即寻址
B、寄存器间接寻址
C、直接寻址
D、寄存器寻址25.用户为了解决自己的问题,用汇编语言所编写的程序,称为( B )。
A、汇编程序
B、汇编语言程序
C、可执行程序
D、目标程序26.用DOS功能调用时,子功能调用的编号应放在( C )。
A、AL
B、AX
C、AH
D、任意指定
27.提供串指令中目的操作数地址的是( C )。
A、SS:[BP]
B、DS:[SI]
C、ES:[DI]
D、CS:[IP]
28.在寄存器间接寻址方式下,能够提供有效地址的寄存器有( B )。
A、AX,BX,CX,DX
B、BX,BP,SI,DI
C、SP,IP,BP,DX
D、CS,DS,ES,SS
29.已知某操作数的物理地址是2117AH,则它的段地址和偏移地址可能是( A )。
A、2025∶0F2A
B、2108∶00EA
C、2000∶017A
D、2100∶117A
30.中断向量表中的每个中断向量所占内存空间为:( B )。
A、2个字节
B、4个字节
C、8个字节
D、依该中断子程序的大小而定
二、填空(30题)
1.在用直接寻址方式寻址操作数时,系统对段地址的默认值在段寄存器 DS 中。2.与指令“NEG AX”功能等效的两条指令依次是 NOT AX 和 INC AX 。3.语句“VAR DB 3 DUP(3,3 DUP(3))”经过汇编后应分配 12 个字节单元。4.指令“MOV AX,SEG VAR”的执行,是把变量VAR的段地址送到AX中。5.设(DS)=1000H,(ES)=2000H,(SS)=3000H,(BP)=4000H。
计算下列各指令中源操作数的物理地址:
MOV AX,[1000H] 物理地址 11000H
MOV AX,ES:[BP] 物理地址 24000H
6.变量和标号均具有三种属性,即:段属性、偏移属性、类型属性。7.在做乘法运算时,如果是做字运算,乘积放在 DX 和 AX 两个寄存器中,做除法运算时,若做字节运算,余数放在 AH 中,商放在 AL 中。
8.用以访问存储器操作的地址表达式中,只要出现BP寄存器,系统就默认以段寄存器 SS 的内容作为存储器操作数的段地址。
9.在数据段或代码段的最开始,常用伪指令“ORG n”来定义本段的偏移地址初值,该初值的范围是 0000H~FFFFH 。
10.指令“CWD”能实现对某寄存器中内容进行扩展,该寄存器是: AX 。11.8088/8086CPU能寻址的最大存储空间为1MB,因此CPU的地址总线是 20 条。12.在应用串处理指令MOVSB时,源串首地址存放在寄存器 SI 中,目的串首地址存放在寄存器 DI 中,并且目的串必须在附加段中,执行串处理指令时,用方向标志位DF控制地址自动增减,数据串的长度存放在寄存器 CX 中。
13.程序状态字PSW中的ZF位,当结果为0时,ZF= 1 ,结果为1时,ZF= 0 。
14.十六进制数0D6H,当把它看作无符号数时,它表示的十进制正数为 214 ,当把它看作带符号数时,它表示的十进制负数为 -42 。
15.IBM PC机中用来存放段地址的段寄存器有四个: CS 、 DS 、 SS 、 ES 。
三、判断题(15题)
1.SHL AL,2 (错)
2.INC 2 (错)
3.ADD BX,1 (对)
4.MOV [SI][DI],BX (对)
5.SUB BX,CL (错)
6.OUT 34H,AL (对)
7.IN AL,0AH (对)
8.MOV CX,[SP] (错)
9.MUL AL (对)
10.SUB BX,BP (对)
11.MOV DS,SEG VARY (错)
12.MOV VARY[SI],ES:BL (错)
13.CMP BLOCK,[100H] (错)
14.宏调用时实元和哑元的个数可以不一致。(对)
15.REP STOSB (对)
四、写程序段(9题)
1.计算8*9,并将乘积送SI。
mov al,8
mov bl,9
mul bl
mov si,ax
2.计算35/6,商存于BL中,余数存于CL中。
mov ax,35
mov bl,6
div bl
mov cl,ah
3.输入一个字母,然后输出它的后继字母(不考虑输入字母是Z的情况)。
mov ah,01h
int 21h
inc al
mov dl,al
mov ah,02h
int 21h
4.从端口35H读入一个字节数据,将该数的第3位置1后(其余位不变),再写回端口35H。(说明:最低位为第0位)
in al,35h
or al,08h
out 35h,al
5.定义数据段NUM,数据段中的数据按下列要求依次存储:
(1)变量X,类型为字节,初值为17 ;
(2)数组变量M,类型为字,所占空间为100H个单元;
(3)变量MSG,存储字符串"LUCKY"。
NUM segment
X db 17
M dw 100h dup(?)
MSG db ‘LUCKY’
NUM ends
6.寄存器BX中存放着一个带符号数,求出其绝对值,结果还放在BX中。
cmp bx,0
jg L1
neg bx
L1:…
7.对存放在(DX,AX)中的双字数据作求补运算。
not dx
not ax
add ax,1
adc dx,0
8.计算5!,结果存于寄存器SI中。
mov cx,5
mov al,1
mov bl,1
L1:mul bl
inc bl
loop L1
mov si,ax
9.定义一个名字为ADDXYZ的宏,实现W X+Y+Z。(注:所有数据均为字类型) ADDXYZ MACRO X,Y,Z,W
mov ax,x
add ax,y
add ax,z
mov w,ax
endm
五、写程序(9题)
1.从键盘输入一个字符串(长度不超过30),统计字符串中非数字的个数,并将统计的结果存入字单元COUNT中,用EXE格式实现。
data segment str db 30,?,30 dup(?)
count db 0
data ends
code segment
assume cs:code,ds:data main proc far
start:
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
lea dx,str
mov ah,0ah
int 21h
mov cl,str+1
mov ch,0 mov si,2
L3:
cmp str[si],30h jae L1
inc count
jmp L2
L1:
cmp str[si],39h jbe L2
inc count
L2:
inc si
loop L3
ret
main endp
code ends
end start
2.统计一个16位二进制数中1的个数,并将结果输出,用COM格式实现。
code segment
org 100h
assume cs:code
main proc near start:
mov bx,0a39h
mov si,0
mov cx,16
next:
shr bx,1
jnc l1
inc si
l1:
loop next
mov dx,si
add dx,30h
cmp dl,3ah
jb l2
add dl,7
l2:
mov ah,02h
int 21h
mov ax,4c00h
int 21h
main endp
code ends
end start
3.从键盘输入两个一位十进制数,求它们的和,并将结果以十进制形式输出。(只考虑和小于10的情况)
code segment
assume cs:code main proc far start: push ds mov ax,0 push ax mov ah,01
int 21h
mov bl,al
mov ah,01
int 21h
mov bh,al
sub bx,3030h add bl,bh
mov dl,bl
add dl,30h
mov ah,02
int 21h
ret
main endp
code ends end start
4.从键盘输入一个十进制个位数,在屏幕上显示相应数量的该数。
例如,输入3,屏幕上将显示“333”。
code segment
assume cs:code main proc far push ds
mov ax,0
push ax
mov ah,01h
int 21h
mov bl,al
sub al,30h cbw mov cx,ax L1:
mov ah,02h mov dl,bl int 21h
loop L1
ret
main endp code ends
end main
5.求100以内所有奇数的和,存于字变量X中。
data segment
x dw ?
data ends
code segment
assume cs:code,ds:data main proc far
start:
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax mov ax,0 mov bx,1 mov cx,50 L1:add ax,bx add bx,2 loop L1 mov x,ax ret
main endp code ends
end start
6.将BX中的数以二进制形式在屏幕上显示出来。
code segment assume cs:code
main proc far start:
mov bx,1234h mov cx,16
L1: mov dl,30h shl bx,1
jnc L2
inc dl
L2: mov ah,02h int 21h
loop L1
mov ax,4c00h int 21h main endp code ends
end start
7.字节数组X中存放着 0~F共16个十六进制数,请将这些数以十六进制形式显示在屏幕上。
data segment
x db 0,1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh data ends
code segment
assume cs:code,ds:data
main proc far
start:
mov ax,data
mov ds,ax
mov cx,16
mov si,0
L1: mov dl,x[si]
add dl,30h
cmp dl,39h
jbe L2
add dl,7
L2:mov ah,02h int 21h
inc si
loop L1
mov ax,4c00h int 21h
main endp code ends
end start
8.从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来。
data segment
array db 45,67,75,82,90,29,80,26,63,59 min db ?
data ends
stack segment stack
dw 10 dup(?)
stack ends
code segment assume
cs:code,ds:data,ss :stack
main proc far start:
mov ax,data mov ds,ax
mov cx,10
mov al,255
mov si,0
mov di,0
L1: cmp al,array[si] jbe L2
mov al,array[si] L2: inc si
loop L1
mov min,al
mov ah,0
mov cx,3
L3: mov bl,10
div bl
mov dl,ah
push dx
inc di
mov ah,0
cmp ax,0
jz L4
loop L3
L4: mov cx,di L5: pop dx
add dl,30h mov ah,02h int 21h
loop L5
mov ax,4c00h int 21h
main endp code ends
end start
9.设在起始地址为STRING的存储空间存放了一个字符串,统计字符串中字符“A”的个数,并将结果存放到RESULT字节单元中。
data segment
string db 'assembly' len dw $-string
result db 0
data ends
code segment
assume cs:code,ds:data main proc far
start:
mov ax,data
mov ds,ax
mov cx,len
lea si,string
L1: lodsb
cmp al,'a'
jnz L2
inc result
L2: loop L1
mov ax,4c00h
int 21h
main endp
code ends
end start