微机原理课件chapter3qsq.ppt_第1页
微机原理课件chapter3qsq.ppt_第2页
微机原理课件chapter3qsq.ppt_第3页
微机原理课件chapter3qsq.ppt_第4页
微机原理课件chapter3qsq.ppt_第5页
已阅读5页,还剩127页未读 继续免费阅读

下载本文档

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

文档简介

第3章80X86 Pentium指令系统 3 180X86 Pentium指令格式和寻址方式 3 28086 8088指令系统 3 380X86 Pentium指令系统 第三章80X86 Pentium指令系统 3 1 1指令格式 3 180X86 Pentium指令格式和寻址方式 第二字节 Reg 编码 23 8 表示一个具体的Reg 操作数 字节或字已由W决定 目的或源由D决定 mod 编码表示另一个操作数是在Reg 中还是在存贮器中11为Reg 其他为存贮器 当mod 11时 r m指出第二个Reg 操作数的编码 当mod 11时 r m指出存贮器操作数存放地址的计算方法 以上例子说明 汇编语言指令可手工汇编成机器码 即使是同一种指令 寻址方式和操作数的不同 机器码的长度也不同 编程时应选择合理算法 数据结构 寻址方式等节省MEM 执行时间 指令的指令时间包括取指 译码和执行的时间 跟该指令的机器码的长短没有直接关系 3 1 2寻址方式 操作数位置 1 操作数在指令中 与代码存放在一起 称为立即操作数 立即寻址2 操作数在Reg 中 指令中操作数部分是对应的编码 Reg 寻址3 操作数在MEM中 指令中操作数部分是操作数所在的内存地址 存贮器寻址存贮器寻址时 指令的操作数部分给出的地址是段内偏移地址 一 寻址方式与有效地址的概念寻址方式 寻找操作数的方式 为了处理各种数据结构的需要 这个段内偏移量可以有几个基本部分组成 称为有效地址EA EA 从段的首地址到操作数所在地址的距离 用字节数表示 是一个无符号16位整数 它指向段首地址开始的64KB 有效地址有四个分量组成 EA 基址Reg 变址Reg 比例因子 位移量四个分量的取值规定 对于16位寻址和32位寻址有所不同 如 ES TABLE对实地址方式 ES是段基地址 TABLE为偏移量 PA ES 16 TABLE 1 立即寻址操作数包含在指令中 紧跟着操作码并与操作码一起存放在代码段中 与代码一起被取入CPU的指令队列 在指令执行时不需要再访问存贮器 例 MOVAL 80HMOVAX 1234H 立即操作数可以是8 16 若是16位 存放时必须满足低对低 高对高的原则 此指令中的立即数只能是源 不能是目的 常用于给Reg 赋初值 二 各种寻址方式 8086 8088 16位寻址 有8种 例 INCSIMOVAX BX 3 存储器寻址操作数在存贮区中 操作数的有效地址EA在指令中 操作数的物理地址PA DS 16 EA 或SS ES Reg是任何CPU中的通用RegAX BX CX BPAH AL 等 操作数在Reg中 无需访问存贮器 执行速度快 若选用AX 执行指令时间更短 2 寄存器寻址操作数存放在指令规定的8或16位Reg中 Reg名字出现在指令中 指令执行后 源操作数不变 目的操作数为源的内容 1 直接寻址 EA 立即数 有效地址EA直接在指令中给出 它存放在代码段操作码之后 操作数一般在数据段DS中 这是一种默认方式 将ES段中2000H 2001H单元内容分别送AL AH 低对低 高对高 不管数据在那个段内存放 只要不是DS 一定要加段超越前缀 允许段超越例 MOVAX ES 2000H 或ES MOVAX 2000H 例 MOVAL 2000H 将DS段中2000H单元的内容送AL若DS 4000H 则物理地址为 4000H 16 2000H 42000H 见右图 直接寻址中EA可以以变量名的形式给出 例 VALUEDB12HMOVAL VALUE 等效于 MOVAL VALUE VALUE又称为符号地址 Reg使用规定如下 16位寻址时 EA在DI SI BP BX中 这时 若以DI SI BX间接寻址 则默认操作数在数据段中 操作数物理地址 DS 16 BX 或SI DI 若以BP间接寻址 则默认操作数在堆栈段内 操作数物理地址 SS 16 BP若操作数不在以上规定段内 则必须在指令中加上段超越前缀 2 Reg间接寻址操作数的有效地址EA在指令的Reg中 即 EA Reg 寄存器间接寻址示意图 例 MOVAX BX 设DS 4000H BX 0100H寄存器间接寻址示意图如左 例 MOVAX SI 将DS段 SI SI 1 的内容送AL AHMOVBH BP 将SS段 BP 的内容送BHMOVCX ES BX 将ES段 BX BX 1 内容送CL CH 3 基址寻址EA 基址Reg 位移量位移量在指令中给出并与代码一起存放在代码段中 Reg使用规定如下 16位寻址时BP BX作基址Reg 其中BP默认在SS段 BX默认在DS段 位移量是8或16位 且跟在操作码之后存放在代码段中 例 MOVAX SI 4MOVAL 5 DI 默认DS为段Reg 当一种寻址方式中 基址 变址Reg的默认段Reg不同时 一般由基址Reg来决定默认段Reg 并允许段超越 例 MOVAX BX SI 或MOVAX BX SI 默认DS为段Reg 基址加变址寻址示意图 6 带位移量的基址加变址寻址 又称为相对基址变址寻址 EA 基址Reg 变址Reg 位移量基址Reg与变址Reg的规定同前 对段Reg的默认同前 例 MOVAH MASK BX DI PA DS 16 BX SI MASK示意图见右方 41444H 三 存贮器寻址时的段约定存贮器寻址时 一般并不在指令中给出段Reg 而是遵寻一种约定 默认 方式 见下表所示 寻址方式总结 寻址方式 1 立即寻址MOVAX 1234H2 寄存器寻址MOVAX BX3 直接寻址MOVAX 1234H 4 寄存器间接寻址MOVAX BX 5 基址寻址MOVAX BX 100H 6 变址寻址MOVAX SI 100H 7 基址加变址寻址MOVAX BX SI 8 基址加变址相对寻址MOVAX BX SI 100H 操作数的分类 立即数操作数 注1 立即数只能作为源操作数 不能作为目标操作数 注2 不能用一条指令简单地将立即数传送到段寄存器 寄存器操作数 注3 有些指令没有指定使用的寄存器 但实际上隐含这特定的寄存器操作数 存储器操作数 注4 不允许源操作数和目标操作数同时为存储器操作数 注5 存储器操作数的物理地址的计算是将段基地址左移四位加上有效地址EA 偏移地址 得到的 但是段寄存器和有效地址的配对是有规定的 注6 执行速度 寄存器操作数 立即数操作数 存储器操作数 3 28086 8088指令系统 8086 8088指令系统是80X86的基本指令集 指令的操作数宽度是8位或16位 偏移地址宽度是16位 之间的数据传送 可实现 指令操作数符号说明规定如下 共有14条指令 分为4组 见表3 4 除了SAHF和POPF指令外 其余指令执行后对标志位都没有影响 一 通用数据传送指令共5条 它们 除XCHG外 是唯一允许以段寄存器 Sreg 作为操作数的指令 OPRD2 OPRD1两者可以是8 16位 但必须等长 MOV指令有如下一些形式 MOVreg Sreg regMOVreg SregMOVreg Sreg memMOVmem reg SregMOVreg immMOVmem imm 例 MOVAL CH 通用寄存器之间传送字节数据MOVDS AX 通用寄存器 段寄存器 CS不能是目标 MOVAX 0FF3BH 立即数 通用寄存器MOVAL BUFFER 存储器 通用寄存器MOVDAT BP DI ES 段寄存器 存储器MOV 1000H 25H 立即数 存储器 该指令有二义性 MOVCX 1000H 存储器 通用寄存器 2 堆栈操作指令PUSH POP 堆栈是按照LIFO原则组织的一段内存区域 80X86规定堆栈设置在堆栈段 SS 内 用SP始终指向堆栈的顶部 堆栈用于在子程序调用或处理中断时 保存当前的断点地址 在8086 8088中为CS和IP 和现场数据 以便子程序执行完毕后 正确返回到主程序 指令格式 PUSHOPRD2POPOPRD1 源操作数 通用Reg Sreg mem目标操作数 通用Reg Sreg CS除外 mem 断点地址的保存由子程序调用指令或中断响应来完成 现场数据保存可通过堆栈操作指令来实现 堆栈操作时 一定是16位操作 注 1 程序中有一个PUSH 必有一个对应的POP 2 遵循后进先出原则 3 按字进行操作 PUSHAH POPBL 错误 4 PUSHCS POPCS 可以 错误 具体的入 出栈指令如下 PUSHreg16 POPreg16PUSHSreg POPSreg CS除外 PUSHmem16 POPmem16 指令格式 PUSHOPRD2 SP SP 2 SP 1 SP OPRD2POPOPRD1 OPRD1 SP 1 SP SP SP 2 指令PUSHAX的执行情况 1FFE 81FFE 81FFE 3 交换指令XCHG 例 XCHGAX BXXCHG 2530H CX 注 1 两个存储器操作数之间不能实现直接交换 2 段Reg和立即数不能作为操作数 指令格式 XCHGOPRD1 OPRD2 OPRD1 OPRD2 OPRD1 OPRD2可以是reg mem 4 查表转换指令XLAT 或称换码指令 指令格式 XLAT AL BX AL 或XLATOPRD 完成一个字节的查表转换 将BX AL做为有效地址EA 在一个表格中找出相应单元内容放入AL 此指令常用来将一种代码转换为另一种代码 使用方法如下 将待转换的代码组成表格 首地址 BX AL存放查找对象在表中下标 指令执行后 BX AL AL BX内容不变 注 1 代码表须建立在数据段 2 代码表长度不超过256字节 8位位移量AL 3 执行指令前 BX 表首址AL 查找对象在表中距首址的偏移量 下标 4 XLAT中的操作数通常为码表首地址的名称 相应指令部分 MOVBX OFFSETS TABMOVAL 4XLATS TAB 例 将数字0 9的BCD码转换为7段LED显示器的显示代码 MOVBX 0800HMOVAL 4XLAT AL 19H 数字0 9的BCD码对应的7段LED显示代码为 40H 79H 24H 30H 19H 12H 02H 78H 00H 18H 将它们依次存放在偏移地址为0800H开始的内存区域 则实现BCD码0100B转换的程序段为 例 LEAAX 2728H AX 2728HLEABX BP SI BX BP SI的值 LEASP 0482H SP 0482H 二 地址传送指令 指令中的源操作数都必须是mem操作数 注 MOV指令与LEA的不同 前者传送操作数的内容 后者传送操作数的地址 例 MOVDI TABLE DI TABLE LEADI TABLE DI TABLE所在单元的EA 例 比较LEABX BUFFERMOVBX BUFFER两指令的不同 存储单元内容如右图所示 DS 093AH BUFFER物理地址093C3H则LEABX BUFFER后 BX 0023HMOVBX BUFFER后 BX 0045H 功能 将由源操作数偏移地址决定的双字单元中的第一个字的内容送入指令指定的16位通用寄存器 第二个字的内容传送给段寄存器DS或ES reg16 EA DS ES EA 2 例2 LDSSI 10H 设指令执行前 DS C000H C0010H 0180H C0012H 2000H则执行后 SI 0180H DS 2000H 例3 LDSBX DI 1008H 程序执行前 DS 2500H DI 2400H 28408H 3344H 2840AH 1122H执行后 BX 3344H DS 1122H 例1 LDSDI 2130H EA 2130H 2130H 2131H DI 2132H 2133H DS 三 标志位传送指令标志位传送指令专门用于对标志寄存器 FR 的保护和更新操作 指令的操作数隐含 PUSHFPOPAXORAH 01HPUSHAXPOPF 1 LAHF SAHF 读写标志寄存器 指令LAHF用于将FR的低字节 含SF ZF AF PF和CF 读出后传送到AH寄存器 这条指令本身不影响标志位 SAHF与LAHF的操作相反 将寄存器AH中的内容写入FR的低字节 取代某些标志位 SF ZF AF PF和CF 的原来状态 在子程序调用或中断子程序中 常用此保护和恢复需要的标志位 四 输入 输出数据传送指令IN OUT CPU用16根I O地址线形成64K个8位数据传送端口地址 当传送16位数据时 则从偶地址传送数据 形成32K个16位端口地址 当端口地址 256 8根地址线 时 该地址直接出现在指令中 当端口地址 256 8 16根地址线 时 该地址置于DX并将DX放在指令中 指令格式 IN累加器 外设口地址OUT外设口地址 累加器 注 1 所有I O指令只能用累加器 不能用其他Reg 2 IN OUT指令有字 字节两种方式 选用那一种则取决于外设端口宽度 具体指令有 INAL imm8OUTimm8 ALINAX imm8OUTimm8 AXINAL DXOUTDX ALINAX DXOUTDX AX 例 INAX 20H 从端口 20H 21H 输入16位数到AXMOVDX 3F0HINAL DX 从端口 03F0H 输入8位数到ALOUT27H AL 将8位数从AL输出到端口 27H OUTDX AX 将16位数从AX输出到DX指定的端口 8086 8088存储器中存放数的方法 右图示 num1单元中有一个16位数 字 1234H num2单元中有一个32位数 双字 12345678H 3 2 2算术运算类指令 共20条 压缩BCD数 一个字节0 99非压缩BCD数 一个字节0 9 1 加减法类指令 1 加减法指令ADD SUB指令格式 ADDOPRD1 OPRD2SUBOPRD1 OPRD2 OPRD1 OPRD1 OPRD2功能 完成两个操作数的加 减运算 结果送入目标操作数 源 Reg mem imm 目标 Reg mem 且两个操作数不能同时为mem 例 书P105 设AX 65A0H BX B79EH执行ADDBX AX具体执行情况如下 一 二进制算术运算指令 特征 所有的算术类指令都影响Flag 这些标志可用于测试 以决定程序的走向 2 算术运算指令与标志 例 两个四字节数分别放在FIRST和SECOND开始的存储区中 存放时 最低字节在地址最低处 可用以下程序段实现相加 MOVAX WORDPTRFIRST 取第一个加数的低16位ADDAX WORDPTRSECOND 与第二个加数低16位相加 如有进位 则CF 1MOVWORDPTRTHIRD AX 存低16位的和MOVAX WORDPTRFIRST 2 ADCAX WORDPTRSECOND 2 高16位相加 同时加上CFMOVWORDPTRTHIRD 2 AX 存高16位的和 2 带进位 借位的加减法指令ADC SBB指令格式 ADCOPRD1 OPRD2SBBOPRD1 OPRD2 OPRD1 OPRD1 OPRD2 CF主要用于多精度 即多于两个字节以上 运算 低位的CF对高位有贡献 低位的OF无意义 高位运算的OF才为整个的OF 例 INCCX CX寄存器中的内容加1DEC BX 指令有不确定性 EA单元的字 字节内容 1 例 实现100 AL NEGALADDAL 100 5 比较指令CMP指令格式 CMPOPRD1 OPRD2 OPRD1 OPRD2 但不送回 其所影响的标志 可用于决定程序所做处理 4 求补指令NEG指令格式 NEGOPRD OPRD 0 OPRD对一个数求补得到它相反数的补码 即按位求反 1 当OPRD 0时 CF 0 OPRD 0 CF 1 且对 128 32768求补时 操作数无变化 OF 1 3 增量和减量指令INC DEC指令格式 INCOPRD OPRD OPRD 1DECOPRD 此指令不影响CF 减去一个数可以转化为加上它的求补值 X补 Y补 X 补 Y 补 X 补 Y 补 求补 具体指令为 CMPreg regCMPmem regCMPmem immCMPreg memCMPreg imm 比较指令在程序中常用于条件转移指令之前 条件转移指令根据CMP操作之后设置的标志状态决定转移或不转移 注 此时不能用SF位判断 CMPA B 1 若任意两个数ZF 0AB JNZ不等转移 ZF 1A B JZ相等转移 2 若两个数都是无符号数CF 0A B JNC CF 1A B JC 3 若两个数都是带符号数正数SF 0A B JNS SF 1A B JS 4 若两个数是任意带符号数SF OF 0A B JNL SF OF 1A B JL 注意 因为判断无符号数和有符号数大小的条件不同 所以条件转移指令也分为无符号数和有符号数两类不同的条件转移指令 这两组转移指令之间的区别是前者根据标志CF来判断 后者是根据SF OF的值来判断 例 比较AX和BX寄存器中两个带符号数的关系 如果相等则RESULT 0 如果 AX BX 则RESULT 1 如果 AX JMPSTOPEQUAL MOVRESULT 00HJMPSTOPLESS THAN MOVRESULT FFHSTOP HLT 2 乘除法类指令 1 乘法指令MUL IMUL指令格式 MULOPRD 无符号数相乘 IMULOPRD 带符号数相乘 AX AL reg8 AL mem8 DX AX AX reg16 AX mem16 此指令由于为乘积保留了两倍于原操作数的存储空间 因而不会出现溢出 2 除法指令DIV IDIV指令格式 DIVOPRDIDIVOPRD 此指令只影响OF CF 其余标志位为任意值 当CF OF 1 表明乘积为16位或32位 高半部分不为0 CF OF 0 表明乘积为8位或16位 高半部分为低8位的符号扩展 该指令只出现源操作数 可以是Reg mem 目标操作数隐含 AL AX OPRD的商 AH AX OPRD的余数 AX DX AX OPRD的商 DX DX AX OPRD的余数 指令执行后 所有标志位状态不确定 对DIV 若商超过存放它的Reg容量 字节相除时为FFH 字相除时为FFFFH 则引起0型中断 除法出错 且商和余数不定 对IDIV 商的符号根据代数符号规则确定 余数的符号与被除数相同 特点 操作数隐含在累加器中 AL AX 操作 将操作数从字节 字 AX 字 双字 DX AX 二 符号扩展指令CBW CWD 例1 对8位机 3为11111101对16位机 3为1111111111111101对8位机 3为00000011对16位机 3为0000000000000011 例2 设AL B4H 无符号数180 带符号数 76 BL 11H 无符号数17 带符号数17 用MULBL 则AX 0BF4H 无符号数3060 CF OF 1而用IMULBL 则AX FAF4H 带符号数 1292 CF OF 1 例3 完成无 有符号数除法DP1 DP2 DP2为字节型 无 XORAH AH AH清零MOVAL DP1DIVDP2 商在AL中 余数在AH中有 MOVAL DP1CBW 扩展到字IDIVDP2 例4 DP1是字型变量 DP2和DPSUM是双字型变量 则要区分它们是无符号数还是有符号数 求和 符号数 MOVAX DP1CWDADDAX WORDPTRDP2MOVWORDPTRDPSUM AXADCDX WORDPTRDP2 2MOVWORDPTRDPSUM 2 DX 无符号数 MOVAX DP1ADDAX WORDOPTRDP2MOVWORDPTRDPSUM AXMOVAX 0ADCAX WORDPTRDP2 2MOVWORDPTRDPSUM 2 AX 三 BCD 十进制 算术运算指令 BCD算术运算 2 算术运算后紧接着用一条调整指令校正 所有调整指令隐含操作数在累加器中 例 非压缩BCD数的加减运算 DX UP1 1 UP1 UP2 1 UP2 UP3 1 UP3 MOVAL UP1ADDAL UP2 个位先加AAA 调整低位和为非压缩BCDMOVDL AL 暂存DLMOVAL UP1 1ADCAL UP2 1 十位相加 且考虑个位CFAAA 调整高位和为非压缩BCDXCHGAL DL 互换后AL为低位和 DL为高位和SUBAL UP3 求低位差AAS 调整XCHGAL DL 差存DL AL现为高位和SBBAL UP3 1 带借位减AASMOVDH AL 存入DX 3 非压缩BCD数乘除法调整指令AAM AAD指令格式 AAM AAD AAM紧跟在MUL指令之后 能把在AX中的两个非压缩BCD数相乘的结果进行调整 得到正确的非压缩BCD的乘积 高位在AH中 低位在AL中 调整操作为 AH AX 0AH AX被0AH除的商 AHAL AX 0AH AX被0AH除的余数 AL 3 2 3逻辑运算与移位指令 一 逻辑运算 P111 根据操作数的位组合格式 有选择地使某些位置位 复位或进行测试等 特征 所有逻辑运算使CF OF 0 ZF PF SF由运算结果决定 AF为不确定标志 特点 AND OR用于某些位置 复位 自己 与 或 自己 操作数不变 但可清CF 即CF 0 XOR 与 0 异或不变 与 1 异或取反 自己 异或 自己 操作数清零且CF 0 功能与AND相同 但不送回结果 通过被影响的标志来判断操作数的情况 用于测试二进制数的某些位 一般为1位 是0还是1 当被测试位为0时 ZF置位 ZF 1 当被测试位为1时 ZF复位 ZF 0 例 TESTAL 1 测试AL得D0位JNZRIGHT D0 1转移TESTAL 128 测试AL得D7位JNZLEFT D7 1转移 二 移位与循环移位指令 操作数是双操作数 第一操作数为Reg mem 第二操作数为立即数即为计数值 当计数值为1 则采用如 SALAX 1当计数值为 1值 则必须采用CL预先指定所移位数 SALAX CL 例2 AH AL中分别存有非压缩BCD数 用下列指令可转化为压缩的BCD数 并存于AL中 MOVCL 4SHLAL CLSHRAX CL 功能1 所有指令 8条 更新CF 其余标志位由运算结果决定 2 可部分地替代乘除法指令 将数扩大或缩小2的n次 3 乘以2的n次时 用算术 逻辑左移皆可 有 无符号数 除以2的n次时 无符号数用逻辑右移 有符号数用算术右移 4 可分离出操作数中的某些位 例 用以下程序来完成X 10 SALAL 1 X 2MOVBL AL 暂存SALAL 1 X 4SALAL 1 X 8ADDAL BL X 10例 将一个四字节数整个左移一位 SALFIRST WORD 1RCLSECOND WORD 1 3 2 4串操作指令 数据串 在存储器中的一串字节或一串字串操作就是对串中的每一项都执行的操作 例如串传送 查找 比较等 串操作指令可以对字节串或字串进行操作 每次处理串中的一个元素 一个字节或一个字 可以处理的数据串长度最多为64K字节 基本串操作指令有五条 传送 MOVS 比较 CMPS 搜索 SCAS 取 LODS 存 STOS 任何一个这样的基本操作 能在指令的前面加一个重复操作前缀指令使它们的操作重复 使得处理长数据串比用软件循环处理快 4 串操作指令 地址修改与方向标志DF有关 设置如下 5 可通过重复前缀来实现串操作 6 重复的数据串处理过程可被中断 SI SI 1 2 1 MOVSOPRD1 OPRD2 DI SI DI DI 1 2 功能 将一个由DS SI指定的数据串的某个元素送另一个由ES DI指定的目标串 且根据方向标志DF自动修改SI DI 以指向串中的下一个元素 3 用CX存待处理的串元素个数 重复前缀来实现串操作每处理一个串元素 自动使CX 1 一 基本串操作指令 DF 1 SI DI自动减量DF 0 SI DI自动增量 OPRD1 OPRD2是目的串和源串的符号地址 在执行MOVS指令时 应该先做好以下准备工作 DS段中源串首地址 或反向传送末地址 存入SI寄存器中 ES段中目的串首地址 或反向传送末地址 存入DI寄存器中 数据串长度存入CX 建立方向标志DF 串传送指令有3种格式 MOVSdest src ES DI DS SI MOVSB 字节 SI SI 1 DI DI 1 MOVSW 字 SI SI 2 DI DI 2 当方向标志 CLD DF 0时 用 STD DF 1时 用 MOV单指令不能完成存储单元之间的数据传送 MOVS指令就是为解决存储单元之间数据传送而设置的 例 将内存的数据段中以AREA1为首地址的100个数据 传送到附加段中的AREA2为首地址的区域 用MOV及MOVS分别完成 并加以比较 用MOVS串操作指令编程 MOVAX SEGAREA1MOVDS AXMOVAX SEGAREA2MOVES AXMOVSI OFFSETAREA1MOVDI OFFSETAREA2MOVCX 100CLD DF 0 增址传送LOOP1 MOVSAREA2 AREA1DECCXJNZLOOP1 用MOV指令编程 MOVAX SEGAREA1MOVDS AXMOVAX SEGAREA2MOVES AXMOVSI OFFSETAREA1 将ARE1偏移地址 SIMOVDI OFFSETAREA2MOVCX 100LOOP1 MOVAL SI AL DS SI MOVES DI AL ES DI AL INCSIINCDIDECCXJNZLOOP1 串传送指令示例 MOVSI OFFSETS1MOVDI OFFSETS2MOVCX 18 CLDAGAIN MOVSS2 S1DECCXJNZAGAIN S1DB Thisisastring S2DB18DUP 0 REPMOVSS2 S1 REPMOVSB 串取指令有3种格式 LODSsrc 字节 AL DS SI SI SI 1 字 AX DS SI SI SI 2 LODSB 字节 AL DS SI SI SI 1 LODSW 字 AX DS SI SI SI 2 功能 将由SI指定的数据段中某单元内容 AL或AX中 DF 0 SI SI 1或 2 DF 1 SI SI 1或 2 LODS应用注意 指令允许用段超越前缀来指定非数据段的存储区 该指令不影响标志位 一般说来 每用一次 累加器的内容就改变一次 若重复使用 AL中只能保持最后一个元素 有时缓冲区中的一串字符需要多次取出测试时可用本指令 2 STOS 存入串指令 功能 将AL或AX ES DI DI 1 2 DI 用途 与REP联用 CX 缓冲区长度 用来建立一串相同值 存入串指令有3种格式 STOSdest 字节 ES DI AL DI DI 1 字 ES DI AX DI DI 2 STOSB 字节 ES DI AL DI DI 1 STOSW 字 ES DI AX DI DI 2 例 内存中有一个首地址为BLOCK 补码表示的有符号数的数据块 要求将正 负数分开 分别存于两个缓冲区 存放正数的缓冲区首址为PLUS DATA 存放负数的缓冲区首址为MINUS DATA 设 源数据块用SI寻址 正数的目标区用DI寻址 负数的目标区用BX寻址 循环次数 CX 传送过程 用LODS指令把源数据取入AL中 检查其符号确定正负 若为正用STOS指令送至正数缓冲区 若是负数 把DI与BX交换 仍使用STOS传送 传送完后再将DI与BX交换 恢复原值 程序见下页 3 串比较指令CMPSOPRD1 OPRD2 功能 将DS SI指定的源串中的元素与ES DI指定的目标串中的相应元素相减 但两个存储单元中的内容不变 而是用标志位的变化表示比较结果 同时根据方向标志DF自动修改源和目标串指针SI DI OPRD1 OPRD2分别为源串和目标串的符号地址 串比较指令有3种格式 CMPSsrc dest DS SI ES DI 结果不存 CMPSB 字节 SI SI 1 DI DI 1 CMPSW 字 SI SI 2 DI DI 2 START MOVSI OFFSETBLOCKMOVDI OFFSETPLUS DATA 正数缓冲区MOVBX OFFSETMINUS DATA 负数缓冲区MOVCX COUNTCLDGOON LODSBTESTAL 80HJNZMINS 若负数转MINSSTOSB 正数 DI AL DI DI 1JMPAGAINMINS XCHGBX DISTOSB 负数 DI AL DI DI 1XCHGBX DIAGAIN DECCXJNZGOONHLT 4 串扫描指令 搜索指令 SCASOPRD 功能 将累加器 AL或AX 中的内容 关键字 与ES DI指定的目标串元素 字节或字 进行比较 减法操作 用标志位反映比较的结果 而不改变累加器和目标串的内容 达到字符串搜索的目的 同时自动修改指针DI OPRD是目标串的符号地址 串扫描指令有3种格式 SCASdest SCASB 字节 AL ES DI DI DI 1 SCASW 字 AX ES DI DI DI 2串扫描指令常用来从一个字符串中找一个指定字符 二 重复前缀REP REPE REPZ REPNE REPNZ 控制后面紧随的串操作指令是否重复 分二种情况讨论 1 与REP相配合工作的MOVS STOS LODS指令判如CX 0则REP串操作且CX自动 1 即直到CX 0退出重复 2 与REPE REPZ和REPNE REPNZ联合工作的CMPS和SCAS指令REPE REPZ 判如CX 0且ZF 1 则REP串操作且CX自动 1 即直到CX 0或ZF 0即为零或不相等 退出重复 REPNE REPNZ 判如CX 0且ZF 1 则REP串操作且CX自动 1 即直到CX 0或ZF 1即为零或相等 退出重复 1 与REP相配合工作的MOVS STOS LODS指令格式 REPMOVS STOS LODS 例1 在附加段STORE开始存5个空格MOVAL 20H ALMOVCX 5MOVDI OFFSETSTORECLDREPSTOSB ES DI AL DI DI 1 例2 下列程序段使0404H开始的256个单元清零CLDLEADI 0404H MOVCX 0080H 共128个字XORAX AXREPSTOSW ES DI AX DI DI 2 对于LODS指令 一般采用重复前缀的较为少见例 将0700H单元开始的5个字节内容逐一取出 放在累加器中处理后再送回原单元CLD DF 0 增量方向MOVSI 0700HMOVCX 5LI LODSB 取一个字节到AL 且SI自动 1PUSHCX 保留计数值后进行相应处理POPCXDECCXMOV SI 1 AL 送回处理结果JNZLI 如CX未结束 则继续循环 例 MOVSI 1000H MOVDI 2000H MOVCX 100 CLD REPMOVSB等效于KKK MOVSBDECCXJNZKKK例 SOURCEDB100DUP 0 DESTDB100DUP LEASI SOURCE 也可用MOVSI OFFSETSOURCELEADI DESTMOVCX 64H 64H 100 如用32H 字传送 CLD 如用STD减量方向 则用REPMOVSB 则用MOVSW LEASI SOURCE 62HLEADI DEST 62HMOVCX 32HSTDREPMOVSW 对REPE REPZCMPS SCAS 1 若CX 0 串结束 或ZF 0 某次比较结果两个操作数不等 则结束REPZ 执行REPZ的下一条指令 否则 2 CX CX 1 3 执行REPZ后面的串操作指令 4 重复 1 3 当串未结束 CX非0 且串相等 ZF 1 则继续比较 REP 串比较指令示例 例 MOVSI OFFSETS1MOVDI OFFSETS2MOVCX xxREPZCMPSB 相等 Z 1 重复JNZNot EqualEqual Not Equal 例利用CMPS指令对STRING1和STRING2两个字符串进行比较 相同 RESULT 00H 不同 RESULT 1 LEASI STRING1LEADI STRING2MOVCX COUNTCLDREPZCMPSB CX 0且两个操作数相等 重复 JNZUNMAT 若串不同 ZF 0 在RESULT 0FFHMOVAL 0 若串相等 CX 0 在RESULT 00HJMPOUTPTUNMAT MOVAL 0FFHOUTPT MOVRESULT ALHLT 注意 CX 1操作不影响标志 由串操作的比较指令影响FR的ZF标志 并影响下一步判断 当CX 0或ZF 0时退出循环 对REPNE REPNZCMPS SCAS 1 若CX 0 串结束 或ZF 1 某次比较结果两个操作数相等 则结束REPNZ 执行REPNZ的下一条指令 否则 2 CX CX 1 3 执行REPNZ后面的串操作指令 4 重复 1 3 当串未结束且串不相等 则继续比较 例 要搜索的关键字放在 AL 或 AX 中 搜索某一数据块或字符串中有无关键字 若有 把搜索次数记下来 且记录关键字地址 若搜索次数为0 表示没有要搜索的关键字 注意 CX 1操作不影响标志 ZF标志由串操作决定 当CX 0或ZF 1时退出循环 串扫描指令示例 例 MOVDI OFFSETStringMOVCX xxMOVAL h REPNZSCASB 不等 Z 0 重复JNZNot Found 满足计数到0则转Found Not Found 程序 LEADI BLOCK 设置数据块地址指针MOVCX COUNT 设置数据块长度MOVAL CHAR 关键字送入AL或AXCLDREPNESCASB CX 0且ZF 0 继续SCASBJZFOUNDMOVDI 0JMPDONEFOUND DECDIMOVPOINTR DI POINTR 关键字地址LEABX BLOCKSUBDI BXINCDI 把搜索次数记下来 DONE HLT 例 一个数据块由大小写英文字母 数字 其他符号组成 用CR ASCII码0DH 结束 数据块首地址为BLOCK1 将其传送到BLOCK2为首地址的内存区 并将英文中小写英文字母 a z 转换成大写英文字母 A Z 其余不变 LEASI BLOCK1LEADI BLOCK2CLDNEXT LODSBCMPAL 0DHJZDONECMPAL 61HJCOKCMPAL 7BHJNCOKSUBAL 20HOK STOSBJMPNEXTDONE HLT 小结 串操作指令重复前缀 操作数 地址指针 串操作指令总结 串传送MOVS 将源串 DS SI 目的串 ES DI SI和DI自动加或减1 2 串比较CMPS 将源串 DS SI 和目的串 ES DI 比较 不影响内容 SI和DI自动加或减1 2 串扫描SCAS 将关键字 AL AX 和目的串 ES DI 的内容比较 SI不变 DI自动加或减1 2 串装入 取 LODS 将源串 DS SI AL AX SI自动加或减1 2 DI不变 串存储STOS 将AL AX 目的串 ES DI SI不变 DI自动加或减1 2 3 2 5控制转移类指令 在8086 8088程序中 指令的地址固定由CS和IP决定 所以说 CS和IP两寄存器的内容决定了程序的流程 改变CS和IP寄存器的值 就改变了程序执行的流程 用于控制程序的执行流程 8086 8088中CS和IP的变化规则 reset复位后 CS FFFFH IP 0故CPU从内存FFFF 0000H处取第一条指令执行 第一条指令在内存的ROM区 非控制转移指令CPU取来一条指令后 自动将IP的值加上该指令的字节数 使IP顺序指向下一条指令 CPU取来紧接着的指令执行 此时IP的变化由CPU内部的硬件自动完成 控制转移指令以CS和IP为主要操作对象改变CS和IP寄存器的值 就改变了程序执行的流程 使程序产生分支 调用结构 例 比较有符号数AX BX的大小 将大数存于max单元 CMPAX BXJGEgreat 大于或等于则转greatXCHGAX BXgreat MOV max AX 包括 无条件转移指令 调用 返回指令 条件转移指令 循环控制指令和中断指令 特点 这些指令有的修改IP 有的修改CS和IP 直接转移 转移的目标地址直接出现在指令中 间接转移 转移的目标地址间接的存储在某个Reg或内存变量中 1 段内直接短转移JMPSHORTlable执行操作 IP IP 8位偏移量目标地址与JMP指令的下一条指令地址之差在 128 127之间 短转移属相对转移 2 段内直接近转移JMPNEARPTRlable执行操作 IP IP 16位位移量 属相对转移 过程 如同SHORT 只是位移量为D16范围 32768 32767H 占有两个字节 目标地址与JMP指令下一条指令的地址之差在 32K之间 指令格式 JMPOPRD 一 无条件转移指令JMP 无条件转移到指令指定地址中去执行 例如 代码段内有一条无条件转移指令在汇编语言中使用符号地址 JMPSHORTNEXT指令执行过程 NEXT 在汇编语言中使用符号地址 IP IP 当前 D8 显然 转移方向有两种 正向 JMPX1负向 X1 X1 JMPX1例 设有一段程序如下 CS 1005H 近转移 汇编语句机器指令偏移地址NEXT MOVBX AX8BD80000HJMPNEARPTRNEXTE9FBFF0002HXORBX BX33D80005H转移地址偏移量 当前IP 位移量 0005H FFFBH 0000H转移地址段基地址 CS 1005H例 NEXT XORBX BX33D80000HJMP1000HE9FB0F0002H转移地址偏移量 当前IP 位移量 0005H 0FFBH 1000H 例 JMPX1 X1是NEAR或SHORT型标号 当使用符号地址时 前面最好加上SHORT或NEARPTR 3 段内间接转移JMPreg或JMPmem转移的目标地址在Reg 16位 或内存单元之中 属于绝对转移 执行操作 IP Reg或IP EA 指令格式举例 JMPAXJMPSIJMPTABLE BX 操作数已定义为16位存储器JMPALPHA WORD 操作数已定义为16位存储器JMPWORDPTR BP DI 例 MOVBX 3100HJMPBX 设当前CS 3000H IP 2400H 则执行此指令后 IP 3100H JMPWORDPTR BX 设DS 2000H 由BX 3100H 如已知 23100H 34H 23101H 12H 则执行此指令后 IP 1234H 4 段间直接转移JMPFARPTRlable 用符号地址时 最好用FARPTR 功能 无条件转移到段间的某一目标地址lable 这也是一种绝对转移指令 执行操作 IP lable的段内偏移地址CS lable所在段的段地址指令本身占有5个字节 用2个字分别存放符号地址的段值 偏移值 用1个字节存放操作码 例1 目标地址也可直接用数值表达式给出 这时可省略FAR属性说明 JMPFARPTR2000H 0100H 程序将转向段地址为2000H 偏移地址为0100H的单元 例2 C1SEGMENT JMPFARPTRnext prog C1ENDSC2SEGMINT next prog C2ENDS 2000 0250H 5 段间间接转移JMPmem执行操作 IP EA 且CS EA 2 EA由mem操作数的寻址方式决定 根据寻址方式确定EA后 把指定存储单元的一个字的内容送IP 并把下一个字送CS 例 MOVSI 0100HJMPDWORDPTR SI 执行这段程序后 把DS SI 即DS 0100H和DS 0101H两单元的字送IP 而把DS 0102H和DS 0103H两单元的字送CS 程序转入由新的CS和新的IP决定的目标地址 例 如果TABLE是数据段中定义的一个变量 偏移地址为0010H 已知DS 1000H 10015H 12H 10016H 34H 10017H 56H 10018H 78H 有指令JMPDWORDPTRTABLE BX 执行时若BX 0005H 则执行后IP 3412H CS 7856H 程序转移到7856H 3412H处 二 调用与返回指令 子程序 程序中具有独立功能的部分编写成独立程序模块 子程序 过程 定义格式 符号名PROC类型 NEAR或FAR 符号名ENDP 过程有两种类型 按过程与调用语句间的位置 过程有两种类型 NEAR类型 调用指令与过程在同一个段中FAR类型 调用指令与过程不在同一个段中 子程序调用指令 CALL子程序名 过程名 用在调用程序中RET 用在被调程序中 CALL调用指令有4种 段内直接调用段间直接调用段内间接调用段间间接调用 1 CALL调用指令 子程序在当前代码段区域中 则将子程序定义为NEAR 这时 CALL子程序名 为段内调用 段内直接调用 目标地址就在CALL指令中 段内间接调用 目标地址在由指令指定的Reg或内存单元中 段内直接CALL子程序名 与子程序的目标地址相关联 执行操作 SP SP 2 SP 1 SP IP IP IP D16 工作过程如下 例 NEAR类型过程 codeSEGMENT code段 CALLsubp YYY入栈断点保护 XXX YYY D16 subp yyy subpPROCNEAR 过程定义 RET 返回 返回地址 YYYsubpENDPcodeENDS 例 两个数据变量X与Y相乘子程序和调用程序在同一个程序模块中 子程序可以直接访问模块中的变量 DATASGSEGMENTXDW100YDW10DATASGENDSCODESGSEGMENTMAINPROCFARASSUMECS CODESG DS DATASGSTART CALLsubp RETMAINENDP subpPROCNEARMOVAX XMOVBX YMULBXRETsubpENDPCODESGENDSENDSTART 例 CALLSUB PROG SUB PROG为NEAR 段内直接CALLAX IP AX 段内间接 Reg CALLWORDPTR BX IP BX 段内间接 mem 自动将IP进堆栈保护 断点保护 再修改IP 段内间接CALLReg或CALLmem子程序的入口地址在Reg中或在mem寻址方式提供的存储单元之中 执行操作 IP Reg或IP EA 子程序不在当前代码段区域中 则将子程序定义为FAR段间直接调用 CALL子程序名段间间接调用 CALLMem自动将当前的CS IP进堆栈保护 断点保护 先入CS再入IP 再修改CS IP 例 CSEG1SEGMENTCALLFARPTRsubp 处的CS IP入栈转subp CSEG1ENDS 例 CALLSUB PROC1 SUB PROC1为FAR 段间直接调用 CALLDWORDPTR DI 段间间接调用 目标地址在 DI DI 1 DI 2 DI 3 4个内存单元中 前2个字节IP 后2个字节为段地址CS CSEG2SEG

温馨提示

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

评论

0/150

提交评论