第5章 汇编语言程序设计1.ppt_第1页
第5章 汇编语言程序设计1.ppt_第2页
第5章 汇编语言程序设计1.ppt_第3页
第5章 汇编语言程序设计1.ppt_第4页
第5章 汇编语言程序设计1.ppt_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

微机原理及接口 教学课件 第5章汇编语言程序设计 微机原理及接口 教学课件 主要内容5 1汇编语言程序格式5 2伪指令5 3汇编语言程序设计5 4DOS和BIOS功能调用 汇编语言的特点 汇编语言是一种以处理器指令系统为基础的低级程序设计语言 它采用助记符表达指令操作码 采用标识符号表示指令操作数利用汇编语言编写程序的主要优点是可以直接 有效地控制计算机硬件 因而容易创建代码序列短小 运行快速的可执行程序在有些应用领域 汇编语言的作用是不容置疑和无可替代的汇编程序设计的过程是与其他高级语言程序设计大致相同 汇编语言源程序 汇编程序 可执行指令和伪指令 DEBUG ASM MASM 机器语言 汇编语言的特点 汇编语言源程序示例 DATASEGMENTM1DW00FFHM2DW00FFHP1DW P2DW DATAENDSSTACKSEGMENTSTDB100DUP TOPEQULENGTHSTSTACKENDSCODESEGMENTASSUMECS CODE DS DATASS STACKSTART MOVAX DATAMOVDS AXMOVAX STACKMOVSS AXMOVSP TOP MOVBX OFFSETM1MOVAX BX MOVDX 00HMOVBX OFFSETM2MULWORDPTR BX MOVBX OFFSETP1MOV BX AXMOVBX OFFSETP2MOV BX DXHLTMOVAH 4CHINT21HCODEENDSENDSTART 5 1汇编语言源程序格式 完整的汇编语言源程序由段组成一个汇编语言源程序可以包含若干个代码段 数据段 附加段或堆栈段 段与段之间的顺序可随意排列需独立运行的程序必须包含一个代码段 并指示程序执行的起始点 一个程序只有一个起始点所有的可执行性语句必须位于某一个代码段内 说明性语句可根据需要位于任一段内通常 程序还需要一个堆栈段整个程序以END结束 源程序由语句序列构成 一 汇编语言的语句格式 执行性语句 执行性语句用于表达处理器指令 也称为硬指令 汇编后对应一条指令代码 由处理器指令组成的代码序列是程序设计的主体标号 硬指令助记符操作数 注释 说明性语句 说明性语句用于表达伪指令 指示源程序如何汇编 变量怎样定义 过程怎么设置等名字伪指令助记符参数 注释 1 标号 名字与标识符 标号是反映硬指令位置 逻辑地址 和属性的标识符 后跟一个冒号分隔名字是反映伪指令位置 逻辑地址 和属性的标识符 后跟空格或制表符分隔 没有冒号标识符 Identifier 一般最多由31个字母 数字及规定的特殊符号 如 组成 不能以数字开头 默认情况下 汇编程序不区别标识符中的字母大小写一个源程序中 每个标识符的定义是唯一的 且不能是汇编系统所采用的保留字 名字和标号的属性 名字和标号是用户自定义的标识符 名字用于伪指令 标号用于硬指令 名字和标号一经使用便具有两类属性 逻辑地址属性 名字和标号对应存储单元的逻辑地址 含段地址和偏移地址 类型属性 变量名的类型可以是BYTE 字节 WORD 字 和DWORD 双字 等 标号 段名 子程序名的类型可以是NEAR 近 和FAR 远 分别表示段内或段间调用汇编程序提供有关操作符 以便获取这些属性值 保留字 保留字 ReservedWord 是汇编程序已经利用的标识符 也称为关键字 主要有 硬指令助记符 例如 MOV ADD伪指令助记符 例如 DB DW操作符 例如 OFFSET PTR寄存器名 例如 AX CS预定义符号 例如 data 汇编语言对大小写不敏感 2 硬 指令和伪指令 指令是目标机器所能执行的代码 为目标cpu所执行使CPU产生动作 并在程序执行时才处理的指令 硬指令就是第4章学习的处理器指令 与具体的处理器有关 与汇编程序无关伪指令是汇编程序所执行的一些操作 为交叉汇编机器所执行不产生CPU动作 在程序执行前由汇编程序处理的说明性指令 伪指令与具体的处理器类型无关 但与汇编程序有关 不同版本的汇编程序支持不同的伪指令 3 操作数和参数 处理器指令中的操作数可以是立即数 寄存器和存储单元伪指令中的参数可以是常数 变量名 表达式等 可以有多个 参数之间用逗号分隔汇编语言程序中 指令参数有数值型 主要形式是常数和数值表达式 和地址型 主要形式是标号和名字 包括变量名 段名 过程名等 例如 硬指令的操作数有立即数 寄存器和存储单元 其中 立即数就要用数值型参数表达 存储单元就应该用地址型参数 存储器操作数 表达 1 常量 常量表示一个固定的数值 它又分成多种形式常数字符串符号常量数值表达式 常数 指由10 16 2和8进制形式表达的数值 各种进制的数据以后缀字母区分 默认不加后缀字母的是十进制数 字符串 字符串常量是用单引号或双引号括起来的单个字符或多个字符其数值是每个字符对应的ASCII码值例如 d 等于64H AB 等于4142H Hello Assembly 符号常量 符号常量使用标识符表达一个数值MASM提供等价机制 用来为常量定义符号名符号定义伪指令有等价 EQU 和等号 符号名EQU数值表达式符号名EQU MASM5 x不支持符号名 数值表达式EQU用于数值等价时不能重复定义符号名 但 允许重复赋值 例如 X 7 等效于 Xequ7X X 5 XEQUX 5 是错误的 符号定义实例 符号定义DosWriteCharequ2CR 13CallDOSequ符号应用 左边的程序段等价右侧的符号形式 movah 2 movah DosWriteCharmovdl 13 movdl CRint21h CallDOS 数值表达式 数值表达式一般是指由运算符连接的各种常量所构成的表达式汇编程序在汇编过程中计算表达式 最终得到一个确定的数值 所以也是常量表达式的数值在程序运行前的汇编阶段计算 所以组成表达式的各部分必须在汇编时就能确定汇编语言支持多种运算符我们经常使用的是加减乘除 例如 movax 3 4 5 等价于 movax 17 2 变量 变量实质上是指可以读写的内存单元 虽然内存单元地址不变 但其中存放的数据可以改变变量需要事先定义才能使用变量定义 Define 伪指令为变量申请固定长度为单位的存储空间 并可以同时将相应的存储单元初始化定义后的变量可以通过变量名等方法引用 读写 其中的数据 即变量中的数值 变量的定义 变量定义的汇编语言格式为 变量名变量定义伪指令初值表变量名为用户自定义的标识符 有时变量名也可以缺省变量定义伪指令有DB DW DD等初值表是用逗号分隔的参数 主要由常量 数值表达式或 组成 其中 表示未赋初值多个存储单元如果初值相同 可以用复制操作符DUP进行定义 重复次数DUP 重复参数 表示初值表首元素的逻辑地址 常称为符号地址 变量名 变量名是用户自定义的标识符 用来表示可读写数据的首地址 或初值表的首地址 这个用符号表示的地址 常称为符号地址 一个变量可以没有变量名 在这种情况下 汇编程序将直接为初值表分配空间 即该变量没有符号地址 设置变量名是为了方便存取它指示的存储单元 初值表 初值表一般指用户定义的多个数据 用逗号分隔 或内存空间主要由数值常数 表达式或 DUP等组成 表示初值不确定 即未赋初值 DUP 表示重复初值 DUP的格式为 重复次数DUP 重复参数 4 注释 语句中由分号 开始的部分为注释内容 用以增加源程序的可读性必要时 一个语句行也可以由分号开始作为阶段性注释汇编程序在翻译源程序时将跳过该部分 不对它们做任何处理 5 分隔符 语句的4个组成部分要用分隔符分开标号后用冒号 注释前用分号操作数之间和参数之间使用逗号分隔其他部分通常采用空格或制表符多个空格和制表符的作用与一个相同MASM支持续行符 二 表达式用运算符 1 算术运算符 实现加 减 乘 除 取余的算术运算 movax 3 4 5 等价于movax 17其中MOD也称为取模 它产生除法之后的余数 如 19mod7 5 和 运算符还可以用于地址表达式 除加 减外 其他运算符的参数必须是整数 2 逻辑运算符 实现按位相与 相或 异或 求反的逻辑运算 oral 03hAND45h 等价于oral 01h 3 移位运算符 实现对数值的左移 右移的逻辑操作 移入低位或高位的是0 其格式为 数值表达式SHL SHR移位次数moval 0101bSHL 2 2 等价于moval 01010000b 4 关系运算符 用于比较和测试符号数值MASM用0FFFFH 补码 1 表示条件为真 用0000H表示条件为假 运算符包括 EQNEGTLTGELE例 movbx PORTLT5 AND20H OR PORTGE5 AND30H 当PORT5时 汇编结果为movbx 30H 否则 汇编结果为movbx 00H 5 高低分离符 取数值的高半部分或低半部分 HIGH LOW从一个字数值或符号常量中得到高 低字节movah HIGH8765h 等价于movah 87h从MASM6 0引入的HIGHWORD LOWWORD取一个符号常量 不能是其他常数 的高字或低字部分dd valueequ0ffff1234h 定义一个符号常量movax LOWWORDdd value 等价于movax 1234h 6 地址操作符 地址操作符取得名字或标号的段地址和偏移地址 7 类型操作符 类型操作符对名字或标号的类型属性进行设置类型操作符包括 PTR THIS SHORTTYPE LENGTH SIZE 1 PTR操作符 类型名PTR名字 标号PTR操作符使名字或标号具有指定的类型 其中 类型名可以是 BYTE WORD DWORD FWORD QWORD TBYTE NEAR FAR 由STRUCT RECORD UNION以及TYPEDEF定义的类型 moval byteptrw var w var是一个字变量jmpfarptrn label n label是一个标号使用PTR操作符 可以临时改变名字或标号的类型 2 THIS操作符 THIS类型名用THIS说明的操作数 在汇编时 具有当前逻辑地址和指定的类型 b varequTHISbyte 字节变量b var w vardw10dup 0 字变量w var 两变量地址相同f jumpequTHISfar f jump为段间转移地址 f jumplabelfar LABEL伪指令的功能等同于 EQUTHIS 3 SHORT操作符 SHORT标名指定标号作为 128 127字节范围内的短转移 如果标号实际上超出了这个范围 则出错 jmpshortn jump 4 TYPE操作符 TYPE名字 标名返回与名字或标号类型相关的数值对字节 字和双字变量分别返回1 2和4 对短 近和远转移分别返回ff01h ff02h和ff05h movax TYPEw var 汇编结果为movax 2movax TYPEn jump 汇编结果为movax 0ff02h near标号 操作符SIZE返回整个变量占用的字节数操作符LENGTH返回整个变量的数据项数 即元素数 8 运算符的优先级 1 LENGTHSIZEWIDTHMASK2PTROFFSETSEGTPYETHIS 3HIGELOW4 MODSHLSHR5 6EQNEGTLTGELE7NOT8AND9ORXOR10SHORT 5 2伪指令 一 符号定义伪指令 1 EQU 等值语句 将表达式值赋予名字 一经定义不能重复 例如 CREQU0DH 常数AEQUASC TABLE 变量 事先已定义 STREQU64 1024 数值表达式ADREQUES BP DI 5 地址表达式 功能同EQU 但可重新定义一个符号 例如 COUNT 100同COUNTEQU100CONNT 57COUNT重新定义 2 等号语句 二 内存数据 变量 定义伪指令 定义一个变量的类型 给内存单元赋初值 或者分配 预留内存单元分为以下几类 DB 定义字节伪指令DW 定义字伪指令DD 定义双字伪指令DF 定义3字伪指令DQ 定义4字伪指令DT 定义10字节伪指令 1 定义字节变量 DefineByte DB伪指令用于分配一个或多个字节单元 并可以将它们初始化为指定值初值表中每个数据一定是字节量 存放一个8位数据 可以是0 255的无符号数或是 128 127带符号数也可以是字符串常数 定义字节变量实例 数据段Xdb a 5db2dup 100 Ydb ABC 字节变量的应用 Xdb a 5db2dup 100 Ydb ABC moval X 此处X表示它的第1个数据 故AL a decX 1 对X为始的第2个数据减1 故成为 6movY al 现在Y这个字符串成为 aBC 符号地址 变量初值 初值表 2 定义字变量 DefineWord DW伪指令用于分配一个或多个字单元 并可以将它们初始化为指定值初值表中每个数据是字量 一个字单元可用于存放任何16位数据 一个段地址一个偏移地址两个字符0 65535之间的无符号数 32768 32767之间的带符号数 定义字变量实例 数据段countdw8000h AB maxintequ64hnumberdwmaxintarraydwmaxintdup 0 字变量和字常量的应用 字变量和字常量的定义 WNUMEQU5678H 定义WNUM为常量COUNTDW20H 定义COUNT为变量 假设它在数据段 的偏移地址为10H 20H为其中存放的 初始化数据字变量和字常量的应用 MOVAX BX SI WNUM MOVAX BX SI 5678H MOVAX COUNT MOVAX 0010H LEABX COUNT LEABX 0010H MOVBX OFFSETCOUNT MOVBX 0010H 3 定义双字变量 DefineDoubleword DD伪指令用于分配一个或多个双字单元 并可以将它们初始化为指定值初值表中每个数据是一个32位的双字量 可以是有符号或无符号的32位整数也可以用来表达16位段地址 高位字 和16位的偏移地址 低位字 的远指针varddDD0 12345678hfarpointDD00400078h 4 其他数据单元定义伪指令 定义3字伪指令DF 用于为一个或多个6字节变量分配空间及初始化 6字节常用在32位CPU中表示一个48位远指针 16位段选择器 32位偏移地址 定义4字伪指令DQ 用于为一个或多个8字节变量分配空间及初始化 8字节变量可以表达一个64位整数 定义10字节伪指令DT 用于为一个或多个10字节变量分配空间及初始化 10字节变量可以表达长双精度 longdouble 浮点数 5 变量的应用 变量具有存储单元的逻辑地址属性程序代码中通过变量名可直接存取其所指向的首个数据Xdb a 5moval X X a 通过变量名加减位移量可存取以改变量地址为基地址的前 后数据moval X 1 X 5 变量的定义示例 数据段bvar1db100 01100100b 64h d 字节变量 不同进制表达同一个数值 内存中有4个64Hminint 5 符号常量 minint数值为5 不占内存空间bvar2db 1 minint minint 5 内存中数值依次为FFH 5 0AHdb 2dup 20h 预留一个字节空间 重复定义了2个数值20Hwvar1dw2010h 4 4 字变量 两个数据是2010H 0010H 共占4个字节wvar2dw wvar2是没有初值的字变量 变量的定义示例 续 dvardd12347777h 87651111h 双字变量 2个双字数据 一个双字空间abcdb a b c 定义字符 实际是字节变量maxintequ0ah 符号常量 maxint 10stringdb ABCDEFGHIJ 定义字符串 使用字节定义DB伪指令crlfsdb13 10 回车符0DH 换行符0AH和美元符 24Harray1dwmaxintdup 0 10个初值为0的字量 可以认为是数组arraydb2dup 2 3 2dup 4 6个字节内容依次为 0203040402030404 三 定位伪指令 汇编程序按照指令的先后顺序一个接着一个分配存储空间 按照段定义伪指令规定的边界定位属性确定每个逻辑段的起始位置 包括偏移地址 定位伪指令ORG控制数据或代码所在的偏移地址ORG参数ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址 例如 ORG100h 从100H处安排数据或程序ORG 10 偏移地址加10 即跳过10个字节空间汇编语言程序中 符号 表示当前偏移地址值 四 段定义伪指令 段名segment定位组合段字 类别名 语句序列段名ends 完整段定义由SEGMENT和ENDS这一对伪指令实现 前者定义一个逻辑段的开始 后者表示一个段的结束 段定义指令后的4个关键字用于确定段的各种属性 堆栈段要采用stack组合类型 代码段应具有 code 类别 其他为可选属性参数 如果不指定 则采用默认参数 但如果指定 注意要按照上面的属性顺序 完整段定义格式示例 stacksegmentstackdw512dup 设置堆栈stackendsdatasegment 在数据段定义数据dataendscodesegment code assumecs code ds data ss stackstart movax datamovds ax 在代码段填入指令序列movax 4c00hint21hcodeendsendstart 1 段定位 align 属性 指定逻辑段在主存储器中的边界 可为 BYTE从下一个可用的字节地址 xxxxxxxxb 开始段WORD从下一个可用的偶数地址 xxxxxxx0b 开始段DWORD从下一个可用的模4地址 xxxxxx00b 开始段PARA从下一个可用的模16地址 xxxx0000b 开始段PAGE从下一个可用的模256地址 00000000b 开始段简化段定义伪指令的代码段和数据段默认采用WORD定位 堆栈段默认采用PARA定位 完整段定义伪指令的默认定位属性是PARA 其低4位已经是0 所以默认情况下数据段的偏移地址从0开始 2 段组合 combine 属性 指定多个逻辑段之间的关系 可为 PRIVATE 本段与其他段没有逻辑关系 不与其他段合并 每段都有自己的段地址 这是完整段定义伪指令默认的段组合方式 PUBLIC 连接程序把本段与所有同名同类型的其他段相邻连接 然后为所有这些段指定一个共同的段地址 也就是合成一个物理段 这是简化段定义伪指令默认的段组合 STACK 本段是堆栈的一部分 连接程序将所有STACK段按照与PUBLIC段的同样方式进行合并 这是堆栈段必须具有的段组合 还有 COMMON 和 AT表达式 这两者不常使用 3 段字 use 属性 为支持32位段而设置的属性 对于16位x86CPU来说 它默认是16位段 即USE16 在汇编32位x86CPU指令时 它默认采用32位段 即USE32 但可以使用USE16指定标准的16位段 编写运行于实地址方式 8086工作方式 的汇编语言程序 必须采用16位段 4 段类别 class 属性 当连接程序组织段时 将所有的同类别段相邻分配 段类别可以是任意名称 但必须位于单引号中 大多数MASM程序使用 code 代码段 data 数据段 stack 堆栈段来分别指示代码段 数据段和堆栈段 以保持所有代码和数据的连续 5 指定段寄存器伪指令 ASSUME段寄存器 段名 段寄存器名 段名 通知MASM用指定的段寄存器来寻址对应的逻辑段 即建立段寄存器与段的缺省关系 在明确了程序中各段与段寄存器之间的关系后 汇编程序会根据数据所在的逻辑段 在需要时自动插入段超越前缀 这是ASSUME伪指令的主要功能 ASSUME伪指令并不为段寄存器设定初值 连接程序LINK将正确设置CS IP和SS SP 由于数据段通常都需要 所以在样板源程序中 首先为DS赋值 如果使用附加段 还要赋值ES 6 段组伪指令 组名GROUP段名 段名 把多个同类段合并为一个64KB物理段 并用一个组名统一存取它 定义段组后 段组内各段就统一为一个段地址 各段定义的变量和标号的偏移地址就相对于段组基地址计算 offset操作符取变量和标号相对于段组的偏移地址 如果没有段组则取得相对于段的偏移地址 offset后可以跟段组中的某个段名 表示该段最后一个字节后面字节相对于段组的偏移地址 五 过程定义和子程序编写 汇编语言中 子程序要用一对过程伪指令PROC和ENDP声明 格式如下 过程名PROC NEAR FAR 过程体过程名ENDP可选的参数指定过程的调用属性 没有指定过程属性 则采用默认属性NEAR属性 段内近调用 的过程只能被同一代码段的其他程序所调用FAR属性 段间远调用 的过程可以被相同或不同代码段的程序所调用 子程序编写注意事项 子程序要用过程定义伪指令声明主程序执行CALL指令后调用子程序 子程序利用RET指令返回主程序堆栈操作 子程序中对堆栈操作 压入 弹出 要匹配使用 以保持堆栈的平衡现场的保护和恢复 子程序首部应保护要用到的寄存器 内容 子程序返回前需进行相应恢复子程序的位置 子程序应安排在代码段的主程序之外 最好放在主程序执行终止后的位置 即返回DOS的指令之后 结束汇编的END伪指令之前 也可以放在主程序开始执行之前的位置 SOFDLYPROCPUSHBXPUSHCXMOVBL 10DELAY MOVCX 2801WAIT LOOPWAITDECBLJNZDELAYPOPCXPOPBXRETSOFDLYENDP 例5 1 一个延迟100ms的子程序 程序开始 为了指明程序开始执行的位置 需要使用一个标号 例题中采用了start标识符 连接程序会根据程序起始点正确地设置CS和IP值 根据程序大小和堆栈段大小设置SS和SP值连接程序没有设置DS和ES值 程序如果使用数据段或附加段 必须明确给DS或ES赋值大多数程序需要数据段 程序的执行开始应是 start movax data data表示数据段的段地址movds ax 设置DS

温馨提示

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

评论

0/150

提交评论