《微机原理课后习题参考答案.doc》由会员分享,可在线阅读,更多相关《微机原理课后习题参考答案.doc(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流微机原理课后习题参考答案.精品文档.第1部分 微型计算机基础知识1.1 微处理器、微型计算机和微型计算机系统三者之间有什么不同?【解】微处理器:指计算机内部对数据进行处理并对处理过程进行控制的部件,伴随着大规模集成电路技术的迅速发展,芯片集成密度越来越高,CPU可以集成在一个半导体芯片上,这种具有中央处理器功能的大规模集成电路器件,被统称为“微处理器”。 微型计算机:简称“微型机”、“微机”,也称“微电脑”。由大规模集成电路组成的、体积较小的电子计算机。由微处理机(核心)、存储片、输入和输出片、系统总线等组成。特点是体积小、灵活性大、价格便宜
2、、使用方便。微型计算机系统:简称“微机系统”。由微型计算机、显示器、输入输出设备、电源及控制面板等组成的计算机系统。配有操作系统、高级语言和多种工具性软件等。1.2 CPU在内部结构上由哪几部分组成?CPU应该具备哪些主要功能?【解】CPU在内部结构上由运算器、控制器、寄存器阵列和内部总线等各部分构成,其主要功能是完成各种算数及逻辑运算,并实现对整个微型计算机控制,为此,其内部又必须具备传递和暂存数据的功能。1.3 微型计算机采用总线结构有什么优点?【解】 简化了系统结构,便于系统设计制造; 大大减少了连线数目,便于布线,减小体积,提高系统的可靠性; 便于接口设计,所有与总线连接的设备均采用类
3、似的接口; 便于系统的扩充、更新与灵活配置,易于实现系统的模块化; 便于设备的软件设计,所有接口的软件就是对不同的口地址进行操作; 便于故障诊断和维修,同时也降低了成本。总线的逻辑电路有些是三态的,即输出电平有三种状态:逻辑“0”,逻辑“1”和“高阻”态。1.4计算机总线有哪些,分别是什么?【解】总线按其信号线上传输的信息性质可分为三组: 数据总线,一般情况下是双向总线; 地址总线,单向总线,是微处理器或其他主设备发出的地址信号线; 控制总线,微处理器与存储器或接口等之间15 数据总线和地址总线在结构上有什么不同之处?如果一个系统的数据和地址合用一套总线或者合用部分总线,那么要靠什么来区分地址
4、和数据?【解】数据总线(DB)为双向结构,数据在CPU与存储器或I/O接口之间的传送是双向的,(数据既可以读也可以写),其宽度通常与微处理器的字长相同。而地址总线(AB)是CPU向存储器或I/O接口传送地址的信号线,只需单向传输,它的位数决定了CPU可以直接寻址的范围。8086CPU为了减少芯片的引脚数量,采用数据与地址线复用,既作数据总线也作为地址总线。它们主要靠信号的时序来区分。通常在读写数据时,总是先输出地址(指定要读或写数据的单元),然后再读或写数据。第2部分 80X86微处理器2.1 IA-32结构微处理器直至Pentium 4,有哪几种?【解】80386、80486、Pentium
5、 、Pentium Pro、Pentium II、Pentium III、Pentium 4。2.2 IA-32结构微处理器有哪几种操作模式?【解】IA-32结构支持3种操作模式:保护模式、实地址模式和系统管理模式。操作模式确定哪些指令和结构我是可以访问的。2.3 IA-32结构微处理器的地址空间如何形成?【解】由段寄存器确定的段基地址与由各种寻址方式确定的有效地址相加形成了线性地址。若未启用分页机制,线性地址即为物理地址;若启用分页机制,则它把线性地址转换为物理地址。2.4 基本程序执行寄存器是由哪些寄存器组成?【解】基本程序执行寄存器由以下寄存器组成:(1)通用寄存器。这8个寄存器能用于存
6、放操作数和指针。(2)段寄存器。这些寄存器最多能保持6个段先择子。(3)EFLAGS(程序状态和控制)寄存器。EFLAGS寄存器报告正在执行的程序的状态并允许有限地(应用程序级)控制处理器。(4)EIP(指令指针)寄存器。EIP寄存器包含下一条要执行的釜底抽薪32位指针。2.5 实地址方式的存储器是如何组织的?地址如何形成?【解】IA-32结构微处理器中的实地址方式是为了与8086(8088)CPU兼容而设置的。所以IA-32结构微处理器的实地址方式是从存储器组织来看与8086(8088)CPU的存储器组织是一样的。8086微处理器有20条地址引线,它的直接寻址能力为220=1MB。所以,在一
7、个由8086组成的系统中,可以有多达1MB的存储器。这1MB逻辑上可以组织成一个线性矩阵。地址范围为00000HFFFFFH。但是,在8086内部的AIU能进行16位运算,有关地址的寄存器如SP、IP,以及BP、SI、DI等也都是16位的,因而8086对地址的运算也只能是16位。这就是说,对于8986来说,各种寻址方式,寻找操作数的范围最多只能是64KB。所以,整个1MB存储器以64KB为范围若干段。在寻址一个具体物理单元时,必须要由一个基地址再加上各种寻址方式确定的16位偏移量来形成实际的20位物理地址。段基地址就是由8088向处理器段寄存器中的16位数自动左移4位,然后再与16位偏移量相加
8、,形成20位物理地址。2.6 通用寄存器起什么作用?【解】通用寄存器主要用于:(1)逻辑和算术操作的操作数。(2)用于地址计算的操作数。(3)内存指针。2.7 8086的基本程序执行寄存器是由哪些寄存器组成?【解】基本程序执行寄存器是由八个通用寄存器、四个段寄存器、标志寄存器FLAG和IP寄存器组成。2.8 8086的存储器是如何组织的?地址如何形成?【解】8086的存储器采用分段机制。实际存储单元地址由段基址左移四位加上偏移地址构成20位的物理地址所组成。2.9 指令地址如何形成?【解】由段寄存器CS确定的段基地址与由指令指针确定的偏移理相加形成指令地址。2.10 8086微处理器的总线接口
9、部件有哪些功能?请一一说明。【解】总线接口单元(BIU)负责与存储器接口;执行单元(EU)执行各种操作。BIU主要由段寄存器、指令指针、加法器(形成20位地址)和预取的指令流队列等组成。2.11 8086微处理器的总线接口有哪几部分组成?【解】8086微处理器中的总线接口单元(BIU)负责CPU与存储器之间的信息传送。由(1)4个段地址寄存器。即CS DS ES SS。(2)16位的指令指针寄存器IP。(3)20位的地址加法器。(4) 6字节的指令队列。具体地说,BIU既负责从内存的指定部分取出指令,送至指令队列中的排队(8086的指令队列有6个字节,而8088的指令队列只有4个字节);也负责
10、传送执行指令时所需的操作数。执行单元(EU)负责执行指令规定的操作。2.12 段寄存器CS=1200H,指令指针寄存器IP=FF00H,此时,指令的物理地址为多少?【解】指令的物理地址=12000H+FF00H=21F00H2.13 8086微处理器的执行部件有什么功能?由哪几部分组成?【解】8086微处理器的执行部件负责指令的执行。它主要由算术逻辑单元、标志寄存器和通用寄存器等部分组成。2.14 状态标志和控制标志有何不同?程序中是怎样利用这两类标志的?8086微处理器的状态标志和控制标志分别有哪些?【解】状态标志反映算术和逻辑运算的结果,主要用于各种条件。控制标志实现一些控制作用。EFLA
11、GS寄存器有下面6个状态标志。(1)进位标志C(Carry Flag)当结果的最高位(字节操作时的D7或字操作时的D15、双字操作的D31)产生一个进位或借位,则C=1,否则为0。这个标志主要用于我字节数的加、减法运算。移位和循环指令也能够把存储器或寄存器中的最高位(左移时)或最低位(右移时)放入标志C中。(2)辅助进位标志A(Auxitiary Carry Flag)在字节操作时,则由低半字节(一个字节的低4位)向高半字节有进位或借位,则A=1,否则为0 。这个标志用于十进制算术运算指令中。(3)溢出标志O(Overflow Flag) 在算术运算中,带符号数的运算结果超出了8位、16位或3
12、2位带符号数所能表达的范围,即在字节运算时大于+127或小于-128,在字运算时大于+32767或小于-32768,在双字运算时大于+231-1或小于-231,则此标志置位,否则复位。一个任先的溢出中数据指令,在溢出情况下能产生中断。(4)符号标志S(Sign Flag)符号标志值与运算结果的最高位相同。即结果的最高位(字操作时为D15)为1,则S=1;否则,S=0。由于在IA-32结构微处理器中,符号数是用补码表示的,所以S表示了结果的符号,0=正,1=负。(5)奇偶标志P(Parity Flag)若操作结果中“1”的个数为偶数,则P=1,否则P=0。这个标志可用于检查在数据传送过程中是否发
13、生错误。(6)零标志Z(Zero Flag)若运算的结果为0,则Z=1,否则Z=03个控制标志,TF陷阱标志位(单步标志位、跟踪标志)。当该位置1时,将使8086/8088进入单步工作方式,通常用于程序的调试。IF中断允许标志位,若该位置1,则处理器可以响应可屏蔽中断,否则就不能响应可屏蔽中断。DF方向标志位,若该位置1,则串操作指令的地址修改为自动减量方向,反之,为自动增量方向。2.15 如果一个堆栈从地址1250::0000H开始,它的最后一个字的偏移地址为0100H,SP的内容为0052H,问:(1)栈顶地址是什么?(2)栈底地址是什么?(3)在SS中的段地址是什么?(4)存入数据234
14、5H后,SP的内容是什么?【解】. 栈顶地址1250:0052,SP指向栈顶地址。. 栈底地址1250:0100,栈底地址为高地址。. SS中的段地址为1250,SS中的段地址为堆栈段地址。存入2345H后,SP内容为0050H。一次入栈操作,SP=SP-2。2.16 8086微处理器是怎样解决地址线和数据线的复用问题的?ALE信号何时有效?【解】采用分时复用的方法。ALE在T1时刻有效,其他时间段均无效。第3部分 80X86微处理器的指令系统3.1 分别指出下列指令中的源操作数和目的操作数的寻址方式。(1)MOV SI,300(2)MOV CX,DATADI(3)ADD AX,BXSI(4)
15、AND AX,CX(5)MOV BP,AX(6)PUSHF【解】(1)源操作数为立即寻址,目的操作数为寄存器寻址。(2)源操作数为变址寄存器加位移量寻址,目的操作数为寄存器寻址。(3)源操作数为基址加变址寻址,目的操作数为寄存器寻址。(4)源操作数和目的操作数都 为寄存器寻址。(5)源操作数为寄存器址,目的操作数为寄存器间接寻址。(6)为堆栈操作。3.2 8086汇编语言指令的寻址方式有哪几类?哪种寻址方式的执行速度最快?【解】寻址方式分为:立即寻址方式、寄存器操作数寻址方式和存储器操作数寻址方式。其中,寄存器操作数寻址方式的执行速度最快。3.3试述指令MOV AX,2000H和MOV AX,
16、DS:2000H的区别。【解】前一条指令是立即数寻址,即把立即数2000H传送至寄存器AX。后一条指令是直接寻址,是把数据(DS)段中的地址为2000H单元的内容传送至寄存器AX。3.4 堆栈操作指令时要注意什么问题?传送指令和交换指令在涉及内存操作数时应该分别要注意什么问题?【解】使用堆栈指令可以把内存单元作为一个操作数(从内存到内存)。但堆栈固定在堆栈段,且只能由SP指向。且堆栈操作要修改堆栈指针。MOV指令不能实现内存单元间的数据传送。XCHG指令是交换,有一个操作数必须是寄存器。3.5 断下列指令书写是否正确。 (1) MOY AL,BX (2) MOY AL,CL (3) INC B
17、X(4) MOV 5,AL (5) MOV BX,SI (6) MOV BL,0F5H (7) MOV DX,2000H (8) POP CS (9) PUSH CS【解】 (1)不正确,AL与BL数据宽度不同。(2)正确。(3)不正确,因为不明确是增量字节还是字。(4)不正确,立即数不能作为目的操作数。(5)不正确,因为不明确要传送的是字节还是字。(6)正确。(7)正确。(8)不正确,CS不能作为POP指令的操作数。(9)不正确,CS不能作为PUSH指令的操作数。3.6写出以下指令中内存操作数的所在地址。(1)MOV AL,BX+10(2)MOV BP+10,AX(3)INC BYTE PT
18、RSI+5(4)MOV DL,ES:BX+SI(5)MOV BX,BP+DI+2【解】(1)数据段BX+10单元(2)堆栈段BP+10单元(3)数据段SI+5字节单元(4)附加段(ES段)BX+SI单元(5)堆栈段BP+DI+2单元3.7 两种方法写出从80H端口读入信息的指令。再用两种方法写出从40H口输出100H的指令。【解】 (1)IN AL,80H (2)MOV DX,80H IN AL,DX (3)MOV AL,100H OUT 40H,AL (4)MOV AL,100HMOV DX,40HOUT DX,AL3.8假如:AL=20H,BL=10H,当执行CMP AL,BL后,问: (
19、1)AL、BL中的内容是两个无符号数,比较结果如何?影响哪几个标志位? (2)AL、BL中的内容是两个有符号数,结果又如何,影响哪几个标志位?【解】 (1)AL=20H,BL=10H,O=0,S=0,Z=0,A=0,P=0,C=0。 (2)因为两个都是符号正数,其结果与(1)相同。3.9设堆栈指针SP的初始值为1000H,AX=2000H,BX=3000H,试问:(1)执行指令PUSH AX后SP=?(2)再执行PUSH BX及POP AX后SP=?、AX=?、BX=?【解】(1)SP=OFFEH.。 (2)SP=OFFEH;AX=3000H;BX=3000H。3.10要想完成把3000H送2
20、000H中,用指令:MOV 2000H,3000H 是否正确?如果不正确,应用什么方法?【解】不正确。 正确的方法为: MOV AL,3000H MOV 2000H,AL3.11若要使AL10,有哪几种方法,试编写出各自的程序段。【解】 (1)使用乘法指令: MOV BL,10 ;乘数 MUL BL ;AL*BL,结果存入AX (2)使用移位指令: SHL AL,1 ;AL*2 MOV BL,AL ;保留一份 SHL AL,2 ;AL*2*2*2 ADD AL,BL ;AL*(8+2) (3)使用加法指令: ADD AL,AL MOV BL,AL ADD AL,AL ADD AL,AL ADD
21、 AL,BL3.12 用两种方法写出从80H端口读入信息的指令。再用两种方法写出从40H口输出100H的指令。【解】(1)IN AL,80H (2)MOV DX,80H IN AL,DX (3)MOV AL,100H OUT 40H,AL (4)MOV AL,100H MOV DX,40H OUT DX,AL3.13 8086汇编语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快?【解】寻址方式分为:立即数寻址方式、寄存器操作数寻址方式和存储器操作数寻址方式。其中,寄存器操作数寻址方式的指令执行速度最快。3.14普通移位指令和循环移位指令(带CF的和不带CF的两类)在执行操作时,有
22、什么差别?在编制乘、除法程序时,为什么常用移位指令来代替乘、除法指令?试编写一个程序段,实现将BX中的数乘以10,结果仍放在BX中的操作。【解】这两种指令的区别在于是否把标志位(CF)的值放入循环中。作移一位相当于乘2,右移一位相当于除2。故左移或右移可实现乘或除2的幂。而移位指令比乘法和除法指令要快得多。要实现BX中的数乘10,可以用乘(2+8)实现,乘2即左移1位,乘8即左移3位,把左移1位和左移3位的数相加就行。 SHL BX,1 MOV AX,BX SHL BX,2 ADD BX,AX3.15用串操作指令设计实现如下功能的程序段:首先将100H个数从2170H处搬到1000H处;然后,
23、从中检索出相等于AL中字符的单元,并将此单元的值换成空格符。【解】MOV SI,2170H MOV DI,1000H MOV CX,100HREP MOVS DI,SINEXT: SCASB JZ NI LOOP NEXT NI: DEC DI MOV DI,20H JMP NEXT3.16在使用条件转移指令时,要特别注意它们均匀为相对转移指令,请解释“相对转移”的含义。如果要向较远的地方进行条件转移,那么,程序中应该怎样设置?【解】相对转移即为相对于指令指针的转移,通常偏移量是8位数,这是短(short)转移;它可以规定16位偏移量,这就是段内(near)转移。3.17用寄存器间接寻址方式时
24、,BX、BP、SI、DI分别针对什么情况来使用?这四个寄存器组合间接寻址时,地址时怎样计算的?举例进行说明。【解】在寄存器间接寻址方式下,BX和BP作为间接寄存器使用,而SI、DI作为变址寄存器使用。除BP间接默认的段为堆栈段,其他的都默认为数据段。它们都可以单独使用,或加上偏移量后组合使用。如:BX+nBP+nSI+nDI+nBX+SI+nBX+DI+nBP+SI+nBP+DI+n3.18 下面这些指令中哪些是正确的?哪些是错误的?如果是错误的,请说明原因。 (1)XCHG CS,AX (2)MOV BX,1000 (3)XCHG BX,IP (4)PUSH CS (5)POP CS (6)
25、IN BX,DX (7)MOV BYTEBX,1000 (8)MOV CS,1000【解】(1)错误,CS不能交换。 (2)错误,MOV指令不能在内存间传送。 (3)错误,IP不能交换。 (4)错误,CS可以作为PUSH指令的操作数。 (5)错误,CS可以作为POP指令的操作数。 (6)错误,IN指令的目的操作数是累加器。 (7)错误,目的操作数是字节单元。 (8)错误,CS不能作为MOV指令的目的操作数。3.19 字节扩展指令和字扩展指令用在什么场合?【解】主要用于字节相除和字相除之前,把被除数扩展为两倍宽度的操作数。3.20使用堆栈操作指令时要注意什么问题?传送指令和交换指令在涉及内存操作
26、数时分别要注意什么问题?【解】使用堆栈指令可以把内存单元作为一个操作数(从内存到内存)。但堆栈固定在堆栈段且只能由SP指向。且堆栈操作要修改堆栈指针。MOV指令不能实现内存单元间的数据传送。XCHG指令是交换,有一个操作数必须是寄存器。3.21在执行中断指令时,堆栈的内容有什么变化?中断处理子程序的入口地址是怎样得的?【解】在执行中断指令后,处理器先推入标志寄存器,在推入断点后的指令指针和CS值。中断处理器的入口地址是由中断向量和中断向量表(描述符)表得到的。3.22在执行中断返回指令IRET和普通子程序返回指令RET时,具体操作内容有什么不同?【解】IFET除了弹出中断要返回的指令的地址(C
27、S和IP)外,还要恢复中断前的标志寄存器。 3.23 什么叫BCD码?什么叫组合的BCD码?什么叫非组合的BCD码?8086汇编语言在对BCD码的加、减、乘、除运算时,采用什么方法?【解】BCD码为十进制编码的二进制数。组合的BCD数是把两位BCD加在一个字节中,高位的在高4位。非组合的BCD码是把一位BCD数放在一个字节的低4位高4位为0。8086在BCD加、减和乘法运算以后用BCD调整指令把结果调整为正确的BCD数。在BCD除法之前先用BCD调整指令再做除法。3.24 用普通运算指令执行BCD码运算时,为什么要进行十进制调整?具体讲,在进行BCD码的加、减、乘、除运算时,程序段的什么位置必
28、须加上十进制调整指令?【解】因为8086指令把操作数作为二进制数进行二进制运算,要得到正确的BCD结果,需要进行调整。在加、减、乘法指令之后加上BCD调整指令,而在除法指令之前先用BCD调整指令再用除法指令。第4四部分 汇编语言程序设计4.1 在下列程序运行后,给相应的寄存器及存储单元填入运行的结果:MOV AL,10HMOV CX,1000HMOV BX,2000HMOV CX,ALXCHG CX,BXMOV DL,01HXCHG CX,BXMOV BX,DLHLT【解】寄存器及存储单元的内容如下:AL=10HBL=00HBH=20HCL=00HCH=10HDL=01HDH=10H(1000
29、H)=10H(2000H)=01H4.2 自1000单元开始有一个100个数的数据块,若要把它传送到自2000H开始的存储区中去,可以采用以下3种方法实现,试分别编制程序以实现数据块的传送。(1)不用数据块传送指令;(2)用单个传送的数据块传送指令;(3)用数据块成组传送指令。【解】(1) LEA SI,1000H LEA DI,2000H MOV CX,100L1: MOV AX,SI MOV DI,AX LOOP L1 HLT(2) LEA SI,I000H LEA DI,2000H MOV CX,100 CLD L1: MOVSBLOOP L1HLT(3) LEA SI,1000H LE
30、A DI,2000HMOV CX,100CLDREP MOVSB HLT4.3 编写一个程序,把自1000H单元开始的100个数传送至1050H开始的储存中。【解】 LEA SI,1000HLEA DI,1050HADD SI,63HADD DI,63HMOV CX,100STDREP MOVSB HLT4.4在自0500H单元开始,存有100个数。要求把他传送到1000H开始的存储区中,但在传送过程中要检查数的值,遇到第一个零就停止传送。 【解】 LEA SI,0500HLEA DI,1000HMOV CX,100 N1: MOV AL,SI TEST AL,0 JZ,N2 MOV DI,A
31、L INC SI INC DI LOOP N1N2: HLT4.5 把在题4.7中指定的数据块中的正数,传送到自1000H开始的存储区;而把其中的负数,传送到自1100H开始的存储区。且分别统计正数和负数的个数,分别存入1200H和1201H单元中。【解】 LEA SI,0500H LEA DI,1000H LEA BX,1100H MOV CX,100MOV DX,0N1: MOV AL,SI TEST AL,0 JS N2 MOV DI,AL INC DL INC SI INC DI JMP N3N2: MOVBX,ALINC DHINC SIINC BX N3: LOOP N1LEA B
32、X ,1200HMOV BX,DLMOV BX+1,DHHLT4.6 自0500H单元开始,有10个无符号数,编写一个程序求这10个数的和(用8位书运算指令),把和放到050A及050B单元中(和用两个字节表示),且高位在050B单元。【解】 LEA BX,0500HMOV AX,0MOV CL,10N1: MOV DL,BXADD AL,DLADC AH,0INC BXDEC CLJNZ N1MOV 050AH,AX4.7 在0100H单元和010AH单元开始,存放两个各为10个字节的BCD数(地址最低处放的是最低字节),求出他们的和,并且把和放在0114H开始的存储单元中。【解】 LEA
33、SI,0100HLEA DI,0114HCLCMOV CL,10N1: MOV AL,SIMOV BL,10SIADC AL,BLDAAMOV DI,ALINC SIINC DIDEC CL JNZ N14.8 若在0200HE 0201H单元中两个正数,编写一个程序比较它们的大小。并且把大的数放在0201H单元中。【解】MOV AL ,0200HCMP AL,0201HJNS LAGJMP NEXTLAG:XCHG AL,0201HNEXT:4.9 若自0500H单元开始有1000个带数符号数,把它们的最小植找出来,并且放在1000H单元中。【解】 LEA BX,0500HMOV AX,BX
34、INC BXINC BXMOV CX,999AGAIN:CMP AB.BXJL NEXTMOV AX.BXNEXT: INC BX INC BXLOOP AGAINMOV 1000H,AXHLT4.10 在自BUFFER单元开始,放有一个数据块,BUFFER和BUFFER+1单元中放的是数据块的长度,自BUFFER+2开始存放的是一ASC码表示的十进制数码,把它们转换成BCD码,并且把两个相邻单元的数码并成一个单元(地址高的放在高4位),放到自BUFFER+2开始的存储区中。【解】 MOV CX,BUFFERLEA SI,BUFFER+2LEA DI,BUFFER+2TRAN: MOV AL,
35、SISUB AL,30HMOV BL,ALINC SIMOV AL,SISUB AL,30HSHL AL,4ADD AL,BL MOV DI,ALINC SIINC DIDEC CXDEC CXJNZ TRAN4.11 在自BUFFER单元开始,放有一个数据块,BUFFER和BUFFER+1单元中放的是数据块的长度,自BUFFER+2开始存放数据,每一个单元放的是两位BCD码把它们分别转换成ASC码,放到自BLOCK开始的存储区中(低4位BCD码转换成的ASC码放在地址低的单元),而BLOCK和BLOCK+1放转换成的ASC码的长度。【解】 MOV CX,BUFFERMOV DX,CXADD
36、DX,DXLEA SI,BUFFER+2LEA DI,BLOCK+2MOV BLOCK,DXTRAN:MOV AL,SIMOV BL,ALAND AL,0FHADD AL,30HMOV DI,ALINC DIMOV AL,BLSHR AL,4ADD AL,30HMOV DI,ALINC SIINC DIDEC CXJNZ TRAN4.12 若自STRING单元开始存放一个字符串(一字符结尾),编写一个程序统计这个字符串的长度(不包括字符);并且把字符的长度,放在STRING单元,把整个字符串往下移两个存储单元。【解】 LEA DI,STRINGXOR DX,DXMOV AL,CLDAGAIN:
37、 SCASBJE N1INC DXJMP AGAINN1: LEA SI,STRING+2XCHG SI,DIMOV CX,DX、REP MOVSBMOV STRING,DX4.13 TRING单元开始存放一个字符串(以字符空格引导,以结尾),编写一个程序统计这个字符串的长度(忽略前导空格和结尾的字符)【解】 LEA DI,STRINGXOR DX,DXMOV AL,20HCLDAGAIN:SCASBJNE N1JMPAGAINN1: MOV AL,A1:SCASBJE N2INC DXJMP A1N2: MOV LENGTH,DX4.14 自STRI1和STRI2开始各有一个由10个字符组成
38、的字符串,检查这两个字符串是否相等,在STFLAG单元中建立一个标志(相等为00和,不等为FFH)。【解】 LEA SI,STR1LEA DI,STR2MOVCX,10CLDREPZ CMPSBJNE UNMATMOV AL,0JMP OUTPTUNMAT: MOV AL,0FFHOUTPT: MOV STFLAG,AL4.15 在自BLOCK开始的存储区中有1000个带符号数。试用气泡排序法编写一个程序,使它们排列有序。【解】 NAME BOBBLE_SORTDATA1 SEGMENTBLOCK DW X1,X2,.,X999DATA1 ENDSSTACK SEGNEBT PARA STAC
39、K STACKDB 100DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA1,SS:STACKSTART PROC FARBEGIN:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXCONT1:MOV BL,0MOV CX,1000ADD CX,CXMOV SI,CXDEC SIDEC SIAGAIN: MOV AX,BLOCKSICMP AX,BLOCKSI-2JGE NEXTXCHG AX,BLOCKSI-2MOV SI,AXMOV BL,-1NEXT:DEC SIDEC SILOOP AGAINCM
40、P BL,0JNE CONT1RETSTART ENDPCODE ENDSEND BEGIN4.16若在0500H单元中有一个数 (1)利用加法指令把它乘2,且送回原存储单元(假定X2后仍为一个字节); (2)X4; (3)X10(假定Xl0255). 【解】 (1) LEA BX, 050OH MOV AL, BX ADD AL, AL MOVBX,AL (2) LEA BX, 0500H MOV AL, BX ADD AL, AL ADD AL, AL MOVBX,AL (3)LEABX, 050OH MOVAL, BX ADDAL, AL MOVDL, AL ADDAL, AL ADD
41、AL,AL ADDAL, DL MOVBX,AL4.17 利用查表法计算平方值。已知0 9的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0X 9且为整数。【解】分析:建立平方表,通过查表完成。STACKSEGMENTDB 100 DUP(?)STACK ENDSDATASEGMENTSUR DB ?DIS DB ?SQTAB DB 0,1,4,9,16,25,36,49,64,81 ; 09的平方表DATA ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATABEGIN:PUSH DSMOVAX,0PUSHAX ;保证返回DOS,MOVAX,DATAMOVDS,AX ;为DS送初值LEA BX,SQTAB ;以下程序部分完成查表求平方值MOVAH,0 ;亦可用查表指令完成(如下程序段)MOVAL,SUR ;AL=X LEA BX, SQTABADDBX,AX ; MOV AL, SURMOVAL,BX