微机原理及应用:第5章 汇编语言程序设计

上传人:枫** 文档编号:570041825 上传时间:2024-08-01 格式:PPT 页数:127 大小:616.50KB
返回 下载 相关 举报
微机原理及应用:第5章 汇编语言程序设计_第1页
第1页 / 共127页
微机原理及应用:第5章 汇编语言程序设计_第2页
第2页 / 共127页
微机原理及应用:第5章 汇编语言程序设计_第3页
第3页 / 共127页
微机原理及应用:第5章 汇编语言程序设计_第4页
第4页 / 共127页
微机原理及应用:第5章 汇编语言程序设计_第5页
第5页 / 共127页
点击查看更多>>
资源描述

《微机原理及应用:第5章 汇编语言程序设计》由会员分享,可在线阅读,更多相关《微机原理及应用:第5章 汇编语言程序设计(127页珍藏版)》请在金锄头文库上搜索。

1、n第五章汇编语言程序设计n汇编语言是一种符号语言,用助记符表示指令的操作码,地址和数据也可用符号表示。比机器语言易于编写、阅读修改。但须经“翻译”成机器语言(或称目标代码)才能执行。n汇编程序有小汇编(ASM)和宏汇编(MASM)。汇编语言源程序经过汇编(.obj)和连接得到可执行文件(.exe)。n5.1汇编语言程序格式n举一个简单的例子:已知X19,Y=43,Z=11,求X+Y-ZnDATASEGMENTnXDW19nYDW43nZDW11nRESULTDW?nDATAENDSnSTACKSEGMENTnSTTTDB100DUP(?)nSTACK ENDSnCODESEGMENTnASSU

2、MECS:CODE,SS:STACK,DS:DATAnSTART:MOVCX,DATAnMOVDS,CXnMOVCX,STACKnMOVSS,CXnMOVSP,100nMOVAX,XnADDAX,YnSUBAX,ZnMOVRESULT,AXnCODEENDSnENDSTARTn5.1.1汇编语言源程序的格式n程序是分段结构,至少要有一个代码段。nNAME1SEGMENTn语句1nn语句nnNAME1ENDSnNAME2SEGMENTnNAME2SEGMENTn语句1nn语句mnNAME2ENDSnNAMEkSEGMENTn语句1nn语句jnNAMEkENDSnnENDn5.1.2源程序语句的种

3、类n三种基本语句:n1.指令语句:汇编后要产生机器码的可执行语句。n2.伪指令语句:提供汇编信息汇编时处理,汇编后不产生指令代码。如指定程序或数据存放的起始地址数据段定义n3.宏指令语句:把多次重复使用的程序段用宏伪操作命令定义为一个名字,可以当作指令一样使用宏指令。n5.2语句行的构成n5.2.1几个基本规定n一、语句使用的字符集n(1)英文字母:大写A-Z和小写a-z;n(2)数字字符:0-9;n(3)算术运算符:*n(4)关系运算符:;n(5)分隔符:,()U(空格)、TAB(制表符)n控制符:CR(回车)、LF(换行)、FF(换页)n其他字符:$&_?.%!n二、保留字n所有的指令操作

4、码助记符:ADD、JCXZ、NOP、TEST、ROL等n伪指令:ASSUMEENDPORGDBLABALPROCPUBLICEQU等n寄存器名:AXAHDISISS等n其他保留字:ABSFARLELENGTHNEARPARASHORTTHIS等n标识符(又称名字)n三、标识符(又称名字)n程序员自行建立的自定义符号,用作标号、变量名、常量名、段名、过程名等。n标识符以字母开头,最多31个字符有效;n可出现$_.?等,有.时必须是第一个字符,?不单独用不得包含空格,保留字不能用。n正确START,ABC,NOT_FIND,LOOP2,C_SEG,X,Y,2等n错误:3FD6,Y+C,ADC,EQ

