微机原理与接口技术课后习题答案_第1页
微机原理与接口技术课后习题答案_第2页
微机原理与接口技术课后习题答案_第3页
微机原理与接口技术课后习题答案_第4页
微机原理与接口技术课后习题答案_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.252.将下列二进制数、十六进制数转换成十进制数。(1)10010(2)100110.1101(3)0FFA9H(4)14AF.5DH3.写出下列十进制数的原码、反码和补码(用8位二进制)。(1)+65(2)-65(3)+115(4)-1154.写出下列用补码表达的二进制数的真值(即十进制数)。(1)01101110(2)01011001(3)10001101(4)111110015.当前计算机的体系结构由哪五部分组成?6.试述微型计算机的一般结构。7.Intel8088在功能上可以分为哪两大部分?各有什么功能?8.试述Intel8088所采用的取指令与执行指令重叠技术的原理及好处。9.为什么说Intel8088是准16位的微解决器芯片?10.Intel8088的通用寄存器有哪些?那些寄存器可拆分为高低字节两部分使用?11.Intel8088对存储器的寻址范围是多少?为什么?12.为什么Intel8088的存储器地址空间要分段?请说明其物理地址的形成过程。参考答案:1.(1)1111101.101B,175.5Q,7D.AH(2).11B,1044.6Q,224.CH(3).001B,570.1Q,178.2H(4)11111110.01B,376.2Q,FE.4H2.(1)95634D(2)38.8125D(3)65449D(4)5295.36328125D3.(1)01000001B,01000001B,01000001B(2)11000001B,10111110B,10111111B(3)01110011B,01110011B,01110011B(4)11110011B,10001100B,10001101B4.(1)+110D(2)+89D(3)-115D(4)-7D5.当前计算机的体系结构由运算器、控制器、存储器、输入设备和输出设备组成,称为冯.诺依曼体系结构。6.微型计算机的一般结构可表达为微型计算机微解决器微型计算机微解决器控制器运算器寄存器组内部存储器输入/输出接口7.略。8.略。9.Intel8088微解决器的内部体系结构是16位,与外部通信采用8位数据总线,因此也称为准16位微解决器。10.略。11.Intel8088芯片的地址引脚有20个,对存储器的寻址范围为220=1MB。12.8088有20根地址线,它的直接寻址范围为220=1MB(Byte,字节)。所以在以8088组成的微机系统中,可以有1MB的内部存储器。而8088中的寄存器都是16位的,所以16位的寄存器只能给出来16位的地址,寻址空间只能在64KB的范围内。因此,在8088系统中,将1MB的内存提成若干个段,一个段最大64KB,最小16B(16个字节定义成一个小节),最多可有64K个段,最少16个段。段与段之间可以部分重叠,也可以完全重叠。物理地址的形成过程可由下式表达:物理地址=段寄存器的内容×10H+有效地址EA第二章8088的寻址方式与指令系统本章的重要内容是8086/8088的寻址方式,以及常用指令的格式和功能。2.1难点与重点本章的学习重点是存储空间的分段管理;堆栈的结构与操作的规则;与数据有关的七种寻址方式、与转移地址有关的四种寻址方式;常用指令的格式和功能,及其对CF、OF、SF、ZF标志的影响。重要掌握的知识点是寻址方式与指令系统。2.1.1指令的一般格式操作码操作码操作码操作码(1)操作码规定了指令的操作性质,用助记符表达;操作数规定了指令的操作对象。(2)指令可分为无操作数指令、单操作数指令、双操作数指令(依次为目的操作数、源操作数)等。(3)操作数类型有三种:立即数——出现在指令中的常数;寄存器操作数——操作数在寄存器中;存储器操作数——操作数在存储器中。(4)在双操作数指令中,目的操作数和源操作数的类型必须一致,即字节相应字节,字相应字;两个操作数不能同时使用存储器寻址方式,除源操作数为立即寻址方式外,两个操作数中其中一个必为寄存器寻址方式;目的操作数不允许使用立即寻址方式,即不允许出现立即数。2.1.2存储空间的分段管理(见第一章习题12参考答案)2.1.3堆栈的结构与操作的规则堆栈是按先进后出的的原则在内存中组织的一个存储区域。该区域一端固定一端活动,固定端称为栈底,而活动端称为栈顶。8086/8088系统中,堆栈位于堆栈段,段地址由SS指示,SP作为指针,始终指向栈顶所在存储单元。堆栈有两个基本操作:PUSH(进栈)和POP(出栈),只能作字操作。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反。当前栈顶为空时,栈顶和栈底指向同一内存单元。2.1.48088寻址方式1.与数据有关的寻址方式这部分寻址方式有立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式、相对基址变址寻址方式。注意:以上除了立即寻址和寄存器寻址两种方式,其他寻址方式可以归结为存储器寻址方式一,允许段跨越,以便取得存储器中其它段中的数据。2.与转移地址有关的寻址这种寻址方式用来拟定转移指令及子程序调用指令的转向地址,分为段内直接寻址方式、段内间接寻址方式、段间直接寻址方式、段间间接寻址方式。2.2例题解析1.指出下列指令的错误:(1)MOVAH,BX(2)MOV[SI],[BX](3)MOVAX,[SI][DI](4)MOVAX,[BX][BP](5)MOV[BX],ES:AX(6)MOVBYTEPTR[BX],1000解:(1)源操作数和目的操作数的类型不匹配,即字长不一致。必须字节对字节,字对字。(2)源操作数和目的操作数不能同时为存贮器寻址方式。(3)基址变址方式没有SI和DI的组合。由于SI和DI都变址寄存器。(4)BX和BP作为基址寄存器不允许组合使用。(5)AX为16位通用数据寄存器,ES:为段跨越前缀,指明存储器的所在段,ES:AX为非法。(6)源操作数和目的操作数的类型不匹配,1000超过一个字节的表达范围,而BYTEPTR[BX]表达字节存储器。2.已知(DS)=3000H,(SS)=3001H,(BX)=100H,(BP)=0F3H,(SI)=2,内存单元的值如图所示,求下列指令执行后AX的值。30100H30101H30102H30103H30104H30105H30106H30107H…12H34H05H06H1AH10H7CHOBH…(1)MOVAX,1200H(2)MOVAX,BX(3)MOVAX,[100H](4)MOVAX,[BX](5)MOVAX,2[BX](6)MOVAX,[BX][SI](7)MOVAX,[BP][SI](8)MOVAX,DS:11H[BP][SI](9)MOVAX,4H[BX][SI]解:(1)(AX)=1200H立即寻址(2)(AX)=0100H寄存器寻址(3)(AX)=3412H直接寻址源操作数物理地址=(DS)×10H+100H=30100H(4)(AX)=3412H寄存器间接寻址源操作数物理地址=(DS)×10H+(BX)=30100H(5)(AX)=0605H寄存器相对寻址源操作数物理地址=(DS)×10H+(BX)+2H=30102H(6)(AX)=0605H基址变址寻址源操作数物理地址=(DS)×10H+(BX)+(SI)=30102H(7)(AX)=7C10H基址变址寻址源操作数物理地址=(SS)×10H+(BP)+(SI)=30105H(8)(AX)=0B7CH相对基址变址寻址(段超越)源操作数物理地址=(DS)×10H+(BP)+(SI)+11H=30106H(9)(AX)=0B7CH相对基址变址寻址源操作数物理地址=(DS)×10H+(BX)+(SI)+4H=30106H3.指出下列程序中用(.)指定的指令执行后AX、DX、CF的值,以及该程序段的功能。movax,7856Hmovdx,8234Haddax,8998H(1)adcdx,1234H(2)subax,4491H(3)sbbdx,8000H(4)解:(1)AX=01EEH,CF=1(2)DX=9469H,CF=0(3)AX=BD5DH,CF=1(4)DX=1468H,CF=0功能:作双字的加减法运算,即(DX:AX)=82347856H+12348998H-80004491H=1468BD5DH,注意:在作高位字的运算时,要考虑进位和借位的情况,故应用ADC或SBB指令。4.已知(DS)=1000H,(ES)=2023H,(BX)=200H,(SI)=10H,内存单元的值如图所示。分别给出下列各条指令执行后BX、DS、ES的值。1000:0210H1000:0211H1000:0212H1000:0213H…00H41H02H03H…(1)MOVBX,[BX][SI](2)LEABX,[BX][SI](3)LDSBX,[BX][SI](4)LESBX,[BX][SI]解:(1)(BX)=4100H,(DS)=1000H,(ES)=2023H(2)(BX)=0210H,(DS)=1000H,(ES)=2023H(3)(BX)=4100H,(DS)=0302H,(ES)=2023H(4)(BX)=4100H,(DS)=1000H,(ES)=0302H5.给出下列程序实现的功能。PUSHAXPUSHBXPOPAXPOPBX解:互换AX和BX值。6.给出下列指令执行后,AL、BL的值,以及标志位的值。movbl,10101010bandbl,11110110b(1)orbl,00001001b(2)xorbl,00001001b(3)NOTBL(4)解:(1)BL=10100010B。CF=OF=0,SF=1,ZF=0,PF=0,AND常用于复位某些位(同0与),不影响其他位。(2)BL=10101011B。CF=OF=0,SF=1,ZF=0,PF=0,OR常用于置位某些位(同1或),不影响其他位。(3)BL=10100010B。CF=OF=0,SF=1,ZF=0,PF=0,XOR常用于求反某些位(同1异或),不影响其他位。(4)BL=01011101B。标志位不变。NOT作按位取反操作,不影响标志位。7.编写程序段,用移位和加法实现将AL寄存器中的无符号数乘10的功能。解:10a=23a+2a,程序段如下:xorah,ah;实现(AH)=0,同时使CF=0shlax,1;(AX)←2×(AL)movbx,ax;(BX)←(AX)=2×(AL)shlax,1;(AX)←4×(AL)shlax,1;(AX)←8×(AL)addax,bx;(AX)←8×(AL)+2×(AL)=10×(AL)8.对于AX中存放的无符号数,假如是偶数则除以2,假如是奇数则加1后除以2。解:下面提供判断奇偶数的两种方法(1)testax,01h;测试AX的最低位(不用AND指令,以免改变AX)jzeven;标志ZF=1,即D0=0:AX是偶数,程序转移addax,01h;标志ZF=0,即D0=1:AX内的奇数,加1even:shrax,1;AX←AX÷2(2)MOVBX,AXshrbx,01h;将AX的最低位D0移进CFjnceven;标志CF=0,即D0=0:AX内是偶数,程序转移addax,01h;标志CF=1,即D0=1:AX内的奇数,加1even:shrax,01h;AX←AX÷29.用MOV和LOOP指令完毕和下列指令同样的功能:REPMOVSB(DF=0)解:NEXT:MOVAL,[SI]MOVES:[DI],ALINCSIINCDILOOPNEXT10.编写程序段,求1+2+…+100之和,并将结果存入AX中。解:XORAX,AXMOVCX,100AGAIN:ADDAX,CXLOOPAGAIN2.3习题与参考答案1.Intel8088的寻址方式有那几类?每一类又有那几种?2.Intel8088各种寻址方式是如何形成物理地址的?3.段跨越前缀在指令中起什么作用?4.在双操作数指令中目的操作数的寻址方式有什么限制?5.在双操作数指令中目的操作数和源操作数的寻址方式有什么规定?6.设当前数据段段地址寄存器的内容为1B00H,在数据段的偏移地址2023H单元中具有一个内容为0FF10H和8000H的指针,它们是一个16位变量的偏移地址和段地址,试写出把该变量装入AX的指令序列。7.TABLE为数据段中0032H单元的符号地址,其中存放的内容为1234H,试问以下两条指令有什么区别?指令执行完后AX寄存器的内容是什么?

