钱晓捷汇编语言程序设计课后习题作业新.docx
《钱晓捷汇编语言程序设计课后习题作业新.docx》由会员分享,可在线阅读,更多相关《钱晓捷汇编语言程序设计课后习题作业新.docx(49页珍藏版)》请在冰豆网上搜索。
![钱晓捷汇编语言程序设计课后习题作业新.docx](https://file1.bdocx.com/fileroot1/2022-11/29/a73dd38c-5430-4aff-a9b9-665e1a92e260/a73dd38c-5430-4aff-a9b9-665e1a92e2601.gif)
钱晓捷汇编语言程序设计课后习题作业新
习题1…………………………………………………………………1
习题2…………………………………………………………………4
习题3…………………………………………………………………10
习题4…………………………………………………………………13
习题5…………………………………………………………………15
习题6…………………………………………………………………18
习题7…………………………………………………………………21
习题8…………………………………………………………………24
习题9…………………………………………………………………27
习题1
1.1简述计算机系统的硬件组成及各部分作用。
1.2明确下列概念或符号:
主存和辅存,RAM和ROM,存储器地址和I/O端口,KB,MB,GB和TB。
1.3什么是汇编语言源程序、汇编程序、目标程序?
1.4汇编语言与高级语言相比有什么优缺点?
1.5将下列十六进制转化为二进制和十进制表示。
(1)FFH
(2)0H(3)5EH(4)EFH
(5)2EH(6)10H(7)1FH(8)ABH
1.6将下列十进制数转换为BCD码表示。
(1)12
(2)24(3)68(4)127
(5)128(6)255(7)1234(8)2458
解答:
十进制数BCD码
12
24
68
1271
1280
2551
123410100
245811000
1.7将下列BCD码转换为十进制数。
(1)10010001
(2)10001001(3)00110110(4)10010000
(5)00001000(6)10010111(7)10000001(8)00000010
解答:
BCD码十进制数
1001000191
1000100189
0011011036
1001000090
0000100008
1001011197
1000000181
0000001002
1.8将下列十进制数分别用八位二进制数的原码、反码和补码表示。
(1)0
(2)-127(3)127(4)-57(5)126(6)-126(7)-128(8)68
1.9完成下列二进制数的计算。
(1)1011+1001
(2)1011-1001(3)1011×1001(4)10111000/1001
(5)1011∧1001(6)1011∨1001(7)~1011(8)1011⊕1001
1.10数码0~9,大写字母A~Z,小写字母a~z,对应的ASCII码分别是多少?
ASCII码为0dH,0aH对应的是什么字符?
解答:
大写字母A~Z,对应的ASCII码分别是41H~5AH
小写字母a~z,对应的ASCII码分别是61H~7AH
ASCII码为0dH,0aH分别对应“回车”、“换行”
1.11计算机中有一个“”编码,如果把它认为是无符号数,它是十进制什么数?
如果你认为它是BCD码,则表示什么数?
如果它是某个ASCII码,则代表哪个字符?
1.12简述Intel80x86系列微处理器在指令集方面的发展。
1.13什么是DOS和ROM-BIOS?
1.14简述PC最低1MB贮存空间的使用情况。
1.15罗列8086CPU的8个8位和16位通用寄存器,并说明各自的作用。
1.16什么是标志?
它有什么用途?
状态标志和控制标志有什么区别?
画出标志寄存器FLAGS,说明各个标志的位置和含义。
1.17举例说明CF和OF标志的差异。
解答:
溢出标志OF和进位标志CF是两个意义不同的标志
进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确
例1:
3AH+7CH=B6H
无符号数运算:
58+124=182,范围内,无进位
有符号数运算:
58+124=182,范围外,有溢出
例2:
AAH+7CH=
(1)26H
无符号数运算:
170+124=294,范围外,有进位
有符号数运算:
-86+124=28,范围内,无溢出
1.18字和双字在存储器中如何存放,什么是“小端方式”?
对字和双字存储单元,什么是它们的对齐地址?
为什么要对齐地址?
1.19什么是8086中的逻辑地址和物理地址?
逻辑地址如何转换为物理地址?
请将如下逻辑地址用物理地址表示(表达地址默认采用十六进制):
(1)FFFF:
0
(2)40:
17(3)2000:
4500(4)B821:
4567
解答:
对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从00000H~FFFFFH
在8086内部和用户编程时,采用的段基地址:
段内偏移地址形式称为逻辑地址
将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址
请将如下逻辑地址用物理地址表达:
(1)FFFFh:
0=FFFF0H
(2)40h:
17h=00417H
(3)2000h:
4500h=24500H
(4)B821h:
4567h=BC777H
1.208086有哪4种逻辑段?
各种逻辑段分别是什么用途?
解答:
代码段(CodeSegment)用来存放程序的指令序列。
处理器利用CS:
IP取得下一条要执行的指令
堆栈段(StackSegment)确定堆栈所在的主存区域。
处理器利用SS:
SP操作堆栈中的数据
数据段(DataSegment)存放当前运行程序所用的数据。
处理器利用DS:
EA存取数据段中的数据
附加段(ExtraSegment)是附加的数据段,也用于数据的保存。
处理器利用ES:
EA存取数据段中的数据
1.21数据的默认段是哪个?
是否允许其他段存放数据?
如果允许,如何实现?
有什么要求?
1.22什么是操作码、操作数和寻址方式?
有哪三种给出操作数的方法?
1.23什么是有效地址EA?
8086的操作数如果在主存中,有哪些寻址方式可以存取它?
1.24说明下列指令中源操作数的寻址方式?
如果BX=2000H,DI=40H,给出DX的值或有效地址EA的值。
(1)Movdx,[1234h]
(2)Movdx,1234h
(3)Movdx,bx
(4)Movdx,[bx]
(5)Movdx,[bx+1234h]
(6)Movdx,[bx+di]
(7)Movdx,[bx+di+1234h]
解答:
(1)movdx,[1234h];直接寻址,EA=1234h
(2)movdx,1234h;立即数寻址,DX=1234h
(3)movdx,bx;寄存器寻址,DX=2000h
(4)movdx,[bx];间接寻址,EA=2000h
(5)movdx,[bx+1234h];相对寻址,EA=3234h
(6)movdx,[bx+di]
;基址变址寻址,EA=2040h
(7)movdx,[bx+di+1234h]
;相对基址变址寻址,EA=3274h
习题2
2.1已知DS=2000H,BX=0100H,SI=0002H,存储单元[20100H]~[20103]依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,说明下列每条指令执行后AX寄存器的内容。
(1)Movax,1200h
(2)Movax,bx
(3)Movax,[1200h]
(4)Movax,[bx]
(5)Movax,[bx+1100h]
(6)Movax,[bx+si]
(7)Movax,[bx][si+1100h]
解答:
(1)movax,1200h;AX=1200h
(2)movax,bx;AX=0100h
(3)movax,[1200h];AX=4C2Ah
(4)movax,[bx];AX=3412h
(5)movax,[bx+1100h];AX=4C2Ah
(6)movax,[bx+si];AX=7856h
(7)movax,[bx][si+1100h];AX=65B7h
2.2指出下列指令的错误
(1)movcx,dl
(2)movip,ax
(3)moves,1234h(4)moves,ds
(5)moval,300(6)mov[sp],ax
(7)movax,bx+di(8)mov20h,ah
2.3已知数字0~9对应的格雷码依次为:
18H,34H,05H,06H,09H,0AH,0CH,11H,12H,14H,它存在于以table为首地址(设为200H)的连续区域中。
为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。
Leabx,table
Moval,8
Xlat
2.4什么是堆栈?
他的工作原则是什么?
它的基本操作有哪两个?
对应哪两种指令?
2.5已知SS=2200H,SP=00B0H,画图说明执行下列指令序列时,堆栈区和SP的内容如何变化?
Movax,8057h
Pushax
Movax,0f79h
Pushax
Popbx
Pop[bx]
解答:
movax,8057h
pushax
movax,0f79h
pushax
popbx;bx=0f79h
pop[bx]
;DS:
[0f79h]=8057h
2.6给出下列各条指令执行后AL的值,以及CF,ZF,SF,OF,PF的状态:
Moval,89h
Addal,al
Addal,9dh
Cmpal,0bch
Subal,al
Decal
Incal
解答:
moval,89h;AL=89hCFZFSFOFPF
addal,al;AL=12h10011
addal,9dh;AL=0afh00101
cmpal,0bch;AL=0afh10101
subal,al;AL=00h01001
decal;AL=0ffh00101
incal;AL=00h01001
2.7设X,Y,Z均为双字数据,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,它们的运算结果存入W单元。
阅读以下程序段,给出运算公式。
Movax,X
Movdx,X+2
Addax,Y
Adcdx,Y+2
Addax,24
Adcdx,0
Subax,Z
Sbbdx,Z+2
MovW,ax
movW+2,dx
解答:
W=X+Y+24-Z
2.8请分别用一条汇编语言指令完成如下功能:
(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。
ADDDX,BX
(2)用寄存器BX和SI的基址变址寻址方式把存储器的1字节与AL寄存器的内容相加,并把结果送到AL中。
ADDAL,[BX+SI]
(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。
ADD[BX+0B2H],CX
(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。
ADDWORDPTR[0520H],3412H
(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。
ADDAL,0A0H
2.9设X,Y,Z,V均为十六位带符号数,分别装在X,Y,Z,V存储单元中,阅读以下程序段,得出它的运算公式,并说明运算结果存于何处。
Movax,X
ImulY
Movcx,ax
Movbx,dx
Movax,Z
Cwd
Addcx,ax
Adcbx,dx
Subcx,540
Sbbbx,0
Movax,v
Cwd
Subax,cx
Sbbdx,bx
IdivX
2.10指出下列指令的错误
(1)xchg[si]30h
(2)Popcs
(3)Sub[si],[di]
(4)Pushah
(5)Adcax,ds
(6)Add[si],80h
(7)Inal,3fch
(8)Outdx,ah
解答:
(1)xchg[si],30h;xchg的操作数不能是立即数
(2)popcs;不能对CS直接赋值
(3)sub[si],[di];两个操作数不能都是存储单元
(4)pushah;堆栈的操作数不能是字节量
(5)adcax,ds;adc的操作数不能是段寄存器
(6)add[si],80h;没有确定是字节还是字操作
(7)inal,3fch;in不支持超过FFH的直接寻址
(8)outdx,ah;out只能以AL/AX为源操作数
2.11给出下列各条指令执行后的结果,以及状态标志CF,OF,SF,ZF,PF的状态。
Movax,1470h
Andax,ax
Orax,ax
Xorax,ax
Notax
Testax,0f0f0h
2.12假设例题2.34中的程序段中,AX=08h,BX=10H,请说明每条指令执行后的结果和各个标志位的状态
2.13编写程序段完成如下要求
(1)
;考虑进位
xorah,ah
movbx,ax
movcl,3
shlax,cl
addax,bx;shlbx,1
addax,bx
用位操作指令实现AL(无符号数)乘以10。
答;不考虑进位
movbl,al
movcl,3
shlal,cl
addal,bl;shlbl,1
addal,bl
(2)用逻辑运算指令实现数字0到9的ASCII码与非压缩BCD码的互相转换。
答:
数字0~9的ASCII码是:
30h~39h
非压缩BCD码的0~9是:
00h~09h
方法一:
andal,0fh;实现ASCII到非压缩BCD码的转换
oral,30h;实现非压缩BCD码到ASCII的转换
(一)testal,30h
jnzASCII
oral,30h;非压缩BCD码到ASCII的转换
jmpdone
ASCII:
andal,0fh;ASCII到非压缩BCD码的转换
done:
...
方法二:
xoral,30h;求反D5D4位,其他不变
;即高4位为3,则变为0;高4位为0,则变为3
(3)把DX,AX中的双字右移4位。
答:
movcl,4
again:
shrdx,1;实现逻辑右移
;采用“sardx,1”,则实现算术右移
rcrax,1
deccl
jnzagain
2.14已知AL=F7H(表示有符号数-9),分别编写用SAR和IDIV指令实现的除以2的程序段,并说明各自执行后,所得的商是什么?
2.15已知数据段500H到600H处存放了一个字符串,说明下列程序段执行后的结果:
Movsi,600h
Movdi,601h
Movdx,ds
Moves,ax
Movcx,256
Std
Repmovsb
2.16说明下列程序段的功能
Cld
Movax,0fefh
Movcx,5
Movbx,3000h
Moves,bx
Movdi,2000h
Repstosw
2.17指令指针IP是通用寄存器还是专用寄存器?
有指令能够直接赋值么?
哪类指令的执行会改变它的值?
2.18控制转移指令中有哪三种寻址方式?
2.19什么是短转移shortjump、近转移nearjump和远转移farjump?
什么是段内转移和段间转移?
8086有哪些指令可以实现段间转移?
2.208086的条件转移指令的转移范围有多大?
实际编程时,你如何处理超出范围的条件转移?
2.21假设DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,试问执行下列段间接寻址的转移指令后,转移的目的地址是什么?
(1)JMPBX
(2)JMPTABLE[BX]
(3)JMP[BX],[SI]
2.22判断下列程序段跳转的条件
(1)xorax,leleh
Jeequal
(2)testal,10000001b
Jnzthere
(3)cmpcx,64h
Jbthere
答:
(1)xorax,1e1eh
jeequal
;AX=1e1eh(异或后为0)
(2)testal,10000001b
jnzthere
;AL的D0或D7至少有一位为1
(3)cmpcx,64h
jbthere
;CX(无符号数)<64h
2.23设置CX=0,则LOOP指令将循环多少次?
例如:
movcx,0
Delay:
loopdelay
2.24假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:
(1)若DX>DI,转到above执行
(2)若AX>SI,转到greater执行;
(3)若CX=0,转到zero执行;
(4)若AX-SI产生溢出,转到overflow执行;
(5)若SI<=AX,转到less_eq执行;
(6)若DI<=DX,转到below_eq执行;
答:
(1)若DX>DI,转到above执行
cmpdx,di
jaabove;=jnbeabove
(2)若AX>SI,转到greater执行
cmpax,si
jggreater;=jnlegreater
(3)若CX=0,转到zero执行
cmpcx,0jcxzzero
jzzero
(4)若AX-SI产生溢出,转到overflow执行;
cmpax,di
jooverflow
(5)若SI≤AX,转到less_eq执行;
cmpsi,axcmpax,si
jleless_eqjgeless_eq
(6)若DI≤DX,转到below_eq执行。
cmpdi,dxcmpdx,di
jbebelow_eqjaebelow_eq
2.25有一个首地址为array的20个字的数组,说明下列程序段的功能。
movcx,20
Movax,0
Movsi,ax
Sum_loop:
addax,array[si]
Addsi,2
Loopsum_loop
Movtotal,ax
2.26按照下列要求,编写相应的程序段:
(1)其实地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串的第一个和第六个字符(字节量)传送给DX寄存器。
(2)从主存buffer开始的4字节中保存了4个非压缩BCD码,现按低(高)地址对低(高)位的原则,将他们合并到DX中。
(3)编写一个程序段,在DX高4位全为0时,使用AX=0;否则AX=-1。
答:
testdx,0f000h;testdh,0f0h
jznext;jnznext
movax,-1;movax,0
jmpagain
next:
movax,0;movax,0ffffh
again:
...
(4)有两个64位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2,编写程序段完成buffer1-buffer2功能。
(5)假设从B800h:
0开始存放有100个16位无符号数,编程求他们的和,并把32位的和保存在DX.AX中。
(6)已知字符串string包含有32KB内容,将其中的'$'符号替换成空格。
答1:
;不使用串操作指令,更好
movsi,offsetstring
movcx,8000h
again:
cmpbyteptr[si],‘$’;‘$’=24h
jnznext
movbyteptr[si],‘’;‘’=20h
next:
incsi
loopagain;deccx
;jnzagain
答2:
;使用串操作指令
movdi,offsetstring
moval,’$’
movcx,8000h
cld
again:
scasb
jnznext
movbyteptres:
[di-1],‘’
next:
loopagain
(7)有一个100字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出)存于原处。
答1:
movsi,offsetarray
movcx,100
again:
decbyteptr[si]
incsi
loopagain
答2:
movsi,offsetarray
movdi,si
movax,ds
moves,ax
movcx,100
cld
again:
lodsb
decal
stosb
loopagain
(8)统计以'$'结尾的字符串srting的字符个数。
2.27对以下要求,分别给出3种方法,每种方法只用一条指令。
(1)使CF=0
(2)使AX=0
(3)使AX=0和CF=0
2.28参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为3,段间直接调用指令则为5字节。
2.29已知AX,BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。
Addal,bl
Daa
Xchgal,ah
Adcal,bh
Daa
Xchgal,ah
Ret
答:
压缩BCD码加法:
AX←AX+BX
出口参数:
AX=BCD码和
2.30ADD指令是用于除法指令之前,进行压缩BCD码调整的。
实际上,处理器的调整过程是:
AL<-AH×10+AL,AH<-0。
如果指令系统没有ADD指令,请用一个子程序完成这个调整工作。
2.31解释如下有关中断的概念:
(1)内部中断和外部中断
(2)单步中断和断点中断
(3)除法错中断和溢出中断
(4)中断向量号和中断向量表
2.32试比较INTn和段间CALL指令,IRET和段间RET指令的功能。
2.33什么是系统功能调用?
汇编语言中,它的一般格式是怎样的?
2.34补充例2.40,当有溢出时显示"Error!
Overflow!
",无溢出显示"OK"。
补充例2.42,显示"1"的个数,注意首先将个数转换为ASCII码。
okmsgdb‘OK’,‘$’
errmsgdb‘Error!
Overflow!
’,‘$’
…
movax,X
subax,Y
jooverflow
movdx,offsetokmsg
jmpnext
overflow:
movdx,errmsg
next:
movah,9
int21h