5、U,AH,等n5.2.2源程序语句的格式n指令性语句格式:n标号:助记符号参数1,参数2;注释n伪指令语句格式:n名字助记符参数1,参数n;注释n1.标号n一、标号n标号是为语句起的名字;n标号以冒号结束;n标号不一定每行都有,需要引用的才加标号;n标号中若有数字,大小不代表执行顺序;n同一程序中的两个标号不得相同;n标号代表本语句的符号地址,汇编时赋予实际值(存储地址)n标号有三种属性n标号有三种属性:n段属性(SEGMENT):标号所在的段,SEG运算符求之CSn偏移量(OFFSET):所在语句与段首的偏移量n类型属性(TYPE):又叫距离属性,NEAR段内引用FAR段间n二、伪指令语句定

6、义的名字n伪指令中的名字:段名、过程名、常量变量名属于标识符n常量名:用符号形式表示的常数。有数字、字符n变量名:一个或一些存储单元的符号地址,其内容为变量的值。变量名下的一组数据数组。n变量名也有三种属性:段、偏移量、类型(字节字双字等)n伪指令定义的名字后面没有冒号。n和机器语言相比,用汇编语言来编写程序的突出优点是可以使用符号助记符。n汇编语言的指令和机器语言的指令之间有一一对应的关系,汇编成的目标代码程序容量为源程序的几倍,汇编语言和机器密切相关。n汇编语言可使程序员直接控制目标代码,可对输入输出端口进行控制。n实时性好,用于系统程序、实时通信程序、实时控制程序等,还可被各种高级语言嵌

7、用。n举例:一个规范程序nDATA SEGMENT;数据段开始nDA1DB2AH,6,33;nDBPROGRAMASMnDB40DUP(?)nBUFDMADB80HDUP(?)nDATA ENDSnSTACKSEGMENT;堆栈段开始nME1DB80HDUP(?)nSTACKENDSnCODE SEGMENT;代码段开始nASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATAnORG200HnSTART:MOVAX,DATA;nMOVDS,AXnMOVDX,OFFSETDA1;删除同名文件nMOVAH,13H;nINT21HnMOVDX,OFFSETBUFDMA;设置磁盘

8、缓冲区nMOVAH,1AH;nINT21HnMOVAX,OFFSETDA1+12 ;当前块号为0nMOVBX,AXnMOVBX,0nMOVSI,2000H ;设文件已在2000H开始的缓冲区nMOVE:MOVDI, OFFSET BUFDMA;传递一个数据块nMOVCX,80HnCLDnPUSHCS; 是 CS和 ES指向同一个段nPOPESnREPMOVSB;执行数据传送nMOVCX,80H;检索是否遇到结束符nMOVAL,1AH;Z的ASC码nMOVDI,OFFSETBUFDMAnPUSHCSnPOPESnREPNZSCASB;检索ZnJZCLOSEnPUSHSI;保留数据区地址nMOVD

9、X,OFFSETDA1;写一个记录nMOVAH,15H;nINT21nPOPSI恢复数据地址nJMPMOVEnCLOSE:MOVDX,OFFSET,DA1;写最后一个记录nMOVAH,15H;nINT21HnMOVDX,OFFSETDA1;关闭文件nMOVAH,10HnINT21HnCODEENDSnENDn二进制表示:01011101Bn十进制表示:1996D或1996n八进制表示:1267Qn16进制表示:0F01AHn浮点数表示:2.05E5n字符串表示:STUDENTS相当于给出了ASC码nASM86规定常数不能以字母开头,16进制数以AF开头时添加0n5.注释汇编时不作处理n汇编源程

10、序为便于理解常加注释,用;隔开,续航也应用;开头n6.表达式n操作数n一个操作数在内容上可能代表一个数据,也可能代表一个存储单元的地址,最简单的数据是常数,如100H,也常用标号表示数据PORT存储器地址也常用标记符(标号)表示,实际包含段值和偏移量。n1.运算符n操作数和运算符构成表达式,有5类运算符n。算术运算符(arithmeticoperators)n。逻辑运算符(logicaloperators)n。关系运算符(relationaloperators)n。分析运算符(analyticoperators)n。综合运算符(syntheticoperators)n算术运算符n加减乘除*和求

