微机原理、接口与汇编语言21.ppt_第1页
微机原理、接口与汇编语言21.ppt_第2页
微机原理、接口与汇编语言21.ppt_第3页
微机原理、接口与汇编语言21.ppt_第4页
微机原理、接口与汇编语言21.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

课堂练习 1 8086 8088系统中 设CS 0914H 共有243字节长的代码段 该代码段末地址的逻辑地址 段地址 偏移地址 和物理地址各是多少 2 若DS 095FH 物理地址是11820H 当DS 2F5FH时 物理地址为多少 3 设SP 0040H 如果用进栈指令存入5个数据 则SP 若又用出栈指令取出2个数据 则SP 用机器指令编写的程序叫机器语言程序 机器指令组成的指令系统叫机器语言 用80X86的机器语言编程序 在屏幕上显示 3 B233B402CD21CD20 第2章汇编语言与汇编程序 第2章汇编语言与汇编程序 用80X86的 小 汇编语言编写实现上述功能的程序MOVDL 33HMOVAH 02HINT21HINT20H这样的指令叫符号指令 汇编指令或助记符指令 第2章汇编语言与汇编程序 用汇编语言编写的程序叫汇编语言源程序 把汇编语言源程序翻译成机器语言程序计算机才能执行 把汇编语言源程序翻译成机器语言程序的程序叫汇编程序 翻译过程叫汇编 指令是对数据进行操作的 在计算机中数据又称为操作数 存放操作数的存储单元的地址或寄存器的地址 寄存器名 称为操作数地址 为简化表示 在汇编语言中操作数和操作数地址有时统称为操作数 同一个操作数可以有多种不同的表达方式 这要服从方便程序设计的需要 2 1符号指令中的表达式 2 1符号指令中的表达式 例如MOVAL 36H可以写成MOVAL 20H 16H还可以写成MOVAL 6 9等等如何表达更能反映程序设计者的意图 就如何表达 2 1 1常量1 常量常量是在程序运行过程中数值不变的量 可以以数值形式出现在符号指令中 称为数值常量 也可以对经常使用的常数预先定义一个名字 然后用该名字表示该常量 称为符号常量 数值常量允许有多种表示形式二进制 以B结尾 十进制十六进制 以H结尾 ASC 码字符 用单引号 括起来 例如MOVAL 36HMOVAL 00110110BMOVAL 54MOVAL 6 是等价的符号常量由伪指令EQU或 定义 如PEQU314或P 314符号常量不占用存储单元 可改善程序的可度性 2 数值表达式汇编语言允许对常量进行算术 MOD 运算 逻辑 AND OR XOR NOT 运算和关系 EQ NE LT GT LE GE 运算 由常量和这三种运算符组成的有意义的式子 叫数值表达式 数值表达式的值在汇编时由汇编程序计算 其结果仍是一个常量 2 1 2标号 标号是指令地址的符号表示 代表所在指令的地址 指令可以有标号 也可以没有标号 当某条指令作为转移指令的转移目标时 就必须有标号 如 L1 MOVAL BLADDAL 30H JZL1指令的标号后面要有冒号 标号也可以是过程 子程序 名 代表过程中第一条指令的地址 例如BCDADDPROCNEARMOVAL 04HADDAL BLDAARETBCDADDENDPBCDADD是过程名 代表过程中第一条指令 MOVAL 04H 的地址 PROC是过程定义伪指令 伪指令左边的标号 BCDADD 后不加冒号 2 1 3变量 1 变量和地址表达式变量与数据区内存单元相对应 变量名即是数据的地址或数据区的首地址 由于存储器是分段使用的 因此变量具有三重属性 段基址 偏移地址和类型 变量的段基址就是变量所在段的起始地址 变量的偏移地址是指变量所在段的段基址到该变量的字节距离 由变量 标号 带方括号的寄存器 SI DI BX BP 常量和运算符组成的有意义的式子叫地址表达式 2 变量的段基址和偏移地址的指定算符变量的段基址的高16位用算符SEG来指定如 MOVAX SEGX表示取变量X的段基址到AX变量的偏移地址算符OFFSET来指定如 MOVBX OFFSETX表示取变量X的偏移地址到BX 3 变量的类型属性及变量的定义 变量的类型是指存取该变量中的数据所需的字节数 变量的类型可以是字节 byte 字 word 双字 dword 6字节 fbyte 4字 qword 和10字节 tbyte 变量用下列数据定义伪指令来定义 DB 定义字节 DW 定义字 DD 定义双字 DF 定义6字节 DQ 定义4字 DT 定义10字节 格式是 变量名 数据定义伪指令表达式 表达式可以是 1 数值表达式 2 ASC 码字符串 若用DB定义 则按顺序存放 长度不限 若用DW定义 则2个1组 3 地址表达式 只适用于DW DD和DF DW定义一个16位偏移地址来初始化变量DD定义段基址的高16位和一个16位偏移地址来初始化变量DF定义段基址的高16位和一个32位偏移地址来初始化变量 只适用于386及后来机型 4 nDUP 表达式 n是重复因子 DUP是重复字句 表达式是重复的内容 5 表示预留空间 6 以上表达式组成的序列 各表达式用逗号分隔 DATASEGMENTB1DB23H 56 10110011B AB B2DB2DUP 5 1 DB2DUP 10 E 23 1 4W1DW2345H CD RE W2DWB2W3DDEWEWDWW1DATAENDS 2 变量存储区中数据的存放 80X86系列微型机 为了与早期的机器实现软件兼容和移植 存储器按字节编址 可按字节 字 双字等访问 80386以后 数据在数据区的存放如下 以前面的定义为例 DATA0000 偏移地址 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 23H 38H B3H 41H 42H 24H FBH FFH FFH FBH 0AH 45H 0AH 45H 32H 33H 01H 04H 45H 23H 44H 43H 45H 52H 06H 00H 1EH 00H XX XX 5 地址表达式类型的变更或临时指定 变量和标号都有类型属性 由其组成的地址表达式也有类型属性 地址表达式的类型属性由其中的变量或标号决定 不含变量或标号 仅含寄存器或直接地址形式没有类型属性 在程序设计时有时需要对没有类型属性的地址表达式临时指定合适的类型属性或临时改变原有的类型属性 对没有类型属性的地址表达式指定类型属性例MOVAL 1000H MOVAX 1000H INC 1000H INCBYTEPTR 1000H 临时改变地址表达式的类型属性设变量W1用DW定义为字变量 一次访问一个字 16位 要临时访问它的一个字节 必须改变它的类型属性为字节 MOVAL BYTEPTRW1设X是用DB定义的字节变量MOVAL X同样也可以把定义为字节的变量临时指定为字 并进行访问 指令中指出操作数及操作数地址或下一条指令地址的方式称为寻址方式 80X86机器指令有0个或多个操作数 某些操作数是显式规定的 有的是指令中隐含的 一个操作数能定位在以下地方之一 1 指令中 立即数 2 寄存器 3 存储单元 4 I O端口 2 280X86的寻址方式 2 2 1 寄存器 直接 寻址 操作数在CPU内部寄存器中 指令给出寄存器名 地址 称为寄存器寻址方式 例如 MOVAL BLADDSI AX 2 2 2立即寻址 指令所用的8位或16位操作数由指令本身提供 无需再寻 立即可得 这种方式叫立即寻址方式 例如 MOVAL 30HMOVBX 1090H立即数只能是整数 不能是小数 变量或其他类型的数据 立即数只能是源操作数 立即数的大小应于目的操作数相适应MOVAL 120H MOVSI 30H 2 2 3直接寻址 操作数在存储器的某存储单元中 指令直接给出存储单元的有效地址 例如 MOVAL 1000H ES MOVAX 2008H ES称为段超越前缀MOVAL VAR VAR已定义为字节变量 MOVAX Y Y已定义为字变量 注意 源和目的的类型要一致 2 2 4寄存器间接寻址 操作数在存储器的某存储单元中 存储单元的有效地址由下列寄存器之一指出 BX BP SI DI 指令给出寄存器名 称为寄存器间接寻址 有以下几点需要说明 1 BX和BP称为基址寄存器 SI和DI称为变址寄存器 SI又叫源变址寄存器 DI又叫目的变址寄存器 使用BX SI和DI寄存器间接寻址时 默认的段寄存器是DS 使用SI和DI的寄存器间接寻址又叫变址寻址 使用BX寄存器的间接寻址常称为数据段基址寻址 使用BP寄存器间接寻址时 默认的段寄存器是SS 使用BP寄存器的间接寻址常称为堆栈段基址寻址 例如 设SI 1000H DI 1200H BX 2000H BP 1500H DS 1000H SS 1100H 分析下列各指令内存操作数的物理地址 PHA MOVAL BX PHA MOVAL SI PHA MOVAL DI PHA MOVAL BP PHA 2 2 5基址寻址 BX和BP称为基址寄存器 SI和DI称为变址寄存器有效地址由基址寄存器和一个偏移量决定时 称为基址寻址MOVAL BX 100H MOVAL BP 1000H 当基址寄存器为BP时 隐含访问堆栈段 当基址寄存器为BX时 隐含访问数据段 2 2 6变址寻址 变址寄存器为SI和DI SI称为源变址寄存器 DI称为目的变址寄存器 一般情况下两个变址寄存器用法相同 只是在数据串操作时有源和目的之分 MOVAL 100 SI MOVAX DI 200 变址寻址和基址寻址用法相同 通常用来访问一维数组 MOVAL VAR SI VAR是用DB定义的字节数组首地址 SI若等于0 则访问数组的第一个元素 SI若等于1 则访问数组的第二个元素 2 2 7 基址变址寻址 将BX BP和SI DI寄存器及偏移量组合起来进行寻址称为基址变址寻址 EA BX或BP SI或DI disp可有以下几种组合 BX SI disp BX DI disp BP SI disp BP DI disp 基址变址寻址方式地址表达式的几种合法形式MOVAL 100 BX SI ADDAL BX SI 100 ADDAL BP DI var 设VAR是字节变量ADDAL BP DI 100ADDAL BX SI 100 2 2 8比例变址寻址 80386及后继微处理器可用地址表达式中含有变址寄存器和比例因子 比例因子可以是1 2 4 8 不带比例因子的可认为比例因子是1 如MOVEBX ARRAY ESI 4 每次操作后 只要使ESI 1 而不是 4 就可以访问下一个双字元素 2 2 9基址比例变址寻址 80386及后继微处理器可用80386后的微机 8个32位寄存器EAX EDI 每一个都可作为基址寄存器 每一个又都可作为变址寄存器 基址比例变址寻址就是两个32位寄存器 其中1个带比例因子 的内容构成地址表达式 例MOVECX EDI 4 EAX MOVEAX ESI 4 EBX 在80386 Pentium 8个32位通用寄存器EAX EBX ECX EDX ESI EDI ESP EBP都可以作为地址寄存器 在8086中指令MOVBX AX 是非法的 因为只有 SI DI BX BP 可以作为地址寄存器 在Pentium中 MOVEBX EAX 是合法的 在8086中movax bl非法 因为类型不同在Pentium中 允许下列指令MOVZXEAX BL BL零扩展后送EAXMOVSXEAX BL BL符号扩展后送EAX设BL 80H 2 2 10存储器寻址及段基或段选择字的确定 1 存储器寻址与地址表达式若指令操作的数据在存储器的数据区 相应的寻址方式叫存储器寻址 包括直接寻址 寄存器间接寻址 基址寻址 变址寻址 基址变址寻址及386后的比例变址寻址和基址比例变址寻址 这个由汇编程序根据寻址方式计算得到的偏移地址通常称为有效地址EA affectveaddress 不同的寻址方式都可用用地址表达式概括 2 存储器寻址中段寄存器的确定 80X86的存储器总是分段使用的 要指出操作数的地址 除了偏移地址 由寻址方式确定 外 还要由段基址 变量有段属性 当指令中给出变量名时 选择哪个段寄存器的值作为段基址 或段选择字 是由变量定义时确定的 但很多情况下指令中不用变量名访问存储器 选择哪个段寄存器的值作为段基址 或段选择字 呢 80X86有一个基本约定 只要指令不特别说明要超越 临时改变 这个约定 就按这个约定来寻找操作数 取指令 偏移地址IP EIP 约定段寄存器CS 不允许超越 堆栈操作 PUSH POP CALL RET中断等 偏移地址SP ESP 约定段寄存器SS 不允许超越 数据存取 地址表达式中不出现BP或EBP寄存器 偏移地址EA约定段寄存器DS 允许超越 例 MOVAL 1000H MOVAL SI MOVAL DI 100 ADDAL BX SI 100H 数据存取 地址表达式中出现BP或EBP寄存器 偏移地址EA约定段寄存器SS 允许超越 字符串处理指令源串偏移地址SI ESI 约定段寄存器DS 允许超越 字符串处理指令目的串偏移地址DI EDI 约定段寄存器ES 不允许超越 如何实现段超越 加段超越前缀 例MOV DI ALMOVES DI AL其中ES是前缀字节 译成机器码时 放在指令的前边 MOV DI AL的机器码是8805MOVES DI AL的机器码是268805 2 3常用指令 80X86具有复杂的指令系统其中常用指令分为以下几类 传送指令算术运算指令逻辑运算和移位指令控制转移指令串操作指令 2 3 1数据传送类指令 数据传送类指令包括通用数据传送指令 扩展传送指令 数据交换指令 堆栈操作指令 地址传送指令 查表转换指令六类 1 通用传送指令 1 最基本的传送指令MOV指令格式 MOV目的操作数 源操作数目的操作数可以是 累加器 通用寄存器 除CS之外的段寄存器 存储器源操作数可以是 累加器 通用寄存器 段寄存器 存储器 立即数 源和目的类型要一致 源和目的不可同为存储器 1 通用传送指令 源为立即数时 目的不可段寄存器用BX SI DI间接寻址时 默认的段寄存器是DS 用BP间接寻址时 默认的段寄存器是SS 但可以使用段超越前缀临时改变这种默认 例MOVAX BXMOVAL DHMOVCX DIMOVES AXMOVBX CSMOVBP SI MOVAL 28HMOVBX 1000MOVSI OFFSETTABLEMOVSP 0A002HMOVAL XMOVAX SI MOVLAST BX DI DLMOVSI ES BP MOVDS 100 BX SI MOV 1000H ESMOVALFA 25MOVES MSM BP 300AHMOVBYTEPTR SI 23MOVWORDPTR 2000H 20Hwordptr和byteptr的作用moval 23hmovax 23hmov si 23h mov 2000h 23hmovbyteptr si 23hmovwordptr 2000h 23h 例判断下列指令是否合法 MOVAL BXMOVBX ALMOVAL 260HMOV SI 23HMOVDS 2000HMOVAX CSMOVCS SIMOVAL DX MOVAX ARRAY ARRAY是变量名 2 扩展传送指令 80386后 1 符号扩展传送指令指令格式MOVSXreg source指令意义 对源操作数中的8位或16位符号数扩展 形成16位或32位补码数例 MOVSXEAX BX若执行前BX 8765H 执行后 EAX FFFF8765H 2 零 zero 扩展传送指令指令格式MOVZXreg source指令意义 对源操作数中的8位或16位无符号数扩展 形成16位或32位无符号数 例MOVZXEAX BL指令若执行前BL 89H 执行后EAX 00000089H 3 数据交换指令 1 字节 字和双字交换指令指令格式 XCHGdest source将源地址的内容与目的地址的内容交换可以有三种形式XCHGREG REGXCHGREG MEMXCHGMEM REG例交换字变量W1和字变量W2的内容 MOVAX W1XCHGAX W2MOVW1 AX不用交换指令 程序会长一些MOVAX W1MOVBX W2MOVW2 AXMOVW1 BX 2 32位通用寄存器中4字节交换指令 80486以后可用 指令格式BSWAPreg指令的意义是把32位寄存器的第1字节与第4字节交换 第2字节与第3字节交换 例BSWAPEAX若执行前EAX 12345678H执行后EAX 78563412H 4 栈操作指令 1 堆栈的概念现代计算机 堆栈是在存储器中开辟的一片数据存储区 这片存储区的一端固定 另一端活动 且只允许数据从活动端进出 堆栈中的数据遵循 先进后出 的原则 堆栈的活动端称为栈顶 固定端称为栈底 对80X86 堆栈必须存放在堆栈段 其段地址存放于堆栈段寄存器SS中 因为栈顶是活动的 所以需要有一个指示栈顶位置的寄存器 叫堆栈指示器 它总是指向栈顶 当堆栈地址长度为16位时用SP作堆栈指示器 当堆栈地址长度为32位时用ESP作堆栈指示器 80X86的堆栈的伸展方向是从高地址向低地址 80X86的堆栈操作是字 16位 操作或双字 32位 操作 把一个数据压入堆栈也称为进栈 进栈时堆栈指示器自动减2或减4 把把一个数据从堆栈中弹出称为出栈 出栈时堆栈指示器自动加2或加4 堆栈的设置主要解决多级中断 子程序嵌套 递归调用等难以处理的实际问题 利用堆栈还可以保护现场 在主程序与子程序之间传递参数等 中断响应时 由中断隐指令自动实现将断点压入堆栈 通过执行中断返回指令 从堆栈中弹出返回地址 恢复断点 调用子程序时 用CALL指令实现将返回地址压入堆栈 通过执行返回指令 从堆栈中弹出返回地址 若要在中断服务程序保存现场与恢复现场则要使用进栈指令PUSH和出栈指令POP 2 进栈指令PUSHsourceSource可以是16 32 位通用寄存器 段寄存器 存储器字或双字单元 80386及以后的CPU允许将立即数 用PTR算符说明类型 压入堆栈 例如PUSHAX 设AX的内容是1234H 3 出栈指令POPdest出栈指令的意义 弹出栈顶元素到destdest可以是 字或双字通用寄存器 除CS之外的段寄存器或存储器 如果dest是类型不明的存储器时 需要用PTR算符说明其类型属性 例如POPAXPOPWORDPTR SI 利用堆栈可以将两个存储字 W1和W2 交换 PUSHW1PUSHW2POPW1POPW2因为W1 W2都有类型属性 不必加PTR算符 4 全部通用寄存器进栈指令PUSHA PUSHAD和出栈指令POPA POPAD 80386后 PUSHA将16位通用寄存器按以下顺序进栈AX CX DX BX SP 指令执行前的值 BP SI DI 执行后SP 16 PUSHAD将32位通用寄存器依次进栈 进栈顺序是 EAX ECX EDX EBX ESP 指令执行前的值 EBP ESI EDI 指令执行后ESP 32 POPA将8个栈顶元素 字 按PUSHA指令相反的顺序弹出到8个16位通用寄存器 POPAD将8个栈顶元素 双字 按PUSHAD指令相反的顺

温馨提示

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

评论

0/150

提交评论