微机原理 基本语法(1)_第1页
微机原理 基本语法(1)_第2页
微机原理 基本语法(1)_第3页
微机原理 基本语法(1)_第4页
微机原理 基本语法(1)_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

第四章汇编语言程序设计 汇编语言程序设计概述汇编语言基本语法汇编语言程序设计BIOS及DOS功能调用汇编语言程序设计实例 3 汇编语言 AssemblyLanguage 汇编语言是一种面向机器的语言 它采用助记符来表示机器指令 助记符通常是一组英文缩写 可以较方便地进行程序编写 阅读和修改 汇编语言程序设计概述 程序设计语言 1 机器语言 MachineLanguage 机器语言是一种用二进制表示的 能够被计算机直接识别的程序设计语言 2 高级语言 HighLevelLanguage 高级语言是一种较接近自然语言的英文语句和数字表达式表示的编程语言 4 宏汇编语言 MacroAssemblyLanguage 增加伪指令 宏指令等语句构成的汇编语言 汇编语言源程序 汇编语言源程序是用汇编语言语句编写的程序文本 通常以 ASM作为扩展文件名汇编语言源程序为分段式程序结构 由若干段 Segment 组成汇编语言程序中的段是一个逻辑上的段 与CPU管理的物理内存段有一定区别 但又有很紧密的联系有两种不同的段定义形式 完整段定义和简化段定义 写法不同 实质一样 完整段程序结构 STACK SEGSEGMENT 堆栈段 段名为STACK SEGDW256DUP 分配堆栈段的大小为256个字TOPLABELWORD 堆栈栈顶位置STACK SEGENDSDATA SEGSEGMENT 数据段 段名为DATA SEGSTRINGDB LetMEhaveatry 定义字符串数据DATA SEGENDSCODE SEGSEGMENT 代码段 段名为CODE SEGASSUMECS CODE SEG DS DATA SEG SS STACK SEGSTART MOVAX DATA SEG 程序执行起始点MOVDS AX 将段寄存器指向用户数据段MOVAX STACK SEGMOVSS AX 将堆栈指针指向用户定义堆栈MOVSP OFFSETTOPLEADX STRINGMOVAH 9 系统功能调用 在CRT显示字符串INT21HMOVAH 4CH 系统功能调用 程序结束返回操作系统INT21HCODE SEGENDSENDSTART 汇编结束 程序起始点为START 完整段程序结构 STACK1SEGMENTSTACK STACK1ENDS 几个段构成 可由数据段 代码段 堆栈段或附加数据段组成 至少要有代码段 代码段必须有汇编起始标号 START 程序结束伪指令END LINK能正确地设置CS和IP值 SS和SP值LINK不设置DS和ES值 START MOVAX DATA 入口MOVDS AX 段寄存器初始化 MOVAX EXDMOVES AX CODESEGMENT ASSUMECS CODE DS DATAASSUMEES EXD SS STACK1 例 将两个4字节的十六进制数相加 其结果保存到第三个4字节数中 简化段程序结构 引入简化段的主要目的是简化源程序中段描述指令 提高程序编写效率 它与完整段程序只是描述形式不同 MODEL模式名 定义程序模式 SMALL LARGE等 DATA 数据段定义开始 变量定义及数据空间预置 STACK2048 堆栈段定义 默认1KB空间 可自己定义大小 CODE 代码段定义开始 STARTUP 代码段入口标志 程序代码内容 EXIT 返回DOS操作系统 子程序定义END 程序结束 简化段程序中需要声明使用的存储模式 以便生成合适的可执行文件 完整段程序无此设置 但需要通过各段定义时选择参数来描述段的特性 简化段程序中所有段定义都使用了专用的保留字伪指令直接标识 不再由用户逐一描述 简化段程序中程序的起始位置由 STARTUP伪指令指明 简化段程序中不需要对段寄存器进行分配 简化段程序中不需要对段寄存器进行初始化设置 简化段程序返回DOS操作系统使用 EXIT伪指令 不需要使用INT21H指令 简化段程序结束只需要使用END伪指令即可 简化段程序与完整段程序的主要区别 例 将前例中的程序改写为简化段程序代码如下 MODELSMALL 声明存储模式为SMALL DATA 定义数据段XDB34H 89H 0FH 02HYDB88H 96H 0DFH 75HZDB4DUP STACK 定义堆栈段 默认1KB大小 CODE 定义代码段 STARTUP 程序入口MOVCX 4LEABX XLEASI YLEADI ZCLCLOOP1 MOVAL BX ADCAL SI MOV DI ALINCBXINCSIINCDILOOPLOOP1 EXIT 返回DOS操作系统END 程序结束 汇编语言程序开发过程 汇编语言程序是一种符号化的语言程序 不能直接提供给计算机执行 需要经过汇编以后才能够转换成机器语言 另外由于操作系统加载的需要 还要通过连接完成相关文件结构和重定位信息的生成 才能供计算机执行 用编辑工具软件编写汇编语言源程序代码 ASM文件 用汇编程序MASM对编写好的源程序代码进行汇编 转换成机器指令 生成 OBJ目标文件 用连接工具LINK对已转换的目标文件进行连接 生成可执行 EXE文件 执行程序 观察运行结果 如果发现不正确则重复步骤 进行调试 直到得到正确结果 指令性语句 由指令构成 标号 操作码 操作数 注释 如 START MOVAX DATA 指示性语句 由命令 伪指令 构成 名字 伪指令 参数 注释 如 DATASEGMENTAT2000H DATAENDS 汇编语言的基本语法 汇编语言语句类型及格式 当存储单元中的数据在程序运行中随时可以修改时 这个数据就可以用变量来定义 为了便于对这个变量的访问 要给这个变量取一个名字 称为变量名 定义变量可以使用数据定义伪指令 格式如下 变量名变量定义伪指令表达式1 表达式2 例 VARlDB12H 34HVAR2DW1234H 5678HVAR3DD12345678HVAR4DQ1122334455667788HVAR5DT00112233445566778899H 汇编语言的变量 常量 标号和表达式 变量 变量具有三个属性 字节DB 8位 一个字节存贮单元字DW 16位 二个连续字节存贮单元双字DD 32位 四个连续字节存贮单元四字DQ 64位 八个连续字节存贮单元五字DT 80位 十个连续字节存贮单元 段属性 段地址 内存地址由段地址加偏移地址构成 因此 存放在内存中的程序或数据都必须属于某个段才能够被访问 偏移地址 段内地址 在定义变量时使用的变量名 就是变量在段中的起始地址 变量类型 变量所在存贮单元的类型 由伪指令指定 1 数值常量 直接用数字进行表示的常量 二进制 10000100B 1111110001010100B十进制 12356D十六进制 12ABH 0F56AH 字母打头前面必须补0 如 MOVAX 100DMOVBL 0FAHMOVCL 10101000B 常量 2 字符型常量 用于表示单个字符或符号串 常用引号括起来 引号中的每个符号都是以ASCII码的形式表示 并占用一个字节存储空间 单字符用单引号 多字符用双引号 如 helloDB HELLOWORLD chDB Y N 12HdigitalDB 123456 3 符号常量 用标识符 常量名 表示的常量 可以被看作是被命名了的一个数值或其他标识符 命名规则 1 31个ASCII码字符A Z a z 0 9 及下划线构成 不能单独作为标识符 不能是独立的保留字或运算符 数字不能作为第一个字符 合法标识符 STA 124 MOV 103 非法标识符 STA 124 MOV 常量 符号常量定义格式 常量名 EQU表达式 例 R 30PAIEQU3 1415CCEQU10001010B 在程序中 可以在任何需要使用圆周率的位置使用PAI这个符号常量来代替3 1415 用R来代替圆的半径 当需要修改程序中圆半径或圆周率精度时只需要修改R和PAI的常量定义语句即可 从而改善程序的可读性 便于程序修改和调试 常量 可重复定义EQU不可重复定义 标号是指令性语句存放地址的符号表示 标号也有三个属性 即段地址 偏移地址和距离 常用于指令的转移和子程序调用 标号定义格式 例 MOVCX 10HLOOP1 MOVAL SI 定义LOOP1标号MOV DI ALINCSIINCDILOOPLOOP1 循环执行到LOOP1 标号名称 汇编指令语句 标号 标识符 距离属性有NEAR和FAR两种 可通过LABEL定义 标号名称LABEL距离 表达式是操作数的常见形式 表达式由常量 变量 标号及连接它们的运算符组成 表达式不会出现在最终的程序代码中 MASM汇编程序可以使用两种表达式 即数值表达式和地址表达式 1 数值表达式 一般由运算符连接各种常量构成 MASM支持的常量运算符包括算术运算符 逻辑运算符和关系运算符 表达式 算术运算符包括加 减 乘 除 取模 MOD 求余数 左移 SHL 相当于乘法 右移 SHR 相当于除法 等7种运算符 如 numDW08H 32H 55HSHR2 MOVDX 1234HMOD1000H 逻辑运算符包括与 AND 或 OR 非 NOT 和异或 XOR 等4种运算符 逻辑运算符只能对常数 或相当于常数 如数值表达式 进行运算 如 MOVCX AXAND10H 错误指令MOVBX NOT55H 正确指令 逻辑运算符与逻辑运算指令的操作符相同 但出现在指令中的位置不同 逻辑运算指令的操作符出现在指令的助记符部分 而逻辑运算符出现在指令的操作数部分 如 ANDDL 7FHAND80HXORAH 10HXOR0AAH OR 32HAND55H 表达式 关系运算符包括相等 EQ 不等 NE 小于 LT 大于 GT 小于或等于 LE 大于或等于 GE 等6种运算符 关系运算符只能对常数 或相当于常数 如数值表达式 进行运算 参加运算的两个数是无符号数 当关系成立时 其结果为全1 否则为全0 如 MOVDX 10LT100由于10小于100成立 因此 该指令汇编后得到的代码为MOVDX 0FFFFH 关系运算符可以和逻辑运算符组合起来使用 如 MOVBX VALUELT5 AND20 OR VALUEGE5 AND30 表达式 2 地址表达式地址表达式的结果是一个存储单元的地址 当某个标号表示的地址中存放的是数据时 称为变量 当该标号表示的地址中存放的是指令时 则称为程序标号 如果指令中的操作数需要用到地址表达式时 应注意其物理意义 比如将两个地址作乘 除操作就没有意义 对不同段数据的地址相加减当然也没有意义 常用的地址表达式是 标号 数字 的形式 如 MOVAX VAR 4 VAR 4为地址表达式 表示VAR后面4处的地址值 表达式 表达式中可以使用的运算符有6类 它们是算术运算符 逻辑运算符 关系运算符 分析运算符 合成运算符 其它运算符等 当多种运算符同时出现于一个表达式中时 这些运算符将按照一定的优先级由高向低排列执行 表达式 格式 变量名 DB DW DD DQ DT表达式功能 为变量分配1字节 字 双字 四字 五字的存储单元 并给它们赋值 说明 使用这些伪指令可以定义数值 字符串 数组等 如 VARBDB12H 定义字节变量VARB为12HVARWDW1234H 定义字变量VARW为1234HVARDDD12345678H 定义双字变量VARD为1345678H 汇编语言程序伪指令 指示性语句 变量定义和属性伪指令 变量定义伪指令 还可以用变量定义字符串等数据 如 STRINGADB HELLOWORLD DATAWDW AB CD DATADDD WXYZ 格式 重复次数DUP 重复定义的内容 功能 与变量定义指令配合 用于重复定义数据 说明 重复次数用于说明需要定义多少次括号中的重复定义的内容 常用于为变量预留存储空间 如 ST1DB10DUP 0 定义ST1为10个值为0的字节ST2DW2 2DUP 定义ST2为1个值2和2个不确定数值的字ST3DB2DUP 0 1 2 3 定义ST3为0 1 2 3 0 1 2 3共8个字节 DUP重复子句伪指令 在数据定义中变量具有5种属性 可以用伪指令来获得变量的相关属性信息 段属性格式 SEG变量功能 获得该变量所在的段地址值 如 MOVBX SEGvar1 偏移地址属性格式 OFFSET变量功能 获得变量所在段中的偏移地址值 如 MOVCX OFFSETvar2 类型属性格式 TYPE变量功能 获得变量定义的类型 类型以字节的整数倍表示 字节型TYPE结果为1 字型TYPE结果为2 双字型TYPE结果为4 8字节型TYPE结果为8 10字节型TYPE结果为10 NEAR型TYPE结果为FFFFH FAR型TYPE结果为FFFEH 变量属性伪指令 长度属性格式 LENGTH变量功能 获得变量定义的数据元素个数 该指令只有使用DUP定义变量时才能够得出有效的元素个数 否则将得出长度为1 大小属性格式 SIZE变量功能 获得变量定义时占用的内存空间大小 以字节为单位表示 SIZE LENGTH TYPE 变量属性伪指令 例 BUF1DB1 2 3 4 5BUF2DB5DUP BUF3DW5

温馨提示

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

评论

0/150

提交评论