11、两数相除余数的MOD如20MOD3结果为2n常用的地址运算操作是标号一个数,地址相乘等无意义nSTART+2DA14n逻辑运算符n包括与.或.非.异或AND.OR.NOT.XORn如:0FHOR0F0H0FFH01HXOR81H80Hn注意:逻辑运算符只能对常数进行运算,结果也是常数。nAND.OR.NOT.XOR既是助记符又是运算符,助记符在程序执行时执行n逻辑运算符在汇编时执行运算,不会混淆。例如:nANDDX,PORT1AND0FEH表示将DX中的内容和逻辑与的结果相与,结果在DX中n关系运算符n相等EQ(equal)n不等NE(noequal)n小于LT(lessthan)n大于GT(

12、greaterthan)n小于等于LE(lessthanorequal)n大于等于GE(greaterthanorequal)n如PORTLE5中,含有关系运算符n要指出的是参与关系运算的两个操作数必须是数据,或是同一段中的存储单元地址,关系成立,结果为FFFFH,否则0nMOVAX,2GE3;因为2GE3不成立,结果为0,相当于nMOVAX,0n关系运算符不能单独使用,与逻辑运算符组合使用,比如:nMOVBX,(PORTLT5)AND20)OR(PORTGE5)AND30)n当PORT小于5时,则汇编后上面语句相当于nMOVBX,20n否则相当于nMOVBX,30n分析运算符和综合运算符n分

13、析运算符和综合运算符n分析运算符把存储单元地址分解为段地址和偏移量以及求取性质OFFSET、 SEG 、TYPE、SIZE、LENGTHn综 合 运 算 符 规 定 存 储 单 元 的 性 质PTR(BYTE/WORD)、THISnOFFSET用来取地址的偏移量,如:nMOVDX,OFFSETDA1n此语句将DA1处的地址的偏移量取到DX中nSEG运算符用来取存储单元地址的段值,如:nMOVAX,SEGABCnMOVDS,AXn这两个语句使得DS中存放对应于ABC的段地址nTYPE用来取存储单元的类型n如KKK存储区是用伪指令:n如KKK存储区是用伪指令:nKKKDB20DUP(?)来定义的,

14、那么nTYPEKKK等于1nLENGTH用来计算一个存储区中的元素(字节字双字)数目。nSIZE用来计算一个存储区的字节总数。伪指令定义如下:nDA1DD20DUP(?)则nTYPEDA1等于4nLENTHDA1等于20nSIZEDA1等于80n综合运算符有PTR、THISnPTR用来对存储单元规定类型,常与伪指令BYTE、WORD联用nMOVWORDPTRDI,01n将使DI单元为01,DI+1单元为00nPTR也用来更改已经规定了类型的存储单元的类型,如原先定义:nHHHDB20DUP(?)即HHH作为20个字节的存储区可更改为:nPPEQUBYTEPTRHHHnQQEQUWORDPTRH

15、HH2nKKEQUDWORDPTRHHH8n前2字节仍为字节单元,中6字节3个字,后12字节放3个双字nTHIS和PTR类似,也可改变存储区类型n比如,希望存储区XYZ既可作为字类型,有可作为字节类型,可在XYZ的类型语句:nXYZDW?之前,加上两个含运算符THIS的语句,变成:nXYZ_2EQUTHISBYTEnXYZ_1EQUTHISDWORDnXYZDW10DUP(?)n因为XYZ_1、XYZ_2和XYZ具有相同的段地址和偏移量,所XYZ:存储单元为字类型nXYZ_1:双字类型n因此上面3句相当于:nXYZDW?nXYZ_1EQUDWORDPTRXYZnXYZ_2EQUBYTEPTRX

16、YZ+1n5.2.3伪指令nASM-86约有20条伪指令,常用的有:n。标号赋值伪指令EQUn。定义存储单元伪指令DB、DW、DDn。定义存储单元类型伪指令BYTE、WORD、DWORDn。 段 定 义 伪 指 令 SEGMENT、 ENDS、ASSUME、ORGn。过程定义伪指令PROC、ENDP、NEAR、FARn。程序结束伪指令ENDn1.标号赋值伪指令EQUn用标号代表数值时,必须在源程序前面赋值,EQU可使标号等于表达式,也可使新标号等于旧标号n标号EQU表达式或n新标号EQU旧标号旧标号是已经赋过值的标号nABCEQU220nXYZEQUABCnCOUNTEQUCXnPURGE和E

