汇编语言作业答案1.3什么是汇编语言源程序、汇编程序、目标程序?见教材P41.10数码0~9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII码为0Dh、0aH对应的是什么字符?见教材P81.11计算机中有一个“01100001‘编码,如果把它认为是无符号数,它是十进制什么数?如果认为它是BCD码,则表示什么数?又如果它是某个ASCII码,则代表哪个字符?97,61h,a1.13什么是DOS和POM-BIOS?DOS:磁盘操作系统;POM-BIOS:可编程的基本输入输出系统2.3举例说明CF和OF标志的差异。见教材P20-212.5什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达:(1)FFFFh:0(2)40h:17h(3)2000h:4500h(4)B821h:4567h见教材P22-23FFFF0h417h24500hBC777h2.68086有哪4种逻辑段,各种逻辑段分别是什么用途?见教材P232.10说明下列指令中源操作数的寻址方式?如果BX=2000H,DI=40H,给出DX的值或有效地址EA的值。(1)movdx,[1234h]直接寻址(2)movdx,1234h立即寻址(3)movdx,bx寄存器寻址(4)movdx,[bx]寄存器间接寻址(5)movdx,[bx+123h]寄存器相对寻址(6)movdx,[dx+di]基址变址寻址(7)movdx,[bx+di+1234h]相对基址变址寻址2.11已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,说明下列每条指令执行后AX寄存器的内容。(1)movax,1200h1200h(2)movax,bx0100h(3)movax,[1200h]2a4ch(4)movax,[bx]1234h(5)movax,[bx+1100h]2a4ch(6)movax,[bx+si]5678h(7)movax,[bx][si+1100h]b765h2.15已知SS=FFAOH、SP=00B0H,画图说明执行下列指令序列时,堆栈区和SP的内容如何变化?movax,8057hpushaxSP=00B2[00B1]=80hmovax,0f79hpushaxSP=00B2[00B2]=0f79hpopbxBX=0f79hSP=00B1pop[bx]SP=00B0h2.16给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:moval,89h不影响标志addal,al见教材P38addal,9dh见教材P38cmpal,0bch见教材P40subal,al见教材P39decal见教材P39incal见教材P382.17设均为双字数据,分别存放在地址为的存储单元中,他们的运算结果存入单元。阅读如下程序段,给出运算公式。movax,Xmovdx,X+2addan,Yadcdx,Y+2addax,24adcdx,0subax,Zsbbdx,Z+2movW,axmovW+2,dxY+X+24-Z2.18请分别用一条汇编语言指令完成如下功能:(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。ADDDX,BX(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。ADDAL,[BX+SI](3)用BX和位移量OB2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回寄存器中。ADDCX,[BX+0B2H](4)用位移量为0520H的直接寻址方式把存储器中的一个字与数4312H相加,并把结果送回该存储单元中。ADD[0520H],4321H(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。ADDAL,0A0H2.20指出下列指令的错误(1)xchg[si],30h不能用立即数(2)popcs没有错误(3)sub[si],[di]不能全为mem(4)pushahah应为字数据(5)adcax,ds不能用段寄存器(6)add[si],80h[si]应为reg或mem(7)inal,3fch位数不对(8)outdx,ahah只能用al或ax2.21给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。movax,1470handax,axorax,axxorax,axnotaxtestax,0f0f0h参考教材P202.23编写程序段完成如下要求:(1)用位操作指令实现AL(无符号数)乘以10参考教材P49例2.32(2)用逻辑运算指令实现数字0~9的ASCII码与非压缩BCD码的相互转换参考教材P47例2.28(3)把DX.AX中的双字右移4位参考教材P49例2.322.25已知数据段500h~600h处存放了一个字符串,说明下列程序段执行后的结果:movsi,600hmovdi,601hmovax,dsmovs,axmovcx,256std数据段向后移动一个字,即数据段首地址为501h和-601hrepmovsb2.26说明下列程序段的功能cldmovax,0fefhmovcx,5moves,bxmovdi,2000hrepstows将0fefh开始的五个字的内容,送致32000H开始的单元中2.32判断下列程序段跳转的条件(1)xorax,lelehjeequalax=1e1eh(2)testal,10000001bjnzthereal=10000000或0000001或10000001(3)cmpcx,64hjbtherecx64h2.34假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:(1)若DXDI,转到above执行;CMPDX,DIJAabove(2)若AXSI,转到greater执行;CMPAX,SIJAgreater(3)若CX=0,转到zero执行;JNCzero(4)若AX-SI产生溢出,转到overflow执行;CMPAX,SIJOoverflow(5)若SI=AX,转到less_eq执行;CMPSI,AXJBEless_eq(6)若DI=DX,转到below_eq执行。CMPDI,DXJBEbelow_eq2.35有一个首地址为array的20个字的数值,说明下列程序的功能。movex,20movax,0movsi,axsun_loop:addax,array[si]addsi,2loopsum_loopmovtotal,ax把array中的20个字的内容相加,并把结果送至total中。2.36按照下列要求,编写相应的程序段:(3)编写一个程序段,在DX高4位全为0时,使AX=0;否则使AX=-1。参考教材P48例2.30(6)以知字符串string包含有32KB内容,将其中的‘$’符号替换成空格。参考教材P52例2.37(7)有一个100个字节元素的数组,其首地为array,将每个元素减1(不考虑溢出)存于原处。参考教材P52例2.362.39以知AX、BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。addal,bldaaxchgal,ahadcal,bhdaaxchgal,ah实现AX、BX中的的4位BCD数相加,结果仍为BCD表示的十进制数,存于AX中,出口参数为ax.2.44补充例2.42,当有溢出时显示“Error!Overflow!”,无溢出时显示“OK”。参看教材P59例2.42和P66例2.493.17修改例题3.3,现在用字定义伪指令dw、字串传送指令movsw和字符传显示9号功能调用实现。参看教材P79例3.1a和P93例3.33.22在SMALL存储模式下,简化段定义格式的代码段、数据段和堆栈段和却省段名、定位、组合以及类别属性分别是什么?参看教材P99(2)SMALL3.25按下面要求写一个简化段定义格式的源程序(1)定义常量num,其值为5;数据段中定义字数组变量datalist,它的头5个字单元中依次存放-1、0、2、5和4,最后1个单元初值不定;参考教材P93例3.2(2)代码段中的程序将datalist中头num个数的累加和存入datalist的最后1个字单元中。Numequ5Datalistdw-1,0,2,5,4,?Movcx,numMovbx,offsetdatalistMovbx,0Again:addax,[bx]Addbx,2LoopagainMov[bx],ax3.,26按下面要求写一个完整段定义格式的源程序(1)数据段从双字边界开始,其中定义一个100字节的数组,同时该段还作为附加段;(2)堆栈段从节边界开始,组合类型为stack;(3)代码段的类别是’coda’,指定段寄存器对应的逻辑段;主程序指定从100h开始,给有关段寄存器赋初值;将数组元素全部设置为64h.参考教材P79例3.1b4.11编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位无符号数。参考教材P115例4.3a4.12设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:如果X大于等于0,保存0;如果X小于0,保存—1(ffh)。编写该程序。参考教材P121例4.64.13bufX、bufY和bufZ是3个有符号16进制数,编写一个比较相等关系的程序;(1)如果这3个数都不相等,则显示0;(2)如果这3个数中有两个数相等,则显示1;(3)如果这3个数都相等,则显示2。参考教材P119例4.3b,子程序中加一段显示程序即可。4.23编写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayP和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。参考教材P121例4.6,4.24编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。Parrydw23,32,56,…;假设有100个数据Wordsumdw0Msgdb‘overflow’,’$’Movcx,100Movax,0Movbx,offsetparrayAgain:addax,[bx]JncnextMovdx,offsetmsgMovah,9Int21hJmpdoneNext:addbx,2LoopagainMovwordsum,axDone:…4.34编制一个子程序把一个16位二进制数用十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并用一个主程序验证它。(1)采用AX寄存器传递这个16位二进制数。(2)采用wordTEMP变量传递这个16位二进制(3)采用堆栈方法传递这个16位二进制数参考教材P126例4.10,4.35设有一个数组存放学生的成绩(0—100),编制一个子程序统计0—59分,60—69分,70—79分,80—89分,90—100分的人数,并分别存放到scoreE、scoreD、scoreC、scoreB及scoreA单元中。编写一个主程序与之配合使用。Sarraydb90,85,70,57,95,…Countdb$-sarrayScoreEdb0;记录0-59分之间的人数ScoreDdb0;记录60-69分之间的人数ScoreCdb0;记录70-79分之间的人数ScoreBdb0;记录80-89分之间的人数ScoreAdb0;记录90-100分之间的人数SnumprocPushaxPushdxPushsiAgain:moval,[bx]Cmpal,60Jbnext0Cmpal,90Jaenext1Movdl,10Movah,0DivdlSubal,5Movah,0Movsi,axJmpnext2Next0:movsi,0Jmpnext