您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 计算机原理习题答案04
第四章80x86汇编语言程序设计习题与答案1、指出以下数据定义伪指令所分配的字节数(8086系统)。(1)DATA1DB10,?,‘A’(2)DATA2DW10DUP(2,3DUP(?),1)(3)DATA3DB‘HELLO,WORLD!’,‘$’(4)DATA4DWDATA4解:(1)3字节;(2)100字节;(3)13字节;(4)2字节。2、指出以下数据定义伪指令所分配的字节数(80386系统)。(1)DATA1DF12,34,56(2)DATA2DFDATA2(3)DATA3DQ0,10DUP(?)(4)DATA4DT0,1,2解:(1)18字节;(3)6字节;(3)88字节;(4)30字节。3、指出以下指令中哪些是无效的,并说明原因。(1)ADDRDB$(2)DATADBF0H,12H(3)1_DATADW1234H(4)@VARDWVAR1;VAR1为一个字节变量(5)MOVAX,[10-VAR1];VAR1为一个字变量(6)MOVBX,[VAR2*2+1];VAR2为一个字变量解:(1)非法,地址计数器$是32位数;(2)非法,以字母开头的16进制数应在前面加“0”,即应为“0F0H”;(3)非法,变量名非法,不能以数字开头;(4)合法;(5)非法,地址表达式不能是“常数-地址”;(6)非法,地址表达式不能出现乘法。4、假设已定义数据段如下:DATASEGMENTORG100HDATA1DB10DUP(1,2,3)DATA2DWDATA1,$DATAENDS且段寄存器DS已初始化为该数据段的段基址(假设段基址为1234H)。请指出以下指令执行后,相应的寄存器中的内容。(1)MOVAX,WORDPTRDATA1;(AX)=?(2)MOVBX,DATA2;(BX)=?(3)MOVCX,DATA2+2;(CX)=?(4)MOVDX,OFFSETDATA2;(DX)=?(5)MOVSI,SEGDATA1;(SI)=?(6)MOVDI,LENGTHDATA1;(DI)=?(7)MOVSP,TYPEDATA1;(SP)=?(8)MOVBP,SIZEDATA2;(BP)=?解:(1)(AX)=0201H;(2)(BX)=0100H;(3)(CX)=0120H;(4)(DX)=011EH;(5)(SI)=1234H;(6)(DI)=000AH;(7)(SP)=0001H;(8)(BP)=0002H。5、在8086系统下,编写完整程序,实现从键盘上输入8位二进制数,从显示器上显示相应的16进制数,例如从键盘上输入“00010010”,应在显示器上显示“12H”。解:参考程序:DATASEGMENTMSG1DB'Inputbinarynumber(ESCtoexit):','$'MSG2DB0AH,0DH,'Inputerror!',0AH,0DH,'$'DATAENDSOUTPUTMACROASC;定义输出一个字符的宏MOVDL,ASCMOVAH,2INT21HENDMCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXAGAIN:LEADX,MSG1MOVAH,9INT21H;提示输入信息MOVCX,8;输入8位二进制数MOVBL,0L:MOVAH,1INT21HSHLBL,1CMPAL,1BH;ESC键退出JZDONECMPAL,'0';输入“0”JZNEXTCMPAL,'1';输入“1”JNZERROR;输入其他则出错INCBLNEXT:LOOPLOUTPUT0AHOUTPUT0DHPUSHBXMOVCL,4SHRBL,CLCALLTRAN;显示高4位对应的16进制数POPBXANDBL,0FHCALLTRAN;显示低4位对应的16进制数OUTPUT'H'OUTPUT0AHOUTPUT0DHJMPAGAINERROR:LEADX,MSG2MOVAH,9INT21HJMPAGAINDONE:RETMAINENDPTRANPROCFARCMPBL,0AHJBBELOWADDBL,7BELOW:ADDBL,30HOUTPUTBLRETTRANENDPCODEENDSENDMAIN6、在8086系统下,编写完整程序,实现从键盘上输入两个4位十进制数,从显示器上显示这两个数之和,例如输入“1234”、“5678”,应在显示器上显示“6912”。解:参考程序:DATASEGMENTMSG1DB'Inputthefirstnumber(ESCtoexit):','$'MSG2DB'Inputthesecondnumber(ESCtoexit):','$'MSG3DB0AH,0DH,'Inputerror!Inputagain:','$'DATAENDSOUTPUTMACROASC;定义输出一个字符的宏MOVDL,ASCMOVAH,2INT21HENDMCODESEGMENTASSUMECS:CODE,DS:DATAMAIN:MOVAX,DATAMOVDS,AXAGAIN:LEADX,MSG1MOVAH,9INT21H;提示输入第一个数CALLINPUT;输入过程PUSHBXOUTPUT0AHOUTPUT0DHLEADX,MSG2MOVAH,9INT21H;提示输入第二个数CALLINPUT;输入过程OUTPUT0AHOUTPUT0DHPOPAX;实现两个4位组合BCD码相加ADDAL,BL;低8位相加DAA;校正MOVCL,AL;保存至CLADCAH,BH;高8位相加MOVAL,AH;移至ALDAA;校正MOVAH,ALMOVAL,CLMOVBX,AX;最后结果放在BX中JNCNEXTOUTPUT'1';如果相加结果大于9999,则显示进位“1”NEXT:PUSHBXMOVCL,4SHRBH,CLADDBH,30HOUTPUTBH;显示千位数POPBXPUSHBXANDBH,0FHADDBH,30HOUTPUTBH;显示百位数POPBXPUSHBXMOVCL,4SHRBL,CLADDBL,30HOUTPUTBL;显示十位数POPBXANDBL,0FHADDBL,30HOUTPUTBL;显示个位数OUTPUT0AHOUTPUT0DHJMPAGAININPUTPROCFAR;输入一个4位十进制数的过程BEGIN:MOVCX,4MOVBX,0L:SHLBX,1SHLBX,1SHLBX,1SHLBX,1;BX的值乘以16MOVAH,1INT21H;输入CMPAL,1BH;ESC键退出JZDONECMPAL,'0'JBERROR;非数字,出错CMPAL,'9'JAERROR;非数字,出错SUBAL,30HXORAH,AHADDBX,AX;将输入加到BX中LOOPLRETERROR:LEADX,MSG3MOVAH,9INT21HJMPBEGINDONE:MOVAH,4CHINT21HINPUTENDPCODEENDSENDMAIN7、在8086系统下,编写完整程序,实现两个32位带符号数相乘。假设被乘数存放在以字变量MUL1开始的连续4个字节中,乘数存放在以字变量MUL2开始的连续4个字节中中,相乘结果存放在以字变量RES开始的连续8个字节中。解:参考程序:DATASEGMENTMUL1DW0FFFFH,0FFFFH;被乘数MUL2DW5678H,1234H;乘数RESDW4DUP(0);结果DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVCX,MUL1MOVBP,MUL1+2MOVSI,MUL2MOVDI,MUL2+2TESTBP,8000H;被乘数是否为负数JZNEXT1NOTBP;为负数,则取反加1NOTCXADDCX,1ADCBP,0NEXT1:TESTDI,8000H;乘数是否为负数JZNEXT2NOTSI;为负数,则取反加1NOTDIADDSI,1ADCDI,0NEXT2:MOVAX,SI;相乘过程MULCXMOVRES,AXMOVRES+2,DXMOVAX,SIMULBPADDRES+2,AXADCRES+4,DXMOVAX,DIMULCXADDRES+2,AXADCRES+4,DXMOVAX,DIMULBPADDRES+4,AXADCRES+6,DXMOVAX,MUL1+2XORAX,MUL2+2;判断被乘数和乘数是否同号JNSDONE;同号,则结果为正数,无须修改结果NOTRES;不同号,则结果为负数,须取反加1NOTRES+2NOTRES+4NOTRES+6ADDRES,1ADCRES+2,0ADCRES+4,0ADCRES+6,0DONE:RETMAINENDPCODEENDSENDMAIN8、在8086系统下,编写完整程序,找出字节数组ARRAY中的最大值和最小值。假设ARRAY的长度为100个字节,每个字节为一个无符号数,程序执行后最大值将存放到字节变量MAX中,最小值则存放到字节变量MIN中。解:参考程序:DATASEGMENTARRAYDB100DUP(?);字节数组MAXDB?;最大值MINDB?;最小值DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXLEASI,ARRAYCLDMOVBH,0;存放临时最大值的寄存器MOVBL,0FFH;存放临时最小值的寄存器MOVCX,100AGAIN:LODSBCMPAL,BHJNANEXT1MOVBH,AL;如果当前数值比临时最大值大,则代替NEXT1:CMPAL,BLJNBNEXT2MOVBL,AL;如果当前数值比临时最小值小,则代替NEXT2:LOOPAGAINMOVMAX,BHMOVMIN,BLRETMAINENDPCODEENDSENDMAIN9、在8086系统下,编写完整程序,将字节数组ARRAY中的所有数据往高地址的方向移动一位,即原来存放在ARRAY中的字节移动到ARRAY+1中,原来存放在ARRAY+1中的字节移动到ARRAY+2中,……,依此类推。假设ARRAY的长度为100个字节。解:可利用MOVSB指令实现移位,但应该注意,必须从串尾开始移动,因为假如直接从串头开始,将串头移到第二个数,那么第二个数将被覆盖。为使程序能从串尾开始移动,可令方向标志位DF=1。参考程序:DATASEGMENTARRAYDB100DUP(?),?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVES,AXLEASI,ARRAY+99;SI指向源串尾LEADI,ARRAY+100;DI指向新串尾STD;DF=1,串尾先移动MOVCX,100REPMOVSB;循环移动RETMAINENDPCODEENDSENDMAIN10、在8086系统下,编写在长字符串L_STR中查找短字符串S_STR的完整程序,如果找到匹配的字符串,则将字节变量RES置0FFH,否则置0。例如,在字符串“ABABCD”中可找到字符串“ABC”,则RES=0FFH。解:参考程序:DATASEGMENTL_STRDB'ABDABABCD';长串L_LTHDW$-L_STR;长串长度S_STRDB'ABC';短串S_LTHDW$-S_STR;短串长度RESDB?;存放结果DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVES,AXLEASI,L_STRLEADI,S_STRCLDMOVCX,L_LTHSUBCX,S_LTHINCCX;作串比较的次数AGAIN:CALLCOMP;进
本文标题:计算机原理习题答案04
链接地址:https://www.777doc.com/doc-2098258 .html