17、QU相反,用来解除标号的赋值,如PURGEABCn1.定义存储单元的伪指令DB、DW、DD、DQ、DTn分别用来定义程序中需要的字节、字、双字、4字、10字存储空间。如:CRDB0DHnLFDB0AH;nBUFDB?;BUF单元无初值,可存放中间结nDO-2DB9DUP(?);DO-2等9个字节单元留下备用nDONTDW10DUP(?);留下10个字空间备用nSTDBHowareyounTABLEDB00,01,03,02,06,04,05nDB0FH,0EH,0CH,0DH,09 DB0BH,0AH,08nDDAAEQU$-TABLEnDB与EQU的区别,第一句使CR单元中的值为0DHnCR

18、EQU0DH表示CR这个标号的值为0DHn使用定义存储单元的伪指令时,初值也可用表达式来表示n如PORT已赋过值PORTEQU50H则可有:nIN-PORTDBPORTnOUT-PORTDBPORT+1n表示IN_PORT单元中存放的是端口号50H,OUT-PORT单元为51Hn1. 定义存储单元类型的伪指令BYTE、WORD、DWORDn定义存储单元类型伪指令不能单独使用,要和8086指令相结合,如:nMOVBYTEPTRDI,00;DI所指单元清零nMOVWORDPTR1000,00;10001001两单元清零nINCBYTEPTRSI;SI所指单元1nJMPDWORDPTR2000;段间

19、间接转移,目的地在20002003单元中n4.段定义伪指令SEGMENT、ENDS、ASSUME、ORGn4. 段 定 义 伪 指 令 SEGMENT、 ENDS、ASSUME、ORGnSEGMENT和ENDS成对使用,每对为一个段:数据段堆栈段代码段nASSUME告诉汇编程序,当前数据段、哪是堆栈段、代码段等nORG规定目标程序存放单元的偏移量,比如:nORG200Hn使得IP200H,规定目标程序的第一个字节放在200H单元n为什么用伪指令来表示有关段的信息?n关系到转移调用时除16位偏移量外,有无16位段地址的问题n例子:两个16位2进制数相乘nDATASEGMENTnM1DW 00FF

20、H;M1中放乘数nM2DW 00FFH;M2中放被乘数nP1DW?nP2DW?nDATA ENDSnSTACKSEGMENTnSTADB 100DUP(?)nTOPEQULENGTHSTAnSTACKENDSnCODESEGMENTnASSUMECS:CODE,DS:DATA,SS:STACKnSTART:MOVAX,DATAnMOVDS,AXnMOVAX,STACKnMOVSS,AXnMOVAX,TOPnMOVSP,AXnMOVBX,OFFSETM1nMOVAX,BXnMOVDX,00nMOVBX,OFFSETM2MULWORDPTRBXMOVBX,OFFSETP1;存积的低16位MOVBX

21、,AXMOVBX,OFFSETP2;存积的高16位MOVBX,DXHLTCODEENDSENDSTARTn几点说明:SEGMENT前面的标号可以是任意的nASSUME语句使得汇编程序得知那一段是数据段、代码段、堆栈段,但除CS段外,段码要用MOV指令赋值。n段定义的一般形式:n段名SEGMENT定位类型组合类型类别n。n段名ENDSn定位类型有:PARA指定段从小段边界XXXX0H,缺省定位类型nBYTE从任何地址开始nWORD从字边界开始nPAGE从页边界开始XXX00Hn组合类型有:不组合(缺省),不同程序中同名段不组合nPUBLIC该段与同名段连接时在一起。nCOMMON连接时同名段重叠

22、,不能同时调入内存AT表达式指定段从表达式左移4物理地址开始nSTACK不同程序中的同名段连成一个逻辑段nMEMORY几个逻辑段连接时该段在地址最高处n类别:决定各逻辑段的装入顺序,相同类别名连续装n5. 定 义 过 程 的 伪 指 令 PROC、 ENDP、NEAR、FARnASM86的子程序含义与其他语言相同,最后一句总是返回语句PROC和ENDP总是成对出现,两者之间为一子程序。n段间返回和段内返回都是RET,但汇编时代码不同段内C3H段间CBHnFAR和NEAR指明到底是段间调用还是段内调用,两方面提供汇编信息。子程序头部标有FAR,则段间调用,产生段地址,返回代码CBHn例子:BCD