MOVAX,TABLE

LEAAX,TABLE8.知堆栈段段址寄存器SS的内容为0FFA0H,堆栈指针寄存器的内容为0080H,先执行两条把8057H和0F79H分别进栈的PUSH指令,再执行一条POP指令。试画出堆栈区和SP的内容变化过程示意图(标出存储单元的物理地址)。9.现有(DS)=2023H,(BX)=0100H,(SI)=0002H,(20230H)=12H,

(20231H)=34H,(20232H)=56H,(20233H)=78H,(21200H)=2AH,

(21201H)=4CH,(21202H)=B7H,(21203H)=65H

试说明下列各条指令单独执行以后AX寄存器的内容。

(1)movax,1200h

(2)movax,bx

(3)movax,[1200h]

(4)movax,[bx]

(5)movax,1100h[bx]

(6)movax,[bx][si]

(7)movax,1100h[bx][si]10.写出执行以下计算的指令序列,其中X、Y、Z、R、W均为存放16位带符号数的单元地址。

(1)ZßW+(Z-X)

(2)ZßW-(X+6)-(R+6)

(3)Zß(W*X)/(Y+6)的商

Rß(W*X)/(Y+6)的余

(4)Zß((W-X)/5*Y)*211.写出对存放在DX和AX中的双字长求补的指令序列。12.写出完毕以下操作的程序段。假设各变量的值均为用压缩BCD码表达的二位十进制数。(1)UßV+(S-6)(2)Uß(X+W)-(Z-V)13.试写出将(DX:AX)双字右移4位的程序段。14.设(DS)=2100H,(SS)=5200H,(BX)=1400H,(BP)=6200H,说明下面两条指令所进行的具体操作:MOVBYTEPTR[BP],20HMOVWORDPTR[BX],2023H15.使用堆栈操作指令要注意什么问题?16.已知(SS)=9000H,(SP)=0E200H则整个堆栈段物理地址范围为~,栈顶的物理地址为。17.下面这些指令中哪些是对的的?哪些是错误的?若是错误的,请说明因素。(1)XCHGCS,AX(2)MOV[BX],[1000H](3)XCHGBX,IP(4)PUSHCS(5)POPCS(6)INBX,DX(7)MOVBYTEPTR[BX],1000(8)MOVCS,[1000H](9)ADDAX,[SI][DI](10)SUB56,AL18.指令序列为:CMPAX,BXJ××L1请在能引起转移到L1单元的条件转移指令下面划钩,AX、BX的内容给定如下:AXBXJBJNBJBEJNBEJLJNLJLEJNLE1F521F5288C988C9FF82007E58BA020EFFC5FF8B09A01E978AEAFC29D36732A619.假如在程序的括号中分别填入指令(1)LOOPL20(2)LOOPNEL20(3)LOOPEL20

