汇编语言的基本语法ppt课件_第1页
汇编语言的基本语法ppt课件_第2页
汇编语言的基本语法ppt课件_第3页
汇编语言的基本语法ppt课件_第4页
汇编语言的基本语法ppt课件_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言的基本语法 1 1 汇编语言源程序的格式DATASEGMENTAT2000HARRAYDBa1 a2 a3 a10 a1 a10为立即数 COUNTEQU ARRAYSUMDW DATAENDSSTACKSEGMENTPARASTACK STACK STAKDB10DUP TOPEQULENGTHSTAKSTACKENDS CODESEGMENTASSUMECS CODE DS DATA SS STACKSTART MOVAX DATAMOVDS AXMOVAX 0MOVDI OFFSETSUMMOVBX OFFSETARRAYMOVCX COUNTLOP ADDAL BX ADCAH 0INCBXLOOPLOPMOV DI AXMOVAH 4CHINT21HCODEENDSENDSTART 汇编语言源程序格式的特点是 1 分段结构2 语句行汇编语言程序的语句有两类 1 指令性语句 2 指示性语句 汇编语言源程序语句的格式汇编语言源程序中的每个语句可以由四项组成 格式如下 名字 操作操作数 注释 其中 名字项是指一个标号或变量 操作项是一个操作码的助记符 它可以是指令 伪指令或宏指令名 操作数项由一个或多个表达式组成 它提供为执行所要求的操作而需要的信息 操作数项可以是常数 寄存器 标号 变量或由表达式组成 注释项用来说明程序或语句的功能 为识别注释项的开始 也可以从一行的第一个字符开始 此时整行都是注释 常用来说明下面一段程序的功能 上面四项中带方括号的两项是可选项 各项之间必须用 空格 space 或 水平制表 Tab 符隔开 1 名字项 2 操作项 3 操作数项 4 注释项 1 名字项源程序中用下列字符来表示名字 字母A Z数字0 9专用字符 除数字外 所有字符都可以放在源语句的第一个位置 名字中如果用到 则必须是第一个字符 可以用很多字符来说明名字 但只有前面的31个字符能被汇编程序所识别 一般说来 名字项可以是标号或变量 它们都用来表示本语句的符号地址 都是可有可无的 只有当需要用符号地址来访问该语句时它才需要出现 标号 标号在代码段中定义 后面跟着冒号 此外 它还可以作为过程名定义 变量 变量在数据段或附加数据段中定义 后面不跟冒号 变量经常在操作数字段出现 2 操作项操作项可以是指令 伪指令或宏指令的助记符 对于指令 汇编程序将其翻译为机器语言指令 对于伪指令 汇编程序将根据其所要求的功能进行处理 对于宏指令 则将根据其定义展开 3 操作数项操作数项由一个或多个表达式组成 多个操作数项之间一般用逗号分开 对于指令 操作数项一般给出操作数地址 它们可能有一个 或二个 或三个 或一个也没有 对于伪操作或宏指令 则给出它们所要求的参数 操作数项可以是常数 寄存器 标号 变量或由表达式组成 4 注释项注释项用来说明一段程序 一条或几条指令的功能 对于汇编语言程序来说 注释项的作用是很明显的 它可以使程序容易被读懂 因此汇编语言程序必须写好注释 注释应该写出本条 或本段 指令在程序中的功能和作用 而不应该只写指令的动作 读者在有机会阅读程序例子时 应注意学习注释的写法 在编制程序时 更应学会写好注释 指令性语句格式为 标号 操作码 操作数 注释 带方括号的为任选项 标号是指令的符号地址 操作码和操作数是用汇编语言指令表示的指令部分 注释是对该语句在本程序中的功能的说明 指示性语句格式为 名字 变量 命令 参数 注释 命令指示汇编程序进行某种汇编操作 参数是有关的数据 名字是段名 符号名等标识符 变量用变量名表示 常量 标识符和表达式一 常量其值在程序中不能改变的量 在汇编语言源程序中的常量有 数字常量 字符常量和符号常量 1 数字常量可以是二进制数 八进制数 十进制数或十六进制数表示 2 字符常量是用单引号 括起来的ASCII字符 其值是该字符的ASCII代码值 3 符号常量是用标识符定义的常量 例如 采用符号定义语句PORTAEQU80H 则指令MOVAL PORTA与指令MOVAL 80H等价 二 标识符在编程时建立的有特定意义的字符序列 标识符可用作符号常量 名字 变量和标号等 组成标识符有如下规定 1 组成标识符的字符有 英文大写字母 A Z 英文小写字母 a z 数字0 9 字符 2 字符长度不超过3l个 3 首字符不能是数字 4 不能单独作为一个标识符 5 不能把保留字用作标识符 保留字包括助记符 寄存器名等 三 表达式表达式是常数 标号 变量与一些操作符相组合的序列 可以有数字表达式和地址表达式两种 在汇编期间 汇编程序按照一定的优先规则对表达式进行计算后可得到一个数值或一个地址 常用的表达式操作符介绍如下 1 算术操作符算术操作符有 和MOD MOD是指除法运算后得到的余数 如19 7的商是2 而19MOD7则为5 余数 算术操作符可以用于数字表达式或地址表达式中 但当它用于地址表达式时 只有当其结果有明确的物理意义时才是有效的结果 例如两个地址相乘或相除是无意义的 在地址表达式中 可以使用 或 但也必须注意其物理意义 例如把两个不同段的地址相加也是无意义的 经常使用的是地址 数字量 它是有意义的 例如SUM 1是指SUM字节单元的下一个字节单元的地址 注意 不是指SUM单元的内容加1 而SUM 1则是指SUM字节单元的前一个字节单元的地址 例 如果要求把首地址为BLOCK的字数组的第6个字传送到DX寄存器 可用指令如下 MOVDX BLOCK 6 1 2 例 如数组ARRAY定义如下 写出把数组长度 字数 存入CX寄存器的指令 ARRAYDW1 2 3 4 5 6 7ARYENDDW 其中ARYEND是为计算数组长度而建立的符号地址 所需指令如下 MOVCX ARYEND ARRAY 2汇编程序在汇编期间将计算出表达式的值而形成指令 MOVCX 7 2 逻辑操作符逻辑操作符有 AND 与 OR 或 XOR 异或 NOT 非 逻辑操作符都是按位操作的 只能用于数字表达式中 逻辑操作符要求汇编程序对其前后两个操作数 或表达式 作指定的逻辑操作 例 OUTPORT VALAND0FEH AL上例中PORT VAL为端口号 OUT指令中的表达式说明只为偶数号端口输出数据 3 关系操作符关系操作符有 EQ 相等 NE 不等 LT 小于 GT 大于 LE 小于或等于 GE 大于或等于 关系操作符的两个操作数必须都是数字或是同一段内的两个存储器地址 计算的结果应为逻辑值 结果为真 表示为0FFFFH 结果为假 则表示为0 例如 MOVBX PORT VALLT5 AND20 OR PORT VALGE5 AND30 则当PORT VAL 5时 汇编结果应该是 MOVBX 20否则 汇编结果应该是 MOVBX 30 4 数值回送操作符数值回送操作符有 TYPE LENGTH SIZE OFFSET SEG等 数值回送操作符把一些特征或存储器地址的一部分作为数值回送 TYPE格式为 TYPE表达式如果表达式是变量 则汇编程序将回送该变量的以字节数表示的类型 DB为1 DW为2 DD为4 DF为6 DQ为8 DT为10 如果表达式是标号 则汇编程序将回送代表该标号类型的数值 NEAR为 1 FAR为 2 如果表达式为常数 则应回送0 举例 ARRAYDW1 2 3则对于指令ADDSI TYPEARRAY汇编程序将其形成为 ADDSI 2 LENGTH格式为 LENGTH变量对于变量中使用DUP的情况 汇编程序将回送分配给该变量的单元数 而对于其他情况则送1 举例1 FEESDW100DUP 0 对于指令MOVCX LENGTHFEES汇编程序将使其形成为 MOVCX 100举例2 ARRAYDW1 2 3对于指令MOVCX LENGTHARRAY汇编程序将使其形成为 MOVCX 1 举例3 TABLEDB ABCD 对于指令MOVCX LENGTHTABLE汇编程序将使其形成为 MOVCX 1 SIZE格式为 SIZE变量汇编程序应回送分配给该变量的字节数 但是 此值是LENGTH值和TYPE值的乘积 例如 MOVCX SIZEFEES将形成为MOVCX 200又例如 MOVCX SIZEARRAY将形成为MOVCX 2又例如 MOVCX SIZETABLE将形成为MOVCX 1 OFFSET格式为 OFFSET变量或标号汇编程序将回送变量或标号的偏移地址值 举例 MOVBX OFFSETOPER ONE汇编程序将OPER ONE的偏移地址作为立即数回送给指令 而在执行时则将该偏移地址装入BX寄存器中 所以这条指令的功能与指令LEABX OPER ONE是等价的 SEG格式为 SEG变量或标号汇编程序将回送变量或标号的段地址值 举例 如果DATA SEG是从存储器的05000H地址开始的一个数据段的段名 OPER1是该段中的一个变量名 则MOVBX SEGOPER1将把0500H作为立即数插入指令 实际上 由于段地址是由连接程序分配的 所以该立即数是连接时插入的 执行期间则使BX寄存器的内容成为0500H PTR格式为 类型PTR符号地址PTR用来给已分配的存储地址 用符号地址表示 赋予另一种属性 使该地址具有另一种类型 类型可有BYTE WORD DWORD FWORD QWORD TBYTE NEAR和FAR等几种 所以PTR也可以用来建立字 双字 四字或段内及段间的指令单元等 举例 已有数据定义如下 TWO BYTEDW 可以用以下语句对这两个字节赋予另一种类型定义 ONE BYTEEQUBYTEPTRTWO BYTE这里ONE BYTE和TWO BYTE两个符号地址具有相同的段地址和偏移地址 但是它们的类型属性不同 前者为1 后者为2 此外 有时指令要求使用PTR操作符 例如用MOV BX 5指令把立即数存入BX寄存器内容指定的存储单元中 但汇编程序不能分清是存入字单元还是字节单元 此时必须用PTR操作符来说明属性 应该写明 MOVBYTEPTR BX 5或MOVWORDPTR BX 5 段操作符段操作符用来表示一个标量 变量或地址表达式的段属性 格式为 段寄存器 地址表达式段名 地址表达式例如 用段前缀指定某段的地址操作数MOVAX ES BX SI SHORT用来修饰JMP指令中转向地址的属性 指出转向地址是在下一条指令地址的 127个字节范围之内 例如 JMPSHORTTAG 转移属性为短转移 TAG MOV THIS格式为 THIS属性或类型THIS可以象PTR一样建立一个指定类型 BYTE WORD DWORD 或指定距离 NEAR或FAR 的地址操作数 该操作数的段地址和偏移地址与下一个存储单元地址相同 例如 FIRST TYPEEQUTHISBYTEWORD TABLEDW100DUP 此时FIRST TYPE的偏移地址和WORD TABLE完全相同 但它是字节类型的 而WORD TABLE则是字类型的 又如 STARTEQUTHISFARMOVCX 100这样 MOV指令有一个FAR属性的符号地址START 这就允许其他段的JMP指令直接跳转到START来 HIGH和LOW称为字节分离操作符 它接收一个数或地址表达式 HIGH取其高位字节 LOW取其低位字节 例如 CONSTEQU0ABCDH则MOVAH HIGHCONST将汇编成MOVAH 0ABH指令MOVAH LOWCONST将汇编成MOVAH 0CDH 操作符的优先级我们知道表达式是常数 寄存器 标号 变量和操作符的组合 在计算表达式时 应该首先计算优先级高的操作符 然后从左到右地对优先级相同的操作符进行计算 括号也可以改变计算次序 括号内的表达式应优先计算 表达式中的运算符 伪指令 指示性语句 伪指令又称为伪操作 它是在对源程序汇编期间由汇编程序处理的操作 它们可以完成如定义数据 分配存储区 指示程序结束等功能 宏指令是由用户按照宏定义格式编写的一段程序 其中语句可以是指令 伪指令 甚至是已定义的宏指令 伪指令和指令的区别在于 每一条指令必须生成机器代码 然后在程序运行期间由CPU来执行其操作 而伪指令是在汇编期间由汇编程序执行的操作命令 除了数据定义及存储器分配伪指令分配存储器空间外 其它伪指令不生成目标码 和各种指令一样 伪指令也是程序设计不可缺少的工具 下面介绍一些常用的伪指令 段定义伪指令段定义伪指令是表示一个段开始和结束的命令 段名SEGMENT 段名ENDS 段名由用户命名 对于数据段 附加段和堆栈段来说 段内一般是存储单元的定义 分配等伪指令语句 对于代码段中则主要是指令及伪指令语句 定义了段还必须说明哪个段是代码段 哪个段是数据段 ASSUME伪指令就是建立段和段寄存器关系的伪指令 其格式为 ASSUME段寄存器名 段名 段寄存器名必须是CS DS ES和SS中的一个 而段名必须是由SEGMENT定义的段名 例 data seg1segment 定义数据段data seg1ends data seg2segment 定义附加段data seg2ends code segsegment 定义代码段assumecs code seg ds data seg1 es data seg2start 程序执行的起始地址 setDSregistertocurrentdatasegmentmovax data seg1 数据段地址movds ax 存入DS寄存器 setESregistertocurrentextrasegmentmovax data seg2 附加段地址moves ax 存入ES寄存器 code segends 代码段结束 endstart 由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器 它并不能把段地址装入段寄存器中 所以在代码段中 还必须把段地址装入相应的段寄存器中 MOVAX DATA SEG1 数据段地址MOVDS AX 存入DS寄存器MOVAX DATA SEG2 附加段地址MOVES AX 存入ES寄存器 如果程序中还定义了堆栈段STACK SEG 也需要把段地址装入SS中 MOVAX STACK SEG 堆栈段地址MOVSS AX 存入ES寄存器 注意 在程序中不需要用指令装入代码段的段地址 因为在程序初始化时 装入程序已将代码段的段地址装入CS寄存器了 程序开始和结束伪指令在程序的开始可以用NAME或TITLE作为模块的名字 其格式为 NAME模块名TITLE文件名表示源程序结束的伪指令的格式为 END 标号 注意 NAME及TITLE伪指令并不是必需的 如果程序中既无NAME又无TITLE伪指令 则将用源文件名作为模块名 END伪指令中的 标号 指示程序开始执行的起始地址 如果多个程序模块相连接 则只有主程序的END要加上标号 其他子程序模块则只用END而不必指定标号 上例最后使用了ENDSTART伪指令 汇编程序将在遇END时结束汇编 并且程序在运行时从START开始执行 数据定义及存储器分配伪指令8086提供了各种数据及存储器分配伪指令 这些伪指令在汇编程序对源程序进行汇编期间 由汇编程序完成数据类型定义及存储器分配等功能 数据定义及存储器分配伪指令的格式是 变量 助记符操作数 操作数 注释 数据定义及存储器分配伪指令格式中的 变量 是操作数的符号地址 它是可有可无的 它的作用与指令语句前的标号相同 区别是变量后面不加冒号 如果语句中有变量 那么汇编程序将操作数的第一个字节的偏移地址赋于这个变量 注释 字段用来说明该伪指令的功能 它也不是必须有的 助记符 字段说明所用伪指令的助记符 下面介绍常用的数据定义伪指令 DB definebyte DB伪指令用来定义字节 对其后的每个数据都存储在一个字节中 DB能定义十进制数 二进制数 十六进制数和ASCII字符 二进制数和十六进制数要分别用 B 和 H 表示 ASCII字符用单引号 括起来 DB还是唯一能定义字符串的伪操作 串中的每个字符占用一个字节 请看下面数据定义的例子 注意DB定义的每个数据的存储情况 左边第一列是汇编程序为数据分配的字节地址 第二列是相应地址中存储的数据或ASCII字符 均用十六进制表示 变量DATA7定义了3个数据和一个字符串 每个数据或串用 分开 它们分别存储在偏移地址002E开始的6个字节单元中 000019DATA1DB25 十进制数000189DATA2DB10001001B 二进制数000212DATA3DB12H 十六进制数0010ORG0010H 指定偏移地址为10h001032353931DATA4DB 2591 ASCII码数0018ORG0018H 指定偏移地址为18h001800DATA5DB 保留一个字节0020ORG0020H 指定偏移地址为20h00204D79206E616DDATA6DB MynameisJoe ASCII码字符65206973204A6F65002E0A1002313042DATA7DB10 10H 10B 10B 不同的数据类型 DW defineword DW伪指令用来定义字 对其后的每个数据分配2个字节 1个字 数据的低8位存储在低字节地址中 高8位存储在高字节地址中 如下例中的变量DATA8的数据存储在0070字地址中 其中0070字节存储0BAH 0071字节存储03H DW还可存储变量或标号的偏移地址 见下面DW伪指令的例子 DD definedoubleword DD伪指令用来定义双字 对其后的每个数据分配4个字节 2个字 该伪指令同样将数据转换为十六进制 并根据低地址存储低字节 高地址存储高字节的规则来存放数据 如下例DATA15的存储情况是 00A8 0F2H 00A9H 57H 00AAH 2AH 00ABH 5CH 用DD存入地址时 第一个字为偏移地址 第二个字为段地址 DQ definequadword DQ伪指令用来定义4字 即64位字长的数据 DQ之后的每个数据占用8个字节 4个字 DT definetenbytes DT伪指令用来为压缩的BCD数据分配存储单元 它虽然可以分配10个字节 5个字 但最多只能输入18个数字 要注意的是 数据后面不需要加 H 下面是DQ和DT的例子 DUP duplicate DUP伪指令可以按照给定的次数来复制某个 某些 操作数 它可以避免多次键入同样一个数据 例如 把6个FFH存入相继字节中 可以用下面两种方法 显然用DUP的方法更简便些 存入6字节的FFHDATA20DB0FFH0FFH0FFH0FFH0FFH0FFH DATA21DB6DUP 0FFH DUP操作一般用来保留数据区 如用数据定义伪指令 DB64DUP 可保留64个字节单元 DUP还可以嵌套 表达式赋值伪操作EQU有时程序中多次出现同一个表达式 为方便起见可以用赋植伪操作给表达式赋予一个名字 其格式如下 Expresstion nameEQUExpresstion此后 程序中凡需要用到该表达式之处就可以用表达式名来代替 上式中表达式可以是任何有效的操作数格式 可以是任何可以求出常数值的表达式 也可以是任何有效的助记符 EQU是一个赋值伪操作 伪指令 它给一个数据标号赋于一个常数值 但这个常数不占用存储单元 当这个数据标号出现在程序中时 汇编程序即用它的常数值代替数据标号 EQU可以在数据段之外使用 甚至可用在代码段中间 假定在数据段和代码段中要多次使用一个数据 如25 那么在编程时凡是用到25的地方都可用数据标号COUNT来表示 如果程序想修改这个数据 那么只需修改EQU的赋值 而无须修改程序中其它部分 如COUNTER和MOV语句就不必修改 COUNTEQU25COUNTERDBCOUNTMOVAL COUNT DATAEQUHEIGHT 12 地址表达式赋以符号ALPHAEQU7 常数赋以符号名BETAEQUALPHA 2 把7 2 5赋以符号名BETAADDREQUVAR BETA VAR 5赋以符号名ADDRBEQU BP 8 变址引用赋以符号名BP8EQUDS BP 8 加段前缀的变址引用赋以符号名P8 注意 在EQU语句的表达式中 如果有变量或标号的表达式 则在该语句前应该先给出它们的定义 如上例 ALPHA必须在BETA之前定义 否则汇编程序将指示出错 伪操作赋值伪操作 的作用与EQU类似 它们之间的区别是 EQU伪操作中的标号名是不允许重复定义的 而 伪操作是允许重复定义的 例如 TMPEQU5TMPEQUTMP 1则是错误语句 因为TMP已赋值为5 就不能再把它定义为其它数值 而TMP 5TMP TMP 1则是允许使用的 因为 伪操作允许重复定义 第一个语句TMP的值为5 第二个语句TMP的值就为6了 地址计数器与对准伪指令1 地址计数器 在汇编程序对源程序汇编的过程中 使用地址计数器来保存当前正在汇编的指令的地址 地址计数器的值在汇编语言中可用 来表示 当 用在伪指令的参数字段时 它所表示的是地址计数器的当前值 汇编语言允许用户直接用 来引用地址计数器的值 例如指令 JMP 6它的转向地址是JMP指令的首地址加上6 当 用在指令中时 它表示本条指令的第一个字节的地址 在这里 6必须是

温馨提示

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

评论

0/150

提交评论