23、码相加程序nDATA SEGMENTnFIRSTDB11,22,33,44;第一个加数nSECONDDB55,66,77,88;第二个加数nSUMDB20DUP(?);结果存放单元nDATAENDSnSTACKSEGMENTnSTACKSEGMENTnSTADB20DUP(?);设堆栈长度为20个字节nTOPEQULENGTHSTAnSTACKENDSnCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKnSTART:MOVAX,DATA;设数据段寄存器的值nMOVDS,AXnMOV AX,STACK;设堆栈段寄存器的值nMOV SS,AXnMOV AX,TOP;

24、设堆栈指针,指向预留栈区底部nMOVSP,AXnMOV SI,OFFSETFIRST;SI指向第一个加数nMOV DI,OFFSETSUM;DI指向结果单元nMOV BX,OFFSETSECOND;BX指向第二个加数nMOVCX,04;共长4个字节nCLDnCLC;清进位标志nADITI:CALLAAA1;完成多字节加法nLOOP ADITIn。nAAA1PROCNEAR;单字节加法子程序,NEAR可省去nLODSB;取第一个加数nADCAL,BX;相加nDAA;十进制调整nSTOSB;结果送DI所指单元nINCBXnRET;返回nAAA1ENDP;子程序结束nCODEENDS;程序段结束nE

25、NDSTART;程序结束n6.源程序结束伪指令ENDnENDPPROCnENDSSEGMENTnEND不和其他伪指令配对使用,源程序结束标志nEND之后的内容不予理睬nEND语句形式:nEND表达式表达式就是程序第一条指令前的标号。n5.3汇编语言程序设计n1.概述n设计一个好的程序,除能正常运行外,还应满足:n。程序要结构化(简明、易读、易调试)n。执行速度快n。占用存储空间小n汇编程序的基本步骤是:n汇编程序的基本步骤是:n。分析问题,描绘出数学模型n。确定算法n。绘制程序框图n。分配存储器及工作单元n。编制程序n。检查程序n2.程序的基本结构n2.程序的基本结构n。顺序程序设计n。分支程

26、序设计(不完全分支和完全分支)n。循环程序设计n。子程序设计nPOPSInJLZZnSTD;减量方式传送nADDSI,STRSE-1;指向数据底部nADDDI,STRSE-1nZZ:REPMOVSB;重复传送50个数据nRETnBINENDPnCODEENDSnEND统计负数的个数统计AX中1的个数n1.子程序与主程序的信息交换n(1)通过寄存器交换信息n例5.7:求y=(x2+x.f(x).f(x2)n其中f(t)=4t3+2t2+3t+7=(4t+2).t+3).t+7n两处用到f(x),可定义为子程序,主程序存x于CX中,子程序存结果于AX中。nDATASEGMENTnXDW2nYDW?

27、nDATAENDSnSTACSEGMENTSTACKnSTADW100DUP(?)nSTACENDSnCODEGSEGMENTCODEnASSUMECS:CODEG,DS:DATA,SS:STACnBEG:MOVAX,DATAnMOVDS,AXnLEASP,STA+200nMOVCX,X;CX=xnCALLFX;AX=f(x)nCALLFX;AX=f(x)nMULX;AX=x.f(x)nMOVBX,AX;BX=x.f(x)nMOVAX,XnMULAXnADDBX,AX;BX=x2+x.f(x)nMOVCX,AX;CX=X2nCALLFX;AX=f(x2)nMULBX;AX=(x2+x.f(x)

28、.f(x2)nMOVY,AXnMOVAH,4CHnINT21HnFXPROCNEARnMOVAX,4nMULCX;AX=4xnADDAX,2;AX=4x2nMULCX;AX=(4x2).xnADDAX,3;AX=(4x2).x3nMULCX;AX=(4x2).x3).xnADDAX,7;AX=(4x2).x3).x7n;=4x3+2x2+3x+7nRETnFXENDPnCODEGENDSnENDBEGn(2)通过内存变量传递信息n上述程序中可把变量x保存在内存单元t中实现参数传递n子程序返回结果仍通过AX传递nFXPROCNEARnMOVAX,4nMULtnADDAX,2nMULtnADDAX

