汇编语言期中试题答案.docx
《汇编语言期中试题答案.docx》由会员分享,可在线阅读,更多相关《汇编语言期中试题答案.docx(17页珍藏版)》请在冰豆网上搜索。
![汇编语言期中试题答案.docx](https://file1.bdocx.com/fileroot1/2022-11/23/0f21b4bc-0aa3-459d-b506-9be0d498bd2c/0f21b4bc-0aa3-459d-b506-9be0d498bd2c1.gif)
汇编语言期中试题答案
班级软件2班学号20112723姓名林苾湲
密封装订线密封装订线密封装订线
z西南交通大学2012-2013学年第
(二)学期中期试卷
课程代码3200514课程名称汇编语言程序设计考试时间120分钟
题号
一
二
三
四
五
六
总成绩
得分
阅卷教师签字:
(注意:
请将所有题的答案写在答题纸上,直接写在考卷上不给分)
一、填空题(答案填在横线上,每空1分,共10分)
1.堆栈段的段地址保存在ss寄存器,栈顶指针保存在sp寄存器。
2.某计算机的机器字长为16,其十进制数-10的二进制数补码是:
111111*********0。
3、80386有哪几种工作方式:
实模式、保护模式、虚拟8086模式。
4.有效地址可以由以下四种成分组成,分别是位移量、基址、变址、比例因子。
二、选择题(将答案的编号填在题后的括号内,每题2分,共20分)
1.两个带符号数分别保存在AX和BX寄存器中,且AX>BX,当执行指令CMPAX,BX之后,OF和SF的值为(
(1)).
(1)相同
(2)不同(3)无法确定(4)SF=0,OF=1
2.指令MOVAX,[BX][SI]的寻址方式是(
(1)).
(1)基址变址寻址
(2)间接寻址(3)相对的基址寻址(4)相对的基址变址寻址
3.如果SP=20H,在执行指令PUSHAX之后,SP的值为((4)).
(1)22H
(2)18H(3)1EH(4)1DH
4.如果CONSTEQU0ABCDH,在执行MOVAH,HIGHCONST指令后,AH的值为(
(2)).
(1)0AH
(2)0ABH(3)0CDH32(4)0BCH
5.某程序在数据段定义了某变量Arraydw200DUP(100),在程序中执行MOVCX,Array之后,CX寄存器的值为:
(
(1))
(1)100
(2)200(3)400(4)2
6.下面哪个段寄存器通常用于存放数据((4))
(1)ES
(2)CS(3)SS(4)DS
7.如果在程序中须使用386以后的32位寄存器,则需要在该指令之前进行说明,可采用伪指令(
(1))
(1).386
(2).8086(3).Use32(4)Use32
8.下面哪一个字符串不是汇编语言保留字(
(2)).
(1)ALPHA
(2)ALPH(3)CLD(4)LOOP
9.下面在数据段中定义的标识符中哪一个是合法的标识符((4))
(1)Add
(2)23AC(3).ab(4)$50H
10.下面哪条语句可用于表示子程序返回((3))
(1)ENDM
(2)ENDP(3)RET(4)END
三、判断下面的8086指令是否有误。
若有错,请指明错误原因,并修改使其完成相同操作(可用多条指令,每题2分,共10分)
1.MOVAX,BH
解:
错误,源/目的操作数长度不一致
改为:
MOVAH,BH
2.MOV[2000H],AX
解:
正确
3.MOV[AX],BX
解:
错误,对于内存单元,必须指明其长度
改为:
MOVWORDPTR[AX],BX
4.MOVBYTEPTR[BX],1234H
解:
错误,源/目的操作数长度不一致
改为:
MOVWORDPTR[BX],1234H
5.MOV[DI],[SI]
解:
错误,源/目的操作数不能同时为内存单元
改为:
MOVAX,WORDPTR[SI]
MOVWORDPTR[DI],BX
四、简答题(共35分)
1.已知某程序的数据段定义如下,请用图表示其在内存中的存放形式(以16进制数形式表示)。
DataSegment
Var1DB-10,2DUP(20H,30H)
Var2EQU$-Var1
Var3dw20H,1122H
Var4DD0FEH
Var5DB2DUP(20H,-1,2DUP(-2,03H))
Dataends
解:
11110110B
20H
30H
20H
30H
20H
00H
22H
11H
0FEH
00H
00H
00H
20H
11111111B
11111110B
03H
11111110B
03H
20H
11111111B
11111110B
03H
11111110B
03H
2.用寄存器BX实现寄存器相对寻址方式(位移量为0200H),将DX的内容和存储单元中的一个字相加,和放在存储单元中。
解:
ADD0200H[BX],DX
3.按照下面的要求设计某数据段,段名为DATA,变量名依次为ITEM1到ITEM5:
(a)十进制数为71的字节变量,用16进制形式表示。
(b)未赋初值的字变量。
(C)十进制数为7524的双字变量,用十六进制形式表示。
(d)十进制数为47的字节变量,用二进制形式表示。
(e)包含6,9,14,18,23,29,31和38的字变量.
解:
DATAsegment
ITEM1db47h
ITEM2DW?
ITEM3DD0474H
ITEM4DB00101111B
ITEM5DW6,9,14,18,23,29,31,38
DATAENDS
4.编写程序段,采用Loop指令将存放在BCDVAL中的01060803H转换成31363833H,并将转换结果保存在ASCII开始的存储单元。
解:
datasegment
BCDVALdd01060803h
Add31363833h
ASCIIdd?
dataends
stacksegmentparastack
db20hdup(0)
stackends
codesegment
assumecs:
code,ss:
stack,ds:
data
start:
movax,data
movds,ax
movcx,4
movsi,3
lop:
moval,bytePTRA[si]
movbyteptrBCDVAL[si],al
MOVbyteptrASCII[si],al
decsi
looplop
movah,4ch
int21h
codeends
endstart
5.下面的程序实现TABLE表中元素的排序,请检查程序中的错误,并修改。
1.TITLEBUBBLESORT
2.DATASEGMENT
3.TABLEDB20,-30,11,120,29,32,-48,-25,72
4.DB96,33,21,50,-19,-46,35,29,-21
5.COUNTEQU$-TABLE
6.DATAENDS
7.STACKSEGMENTPARASTACK
8.DW20HDUP(0)
9.STACKENDS
10.CODESEGMENT
11.ASSUMECS:
CODE,SS:
STACK,DS:
DATA
12.MAIN:
MOVAX,DATA
13.MOVDS,AX
14.MOVDX,COUNT
15.decDX
16.LOP1:
MOVBL,0
17.MOVCX,DX
18.MOVSI,2
19.LOP2:
MOVAL,TABLE[SI]
20.CMPAL,TABLE[SI+1]
21.JLENEXT
22.XCHGAL,TABLE[SI+1]
23.MOVTABLE[SI],AL
24.MOVBL,0FFH
25.NEXT:
INCSI
26.LOOPLOP2
27.INCDX
28.CMPBL,0
29.JNELOP1
30.MOVAH,4CH
31.INT21H
32.CODEENDS
33.ENDMAIN
解:
1.第15句错误,冒泡不用比到最后一位的前一位,这里需要在该句前加一句decDX
2.第18句错误,每次从第一个数开始比较,采用冒泡排序,把最大的数甩到当前最后位置,应该改为MOVSI,0
3.第27句错误,DX记下每次从开始处到要甩的最后位置的距离,长度不应该增加,应该减小。
改为:
DECDX
4.第28句错误,BL中存标记项,如果发生交换bl被置FF,需要再循环,如果bl为0表示排序已经完成,无需再继续。
这句无错
6.编写程序将下面数据段中BYTE_TBL开始的6个存储单元的内容相加并保存到CL寄存器中。
DATASEGMENT
BYTE_TBLDB12,15,16,10,8
DATAENDS
解:
Codesegment
Assumecs:
code,ss:
stack,ds:
data
Start:
movax,data
Movds,ax
LeaSI,BYTE_TBL
MOVCX,5;送入循环次数,如送入cl,ch必先清0
XORBL,BL
LOP:
ADDBL,[SI];累加
INCSI
LOOPLOP;cl减1后循环
MOVCL,BL
Codeends
Endstart
五、程序阅读(阅读程序并绘制流程,共10分)
datasegment
Msg1db"Pleaseinputthefirststring:
$"
Msg2db"Pleaseinputthesecondstring:
$"
Ensgdb0ah,0dh,'$'
sdb100,0,100dup(0)
s1db100,0,100dup(0)
dsp1db"s>=s1$"
dsp2db"sdataends
stacksegmentparastack
db20hdup(0)
stackends
codesegment
assumecs:
code,ss:
stack,ds:
data
start:
movax,data
movds,ax
moves,ax
leadx,Msg1
movah,09h
int21h
leadx,s
movah,0ah
int21h
leadx,Ensg
movah,09h
int21h
leadx,msg2
movah,09h
int21h
leadx,s1
movah,0ah
int21h
leadx,ensg
movah,09h
int21h
movch,s+1
cmpch,s1+1
janext
movcl,ch
jmpnext1
next:
movcl,s1+1
next1:
leasi,s+2
leadi,s1+2
xorch,ch
cld
repzcmpsb
jznext2
janext3
jmpnext4
next2:
movch,s+1
cmpch,s1+1
jbnext4
next3:
leadx,dsp1
jmpnext5
next4:
leadx,dsp2
next5:
movah,09h
int21h
movah,4ch
int21h
codeends
endstart
解:
JAJB
JA
JB
JZ
JB
JA
JZ
六、用汇编语言重写下面的C语言程序。
(共15分)。
intmain()
{
intsum=0,n,i=0;
printf(“Pleaseinputintegern:
\n”);
scanf(“%d”,&n);
while(isum+=i;
i=i+1;
}
printf(“sum=%d\n”,sum);
return1;
}
解:
datasegment
Msg1db"Pleaseinputintegern:
$"
Msg2db"TheSUMare:
$"
EntMsgdb0ah,0dh,'$'
numdw0
tamountdw0;累加结果
resultdb8dup(0)
dataends
stacksegmentparastack
db200dup(0)
stackends
codesegment
assumecs:
code,ss:
stack,ds:
data
start:
movax,data
movds,ax
leadx,Msg1
movah,09h
int21h
callinone
movnum,dx;num获取累加总数
callcompute;计算累加结果后存入tamount
leadx,Msg2
movah,09h
int21h
calloutput
exit1:
movah,4ch
int21h
inoneproc;结果按小数点后面有几位,扩大相应倍数后存在dx
pushax
pushbx
pushcx
xordx,dx
lop2:
movah,01h
int21h
cmpal,0dh
jzextp1
cmpal,'.'
jznext
andal,0fh
movcl,al
movax,dx
movbx,10
mulbx
movdx,ax
movch,0
adddx,cx
next:
jmplop2
extp1:
popcx
popbx
popax
ret
inoneendp
computeproc;计算累加结果后存入tamount
pushcx
pushdx
pushax
pushbx
xorcx,cx
movcx,num
xorax,ax
movbx,1
lop1:
addax,bx;开始累加
incbx
looplop1
movtamount,ax
popbx
popax
popdx
popcx
ret
computeendp
outputproc
pushsi
pushbx
pushax
pushcx
xorcx,cx
leasi,result
addsi,8;si指尾
movax,tamount
movbx,10;作为除数
lop3:
xordx,dx
divbx
mov[si],dl;每次把余数放入相应位子
inccx
cmpcx,0;比较是倒数第0位时,赋小数点(无小数)
jnznext2
decsi
pushax
moval,'.'
mov[si],al
popax
next2:
cmpax,0;;比较ax(原数)是否除到头了,是就结束去显示
jznext3
decsi
jmplop3
next3:
leasi,result
movcx,9
lop4:
moval,[si]
incsi
deccx
cmpal,0;如果是0就跳过,去掉前面的0
jzlop4
decsi
inccx
lop5:
moval,[si]
cmpal,'.';是小数点就直接显示
jznext4
oral,30h;非小数点化成ascll码后显示
next4:
movdl,al
movah,02h
int21h
incsi
looplop5
popcx
popax
popbx
popsi
ret
outputendp
codeends
endstart