已阅读5页,还剩58页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章汇编语言程序格式,4.1汇编语言程序功能1、汇编语言程序的建立及汇编过程用编辑程序建立ASM源程序用ASM程序把ASM文件转换为OBJ文件用LINK程序把OBJ文件转换为EXE文件用DOS命令直接键入文件名就可以执行该程序,2、汇编程序的主要功能检查源程序策出源程序中的语法错误,并给出出错信息产生源程序的目标程序,并可给出列表文件(同时列出汇编语言和机器语言的文件,称为LST文件)展开宏命令,4.2伪操作,汇编语句由指令、伪指令、宏指令构成指令:每条指令语句都生成机器代码,各对应一种CPU操作,在程序运行时执行。伪指令:在汇编程序对源程序汇编期间由汇编程序处理的操作,可以完成如数据定义、分配存储区、指示程序结束等功能,不生成目标代码。宏指令:用户按照宏定义格式编写的一段程序,可以包含指令、伪指令、甚至其他宏指令。,伪指令与机器无关,取决于汇编程序的版本,版本越高,提供的伪指令数目增加,功能增强;如MASM6.0提供了.IF/.ENDIF等语句,使汇编语言程序设计类似高级语言的形式。,4.2.2段定义伪操作,存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用段定义伪操作。,段定义伪操作格式为:段名SEGMENT定位组合段字类别段名ENDS说明:段名由用户自己起,要符合汇编语句对名字的要求。SEGMENT定义一个段的开始,ENDS定义该段的结束。删节部分,对于数据段、附加段和堆栈段来说,一般是存储单元的定义、分配等伪操作;对于代码段则是指令及伪操作,定位属性:指定逻辑段的起始地址BYTE:为下一个可用的字节地址(xxxxxxxxB)WORD:为下一个可用的偶数地址(xxxxxxx0B)DWORD:下一个可被4整除的地址(xxxxxx00B)PARA:下一个可被16整除的地址(xxxx0000B)PAGE:下一个可被256整除的地址(00000000B)默认的定位属性为PARA。简化段定义中,代码段和数据段默认的定位属性为WORD,堆栈段为PARA。,组合属性:指定段与段之间的关系。通常在多模块设计时使用,单模块下,除堆栈段必须使用组合属性STACK外,其它段使用默认值即可。完整段定义时,默认的组合属性为PRIVATE,意思是各段相互独立,不与其它段合并,各段都有自己的段地址;简化段定义时,默认的组合属性为PUBLIC,意思是告诉连接程序把本段与所有同名的其它段相邻地连接在一起,并合并为同一个段,共用一个段地址。,段字属性(use16use32):MASM5.0以后版本增加。对8086使用默认值(16位段),对32位CPU默认采用32位段,当然,也可以设置成16位段。,类别属性:类别名。类别名相同的段相邻连接但各有各的段地址。通常使用code,date和stack等类别名,以保持所有代码和数据的连续。,1.完整的段定义伪操作,2.存储模式与简化段定义伪操作,存储模式伪指令.model存储模式,语言类型,系统类型,堆栈选项使用简化段定义格式时,必须使用。必须位于所有段定义语句之前。7种不同的存储模式:tiny,small.medium,compact,large,huge,flat,简化段定义标准格式:,.modelsmall.stack.data.code.startup.exit0end,存储模式伪指令,;子程序代码,;程序代码,;数据定义,程序开始伪指令,程序结束伪指令,汇编结束伪指令,.stack大小:创建堆栈段,段名:STACK.STACK512;创建512字节的堆栈段。.STACK;创建1024字节(默认)的堆栈段。,.DATA;创建数据段,段名:_DATA.DATA?;数据段,无初值变量专用(_BSS).CONST;只读的常量数据段(CONST),.CODE段名;创建代码段,在SMALL模式下,默认的段名为:_TEXT没有段定义结束语句,下一个段的开始,就是本段的结束。,3、段组定义伪指令组名GROUP段名,段名,将多个同类但不同名的段合并为一个不超过64KB的物理段,并使用组名统一访问它。可理解为组合属性PUBLIC的补充。,4.2.3程序开始和结束伪操作,程序的开始可用NAME或TITLE为模块取名字。格式为:NAMEmodule-nameTITLEtext程序的结束可以用END来表示。格式为:ENDlabel,4.2.4数据定义及存储器分配伪操作,格式:变量名助记符操作数;注释功能:为变量分配单元,并为其初始化或者只预留空间。说明:变量名是可有可无的,需要时由用户自己起。变量名用符号地址表示,作用与语句前的标号相同,但它的后边不需要冒号,它也是其中第一个数据项的偏移量。程序通过变量名引用其中的数据。,汇编语言程序的语句格式两类语句:1)执行性语句2)说明性语句,1)执行性语句(硬指令、代码段)标号:硬指令助记符操作数,操作数;注释,2)说明性语句(伪指令、可位于任何段)名字伪指令助记符参数,参数;注释,助记符是数据类型的符号表示。助记符数据类型一个数据项字节数DB(BYTE)字节型1DW(WORD)字型2DD(DWORD)双字型4DQ(QWORD)四字型8DF(FWORD)六字节型(386以上机型有效)6DT(TBYTE)10字节型10,操作数可以是数字常量、数值表达式、字符串常量、地址表达式、?、DUP(操作数,)形式。数字常量及数值表达式:操作数可以是常数、表达式。数字中若出现字母形式,不区分大小写。如下所示:二进制数:以B结尾,有效数字是0、1。八进制数:以Q或O(字母)结尾,有效数字是07。十进制数:以D结尾,汇编语言中缺省值是十进制数,所以D可以省略不写。有效数字是09。十六进制数:以H结尾,有效数字是09和A(a)F(f)。若第一位数字是字母形式,则必须在前边加上0(数字)。,字符串常量在汇编语言中字符需要用单引号括起来,其值为字符的ASCII值。因为每个字符占用一个字节,所以最好用DB助记符定义字符串。地址表达式操作数可以是地址符号。若只定义符号的偏移量部分,则使用DW助记符。若要定义它的双字长地址指针(既含16位偏移量又含段基址),则使用DD助记符,其中低字中存放偏移量,高字中存放段基址。若要定义它的全地址指针(既含32位偏移量又含段基址),则使用DF助记符,其中低32位存放偏移量,高16位存放段基址。例如,“VARDWLAB”语句在汇编后VAR中含有LAB的偏移量。,?在程序中使用操作数?为变量预留空间而不赋初值。nDUP(操作数,)DUP是复制操作符,若要对某些数据重复多次,可以使用这种格式。其功能是把()中的内容复制n次。DUP操作可以嵌套使用。,例1.M1DB15,67H,11110000B,?M2DB15,AB$M3DW4*5M4DD1234HM5DB2DUP(5,A)M6DWM2;M2的偏移量M7DDM2;M2的偏移量、段基址M8DBABM9DWAB设以上数据自1470:0000开始存放,则为:0F67F000313541422414003412000005410541040004007014,例2可直接通过变量名引用变量,但要注意类型匹配。例如以下程序片段:MOVAL,M1;(AL)15MOVBX,M3;(BX)20ADDM3,6;(M3)26MOVAL,M2;(AL)131HMOVBL,M2+2;(BL)A41HMOVM1+3,BL;(M13)41H,PTR属性操作符格式:类型名PTR变量|标号给变量或标号指定类型属性BYTE、WORD、WORD、;NEAR、FAR;STRUCT、RECORD等类型的定义。例:OPER1DB1,2OPER2DW1234HMOVAX,WORDPTROPER1MOVAL,BYTEPTROPER2,LABEL伪指令格式:名字LABEL类型功能:为下一个存储单元起一个名字并定义它的类型说明:对于变量,类型可以是BYTE、WORD、DWORD等。对于标号,其类型可以是NEAR、FAR。LABEL伪指令并不为名字分配空间,但它可以为下一个存储单元另起名字而且另定义它的类型,从而可以使同一地址具有不同类型的名字,便于引用。,例.REDEWLABELWORDDEBYTEDB25H,32H,56H,42HMOVBL,DEBYTE;(BL)=25HMOVCX,REDEW;(CX)=3225H以上程序片段执行情况见下图,4.2.5表达式赋值操作EQU,格式:符号名EQU表达式功能:用符号名代表表达式或表达式的值。说明:表达式可以是任何有效的操作数格式。例如常数、数值表达式、另一符号名或助记符。注意:用EQU定义的符号在同一个程序中不能再定义。用途:增加程序可读性、缩短程序书写长度、避免因为某些修改而带来的程序不一致性。EQU伪指令经常与配合使用,得到变量分配的字节数。,例.MSGDBThisisfirststring.Countequ$msgCREQU0DH;回车符的ASCII值PORT_BEQU61H;定义PORT_B端口BEQUBP6;BP6用B表示程序中可以通过符号引用这些值,例如:MOVAL,CR;等价于MOVAL,0DHADDBL,B;等价于ADDBL,BP6)OUTPORT_B,AL;输出到61H端口Movcl,count;(CL)MSG的串长21,4.2.6地址计数器与对准伪操作,地址计数器$在汇编语言对源程序汇编的过程中,可使用地址计数器来保存当前正在汇编的指令的地址。地址计数器的值可用$来表示。如ORG$+8JNE$+6EVEN功能:使下一个字节地址成为偶数ORG表达式使下一个字节的地址成为常数表达式的值ALIGNn使它后面的数据或指令从n的整数倍地址开始(可被n整除)。,使它后面的数据或指令从偶地址开始,使地址计数器指向参数表达的偏移地址使它后面的数据或指令从偶地址开始,n是2的乘方(2,4,8)且小于所在段的定位属性值。如“ALIGN4”,使下一个地址开始于双字边界。,4.2.7基数控制伪操作,汇编程序默认的是十进制数。二进制数后面有B;十进制数后面有D;十六进制数后面有H;八进制数后面O或Q字符串可以看成串常数,可以用单引号或双引号把字符串放在其中RADIX伪操作:可以把默认的基数改为216范围内的任何基数。格式为:RADIXexpression,4.3.1名字项,源程序中可以用下列字符来表示名字:字母AZ;数字09;专用字符?、-、$名字项可以是标号或变量。标号:标号在代码段中定义,后面跟冒号标号有三种属性:段、偏移、类型。变量:在除代码段以外的其他段中定义,不跟冒号,常在数据段中出现,4.3汇编语言程序格式,都用来表示本语句的符号地址,可有可无,可用LABEL或EQU来定义,可用LABEL或EQU来定义;有段、偏移、类型三种属性。,4.3.3操作数项,操作数项由一个或多个表达式组成,多个操作数项之间用逗号隔开。对于指令,操作数项一般给出操作数地址;对于伪操作或宏指令,则给出他们所要求的参数。操作数项可以是常数、寄存器、标号、变量或由表达式组成。表达式可以是常数、寄存器、标号、变量与一些操作符相组合的序列。可以有数字表达式和地址表达式两种,算术操作符,算术操作符包括、*、和MOD(取模)操作符。算术操作符可以用在数值表达式或地址表达式中,但当用于地址表达式时,要注意只有当其结果有明确的物理意义时才是有效的。经常使用在地址表达式中的算术操作符是和,例如FIRST1是指紧跟FIRST单元之后的单元地址(注意不是FIRST单元的内容加1)。,逻辑操作符,逻辑操作符包括AND(逻辑与)、OR(逻辑或)、XOR(逻辑异或)和NOT(逻辑非)。逻辑操作符是按位操作的,它只能用在数值表达式中。虽然这些操作符与逻辑指令助记符的表示方法及操作相同,但它们的执行时间不同,前者在汇编时执行,后者在程序执行时执行。例.PORTEQU0FHANDDL,PORTAND0FEH,关系操作符,关系操作符包括EQ(等于)、NE(不等于)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)。其操作结果为一个逻辑值,若关系成立结果为真(全1),否则结果为假(0)。其中的操作数必须是数字或同段内的两个存储器地址。例.指令MOVAL,CHLT20的汇编结果:MOVAL,0FFH;当CH20时或:MOVAL,0;当CH20时,数值回送操作符,这组操作符可以把一些特征或内存单元地址的组成部分作为数值返回。它们是TYPE、LENGTH、SIZE、SEG、OFFSET和,变量:DBDWDDDQDT返回值124810标号:NEARFAR返回值-1-2,属性操作符,1、PTR操作符格式:类型PTR地址表达式功能:指定地址表达式的类型。说明:若是变量的地址表达式,则类型可以是BYTE、WORD、DWORD等。若是标号的地址表达式,则类型可以是FAR、NEAR。PTR经常用在临时改变地址类型或必须明确指出类型的场合。,2、段操作符用来表示一个标量、变量或地址表达式的段属性可以用段寄存器:地址表达式来表示,也可以用段名:地址表达式或组名:地址表达式来表示,3、SHORT操作符用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址的-128+127字节范围之内。例如:JMPSHORTLAB,4、THIS操作符格式:THIS类型功能:为存储器操作数指定类型。该操作数地址与下一个存储单元具有相同的段基址和偏移量。说明:它并不为该存储器操作数分配空间。与LABEL伪指令的功能有相似之处,但其区别是所出现的位置不同,THIS出现在操作数位置,与EQU伪指令配合定义一个具有类型、段基址和偏移量三属性的表示存储器操作数的符号。而LABEL是一条独立使用的伪指令。,5、HIGH、LOW操作符这两个操作符被称为字节分离操作符,它接收一个数字或地址表达式,HIGH取其高字节,LOW取其低字节。例.COUNTEQU1234HMOVAL,LOWCOUNT汇编结果为:MOVAL,34H,4.3.4注释项,注释项用来说明一段程序或一条或几条指令的功能,可有可无。,段定义伪操作格式为:段名SEGMENT定位组合段字类别段名ENDS说明:段名由用户自己起,要符合汇编语句对名字的要求。SEGMENT定义一个段的开始,ENDS定义该段的结束。删节部分,对于数据段、附加段和堆栈段来说,一般是存储单元的定义、分配等伪操作;对于代码段则是指令及伪操作,定位属性:指定逻辑段的起始地址BYTE:为下一个可用的字节地址(xxxxxxxxB)WORD:为下一个可用的偶数地址(xxxxxxx0B)DWORD:下一个可被4整除的地址(xxxxxx00B)PARA:下一个可被16整除的地址(xxxx0000B)PAGE:下一个可被256整除的地址(00000000B)默认的定位属性为PARA。简化段定义中,代码段和数据段默认的定位属性为WORD,堆栈段为PARA。,组合属性:指定段与段之间的关系。通常在多模块设计时使用,单模块下,除堆栈段必须使用组合属性STACK外,其它段使用默认值即可。完整段定义时,默认的组合属性为PRIVATE,意思是各段相互独立,不与其它段合并,各段都有自己的段地址;简化段定义时,默认的组合属性为PUBLIC,意思是告诉连接程序把本段与所有同名的其它段相邻地连接在一起,并合并为同一个段,共用一个段地址。,段字属性(use16use32):MASM5.0以后版本增加。对8086使用默认值(16位段),对32位CPU默认采用32位段,当然,也可以设置成16位段。,类别属性:类别名。类别名相同的段相邻连接但各有各的段地址。通常使用code,date和stack等类别名,以保持所有代码和数据的连续。,1.完整的段定义伪操作,4.4汇编语言程序的上机过程,ASSUME伪指令格式:ASSUME段寄存器:段名,段寄存器:段名功能:说明段寄存器和段之间的关系。说明:若一个段寄存器与NOTHING关联,则表示取消前边对该段寄存器的假设,可以省略。ASSUME语句并不给段寄存器赋值,它应放在引用段寄存器之前,通常放在代码段或主过程的第一个语句位置。ASSUME伪操作只是指定某个段分配给哪个段寄存器(CS、DS、SS、ES),并不能把段地址装入段寄存器中,因此在代码段中,还必须把段地址装入相应的段寄存器中。,建立段寄存器与段之间的缺省关系,改变这种缺省关系可使用段跨越前缀。如ASSUMECS:CODE,DS:DATA,ASSUME段寄存器:NOTHING对指令给出的段寄存器取消已经指定的缺省关系。,返回DOS的两种方法,方法一:codesegmentmainprofarassumestart:pushdsmovax,0pushaxretmainendpcodeendsendstart,方法二:codesegmentmainprofarassumestart:movah,4chInt21hmainendpcodeendsendstart,在MasmforWindows中集成CV(全称CodeView)与DEGUB两种调试工具,默认为用CV调试程序。(1)用CV调试先单击“运行”按钮生成EXE文件,再单击“调试”按钮,出现图1界面。说明:图1是调试求3+5的汇编程序,当连续按F10或连续在命令窗口输入P命令执行到ADDAL,03时,可以看到AL的值为8。,CV的功能键,调试程序DEBUG的使用,DEBUG.EXE是DOS提供的用于调试可执行程序的工具软件,是汇编语言程序设计中常用的调试工具。在DEBUG环境下,不但可以调试经汇编、连接后生成的可执行程序,也可以编写简单的程序。,1.启动DEBUG程序,在DOS提示符下键入:DEBUG(表示回车)Debug执行,屏幕显示提示符“”,说明计算机当前处于DEBUG的管理之下,可接受、并执行DEBUG命令。在DOS提示符下键入:DEBUG路径文件名DEBUG执行,并将指定文件装入内存,供调试。如不指定被调试程序,DEBUG设置所有段寄存器的值相同,并指向最低的、可用的段地址;SP指向本段的尾部;IP指向本段的0100H单元;其它通用寄存器和所有状态标志清0。,如带入的被调试程序扩展名不是.EXE,则BX、CX包含被调试文件长度(字节数,BX为高位),其他同上。(带入.COM程序同此)如带入的被调试程序扩展名是.EXE,则需要重新定位。DS=ES指向当前最低的、可用的段地址(PSP的首字节);CS:IP和SS:SP根据被调试程序确定,分别指向代码段和堆栈段;BX.CX为文件长度,其它通用寄存器和状态标志清0。,2DEBUG命令和参数的格式,1.命令格式命令字母参数字母不分大小写;只使用16进制数,不加H;分割符只在两个数值之间是必须的,命令和参数之间可有可无;键入回车键执行命令,Ctrl+Break或Ctrl+C中止命令的执行;如命令不符合DEBUG的规则,则提示“error”并使用“”指示错误位置。,2.参数格式表示地址(逻辑地址):段地址:偏移地址D0400:2500D10ac:0Dds:04Dcs:100偏移地址D2505D100;DEBUG认为输入的是偏移地址,段地址采用默认的段寄存器,不同的命令默认不同的段寄存器,例如汇编命令默认CS,显示数据命令默认DS。既不送段地址,也不送偏移地址,段地址采用默认的段寄存器,偏移地址采用当前值。只送段地址,省略偏移地址,非法。如DDS:或D0400:,表示范围开始地址结束地址如“DDS:050”,“D2AC0:100200”,“D100120”注意:结束地址不能带段地址开始地址L字节长度如“DDS:0L10”,“D100L20”,命令索引D命令E命令F命令R命令A命令U命令G命令T命令P命令Q命令N命令L命令W命令C命令H命令S命令I命令O命令M命令,3.DEBUG命令,1.显示命令DD地址D范围;如不指定范围,一次显示8行16个字节。D;默认段寄存器为DS,当前偏移地址DDS:100/DCS:200D200:100D200;200为偏移地址,默认段寄存器DSDDS:100110/D100L10,2.修改命令EE地址;从指定地址开始,修改(或连续修改)存储单元内容。DEBUG首先显示指定单元内容,如要修改,可输入新数据;空格键显示下一个单元内容并可修改,减号键显示上一个单元内容并可修改;如不修改,可直接按空格键或减号键;回车键结束命令。E地址数据表;从指定的地址开始用数据表给定的数据修改存储单元。EDS:100F3AB8D。,3.添充命令F,F范围数据表;将数据表写入指定范围的存储单元;数据个数多,忽略多出的数据,个数少,则重复使用数据表。FDS:0L501,02,03,04,05FDS:0L50102030405(空格分隔)FDS:0L5FF;5个字节重复使用FF注意和E命令的区别:E地址数据表,起始地址,不是范围,4.显示修改寄存器命令R,R;显示所有寄存器和标志位状态;显示当前CS:IP指向的指令。显示标志时使用的符号:标志标志=1标志=0OFOVNVDFDNUPIFEIDISFNGPLZFZRNZAFACNAPFPEPOCFCYNCR寄存器名;显示并修改指定的寄存器。RAX;RIP;RF等,5.汇编命令A,A地址;从指定的地址开始输入符号指令;如省略地址,则接着上一个A命令的最后一个单元开始;若第一次使用A命令省略地址,则从当前CS:IP开始(通常是CS:100)。注释:在DEBUG下编写简单程序即使用A命令。每条指令后要按回车。不输入指令按回车,或按Ctrl+C结束汇编。支持所有8086符号硬指令,伪指令只支持DB、DW,不支持各类符号名。,6.反汇编命令U,U地址;从指定地址开始反汇编32个字节的机器指令;省略地址时,则接着上一个U命令的最后一个单元开始;若第一次使用U命令省略地址,则从当前CS:IP开始(通常是CS:100)。U范围;对指定范围的单元进行反汇编。UU100U100L10,7.运行程序命令G,G;从CS:IP指向的指令开始执行程序,直到程序结束或遇到INT3。G=地
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 侦查系推理试题题库及答案
- 手提式双层袋行业深度研究报告
- 数显式电动机保护器行业深度研究报告
- 杀寄生虫药行业深度研究报告
- 色基染料行业深度研究报告
- 高氧酸盐行业深度研究报告
- 数据中心基础设施建设方案
- 地下排水管网建设施工方案
- 公休期间安全协议书
- 银行签订按揭合同范本
- 钻探技师考试试题及答案
- 石英石台面供货合同协议
- 冠心病大讲堂
- 2025年陕西神渭煤炭管道运输有限责任公司招聘笔试参考题库含答案解析
- 急诊绿色通道管理制度
- 职业技能鉴定指导书-脱硫值班员
- ICU各项规章制度和岗位职责
- 《小军号》参考课件
- 2024年11月-矿山隐蔽致灾因素普查
- 高中家长会 决战高考课件-高三下学期高三家长会
- 纪录片观念与历史知到智慧树章节测试课后答案2024年秋云南艺术学院
评论
0/150
提交评论