试说明在三种情况下,当程序执行完后,AX、BX、CX、DX四个寄存器的内容分别是什么?请在下列表格的空档中填入对的的内容。指令AXBXCXDXLOOPL20LOOPNEL20LOOPEL20BEGIN:MOVAX,01MOVBX,02MOVCX,03MOVDX,04L20:INCAXADDBX,AXSHRDX,1()参考答案:1.答:立即寻址方式寄存器寻址方式直接寻址方式与数据有关的寻址方式寄存器间接寻址方式存储器寻址方式寄存器相对寻址方式基址变址寻址方式8088寻址方式基址变址相对寻址方式段内直接寻址方式段内间接寻址方式与转移地址有关的寻址方式段间直接寻址方式段间间接寻址方式2.答:具体就是以数据有关的寻址方式的物理地址的形成方式。直接寻址方式:物理地址=(DS)╳16D+EA寄存器间接寻址方式:物理地址=(DS)╳16D+(BX)|(SI)|(DI)物理地址=(SS)╳16D+(BP)寄存器相对寻址方式:物理地址=(DS)╳16D+(BX)|(SI)|(DI)+8位|16位位移量物理地址=(SS)╳16D+(BP)+8位|16位位移量基址变址寻址方式:物理地址=(DS)╳16D+(BX)+(SI)|(DI)物理地址=(SS)╳16D+(BP)+(SI)|(DI)相对基址变址寻址方式:物理地址=(DS)╳16D+(BX)+(SI)|(DI)+8位|16位位移量物理地址=(SS)╳16D+(BP)+(SI)|(DI)+8位|16位位移量3.答:在指令中段跨越前缀允许CPU访问别的数据段的数据。4.答:其限制有:(1)两操作数不能同时使用存储器寻址方式;(2)除源操作数为立即寻址方式外,两操作数中至少一个为寄存器寻址方式;(3)目的操作数不能为立即数。5.答:源操作数可使用所有寻址方式,目的操作数除立即寻址方式外其他寻址方式均可使用。此外要考虑第4题中所述的限制。6.解:LDSSI,[2023H]MOVAX,[SI]7.解:MOVAX,TABLE;以TABLE为偏移地址的内存单元的内容送AX,指令执行完后,;(AX)=1234HLEAAX,TABLE;TABLE的偏移地址送AX,指令执行完后,(AX)=0032H8.解:SP→FFA0:0080SP→FFA0:007ESP→FFA0:007C79HSP→FFA0:007E79H0FH0FH57H57H57H80H80H80H初始状态PUSHPUSHPOP

