汇编语言设计复习题.docx
《汇编语言设计复习题.docx》由会员分享,可在线阅读,更多相关《汇编语言设计复习题.docx(15页珍藏版)》请在冰豆网上搜索。
汇编语言设计复习题
一、选择题
1.应用程序具有3个基本段,可执行指令应该保存于( A )。
A)代码段 B)数据段 C)堆栈段 D)附加段
2.8位补码F3H要扩展成16位补码应该是( D ),这样其真值才不变。
A)F0F3H B)00F3H C)10F3H D)FFF3H
3.“mov[ebx+8],eax”指令的目的操作数采用( C )寻址方式。
A)存储器间接B)寄存器 C)寄存器相对 D)立即数
4.执行“sarebx,1”指令后,ebx最高D31位一定等于( D )
A)0 B)1 C)D0位 D)D30位
5.在代码段内的-128~127个字节前后范围的跳转,可以用( C )类型名表示。
A)WORD B)DWORD C)SHORT D)FAR
6.在Windows控制台环境,在当前光标显示信息应该使用( B )函数(功能)。
A)ReadConsole B)WriteConsole
C)MessageBox D)GetStdHandle
7.汇编语言源程序经汇编后不能直接生成( C )
A)OBJ文件 B)LST文件 C)EXE文件 D)CRF文件
8.在ADD指令中,两个操作数的物理位置不可以安排在( A )中。
A)两个主存储单元
B)一个主存储单元和一个数据寄存器
C)两个数据寄存器
D)一个堆栈单元和一个数据寄存器
9.假定ax=6987h,执行指令cmpax,0eb30h后,则标志位CF和OF的状态( C )。
A)0,0 B)0,1 C)1,0 D)1,1
10.假定esp=00120100h,eax=1f6c2107h,执行指令pushax后,存放数据07h的物理地址是( C )。
A)00120104hB)00120101h C)001200fch D)001200ffh
11.下列对标志寄存器中标志位产生影响的指令是( B )
A)jmp done B)shl eax,2
C)call subp D)not eax
12.假设CL=98H,执行“MOVSXDX,CL”后,DX=( D )
A)F098H B)0098H C)1098H D)FF98H
13.“mov80h[esi],eax”指令的目的操作数采用( C )寻址方式。
A)存储器间接B)寄存器 C)寄存器相对 D)变址寻址
14.要在程序中定义缓冲区BUF,保留9个字节存储空间的语句是(C )。
A)BUF DW 9 B)BUF DB 9
C)BUF DB 9DUP(?
) D)BUF DW 9DUP(?
)
15.下列指令执行后总是使CF=0,OF=0的是( A )。
A)AND B)NEG C)MOV D)INC
16.下面指令的表示中,错误的操作是( C )
A)mov eax,[ebx+esi] B)jmp nearptrdon1
C)dec [ebx] D)mul cx
17.测试BL寄存器内容是否与数据4FH相等,若相等则转NEXT处执行,可实现的方法是( A )
A)xorbl,4fh B)testbl,4fh
jznext jznext
C)andbl,4fh D)orbl,4fh
jznext jznext
18.下列寄存器组中在段内寻址时不可以提供偏移地址的寄存器组是( C )
A)ECX,EBX B)EDI,EBP
C)EIP,EAX D)EDX,ESI
19.若要使寄存器AL中的高4位不变,低4位为0,所用指令为( B )
A)AND AL,0FH B)AND AL,0F0H
C)OR AL,0FH D)OR AL,0F0H
20.将汇编语言源程序文件翻译成目标代码文件的过程,称为( A )
A)汇编 B)编辑 C)连接 D)调试
21. ADD求和指令的结果最高位为1,则SF=( B )
A)0 B)1 C)任意 D)不影响
22.子程序最后,通常需要执行的返回指令是( D )
A)LOOP B)JZ C)CALL D)RET
23.“moveax,[ebx][esi]”指令的源操作数采用( A )寻址方式。
A)基址变址 B)寄存器 C)寄存器相对 D)存储器间接
24.若CL=4,AX=0FF0FH,执行语句“ROL AX,CL”后,AX=( C )
A)0FFFFHB)0FFF0H C)0F0FFH D)0FFFH
25.JMP WORD PTR[EBX]转移的目标地址是( D )
A)EBX中的内容 B)ESP+EBX的和
C)EIP+[EBX]之和 D)EBX指示的内存单元的内容
二、填空题
1.IA-32处理器有三种操作模式分别是:
保护模式 、实地址模式、系统管理模式。
2.在实地址工作方式下,逻辑地址“1460H:
100H”表示的物理地址是14700H 。
3.“cmpebx,98”指令之后是“jzagain”指令,发生控制转移的条件是EBX= 98 ,此时ZF= 1 。
4.伪指令“xyzdword67762000h”定义的变量保存于IA-32的存储器中,则从低地址到高地址每个字节依次是 00 、 20 、 76 和 67 。
5. movax,1234h;
xorax,00ffh;
上述两条指令执行后:
ax=12cbh ,CF=OF=0 ,SF=0 ,ZF=0 , PF=0.
6.利用堆栈传递子程序参数的方法是固定的,例如:
寻找堆栈段数据的寄存器是 EBP
7.JMP指令根据目标地址的转移范围和寻址方式,可以分为四种类型:
段内转移、相对转移、段内转移、间接转移 以及段间转移、直接转移 、段内转移、间接转移 。
8.IA-32处理器工作在保护方式时,可以使用 平展 和 段式 存储模型。
9.数据段有语句“VARDWORD99008843H”,代码段指令“MOVCX,WORDPTRVAR”执行后,CX=8843H 。
10.数据段有语句“ABCBYTE1,2,3”,代码段指令“MOVCL,ABC+2”执行后,CL=3 。
11.已知ESI=04000H,EBX=10H,指令“MOVEAX,[ESI+EBX*2+8]中访问的有效地址是 04028H 。
12.假设在平展存储模型下,EBX=1256H,双字变量TABLE的偏移地址是40100H,线性地址41356H处存放40107H,执行指令“JMPEBX”后EIP= 1256H ,执行指令“JMPTABLE[EBX]”后EIP=40107H
13.已知数据段定义如下:
.data
org2000h
vard dword1234h
varw word 3*20
msg byte ’hello!
’,’0’
n1 equ $-msg
count equ 5
buf word countdup(5,3dup(1,2),0)
array dwordvarw
问题:
(1)执行MOVEBX,OFFSETVARD后,EBX= 2000H
(2)执行MOVECX,TYPEBUF后,ECX= 2
MOVEDX,SIZEOFVARD后,EDX= 4
(3)经汇编后,BUF占有的存储空间是 80 字节
(4)经汇编后,$= 200DH ,N1= 7
Array= 2004H
14.执行“SHREBX,4”指令后,JNC发生转移,则说明EBX的D3= 0
15.子程序的参数传递主要有三种,它们是 寄存器传递 、
共享变量传递 、 堆栈传递
三、程序阅读题
1.填写下面指令的执行结果。
moveax,3721h
addeax,9;EAX= 372A H
movebx,50h
subebx,8;EBX= 48 H
movedi,9eh
xoredi,7fh ;EDI= E1 H
2.填写下面指令执行的结果。
moval,82h ;
movsxbx,al ;BX=FF82h
movsxebx,al ;EBX=FFFFFF82h
movcx,1000h ;
movsxedx,cx ;EDX=00001000h
3.填写下面指令执行的结果。
movax,20000
movbl,10
divbl
;以上代码是否产生溢出 是
4.数据段有如下定义,IA-32处理器将以小端方式保存在主存:
var dword 12345678h
现以字节为单位按地址从低到高的顺序,写出这个变量内容。
并说明如下指令的执行结果:
moveax,var ;EAX=12345678h
movcx,wordptrvar+2 ;CX=1234h
movdh,byteptrvar+3 ;DH=12h
5.填写下面指令的执行结果。
moveax,3721h
addeax,9 ;EAX= 372A H
movebx,50h
subebx,8 ;EBX= 48 H
movesi,9eh
andesi,80h ;ESI= 80 H
6.填写下面指令执行的结果。
.data
array dword616h,727h,838h ;假设该变量的存储器地址是40100H
.code
movesi,array+4 ;ESI= 727H
movedi,offsetarray ;EDI= 40100H
movedx,[edi];EDX= 616H
pusharray+8 ;array+8= 838H
popecx ;ECX= 838H
7.分析下面程序段:
moveax,2000h
movebx,5000h
mov[ebx+100h],60h
addeax,[ebx+100h]
leaesi,[ebx+100h]
mov ebx,eax
程序段执行后,ESI= 5100 H,EBX= 2060 H
8.填写下面指令的执行结果。
moveax,3721h
addeax,9;EAX= 372A H
movebx,50h
subebx,8;EBX= 48 H
movesi,9eh
andesi,80h ;ESI= 80 H
9.填写下面指令执行的结果。
moveax,0ffh
movebx,1000h
callsub1
inceax
decebx
;子程序
sub1 proc
addeax,ebx
xchgeax,ebx
ret
sub1 endp
程序段执行后,EAX= 1001 H,EBX= 10FE H。
四、语句填空题
1.在下面程序段实现下述功能:
求:
z=|x-y|,设x,y,z分别为双字数据的无符号变量名称。
mov eax,x
cmp eax,y
jb below
subeax,y
mov z,eax
below:
mov eax,y
subeax,x
done:
movz,eax
2.下列程序段将EAX中值乘以9,请将程序填写完整。
push eax
shl eax,3
pop ebx
add eax,ebx
3. 以下程序段用于计算符号函数。
的取值范围为32位的有符号数,试填写方框中的指令。
mov eax,x
cmp eax,0
jz zero
js nega
mov eax,1
jmp ok
zero:
xor eax,eax
jmp ok
nega:
mov eax,0ffffffffh
ok:
mov y,eax
4.下列程序段求数组ARRAY的累加和。
请将程序填写完整。
array word 45h,68h,………….,0abc1h,9600h;
mov esi,offsetarray
mov ecx,lengthofarray
xor eax,eax
again:
add eax,[esi]
add esi,2
loop again
5.已知从BUF单元起存有若干带符号数,将其中的正数找出并存入PLUS单元,负数存入MINUS单元,把下列程序填充完整。
.data
buf dword 12,-2,555,1000,-80,-2000,6,99,-111,-235
cn equ $-buf
plus dword cn dup(?
)
minus dword cn dup(?
)
.code
start:
mov esi,0
mov edi,offset plus
mov ebx,offset minus
mov ecx,cn
next:
mov eax,buf[esi*(typebuf)]
inc esi
test eax,800000000h
jnz pp
mov [edi],eax
add edi, 4
jmp lp
pp:
mov [ebx],eax
add ebx, 4
lp:
loop next
6.以下程序段用于计算符号函数。
的取值范围为32位的有符号数,试填写方框中的指令。
mov eax,x
cmp eax,0
jz zero
js nega
mov eax,1
jmp ok
zero:
xor eax,eax
jmp ok
nega:
mov eax,0ffffffffh
ok:
mov y,eax
五、编制程序题
1. 求 的绝对值,结果存入result单元中。
.data
Xdword100
Ydword200
resultdword?
.code
start:
moveax,x
subeax,y
jnsAl
negeax
Al:
movresult,eax
endstart
2.编写程序从键盘接受两个有符号十进制数A和B,将它们按照大小顺序显示。
;本题答案没有,自己写的,而且没有考虑溢出情况(就是懒),没调试,错了不管
.data
msgbyte13,10,0
.code
callreadsid
movebx,eax
callreadsid
cmpeax,ebx
jnshehe
pusheax
moveax,ebx
popebx
hehe:
calldispsid
moveax,offsetmsg
calldispmsg
moveax,ebx
calldispsid
3.编写一个程序片段,首先测试双字变量DVAR的最高位,如果为1,则显示字母”L”;如果最高位不为1,则继续测试最低位,如果最低位为1,则显示字母”R”,如果最低位也不为1,则显示字母”M”。
字符显示子程序为dispc,它具有显示AL寄存器中ASCII字符的功能。
.code
moveax,dvar
shl eax,1
jc one
movebx,dvar
shr ebx,1
jc two
moval,‘R’
jmpdone
two:
moval,‘M’
jmpdone
one:
moval,‘L’
done:
calldipsc