您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 汇编语言程序设计第四章
汇编源程序的语句类型完整的源程序至少包含两类语句:1.指令性语句-------符号指令通知CPU进行某种操作的命令,由硬件完成相应的功能;2.指示性指令--------伪指令为汇编程序提供编译信息,为链接程序提供链接信息,由软件完成.处理器选择伪操作.8086选择8086指令系统(缺省).286选择80286指令系统.286P选择保护方式下的80286指令系统.386选择80386指令系统.386P选择保护方式下的80386指令系统.486选择80486指令系统.486P选择保护方式下的80486指令系统.586选择Pentium指令系统.586P选择保护方式下的Pentium指令系统段的定义1格式:Segment_namesegment[定位类型][链接参数][‘分类名’][段长度]Segment_nameends[定位类型]:通知链接程序,逻辑段的目标代码在存储器中如何存放.给出实际段起点的类型.可以是:PARA指定段的起始地址必须从小段的边界开始。即段地址的起始地址能被16整除。(缺省)BYTE该段可以从任何地址开始。WORD段必须从字(偶地址)的边界开始,段的起始地址能被2整除。PAGE该段必须从页的边界(256个字节)开始,即段地址的起始地址能为256整除。段的定义2链接参数(combine_type):在模块化程序设计中表示该段和其它同名段间的组合连接方法,若不指明组合类型,则ASM认为这个段是不准备与别的段相连接.PUBLIC该段连接时将与有相同名字的其他分段连接在一起。其连接次序由连接命令指定。COMMON连接时与其他同名的分段具有相同的起始地址,所以会产生覆盖,连接后,段的长度等于最长的COMMON段的长度。ATexpression使段的起始地址开始为表达式计算出来的地址。但不能用来指定代码段。DATASEGMENTAT0040HORG0017HKEYFLAGDB?DATAENDSSTACK指定该段运行时为堆栈的一部分,处理方式同PUBLIC。MEMORY实践证明,MEMORY与PUBLIC等价。‘分类名’:一长度不超过40个字符的字符串,连接时将相同类名的各段在物理地址上相邻的连接在一起,其顺序则与LINK时提供的各模块顺序一致.段长度:USE16------段最大长度为64KB,访问时采用16位寻址USE32------段最大长度可大于64KB,访问时采用32位寻址ASSUME伪指令格式:ASSUME段寄存器:段名,···,段寄存器:段名功能:通知汇编程序,寻址逻辑段使用哪一个段寄存器。通常作为代码段的第一条指令.例:ASSUMECS:CODE,DS:DATA注意:ASSUME伪指令只是约定了段寄存器与段的关系,不意味着汇编后这些段地址已经装入相应的段寄存器,除CS外,各个段寄存器的实际值还需用MOV指令来赋值.SS可赋值,也可不赋值.例:MOVAX,DATAMOVDS,AX求某个逻辑段/变量/标号的段基址运算符SEG格式:SEG段名例:MOVAX,SEGDATA;AX=名为DATA逻辑段的段基址MOVDS,AX例:XYZDW1234H······MOVAX,SEGXYZ返回属性或数值的运算符存储模型与简化段定义伪指令MODEL伪操作简化的段定义伪操作与简化段定义有关的预定义符号MODEL伪操作格式:.MODELMEMORY-MODEL[,MODELOPTIONS]MEMORY-MODEL:用来说明在存储器中是如何安放各个段的,也就是说明代码段在程序中如何安排,代码的寻址是近还是远,数据段在程序中又是如何安排的,数据的寻址是近还是远,根据它们的不同组合,可以建立7种存储模型。MEMORY-MODELTiny:所有的数据和代码都放在一个段内,其数据和代码都是近访问。Small:所有的数据放在一个64KB的段内,所有的代码放在另一个64KB的段内,数据和代码也都是近访问的。Medium:代码使用多个段,一般一个模块一个段,而数据则合并为一个64KB的段组。数据是近访问的,代码是远访问的。Compact:所有代码都放在一个64KB的代码段中,数据则放在多个段内,形成代码是近访问的,而数据则可为远访问的格式。Large:代码和数据都可用多个段,所以代码和数据都可远访问。Huge:与Large类型相同,其差别是允许数据段的大小超过64KB.Flat:允许用户用32位偏移量,但DOS下不允许使用这种模型,只能在OS/2下或其他保护模式的操作系统下使用。MASM5不支持该模型,但MASM6支持MODEL-OPTIONSMODEL-OPTIONS:允许用户指定3种选项--------高级语言接口,操作系统,堆栈距离高级语言接口选项:指该汇编语言程序作为某一种高级语言程序的过程而为该高级语言程序所调用时,应该用如C,BASIC,PASCAL,FORTRAN等来加以说明。操作系统选项:说明程序运行于哪一个操作系统之下,可用OS-DOS或OS-OS2来说明,缺省项为OS-DOS。堆栈距离选项:可用NEARSTACK或FARSTACK来说明,NEARSTACK:把堆栈段和数据段组合到一个DGROUP段中,DS和SS均指向DGROUP段。FARSTACK:把堆栈段和数据段并不合并。当存储模型为TINY,SMALL,MEDIUM和FLAT时,缺省项为NEARSTACK,当存储模型为COMPACT,LARGE和HUGE时,缺省项为FARSTACK。例:.MODELLARGE,PASCAL,OS-DOS,FARSTACK汇编给出的标准段.code堆栈段.initializeddata初始化数据段.uninitializeddata未初始化数据段.farinitializeddata远初始化数据段.faruninitializeddata远未初始化数据段.constants常数段.stack堆栈段简化的段定义伪操作.CODE[name]对于一个代码段的模型,段名为可选项,对于多个代码段的模型,则应为每个代码段指定段名。.DATA.DATA?.FARDATA[name]可指定段名,如不指定,则将以FAR-DATA命名.FARDATA?[name]可指定段名,如不指定,则将以FAR-BSS命名.CONST.STACK[size]可指定堆栈段大小,如不指定,则缺省值为1KB。注意:当使用简化段伪操作时,必须在这些简化段伪操作出现之前,即程序的一开始先用.MODEL伪操作定义存储模型,然后再用简化段伪操作定义段。每一个新段的开始就是上一个段的结束,而不必用ENDS作为段的结束符。与简化段定义有关的预定义符号@model以数值表示当前所用的存储模型Tiny=1Small或flat=2Compact=3Medium=4Large=5Huge=6与简化段定义有关的预定义符号@code由.code伪操作定义的段名或段组名@codesize以数值表示当前代码段情况在指定的存储模型中,只有一个代码段(tiny,small,compact,flat)时,此值为0,其他有多个代码段的情况下,此值为1。@data由.data伪操作定义的段名,或由.data,.data?,.const和.stack所定义的段组名。@datasize以数值表示当前数据段情况在指定的存储模型中,只有一个数据段(tiny,small,compact,flat)时,此值为0,有多个数据段的compact和large时,此值为1。有多个数据段且有超过64KB的大数据段的HUGE时,此值为2。与简化段定义有关的预定义符号@fardata由.fardata伪操作定义的段名@fardata?由.fardata?伪操作定义的段名@curseg当前段名@stack堆栈段的段名或段组名@filecur当前文件名(包括扩展名)@filename当前文件名(不包括扩展名)@wordsize表明段为16位还是32位的数值回送符,如为16位,则回送2;如为32位,则回送4。例:用.data定义数据段movax,@datamovds,ax用MODEL定义存储模型时的段缺省属性P140表4.1例4.2.modelsmall.stack100h.data....codeStart:movax,@datamovds,ax...movax,4c00hint21hendstart例4.3.modelsmall.stack100h.const....data....codeStart:movax,DGROUPmovds,ax...movax,4c00hint21hendstart例4.4.modelsmall.fardata.const....codeStart:movax,@datamovds,axmovax,@fardatamoves,axassumees:@fardata...movax,4c00hint21hendstart段组定义伪指令grpnameGROUPsegname[,segname…]grpname:段组名Segname:段名例4.5Dseg1segmentwordpublic‘data’...Dseg1endsDseg2segmentwordpublic‘data’...Dseg2endsDatagroupgroupdseg1,dseg2Csegsegmentparapublic‘code’assumecs:cseg,ds:datagroupStart:movax,datagroupmovds,ax...movax,4c00hint21hCsegendsendstart程序的开始和结束1、END在模块化程序中,子模块结束.2、END[label]程序的结束label指定程序第一条要运行的指令的地址。表明主程序的结束为模块命名1.namemodule-name2.titletext指定列表文件的每一页上打印的标题。同时,如果程序中没有name伪操作,则汇编程序将用text中的前6个字符作为模块名。Text最多可有60个字符。如果无name和title,则将用源文件名作为模块名。所以name和title并不是必须的,但一般经常使用title,以便在列表文件中能打印出标题来。.startup定义程序的初始入口点,并产生设置DS,SS,SP的代码,如果程序中使用了.startup,则结束程序的END伪操作中不必再指定程序的入口点标号。.exit[return-value]return-value:返回给操作系统的值,常用0作为返回值。例:.modelsmall.data....code.startup....exit0end常量立即数:经汇编后转换成等值的二进制补码。如:12,0A8H,10100000B,34Q,-2字符串常数:经汇编后转换成相应的ASCII码。如:‘A’,‘P10’,‘3’例:MOVDL,‘1’;DL=31H符号常数——用伪指令EQU或“=”定义。例:COUNTEQU55POINTER=2F8H······MOVCL,COUNT;CL=55MOVDX,POINTER;DX=2H8H数值运算符算术运算符有:+、—、*、/、MOD(摸除,即取余)例:MOVAX,8+5;汇编时完成运算,其值若出界给出错误信息,MOVAX,31MOD5;AX=1逻辑运算符NOT:按位取反例:MOVAL,NOT10010011B;AL=01101100BAND:按位相与例:MOVAL,37HAND0FH;AL=07HOR:按位相或例:MOVAL,7OR30H;AL=37HXOR:按位异或例:MOVAL,0AAHXOR55H;AL=0FFHHIGH:截取高8位例:MOVAH,HIGHBX;BH——AHLOW:截取低8位例:MOVAL,LOWBX;BL——ALHIGHWORDLOWWORD关系运算符运算符格式说明例EQXEQYX=Y为“真”MOVAX,XEQ5;若X=5则AX=0FFFFH否则AX=0HNEXNEYX≠Y为“真”MOVBL,XNE25LEXLEYX≤Y为“真”MOVE
本文标题:汇编语言程序设计第四章
链接地址:https://www.777doc.com/doc-3392463 .html