29、,3nMULtnADDAX,7nRETnFXENDPn(3)通过堆栈区传递参数n例5.8:求y=(x2+x.f(x).f(x2)n其中f(t)=at3+bt2+ct+d=(at+b).t+c).t+dn程序如下:nDATASEGMENTDATAnXDW2nADW4nBDW2nCDW3nDDW7nYDW?nDATAENDSnSTACSEGMENTSTACKnDB100DUP(?)nSTACENDSnCODEGSEGMENTCODEnASSUMEDS:DATA,SS:STAC,CS:CODEGnBEG:MOVAX,DATAnMOVDS,AXnPUSHAnPUSHBnPUSHCnPUSHDnPUSH

30、XnCALLFXnPOPAX;取出信息AX=f(x)nMULXnMOVBX,AX;BX=x.f(x)nMOVAX,XnMULAX;AX=x2nADDBX,AX;BX=x2+x.f(x)nPOPCX;CX=xnPUSHAX;x2压入栈顶nCALLFXnPOPAX;AX=f(x2)nMULBX;AX=(x2+x.f(x).f(x2)nMOVY,AXnADDSP,10;退栈nMOVAH,4CHnINT21HnFXPROCnMOVBP,SP;虽然栈顶未变内容变成x2nMOVAX,WORDPTRBP+8;AAXnMULWORDPTRBPnADDAX,WORDPTRBP+6nMULWORDPTRBPnAD

31、DAX,WORDPTRBP+4nMULWORDPTRBPnADDAX,WORDPTRBP+2nPUSHAXnRETnFXENDPnCODEGENDSnENDBEGn关于现场保护n1.关于现场保护(CPU寄存器状态)n(1)主程序子程序分开使用存储器和寄存器n(2)子程序使用临时寄存器和堆栈单元n(3)保留恢复现场(子程序中保留恢复现场较好,尤其是中断子程序,随机发生)n5.4DOS功能调用nDOS、BIOS系统功能不用CALL指令调用,而用INTn不连接n用户有两种途径使用DOS功能,普通用户从键盘输入DOS命令,COMMAND.COM接收、识别、执行之。高级用户通过用户程序调用DOS、BIO

32、S中的服务程序。n用户程序控制PC机硬件的方式n1.使用高级语言提供的功能控制硬件n高级语言中的IO语句方便,但少,速度慢。n2.使用DOS提供的程序控制硬件nDOS提供近百种I/O程序,使用简单可移植性好,效率低。n3.使用BIOS提供的程序控制硬件nBIOS驻留ROM中,运行效率高,可移植性差。n4.直接访问硬件n常用DOS功能调用nINTn软中断调用DOS、BIOS功能,nBIOS调用:n=51F,nn=20-3FH为DOS功能调用,见表5-4。n所有的DOS功能调用格式都是相同的,分4个步骤:n;在AH寄存器中设置调用功能号n;在指定寄存器中设置入口参数(有些不需要)n;用INT21H

33、指令执行功能调用n;根据出口参数分析功能调用执行情况n一.键盘输入(1号调用)INT21H常用功能n调用格式:MOVAH,1nINT21H;功能是等待从键盘输入一个字符n的ASCII码送入寄存器AL中,并送显示器n二.显示输出(2号调用)n调用格式:MOVDL,待显示字符的ASCII码;如AnMOVAH,2nINT21Hn三.打印输出(5号调用)nMOV DL,待打印字符的ASCII码;例如$nMOVAH,5nINT21H;打印出了字符$n四、检查键盘状态0BH号功能,如dir/p、放错启动软盘等nLOOP:n。nMOVAH,0BHnINT21H;检查键盘状态nCMP AL,00H ;有键按下

34、AL=FFH,否则AL=00nJELOOP;无字符键入,循环nRET;有键入字符,停止循环返回n五、单字符键入功能1、7、8都可直接键入字符,回答提示信息,7、8不回显可用于保密信息输入。nMAINn。nKEY:MOVAH,1;等待字符键入,按下后nINT21H;AL=字符nCMPAL,YnJEYES;键入字符“Y”,转YES语句处nCMPAL,NnJENOTnJMPKEYn。;继续等待键入字符nYES:。nNOT:。n六、显示字符串(9号调用)nLEADX,字符串首偏移地址;字符串要以$结尾nMOVAH,9nINT21H;将DS:DX所指以$结尾的字符串送显示n七、键盘输入字符串(10号调用

35、)nLEADX,缓冲区首偏移地址nMOVAH,10nINT21H;从键盘往DS:DX所指输入缓冲区输入并显示例题:字符串键入与显示nDATASEGMENTnBUFSIZEDB50nACTCHARDB?nCHARTEXDB50DUP(20H)nDB$n。nDATAENDSn。nCODESEGMENTn。nMOVDX,OFFSETBUFSIZEnMOVAH,0AHnINT21H;键入字符串,放入缓冲区n。nMOVDX,OFFSETCHARTEXnMOVAH,09HnINT21H;显示键入的字符串n5.4MASM5.0宏汇编语言上机过程n实验一MASM5.0宏汇编语言编程调试n一、一、实验目的实验目

36、的n为了深入理解汇编语言指令系统常用指令的含义,掌握汇编语言程序的编辑、连接和调试方法,用MASM5.0进行编程调试实验。MASM5.0是在DOS环境下运行的一种功能很强的宏汇编程序,除具有一般汇编程序的功能外,还支持宏处理、条件汇编。n一、一、实验方法实验方法nMASM5.0宏汇编语言系统只有数百K字节,主要由EDIT.COM,MASM.EXE,LINK.EXE和DEBUG.EXE四个文件组成,系统不需要安装。由于Windows2000以上版本的操作系统没有MS-DOS方式,需从开始菜单的运行子菜单处键入CMD或COMMAND命令,进入命令行方式,设法进入汇编系统所在的文件夹子目录后。操作过

37、程如下:n1.EDIT文件名文件名.ASMn1.EDIT文件名文件名.ASMn进入编辑状态,编辑汇编语言源程序。文件名.ASMn2.MASM文件名文件名.ASMn对对源源程程序序进进行行汇汇编编,根根据据提提示示输输入入三三次次文文件件名名,分分别别得得到到目目标标代代码码文文件件:文文件件名名.OBJ;列列表表清清单单文文件件:文文件件名名.LST和和交交叉叉参参考考文文件件:文文件件名名.CRF。如如果果出出错错重重新新汇汇编编。直到显示直到显示n0warningerrorsn0seviererrorsn3.LINK文件名文件名.OBJn连接系统与目标文件,得到可执行文件:文件名.EXE;

38、和列表文件:文件名.MAP。通常不要选择连接库文件,直接回车即可。n4.调试过程:调试过程:nF:DEBUGMASM5文件名文件名.EXEn4.调试过程:调试过程:nF:DEBUGMASM5文件名文件名.EXEn屏幕上出现一个闪动的短横,表示已进入调试状态。应按如下规定:nA.所使用的数均为16进制数,且不写后缀HnB.地址形式为:段地址:偏移量,如nDS:1000CS:0134A:1001200:10nC.“地址范围”形式为:nC.“地址范围”形式为:n段地址:始偏移量末偏移量n或:地址L字节数,如nDS:10013F10041F(当前段)CS:100L60n调试命令如下:n调试命令如下:n

39、1._R寄存器名显示寄存器内容(还可修改)n2.U反汇编命令n_U或U或Un_U0;从CS:0开始反汇编,每次不超过20H字节n_UCS:105A从10到5A反汇编。n_U;接着前一个地址继续反汇编。n1.G执行命令n_G;从CS:IP开始执行,直到程序结束。n_G=;从指定地址开始执行,直到程序结束。n_G=从指定地址执行到断点地址。n_G=04E从CS:0执行到CS:4E。n_G=10从CS:10到程序结束。n_G从当前CS:IP执行到最后。n_G4B从当前CS:IP执行到4B。n4.D显示内存单元命令n_DDS:0显示数据段从0开始的128个单元。n_D25D3:0F显示25D3段的0到

40、F单元的数据。n_DCS:03F显示CS段的0到3F单元的机器码。n_D从当前地址往下显示128单元n1.E修改内存单元内容。n2.T单步执行(跟踪),每次执行一条指令。n3.Q结束调试,返回DOSn运行程序键入文件名n五、打印实验结果n用EDIT命令打开.ASM、.LST、.MAP文件,打印并阅读实验结果。n4.2汇编语言编程例题解析汇编语言编程例题解析n1、下列指令中,指令先执行CX-1送的CX操作,然后再根据CX的值决定是否转移、循环或进行重复操作。n(A)JNC(B)REP(C)JCXZ(D)LOOPn答案:(D),LOOP指令的执行过程就是先将CX1送CX,然后判断CX是否为零,不等

41、于零继续循环,等于零循环终止,跳出循环,执行下面的语句。JCXZ不仅执行以上过程,同时还要检查ZF标志位是否为1,ZF=1,且CX0才继续循环,否则跳出循环。n2、将寄存器AX的内容求反的正确指令是 。n(A)NEGAX(B)CMPAX,OFFFFHn(C)NOTAX(D)CMPAX,AXn答案:(C),只有NOT指令能取反。NEG是求补指令。CMP指令不改变AX中的内容。n3、计算机系统软件中的汇编程序是一种。n(A)汇编语言程序n(B)编辑程序n(C)翻译程序n(D)将高级语言程序转换成汇编语言程序的程序n答案:(C),计算机系统软件中的汇编程序起作用就是将汇编语言编写的程序翻译成机器语言

42、,这一过程通常也称为汇编。n4、使得JB指令执行转移操作的条件是 。n(A)CF=1且ZF=0(B)CF=1n(C)CF=0或ZF=1(D)ZF=0n答案:(A),CF=1说明相减后有借位,ZF=0说明结果不为0,显然无符号数被减数低于减数,满足转移条件。n5、设(SP)=2800H,使(SP)=27FEH的正确指令是。n(A)NEGA(B)MOVSP,27FEHn(C)POPAX(D)MOVSP,27FEHn答案:(B),NEGA指令与此无关。POPAX使SP内容22802H,最后一个选择使内存中2800、2801两单元分别为0FEH、27Hn6、8086CPU在基址加变址的寻址方式中,已知

43、BX=2000H,SI=1234H,则指令“MOVAX,BX+SI+2”的源操数作在中。n(A)数据段中偏移量为3236H的字节n(B)数据段中偏移量为3234H的字节n(C)附加段中偏移量为3236H的字节n(D)附加段中偏移量为3234H的字节n答案:(A),按规定,用BX间接寻址的,默认数据在数据段,具体偏移量由.中结果确定。n7.执行下列程序后,指出相应寄存器的当前值。nMOVSP,2000H;(SP)2000HnMOVAX,0F0H;(AX)0F0HnMOVSI,1234H;(SI)1234HnMOVDX,5678H;(DX)5678HnPUSHSI;2000H-21234HnPOP

44、DI;(DI)1234HnTESTAX,DX;AX不变,只影响标志nPUSHDX;2000H-2=5678HnHLTnSP=;DL内容所在存储器的偏移地址为_;nAX=_;DX=_;n标志位ZF为_。n答案要点:n1FFEH;1FFEH;00F0H;5678H;0n8.执行下列指令后:nSTR1DWABnSTR2DB16DUP(?)nCNTEQU$-STR1;CNT=18nMOVCX,CNT;(CX)18nMOVAX,STR1;(AX)4142HnHLTn寄存器CL的值是_;n、寄存器CL的值是_;n、寄存器AX的值是_;n、如将STR1DWAB改为STR1DBABn用“MOVAX,WORDPTRSTR1”代替“MOVAX,STR1”后,n寄存器AX的值是_。n答案要点:18;4142H;4241H;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号