还剩16页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
复习题
11、指出下列指令的错误
(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)SALAL5答案
(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,CL
2、下面哪些指令是非法的?(假设OP1,OP2是已经用DB定义的变量)
(1)CMP15,BX
(2)CMPOP1,25
(3)CMPOP1,OP2
(4)CMPAX,OP1答案
(1)非法
(2)合法
(3)非法
(4)非法
3、假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列指令中哪些是非法的?它们的错误是什么?
(1)MOV BP,AL
(2)MOV WORD_OP[BX+4*3][DI],SP
(3)MOV WORD_OP1WORD_OP2
(4)MOV AXWORD_OP1[DX]
(5)MOV SAVE_WORDDS
(6)MOV SPSS:DATA_WORD[BX][SI]
(7)MOV AX[WORD_OP1+WORD_OP2]
(8)MOV AX[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)ADD VAR1,VAR2
(2)SUB AL,VAR1
(3)JMP LAB[SI]
(4)JNZ VAR1
(5)JMP NEAR LAB答案
(1)不允许两内存单元同时作为源操作数和目的操作数进行运算
(2)操作数类型不同
(3)跳转指令只能转到符号地址
(4)转移指令后不能为变量,只能为标号
(5)格式不对,应为NEARPTR补充题
5、指出下列指令中的错误,并改正1MOVBL30A0H2MOV0010HAL3XCHGALBX4MOV[AX]3456H5PUSHAL6POPCS7MOVDS1000H8MOV[BX][1000H]9LDSBX[1000H]10LEABXCX答
(1)数据类型不一致,改为MOVBX,30A0H
(2)0010H是个立即数,既不是一个内存单元的地址,也不是个寄存器改为MOV[0010H],AL
(3)数据类型不一致,改为XCHGAXBX
(4)这是寄存器间接寻址,只能使用基址变址寄存器而且需要指定为字类型改为MOVWORDPTR[SI]3456H
(5)PUSH指令是压入堆栈两个字节的操作改为:PUSHAX
(6)不能对CS进行直接修改改为POPCX
(7)不能对段寄存器直接赋值,而只能通过累加器来赋值改为MOVAX1000HMOVDSAX
(8)存储器的两个单元之间不能同时作为源操作数和目的操作数参与运算改为MOVAX[1000H]MOV[BX]AX
(9)没有()这种指令改为LDSBX[1000H]
(10)源操作数必须是内存单元,寄存器不能给出地址改为LEABX[CX]=MOVBX,CX复习题
25、假设程序中的数值数据定义如下,DATA1 DW 25D3HDATA2 DB 16 DUP(?)DATA3 DD 2A004455HDATA4 EQU $-DATA1试画出这些数值数据在内存中的存储示意图,并问DATA4的值是多少?它表示什么意义?答案D3H25H∶∶55H44H00H2AHDATA4的值为22,表示该数据段的长度.注意“$”为地址计数器的值,用来保存当前正在汇编的指令的偏移地址
6、有字符型数据定义语句如下K1 DB ?,?,?,‘123’K2 DB ‘ABC’L EQU K2–K1试画出这些字符数据在内存中的存储示意图,并问L的值是多少?它表示什么意义?答案31H32H33H41H42H43HL的值为6,即为K1数据区的长度注意请考试时准备一个ASCII码表
7.定义数据段如下,试画出数据存储示意图,并说明X1和X2所对应的逻辑地址各是多少?DATASEGMENTAT10A0HORG0010HX1DB2233ORG$+0020HX2DB‘AB12CD’DATAENDS答∶∶∶∶22H33H∶∶∶41H42H31H32H43H44H
8.定义数据段如下,写出执行以下指令后的结果DATASEGMENTDA1DW2437H14A2HDA2DB‘ABCD’DA3DB10DUPDATAENDS1MOVBXDA1;BX=2437H2MOVSIOFFSETDA1;SI=0000H3MOVALTYPEDA1;AL=24MOVAL[DA2+02H];AL=43H5MOVALLENGTHDA3;AL=106MOVALSIZEDA3;AL=
109.程序中数据段定义的数据如下DATASEGMENTNAMESDB‘GOODMORNING’DW2050H78H3080HDATAENDS请指出下列指令系列执行后累加器中的结果是多少?
(1)MOVBXOFFSETNAMESMOVAL[BX+03H]
(2)MOVBX12MOVSI3MOVAXNAMES[BX+SI]
(3)MOVBX12MOVSI3LEAAXNAMES[BX+SI]答
(1)(AL)=44H
(2)(AX)=0078H
(3)(AX)=000FH复习题
310.试分析下列两个程序段执行的功能
(1)CLD;方向标志置为加1LEADI[0406H];DI=0406HMOVCX0010H;设置循环次数为16次XORAXAX;AX清零REPSTOW;循环传送AX的值到DI所指向的内存空间
(2)CLD;方向标志置为加1MOVCX10;设置循环次数为10次LEASIFIRST;把FIRST数据区的首地址SILEADISECOND;把SECOND数据区的首地址DIREPMOVSB;循环传送10次答
(1)功能将起始偏移地址为0406H的16个内存单元清零
(2)功能将FIRST数据区的10个数据拷贝到SECOND数据区中去
11.阅读下列程序段,并说明程序的功能LEABXARRAY;LEADIRESULTMOVCL4AGAIN:MOVAL[BX]TESTAL80HJZNEXTXORAL0FFHINCALNEXT:MOV[DI]ALINCBXINCDIDECCLJNZAGAIN答把ARRAY数据区里的四个字节取出来,判断是不是负数,如果是负数就把它变成正数,如果是正数就不处理,最后把这些数再存放到RESULT数据区里去注意这里负数是按照补码来表示
12.阅读下列程序写出程序执行后的结果DATASEGMENTAT3000HBLOCKDB00H12H35H64H41HDB7FH80H0ABH0EFH5FHVALDB00HDATAENDSCOSEGSEGMENTASSUMECS:COSEGDS:DATASTART:MOVAXDATAMOVDSAXMOVBXOFFSETBLOCKMOVAL[BX]INCBXMOVCX9AGIN:CMPAL[BX]JGNEXTMOVAL[BX]NEXT:INCBXDECCXJNZAGINMOVVALALMOVAH4CHINT21HCOSEGENDSENDSTART结果:DS=_3000H____3000AH=___00H___BX=__09H______标志位CF=__0______[VAL]=__EFH______
13.程序段如下MOVCX0LOP:ANDAXAXJZSTOPSALAX1JNCNODINCCXNOD:JMPLOPSTOP:HLT问该程序段完成什么功能?答该程序完成对存放在AX中的二进制数的1位进行统计的功能复习题
414.设abc均为无符号字节数据,编程计算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;三个数据abcyDW2DUPDSEGENDS;CSEGSEGMENTASSUMECS:CSEGDS:DSEGSTART:;--------请在这里加入语句,完成数据段初始化---------------MOVAXDSEGMOVDSAX;------------使AX,BX清零---------------XORAXAXMOVBXAX;--------------完成a+b×C---------MOVALaMOVBLbADDAXBXMOVBLcMULBX;-----------将运算结果存到y单元中---------------------MOVDIOFFSETyMOV[DI]AXMOV[DI+2]DX;-----------------------------------------------------------CSEGENDSENDSTART
15.编程计算无符号字节数之和无符号字节数的长度及其所求的和都存放在存储器的数据段中无符号字节数串从NUM单元开始存放,长度存放在COUNT单元,和存放在SUM单元假设和数小于256解答分析:由题目可知,要求将多个无符号字节数加起来,主要任务是做加法,关键指令是“加法指令”,由于一条加法指令每次只能完成两个数据的加法运算,因此,要多次使用加法指令,首先把第
1、第2个数相加,其和再与第3个数相加,依次完成n个数的加法程序结构:从以上分析可知该程序应采用循环结构数据定义:要存储的数据有字节长度、字节数及其结果字节数长度(count)定义为字单元,待加的无符号数(num)定义为字节单元,连续存放COUNT个无符号字节数,结果(sum)定义为字节单元处理方法:做好循环初始化工作,在循环次数控制下完成任务循环的初始化部分完成:1和数寄存器AX清零:0→AX2设置这串数的长度CX:COUNT→CX3设置这串数的数据首地址BX:OFFSETNUMBX循环体中应完成:4把一个数据与和数相加,结果存放在和数寄存器AL中:AL+[BX]AL5修改数据指针:BX+1BX循环结束判断:6加法结束了吗CX-1CXCX=0若没有,则循环转向4;若已经完成,则转结束处理7:7结果→SUM单元;8程序结束程序流程图如图
5.19所示程序清单如下DSEGSEGMENTCOUNTEQU6;字节数长度单元NUMDB03H07H11H02H30H19H;待加字节数6个字节SUMDB;预留1个字节单元存放结果DSEGENDSCSEGSEGMENTASSUMECS:CSEGDS:DSEGSTART MOVAXDSEGMOVDSAX;数据段初始化;-----------------请从这里补充代码,完成整个程序-------------------------XORALALMOVBXOFFSETNUMMOVCXCOUNTLOP:ADDAL[BX]INCBXLOOPLOPMOVSUMAL;------------------------------------------------------------------------------------CSEGENDSENDSTART
16.编制一个数据块移动程序,要求完成如下任务:1给内存数据段DATA中偏移地址为01开始的连续32个字节单元置入数据OOH,01H,02H,…,1FH2将内存数据段DATA中偏移地址为01的数据传送到偏移地址为n2开始的连续的内存单元中去解答1分析:这个题目需要对32个单元进行相同的操作,但是每次参加操作的数据不同程序结构:本程序结构应该选择循环结构数据定义:该程序只需要从n1开始保留32个字节单元每个单元中要置人的数据是有规律变化的数据,可以在程序中生成处理方法:做好循环初始化工作,在循环次数控制下完成任务循环的初始化部分完成:1将n1的偏移地址置入变址寄存器SI或者BX,BP,DI都可以,这里的变址寄存器作地址指针用
②待传送数据的起始值OOH送AL
③循环计数值32或20H送计数寄存器CX循环体中完成:
③AL中内容送地址指针所指单元
⑤AL加1送AL;依次得到01H,02H,03H,…,1FH
⑤地址指针加1,指向下一个地址单元循环结束判断:
⑦计数器CX-l→CX
⑧若CX≠0,继续循环;否则结束循环程序流程图如图所示汇编语言程序如下DSEGSEGMENTNlDB20HDUPDSEGENDSCSEGSEGMENTASSUMECS:CSEGDS:DSEGSTART MOVAX,DSEGMOVDS,AX;数据段地址DS;-----------------请从这里补充代码,完成整个程序-------------------------MOVSIOFFSETN1MOVAL00HMOVCX32LOP:MOV[SI]ALINCALINCSIDECCXJNZLOP;------------------------------------------------------------------------------------CSEGENDSENDSTART
(2)分析:这个问题是数据块移动问题程序结构:可选择循环结构或串传送指令来处理,如选择串传送指令MOVSB指令数据定义:要定义源串和目的串源串是如1中所设置的数据,目的串要保留相应长度的空间源串的数据的置入可使用loop循环来完成处理方法:MOVSB指令是字节传送指令它要求事先将摞串的首偏移地址送S1,段地址为DS,目的串的首偏移地址送DI,段地址为ES,串长度送CX寄存器中,并设置方向标志DF编写程序:根据数据定义和处理方法编写摞程序C汇编语言源程序清单如下:DSEGSEGMENTN1DB20HDUP;源数据串区域定义N2DB20HDUP;目的数据串区域定义DSEGENDS.CSEGSEGMENTASSUMECS:CSEGDS:DSEGES:DSEGSTART:MOVBXDSEGMOVDSBX;源数据区域的段地址DSMOVESBX;目的数据区域的段地址→ES;--------在源数据区N1中置入从00H开始的32个字节数据------------MOVSIOFFSETN1MOVAL00HMOVCX32LOP:MOV[SI]ALINCSIINCALLOOPLOP;------------将源数据区N1的数据传送到目的数据区N2去-------------MOVSIOFFSETN1MOVDIOFFSETN2CLDMOVCX32REPMOVSB;------------------------------------------------------------------------------CSEGENDSENDSTART
17.给定符号函数1X0Y=0X=0-1X0设任意给定的X存放在DATAX单元,计算出函数Y值,要求存放在DATAY单元中解答A.分析:这是一个数学上求符号函数值的问题,根据自变量X的值来确定函数Y的值程序结构:这是一个根据条件判断产生分支的问题,应采用分支程序结构首先判断X0还是X0如果X0,则能确定Y=-1;如果X不小于0,则要进一步判断X=0还是X0来确定函数值YB.数据定义:这里数据定义比较简单,定义一个自变量Xdatax单元,结果单元YdatayC.处理方法:这个问题的处理步骤如下:1取出X→AL;2判断AL≥0,是转向4,不是转向3;3-1AL,转向6;4AL=
0..”是转向6,不是转向5;51AL;6ALDATAY;7结束求符号函数值的流程如图所示程序代码DSEGSEGMENTDATAXDBXXHDATAYDBDSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART MOVAX,DSEGMOVDS,AX;---------请填入代码----------------MOVAL[DATAX]TESTAL80HJZBIGEMOVAL0FFHJMPEXITBIGE:CMPAL0JEEQULMOVAL1EQUL:MOV[DATAY]AL;------------------------------------CSEGENDSENDSTART复习题
51.静态RAMInte12114的容量为lK×4位,用其构成16K×8位的存储器,问需要多少片Intel2114解根据题意知,每片2114有1024个存储单元,每个存储单元可存放4位二进制码要构成16×1024个单元、每个单元存放8位二进制码的存储器,则需要片数计算如下:
2.已知SRAM6116芯片的容量为2K×8位,判断该芯片有多少根地址输入端?多少根数据输入端?解SRAM6116芯片具有2x1024个单元,每个单元8位对2048个单元的每个单元分配唯一的地址,需11根地址线,这是因为211=2048对存储单元中的人个二进制码要并行存取,需要8根数据线3.用Inte12114芯片组成4K×8位的存储器,完成芯片之间及芯片和CPU之间的连接解1计算所需芯片数目题目要求设计4K×8位的存储器,而Inte12114的结构是1KB×4用Inte12114组成8位存储器,每组需两个芯片组成4KB存储器,则需四组因此共需八片Intel2114芯片2地址总线连接4KB存储器具有4×1024个单元,共需地址线12根,因为212=4×1024其中10根地址线A0-A9作为Inte12114片内地址,另外2根Al0-A11作为芯片组的片选线每组存储器两个芯片的片选段相连,使得两块芯片同时被选中第1组:片选信号CS0A10=0,A11=0芯片组的12位地址:0000H-03FFH第2组:片选信号CSlA10=0A11=1芯片组的12位地址:0400H-07FFH第3组:片选信号CS2A10=1A11=0芯片组的12位地址:0800H-0BFFH第4组:片选信号CS3A10=1A11=1芯片组的12位地址:0C00H-0FFFH请解决一下两个问题
(1)按照地址分配表画出相应的地址位图,按地址总线为16位来画
(2)若CPU的地址总线为16位,请问有多少个地址重叠区?3数据线的连接每组内有两块芯片,这两块芯片的数据线各4位分别与数据总线的低4位和高4位连接4控制线的连线要使Intel2114芯片正常工作,只进行地址线、数据线及片选信号线连接还不够因为Intel2114存储器中数据的存取还受WE写允许信号的控制WE应与CPU的WR相连5读写过程写入时,先由CPU发出地址信息,高位地址总线通过译码器产生片选信号召,选中某组存储器低位地址线A9-AO选中存储器的某单元然后,CPU发出写入控制信号,使WE成为低电平紧接着,CPU发出数据,并把它写入选中的单元读出时,同样先由CPU发出地址信息,选中存储器的某单元但这时CPU并没发写入信号,因此有E为高电平选中单元的数据被送到数据总线,由CPU读取
4.为某8位机(地址总线为16位)设计一个32KB容量的存储器要求EPROM区为8KB,从0000H开始,作为系统程序区;RAM区为24KB,从2000H开始,作为用户程序区片选信号采用全译码法解答
(1)选用两片2732(4K×8)和3片6264(8K×8)组成存储器,用74LS138产生片选
(2)地址分配表第一片2732(4KB=212)第二片2732(4KB=212)第一片6264(8KB=213)第二片6264(8KB=213)第三片6264(8KB=213)如上可知,A15-A13是作为3-8译码器74LS138的输入;对于2732,A11~A0作为片内地址线,A12是作为片选控制,用来从两片2732中选出一片;对于6264,A12~A0作为片内地址线
(3)请根据前面所提供的信息,画出存储器,译码器与CPU系统总线的连接图说明
(1)为访存控制信号(低电平有效),这是系统总线里一个信号
(2)74LS138的片选输出段与2732和6264的(片选)端相连,
(3)系统总线里只有一个信号来控制存储器读写,为高电平时,完成读的过程,为低电平时,完成写的过程小结进行存储器扩展设计时,通常按下列步骤进行
(1)根据系统实际装机存储容量,确定存储器的地址范围,也就是在整个存储空间中的位置或根据指定存储器的地址范围,得出存储器的容量
(2)针对不同的用途,选择合适的存储器芯片,如ROM还是RAM?然后根据存储容量选择相应的存储芯片数量
(3)列出地址分配表,画出地址位图
(4)根据地址分配表,确定片选和片内单元的地址线,由片选的地址线位数来选用相应的译码器需要了解的是74LS
138.
(5)分别按地址总线、数据总线和控制总线,画出存储器,译码器与CPU系统总线的连接图相关内容可参考课本节及课本习题
6.1-
6.4附加题如果要把地址范围4000H~47FFH设置为用户程序区,请问需要多少片1K×8的RAM芯片,地址线如何连接?DATA1DATA2DATA316个?$K1K210A0H0000H10A0H0010H10A0H0012HDATAX1$X210A0H0032HA15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A000000000000000000000111111111111cba12Bit212=4kByte0000H0FFFHA15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A000010000000000000001111111111111cba12Bit212=4kByte1000H1FFFHA15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A000100000000000000011111111111111cba13Bit213=8kByte2000H3FFFHA15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A001000000000000000101111111111111cba13Bit213=8kByte4000H5FFFHA15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A001100000000000000111111111111111cba13Bit213=8kByte6000H7FFFH圆圈符号为“非门”74LS1382732G1G2AG2BY3cY2bY1aY02732626462646264MREQA15A14A13A12A0~A11D0~D7WR与门。