9.解:(1)1200h(2)0100h(3)4c2ah(4)3412h(5)4c2ah(6)7856h(7)65b7h10.解:(1)MOVAX,Z

SUBAX,X

ADDAX,W

MOVZ,AX

(2)ADDX,6

ADDR,9

MOVAX,WSUBAX,X

SUBAX,R

MOVZ,AX

(3)MOVAX,W

IMULX

ADDY,6

IDIVY

MOVZ,AX

MOVR,DX

(4)假定运算过程中均不超过16位。MOVAX,W

SUBAX,X

CWD

MOVBX,5

IDIVBX

IMULY

MOVBX,2

IMULBXMOVZ,AX11.解:NOTAX

NOTDX

ADDAX,1

ADCDX,012.解:(1)MOVAL,S

SUBAL,6

DAS

ADDAL,V

DAA

MOVU,AL

(2)MOVAL,X

ADDAL,W

DAA

MOVBL,AL

MOVAL,Z

SUBAL,V

DAS

XCHGAL,BL

SUBAL,BL

DAS

MOVU,AL13.解:MOVCL,4另解:movcx,4

SHRAX,CLagain:shrdx,1

MOVBL,DLrcrax,1

SHRDX,CLloopagain

SHLBL,CL

ORAH,BL14.解:MOVBYTEPTR[BP],20H;字节操作,20H→(58200H),MOVWORDPTR[BX],2023H;字操作,2023H→(22400H),即;00H→(22400H),20H→(22401H)15.答:PUSH和POP堆栈操作指令中操作数为除立即寻址方式外的所有寻址方式,字操作。16.解:90000H,9E1FFH,9E200H17.解:(1)错。码段段址寄存器CS不能出现在指令中。(2)错。双操作数指令中两操作数不能同为存储器寻址方式。(3)错。IP是指令指针寄存器,它的内容是下一条要取出的指令的偏移地址,不能为用户所用,故不能出现在指令中。(4)(5)错。因素同(1)。(6)错。IN为输入指令,不能使用BX,只能使用累加器AX或AL,接受端口上的数据信息。指令中DX内存放16位端口地址。(7)错。数据类型不匹配,“BYTEPTR[BX]”指示目的操作数将存放在一个字节的存储器内,源操作数为立即数1000为字数据。(8)错。因素同(1)。(9)错。SI和DI都是变址寄存器,不能同时使用。(10)错。双操作数指令中目的操作数不能为立即数。18.答:见表1表1题18答案表1题18答案AXBXJBJNBJBEJNBEJLJNLJLEJNLE1F521F52√√√√88C988C9√√√√FF82007E√√√√58BA020E√√√√FFC5FF8B√√√√09A01E97√√√√8AEAFC29√√√√D36732A6√√√√19.答:见表2表2题19答案表2题19答案指令AXBXCXDXLOOPL200004H000BH0000H0000HLOOPNEL200004H000BH0000H0000HLOOPEL200002H0004H0002H0002H第三章8088汇编语言程序设计本章的重要内容是汇编语言语句行的构成,源程序的结构,汇编语言程序设计方法。3.1重点与难点本章的学习重点是结构化程序设计思想,顺序、分支、循环结构的程序设计,子程序结构的设计与调用,中断指令的应用。此外,汇编语言伪指令的使用、源程序的结构等也是必须掌握的。3.1.1汇编语言语句行的构成1.标记(1)标记符:由数字、字母和下划线组成,且不能以数字开头,最大长度不超过31个字符。(2)保存字:汇编语言中保存下来的具有特殊用途的字串,如指令、伪指令、寄存器名等都是保存字。保存字不可用作标记符。(3)界符:程序或指令中两个部分的分隔符号。汇编语言源程序中可用的界符:′〈〉;,:?$()+-=&[]*/·(4)常量:数字常量,可以使用不同的进制D、B、H、Q;字符串常量,由引号引起来的字符串,相称给出字符所相应的ASCII码串。2.符号及其属性(1)寄存器:8086/8088CPU的寄存器可以作为指令的操作数。(2)变量:即内存单元的符号地址。变量不能与保存字、段名重名。它有三个属性:段属性,指变量所在段的段地址;偏移量,指变量所在段的起始地址到变量地址之间的字节数,即偏移(有效、逻辑)地址。类型,指指变量具有的字节数,涉及BYTE、WORD、DWORD、QWORD和TBYTE等。(3)标号:即代码段中某条指令的符号地址,由编程者根据需要拟定的。标号不能与保存字重名,可使用字母、数字及下划线,但不允许用数字开头,字符个数不超过31个。标号作为符号地址也有三个属性:段、偏移量和类型(NEAR、FAR)。3.表达式表达式是作为语句的一个操作数,在汇编时一个表达式得到一个值。(1)操作数数据——常数、符号常量;存储单元地址——常用符号地址表达。(2)运算符算术运算符:+、-、*、/、MOD。对地址的运算仅有+(加)、-(减)运算符。逻辑运算符:AND、OR、NOT和XOR。注意,不要将其和同样名称的指令操作码相混淆。关系运算符:EQ、NE、LT、GT、LE和GE。参与关系运算的两个操作数必须都是数值,或同一段中的两个存储单元地址,运算结果为0FFFFH(真,True)或0(假,False)。分析运算符:0FFSET——取一个标号或变量的偏移地址;SEG——取一个标号或变量所在段的段地址;TYPE——取变量和标号的类型(BYTE、WORD、DWORD或NEAR、FAR);SIZE——计算一个存储区的字节总数;LENGTH——计算存储区中数据单元的数目,只对数据定义中的DUP操作有效。综合运算符:PTR——用于暂时改变变量或标号的原有属性,只在当前语句中有效;THIS——和PTR类似,用于改变存储区的类型;SHORT——指定一个标号为短标号。4.语句指令语句:重要由CPU指令组成,每条语句在汇编过程中都会产生相应的目的代码。伪操作或伪指令语句:为汇编程序提供信息,让汇编程序在汇编过程中执行特定的功能。两者本质区别在于,伪指令在汇编过程中不形成任何代码。这里仅对伪指令进行总结。(1)符号定义伪指令(赋值语句)格式:符号常量EQU表达式或符号常量=表达式功能:把表达式的值赋给符号名。说明:在程序中,用EQU语句赋值的符号名不能被重新赋值,但用“=”号赋值的符号名可以被重新赋值。若要重新赋值,必须使用解除伪指令PURGE。(2)内存数据定义伪指令格式:[变量名]数据定义表达式或数据项表功能:可为数据项分派存储单元,并根据需要设立其初值。还可用符号代表数据项。说明:数据定义符有字节DB、单字DW、双字DD、8字节DQ、10字节DT;DUP()表达数据反复,“$”表达地址计数器当前值,“?”用于预留存储空间;数据项允许为字符串。(3)段定义伪指令格式:段名SEGMENT[定位方式][连接方式][‘类别名’]段体段名ENDS功能:为程序汇编和链接说明了段名、分段的各种属性以及分段的开始和结束。段名是自定义符,开始的段名与结束的段名必须相同。段的长度不超过64KB。属性参数定义:定位方式,指定段的起始地址边界。有四种方式:页边界PAGE、段边界PARA(系统隐含)、字边界WORD、字边界BYTE。连接方式,告诉连接程序本段与其他段的连接方式。系统隐含为不写,表达本段不与任何段链接。STACK表达此段为堆栈段。‘类别名’,是合法的自定义符,长度不超过40。凡是类别名相同的段在连接时均按先后顺序连接在相邻存储区中。说明:段名的命名规则和变量名以及标号同样;单模块程序中属性参数可省略不写。(4)段址寄存器说明伪指令格式:ASSUME段寄存器:段定义名1[,段寄存器:段定义名2,…]功能:告诉汇编程序在汇编时,段寄存器CS、DS、SS和ES应具有的符号段基址。段寄存器实际值(CS除外)由传送指令在执行程序时赋值。(5)过程(子程序)定义伪指令格式:过程名PROC[NEAR](或FAR)∶过程名ENDP说明:过程名是自定义符。调用格式为:CALL过程名过程中的RET指令,实现从过程返回调用处。选NEAR,过程是段内调用,过程中的RET是段内返回。选FAR,过程是段间调用,过程中的RET是段间返回。系统默认是近过程。(6)模块开始伪指令格式:NAME模块名功能:该伪指令指明程序模块的开始,并指出模块名。模块名是自定义符,不能与系统保存字同名。每次汇编只能出现一次。若该伪指令不写,则取TITLE语句中的页标题前6个字符;若没有TITLE语句,则取源程序文献名为模块名。(7)建立标题伪指令格式:TITLE标题功能:建立每页标题。(8)模块结束伪指令格式:END[启动标号或过程名]功能:告诉汇编程序源文献结束,并给出执行程序的入口。仅用于主模块才故意义。(9)定位伪指令格式:ORG表达式功能:把该伪指令以下所定义的内存数据或程序,从表达式的值所指定的起点开始连续存放,直至碰到新的ORG指令。表达式的值是一个无符号数。(10)系统隐含进位制伪指令格式:RADIX表达式功能:定义在源程序中书写数据时隐含进位制方式。表达式的值是2~16之间的十进制数,要碰到新的RADIX伪指令以后才改变隐含进位制。3.1.2汇编语言源程序的结构1.源程序结构8088汇编语言源程序采用分段结构的形式,一个完整的汇编语言源程序通常由若干个逻辑段组成,涉及数据段、附加数据段、堆栈段和代码段。2.源程序基本框架DSEGSEGMENT…;数据定义(DB/DW/DD)DSEGENDSESEGSEGMENT…ESEGENDSSSEGSEGMENTSTACKDW512DUP(?);堆栈段大小为1024BSSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:ESEG;指定段寄存器与段之间的相应关系START:MOVAX,DSEGMOVDS,AXMOVAX,ESDGMOVES,AX;DS、ES段寄存器初始化…;程序部分MOVAX,4C00H;8088/8086为MOVAH,4CHINT21H;程序结束,返回DOSCSEGENDSENDSTART说明:CS段寄存器的初值,由系统自动指定为END后的地址;ES段寄存器的初值,可以用类似DS的方法设立,或由系统指定为定义了STACK属性的段。若未定义堆栈段,则系统默认使用系统堆栈。3.1.3汇编语言程序设计的方法1.顺序结构程序设计的方法顺序结构是最基本的结构。其特点是CPU按指令排列的顺序逐条执行。2.分支(选择)结构程序设计的方法分支结构,根据不同的条件转到不同的程序段执行。3.循环结构程序设计的方法循环结构,完毕需要反复执行的工作。通常由三部分组成:初始化部分,完毕对地址指针寄存器、计寄存器等循环中用到的寄存器及存储器置初值;循环体,完毕需反复执行的工作;循环控制,用于判断循环是否结束,若结束则跳出循环,未结束则修改地址指针和计数器值,为下一轮循环做准备。4.混合结构程序设计方法混合结构程序设计是指上述三种设计方法的组合应用,也是程序设计中最常用的方法,5.子程序的设计方法子程序(或过程)是完毕某项特殊功能的程序模块,可以在程序中的任何地方多次被调用。用CALL指令调用子程序,用RET指令返回主程序;用伪指令PROC和ENDP定义子程序。主、子程序关系RET主、子程序关系RETCALL子程序主程序(1)参数传递方式通过寄存器传递,合用于传递参数个数少的情况;通过程序存储器中的参数表传递,在主程序中把要传送的参数直接放在调用指令的后面,而在子程序中到堆栈中取返回地址,以获得参数。通过堆栈传递,合用于参数较多,且子程序有嵌套、递归调用的情况。主程序将要传递的参数压入堆栈,子程序中再将这些参数从堆栈中弹出。(2)寄存器和存储单元的内容保护(保护现场)在主程序中用到的寄存器或存储单元,要在子程序里被用到,而主程序并不希望这些单元的内容被修改,此时必须在子程序入口处将这些单元内容压入堆栈保护起来。6.其它设计方法介绍(1)DOS和BIOS中断功能调用DOS和BIOS为用户提供了两组系统服务程序,用户可以采用软中断指令INTN来调用。DOS调用与BIOS调用相比,不依赖于硬件,通用性较好,但执行效率较低。DOS和BIOS中断功能调用的使用方法如图所示:置功能号n→置功能号n→(AH)置入口参数执行INT21H分析出口参数条件伪操作的一般格式如下:IF条件…(语句组1)[ELSE];可选的…(语句组2)ENDIF假如条件为真,则汇编语句组1,否则如有ELSE则汇编语句组2,如无ELSE则不生成条件块。ENDIF表达结束条件汇编。下表给出了汇编语言的条件伪操作及其意义。表3条件伪操作及其意义表3条件伪操作及其意义条件伪操作意义IF表达式假如汇编程序求出的表达式非0,条件为真IFE表达式假如汇编程序求出的表达式等于0,条件为真IF1假如是第一遍扫描,条件为真IF2假如是第二遍扫描,条件为真IFDEF符号假如符号在程序中有定义或被说明为EXTRN,条件为真IFNDEF符号假如符号在程序中无定义或未用EXTRN说明,条件为真IFB〈变元〉假如变元是空白符,条件为真(变元规定带尖括号)IFNB〈变元〉假如变元不是空白符,条件为真IFIDN〈变元1〉,〈变元2〉假如变元1的字符串和变元2的字符串相同,条件为真IFNIDN〈变元1〉,〈变元2〉假如变元1的字符串和变元2的字符串不同,条件为真3.2例题解析1.伪指令与指令的区别是什么?答:指令是在程序运营期间由CPU执行的,汇编后由相应的机器代码所代替。伪指令是不可执行的,它只在源程序汇编期间由汇编器解决的命令,用来指示汇编器为数据分派内存空间,或是为汇编器提供源程序结束或段定义等信息。两者本质区别在于,伪指令在汇编过程中不形成任何代码。2.设有数据段如下:DATASEGMENTBUF1DB1,6,3,90H,‘A’,‘G’,‘V’BUF2DW567,9087,100DUP(?),1,4,BUF3DW100DUP(?)DATAENDS试拟定下列指令执行后寄存器AX的值。(1)MOVAX,TYPEBUF1(2)MOVAX,TYPEBUF2(3)MOVAX,SIZEBUF1(4)MOVAX,SIZEBUF2(5)MOVAX,SIZEBUF3(6)MOVAX,LENGTHBUF1(7)MOVAX,LENGTHBUF2(8)MOVAX,LENGTHBUF3解:LENGTH运算仅对数据定义中的DUP操作故意义。(1)AX=1(2)AX=2(3)AX=7(4)AX=208(5)AX=200(6)AX=1(7)AX=1(8)AX=1003.已知数据段定义如下:DATASEGMENTD01DW1580HD01_ADRDWD01DATAENDS请给出下列指令执行后BX的值。XORSI,SIMOVBX,D01;(1)MOVBX,D01+2;(2)MOVBX,[SI+D01];(3)MOVBX,OFFSETD01;(4)LEABX,D01+2;(5)解:(1)BX=1580H(相称于MOVBX,[0000])(2)BX=0000H(相称于MOVBX,[0000+2])(3)BX=1580H(相称于MOVBX,[SI+0](4)BX=0000H(5)BX=0002H4.设有如下定义:VARDW10DUP(?)分别用LABEL、PTR、THIS和EQU实现将VAR的第0字节置0。解:(1)VAR0LABELBYTEVARDW10DUP(?)…MOVVAR0,0(2)VARDW10DUP(?)…MOVBYTEPTRVAR,0(3)VAR0EQUTHISBYTEVARDW10DUP(?)…MOVVAR0,06.采用查表法,实现一位16进制数,转换为ASCII码显示。解:将0~F的ASCII码顺序存放在数据区中,一个十六进制数自身恰好是其相应的ASCII码在数据区中的偏移量。源程序如下:DSEGSEGMENTASCDB30h,31h,32h,33h,34h,35h,36h,37h,38h,39h;‘0’~‘9’的ASCII码DB41h,42h,43h,44h,45h,46h;‘A’~‘F’的ASCII码HEXDB04h,0Ah;设两个数据DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVBX,OFFSETASC;BX指向ASCII码表MOVAL,HEX;AL取得一位16进制数,也是ASCII码表中的偏移ANDAL,0FH;只有低4位有效,高4位清0XLAT;换码:AL←DS:[BX+AL]MOVDL,AL;入口参数:DL←ALMOVAH,2;02号DOS功能调用INT21H;显示一个ASCII码字符MOVal,HEX+1;转换并显示下一个数据ANDal,0FHXLATMOVDL,ALMOVAH,2INT21HMOVAH,4CHINT21HCSEGENDSENDSTART7.设内存中有三个互不相等的无符号字数据,分别是放在DA开始的字单元,编制程序将其中最大值存入MAX单元。解:数1和数2比较,将较大的数再与数3比较,就可以求三个无符号数中的最大值。源程序如下:DSEGSEGMENTDADW348AH,5612H,490EHMAXDW?DESGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEASI,DAMOVAX,[SI];AX←数1MOVBX,[SI+2];BX←数2CMPAX,BX;比较AX、BX,保证AX←较大的数JAEMAX1MOVAX,BXMAX1:CMPAX,[SI+4]JAEMAX2MOVAX,[SI+4]MAX2:MOVMAX,AXMOVAH,4CHINT21HCSEGENDSENDSTART8.在数据段定义首地址为A的10个字符,将这10个字符以相反顺序传送到附加段首地址为B的内存单元中。解:源程序如下:DSEGSEGMENTADB‘’BDB10DUP(?)DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEG,ES:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVES,AXLEASI,A;DS:SI指向A数据区的首字符LEADI,BADDDI,9;ES:DI指向B数据区的末字符MOVCX,10;循环次数为10次MOVE:CLDLODSB;按地址递增方向读取A数据区中的字符STDSTOSB;按地址递减方向将字符存入B数据区中LOOPMOVEMOVAH,4CHINT21H;结束程序,返回DOSCSEGENDSENDSTART9.编写程序,将无符号数10,25,16,2,18,20,3,9,11,15由小到大排序。解:采用“冒泡法”排序。(1)第1轮,从第1个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素。比较9次后,最大的1个元素就排到了最后。(2)第2轮,除掉最后1个元素,其他元素依上述方法再进行比较,比较8次后,得到次大的元素排在后面,即已有2个元素排好顺序。(3)第9轮,除去第8轮后面已排好顺序的8个元素,剩下的第1个元素和第2个元素进行1比较,较大的排在后面,从而完毕了整个排序过程。这是一个循环次数已知的双重循环程序。外层循环次数(即轮数)为数据总数减1,每一轮的内层循环次数等于当前轮的剩余外循环次数。10个数据,第1轮,外循环次数为9,内循环次数为9;第2轮中外循环剩余8次,内循环次数等于8,依次类推。源程序如下:DSEGSEGMENTARRAYDB10,25,16,2,18,20,3,9,11,15COUNTEQU($-ARRAY)/(TYPEARRAY);计算元素的个数DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,COUNT;CX←数组元素个数DECCX;外循环次数OUTLP:MOVDX,CX;DX←内循环次数MOVBX,OFFSETARRAYINLP:MOVAL,[BX];取前一个元素CMPAL,[BX+1];与后一个元素比较JNANEXT;前一个不大于后一个元素,则不进行互换XCHGAL,[BX+1];否则,进行互换MOV[BX],ALNEXT:INCBX;下一对元素DECDXJNZINLP;内循环LOOPOUTLP;外循环MOVAH,4CHINT21H;结束程序,返回DOSCSEGENDSENDSTART3.3习题与参考答案1.设有数据段如下:DATASEGMENTBUFFER1DB1,6,3,90H,‘A’,‘G’,‘V’BUFFER2DW567,9087,100DUP(?),1,4,BUFFER3DW100DUP(?)BUFFER4DW100DUP(?),45,65,100,2023HDATAENDS试拟定下列指令执行后寄存器AX的值。(1)MOVAX,TYPEBUFFER1(2)MOVAX,TYPEBUFFER2(3)MOVAX,SIZEBUFFER1(4)MOVAX,SIZEBUFFER2(5)MOVAX,LENGTHBUFFER1(6)MOVAX,LENGTHBUFFER2(7)MOVAX,LENGTHBUFFER3(8)MOVAX,LENGTHBUFFER42.设有数据段如下:DATASEGMENTORG1000HVAL1DB23,13,45H,5AHVAL2DB51DUP(0)ORG1500HVAL3DW23,3FH,$-6,1,4,8,$+34,10DATAENDS假定经汇编和链接后,分派给DATA的实际段地址为3000H。试拟定下列指令执行后寄存器BX的内容。(1)MOVBX,OFFSETVAL2(2)MOVBX,SEGVAL3(3)MOVBX,VAL3+4(4)MOVBX,VAL3+123.假设下列指令中的所有标记符均是类型属性为字的变量名,请指出下列指令中哪些是合法的,哪些是非法的?它们的错误是什么?(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)mov[bx][si],2(8)movax,word_op1+word_op2(9)movax,word_op1-word_op2+100(10)movword_op1,word_op1-word_op24.执行下面的程序后,(A)=?DATASEGMENTADW0BDW0CDW10,20,30DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXLEABX,CMOVAX,[BX]MOVB,AXMOVAX,2[BX]ADDAX,BMOVA,AXRETSTARTENDPCODEENDSENDSTART5.已知小写字母的ASCII码的D5=1,大写字母的ASCII码的D5=0,阅读下列程序,试说明其完毕的功能,并画出程序流程图。DATSEGSEGMENTERR1DB‘INPUTISERROR!’,0DH,0AH,‘$’DATSEGENDSCODSEGSEGMENTASSUMECS:CODSEG,DS:DATSEGSTART:MOVAX,DATSEGMOVDS,AXMOVAH,1INT21HCMPAL,‘a’JBNEXTCMPAL,‘z’JANEXTANDAL,0DFHMOVDL,ALMOVAH,2INT21HNEXT:MOVDX,EER1MOVAH,9INT21HMOVAH,4CHINT21HCODSEGENDSENDSTART6.已知以BLOCK为首地址的存储区内存放了100个带符号的字数据,阅读以下的程序,试说明其完毕的功能,并画出程序流程图。DATSEGSEGMENTBLOCKDW0123H,0A65BH,7078H,9802H,8974H,……COUNTEQU$-BLOCKDATSEGENDSCODSEGSEGMENTASSUMECS:CODSEG,DS:DATSEGSTART:MOVAX,DATSEGMOVDS,AXMOVDX,COUNTSHRDX,1LOP1:MOVCX,DXMOVSI,0LOP2:MOVAX,BLOCK[SI]CMPAX,BLOCK[SI+2]JGENEXTXCHGAX,BLOCK[SI+2]MOVBLOCK[SI],AXNEXT:ADDSI,2LOOPLOP2DECDXJNZLOP1MOVAH,4CHINT21HCODSEGENDSENDSTART7.自1000H单元开始有一个100个字数据,若要把这批数据传送到自2023H开始的存储区中,可以采用下列三种方法实现,试分别编制程序段以实现数据串的传送。(1)不用串解决指令;(2)用单个传送的串解决指令;(3)用REP前缀与串解决指令配合。8.编写一个程序,把自1000H单元开始的100个字节数据传送到自1050H开始的存储区中去。(注意:数据区有重叠)9.自0500H单元开始,存有100个数。规定把它传送到1000H开始的存储区中去,但在传送过程中要检查数的值,碰到第一个零就停止传送。10.在以Array为首地址的字节数组中,有100个无符号数。编一个程序求这100个数据的偶数之和与奇数之和,并把两个和分别放在Sum_e与Sum_o单元中(和用两字节表达)。11.在以Array为首地址的字数组中,有100个带符号数。编一个程序把其中的最大偶数挑出来,存放在Max单元中。12.编制一个程序,计算100个正整数(字数据)之和,假如不超过机器数的范围(65535),则计算其平均值并存于RESULT,否则显示“overflow”。13.若在存储器中有数a、b、c、d(它们连续存放),编一个程序实现下面的运算:((a×10+b)×10+c)×10+d(和≤65535)注:a×10=a×2+a×8,可用逻辑左移指令实现乘法运算。14.设在变量X、Y、Z中存放有三个数,若三个数都不为0,则将三个数之和存入U中;若有一个为0,则将其它两个单元也清0。试编写此程序。15.在缓冲区Buffer连续放着100个学生的数学成绩,编程序记录其中85~100、60~84、60分以下者各有多少人,并把结果存到Result开始的三个字节单元。参考答案:1.(1)1(2)2(3)7(4)208(5)1(6)1(7)100(8)1002.(1)1004H(2)3000H(3)14FEH(4)152EH3.(1)错。数据类型不匹配。(2)对。(3)错。两操作数必须有一个采用寄存器寻址方式。(4)错。DX不作变址用。(5)对。(6)对。(7)错。目的操作数应为wordptr[bx][di],即必须指明其数据类型。(8)错。符号地址与符号地址不能相加,此处必须为立即数。(9)对。(10)对。4.(A)=30YYYYNN键盘输入字符→(AL)startend转换:(AL)∧DFH→(AL)(AL)<‘a’?(AL)>‘z’?屏幕显示错误信息屏幕输出大写字母6.答:其功能是,采用冒泡法将100个数据从大到小排序。其流程图如下:YYYYNN初始化:指针SI指向块首块长度÷2送DXstartend(DX)→(CX)(AX)≥下一数?(CX)=0?两数互换(SI)+2→(SI)取一个16位数→(AX)(CX)-1→(CX)(DX)-1→(DX)(DX)=0?YN7.解:编程如下:(1)不用串解决指令,程序段如下:MOVSI,1000HMOVDI,2023HMOVCX,100AGAIN:MOVAX,[SI]MOVWORDPTR[DI],AXADDSI,2ADDDI,2LOOPAGAIN(2)用单个传送的串解决指令,程序段如下:MOVSI,1000HMOVDI,2023HMOVCX,100CLDAGAIN:LODSWSTOSWLOOPAGAIN(3)用REP前缀与串解决指令配合,程序段如下:MOVSI,1000HMOVDI,2023HMOVCX,100CLDREPMOVSW8.解:对于源区和目的区有重叠的数据快的搬运,应从数据快的底部开始,程序如下:DATASEGMENTORG1000HDATA1DB1,2,3,……,50DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVCX,100LEASI,DATA1+99LEADI,DATA+149STDREPMOVSBMOVAH,4CHINT21HCODEENDSENDSTART9.解:源程序如下:datasegmentorg0500Hbuffer1dbx1,x2,x3,……,x100org1000Hbuffer2db100dup(?)dataends

stacksegmentparastack‘stack’db100dup(?)stackendscodesegmentassumecs:code,ds:data,es:data,ss:stackstartprocfarbegin:pushdsmovax,0pushaxmovax,datamovds,axmoves,axmovax,stackmovss,axmovcx,100cldleasi,buffer1leadi,buffer2again:lodsbcmpal,0jestopstosbloopagainstop:retstartendpcodeendsendbegin10.解:源程序如下:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论