微机原理与接口技术复习题1-5(答案)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

复习题1:1、指出下列指令的错误(1)MOVAH,BX(2)MOV[BX],[SI](3)MOVAX,[SI][DI](4)MOVMYDAT[BX][SI],ES:AX(5)MOVBYTEPTR[BX],1000(6)MOVBX,OFFSETMYDAT[SI](7)MOVCS,AX(8)SALAL,5答案:(1)MOVAH,BX源操作数与目的操作数长度不相同(2)MOV[BX],[SI]这是两个内存单元在传递数据,而这在汇编语言中是不允许的。不允许两内存单元同时作为源操作数和目的操作数进行运算(3)MOVAX,[SI][DI]不能用两个变址连用,其中一个应为基址BX或BP(4)MOVMYDAT[BX][SI],ES:AX同(2)(5)MOVBYTEPTR[BX],1000源操作数与目的操作数长度不相同,1000D=3E8H(6)MOVBX,OFFSETMYDAT[SI]OFFSET不能与复杂操作数相连(7)MOVCS,AX,不能对CS赋值(8)MOVCL,5SALAL,CL2、下面哪些指令是非法的?(假设OP1,OP2是已经用DB定义的变量)(1)CMP15,BX(2)CMPOP1,25(3)CMPOP1,OP2(4)CMPAX,OP1答案(1)非法(2)合法(3)非法(4)非法3、假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列指令中哪些是非法的?它们的错误是什么?(1)MOVBP,AL(2)MOVWORD_OP[BX+4*3][DI],SP(3)MOVWORD_OP1,WORD_OP2(4)MOVAX,WORD_OP1[DX](5)MOVSAVE_WORD,DS(6)MOVSP,SS:DATA_WORD[BX][SI](7)MOVAX,[WORD_OP1+WORD_OP2](8)MOVAX,[WORD_OP1-WORD_OP2+100](9)MOV[WORD_OP1],[WORD_OP1-WORD_OP2]答案:(1)非法,操作数类型不同。(2)合法。(3)非法,不允许两个内存单元直接传递数据。(4)非法,DX不可以用作基址。(5)合法。(6)非法,SS不可以作段跨越前缀。(7)合法。(8)合法。(9)非法,不允许两个内存单元直接传递数据。不允许两内存单元同时作为源操作数和目的操作数进行运算4、假设VAR1和VAR2为字变量,LAB为标号,试指出下列指令的错误之处。(1)ADDVAR1,VAR2(2)SUBAL,VAR1(3)JMPLAB[SI](4)JNZVAR1(5)JMPNEARLAB答案:(1)不允许两内存单元同时作为源操作数和目的操作数进行运算(2)操作数类型不同(3)跳转指令只能转到符号地址(4)转移指令后不能为变量,只能为标号(5)格式不对,应为NEARPTR。补充题5、指出下列指令中的错误,并改正。(1)MOVBL,30A0H(2)MOV0010H,AL(3)XCHGAL,BX(4)MOV[AX],3456H(5)PUSHAL(6)POPCS(7)MOVDS,1000H(8)MOV[BX],[1000H](9)LDS(BX),[1000H](10)LEABX,CX答:(1)数据类型不一致,改为:MOVBX,30A0H(2)0010H是个立即数,既不是一个内存单元的地址,也不是个寄存器改为:MOV[0010H],AL(3)数据类型不一致,改为:XCHGAX,BX(4)这是寄存器间接寻址,只能使用基址变址寄存器。而且需要指定为字类型改为:MOVWORDPTR[SI],3456H(5)PUSH指令是压入堆栈两个字节的操作。改为:PUSHAX(6)不能对CS进行直接修改,改为:POPCX(7)不能对段寄存器直接赋值,而只能通过累加器来赋值改为:MOVAX,1000HMOVDS,AX(8)存储器的两个单元之间不能同时作为源操作数和目的操作数参与运算改为:MOVAX,[1000H]MOV[BX],AX(9)没有()这种指令改为:LDSBX,[1000H](10)源操作数必须是内存单元,寄存器不能给出地址改为:LEABX,[CX]=MOVBX,CX复习题25、假设程序中的数值数据定义如下,DATA1DW25D3HDATA2DB16DUP(?)DATA3DD2A004455HDATA4EQU$-DATA1试画出这些数值数据在内存中的存储示意图,并问DATA4的值是多少?它表示什么意义?答案:D3H25H?∶∶?55H44H00H2AHDATA4的值为22,表示该数据段的长度.注意:“$”为地址计数器的值,用来保存当前正在汇编的指令的偏移地址。6、有字符型数据定义语句如下:K1DB?,?,?,‘123’K2DB‘ABC’LEQUK2–K1试画出这些字符数据在内存中的存储示意图,并问L的值是多少?它表示什么意义?DATA1DATA2DATA316个?$答案:???31H32H33H41H42H43HL的值为6,即为K1数据区的长度。注意:请考试时准备一个ASCII码表7.定义数据段如下,试画出数据存储示意图,并说明X1和X2所对应的逻辑地址各是多少?DATASEGMENTAT10A0HORG0010HX1DB22,33ORG$+0020HX2DB‘AB12CD’DATAENDS答:∶∶∶∶22H33H∶∶∶41H42H31H32H43H44H8.定义数据段如下,写出执行以下指令后的结果K1K2DATAX110A0H:0000H10A0H:0010H10A0H:0012HX210A0H:0032H$DATASEGMENTDA1DW2437H,14A2HDA2DB‘ABCD’DA3DB10DUP(?)DATAENDS(1)MOVBX,DA1;(BX)=2437H(2)MOVSI,OFFSETDA1;(SI)=0000H(3)MOVAL,TYPEDA1;(AL)=2(4)MOVAL,[DA2+02H];(AL)=43H(5)MOVAL,LENGTHDA3;(AL)=10(6)MOVAL,SIZEDA3;(AL)=109.程序中数据段定义的数据如下:DATASEGMENTNAMESDB‘GOODMORNING’DW2050H,78H,3080HDATAENDS请指出下列指令系列执行后累加器中的结果是多少?(1)MOVBX,OFFSETNAMESMOVAL,[BX+03H](2)MOVBX,12MOVSI,3MOVAX,NAMES[BX+SI](3)MOVBX,12MOVSI,3LEAAX,NAMES[BX+SI]答:(1)(AL)=44H(2)(AX)=0078H(3)(AX)=000FH复习题310.试分析下列两个程序段执行的功能(1)CLD;方向标志置为加1LEADI,[0406H];(DI)=0406HMOVCX,0010H;设置循环次数为16次XORAX,AX;AX清零REPSTOW;循环传送AX的值到DI所指向的内存空间(2)CLD;方向标志置为加1MOVCX,10;设置循环次数为10次LEASI,FIRST;把FIRST数据区的首地址SILEADI,SECOND;把SECOND数据区的首地址DIREPMOVSB;循环传送10次答:(1)功能:将起始偏移地址为0406H的16个内存单元清零。(2)功能:将FIRST数据区的10个数据拷贝到SECOND数据区中去11.阅读下列程序段,并说明程序的功能LEABX,ARRAY;LEADI,RESULTMOVCL,4AGAIN:MOVAL,[BX]TESTAL,80HJZNEXTXORAL,0FFHINCALNEXT:MOV[DI],ALINCBXINCDIDECCLJNZAGAIN答:把ARRAY数据区里的四个字节取出来,判断是不是负数,如果是负数就把它变成正数,如果是正数就不处理,最后把这些数再存放到RESULT数据区里去。注意:这里负数是按照补码来表示12.阅读下列程序,写出程序执行后的结果。DATASEGMENTAT3000HBLOCKDB00H,12H,35H,64H,41HDB7FH,80H,0ABH,0EFH,5FHVALDB00HDATAENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETBLOCKMOVAL,[BX]INCBXMOVCX,9AGIN:CMPAL,[BX]JGNEXTMOVAL,[BX]NEXT:INCBXDECCXJNZAGINMOVVAL,ALMOVAH,4CHINT21HCOSEGENDSENDSTART结果:DS=_3000H____,(3000AH)=___00H___,BX=__09H______标志位:CF=__0______,[VAL]=__EFH______13.程序段如下MOVCX,0LOP:ANDAX,AXJZSTOPSALAX,1JNCNODINCCXNOD:JMPLOPSTOP:HLT问该程序段完成什么功能?答:该程序完成对存放在AX中的二进制数的1位进行统计的功能复习题414.设a,b,c均为无符号字节数据,编程计算y=(a+b)×C。解答:(1)分析:由题设条件知a,b,c均为无符号字节数据,那么a+b则在无符号字数据范围内,求出(a+b)之后,其结果与c相乘得到最终结果。(a+b)×C的结果在双字范围内。(2)程序结构:从分析可知这个题目应由顺序程序结构方法来编程。(3)数据定义:解决参加运算的数据和结果应如何存放的问题。参加运算的这三个数可以存放在一个变量开始的单元,也可以分别存放。假设三个数据a,b,c存放在数据段偏移量num开始的单元,结果保存在数据段偏移量为y的单元中,y单元为预留的结果单元。(4)处理方法:程序处理时清零ax,bx,设置数据指针,依次取出a,b求其和,再将此和乘以c,最后将存放在DX和AX中的结果依次送到y单元中。(5)编写程序:根据处理方法和数据存放空间的分配编写源程序。汇编语言源程序清单如下:DSEGSEGMENTaDB200bDB238cDB196;三个数据a,b,cyDW2DUP(?)DSEGENDS;CSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:;--------请在这里加入语句,完成数据段初始化---------------MOVAX,DSEGMOVDS,AX;------------使AX,BX清零---------------XORAX,AXMOVBX,AX;--------------完成(a+b)×C---------MOVAL,aMOVBL,bADDAX,BXMOVBL,cMULBX;-----------将运算结果存到y单元中---------------------MOVDI,OFFSETyMOV[DI],AXMOV[DI+2],DX;-----------------------------------------------------------CSEGENDSENDSTART15.编程计算无符号字节数之和。无符号字节数的长度及其所求的和都存放在存储器的数据段中。无符号字节数串从NUM单元开始存放,长度存放在COUNT单元,和存放在SUM单元。假设和数小于256。解答:分析:由题目可知,要求将多个无符号字节数加起来,主要任务是做加法,关键指令是“加法指令”,由于一条加法指令每次只能完成两个数据的加法运算,因此,要多次使用加法指令,首先把第1、第2个数相加,其和再与第3个数相加。。,依次完成n个数的加法。程序结构:从以上分析可知该程序应采用循环结构。数据定义:要存储的数据有字节长度、字节数及其结果。字节数长度(count)定义为字单元,待加的无符号数(num))定义为字节单元,连续存放COUNT个无符号字节数,结果(sum)定义为字节单元。处理方法:做好循环初始化工作,在循环次数控制下完成任务。循环的初始化部分完成:(1)和数寄存器AX清零:0→AX(2)设置这串数的长度CX:(COUNT)→CX(3)设

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功