第三章 8086寻址方式和指令系统.ppt_第1页
第三章 8086寻址方式和指令系统.ppt_第2页
第三章 8086寻址方式和指令系统.ppt_第3页
第三章 8086寻址方式和指令系统.ppt_第4页
第三章 8086寻址方式和指令系统.ppt_第5页
已阅读5页,还剩153页未读 继续免费阅读

下载本文档

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

文档简介

第三章8086的寻址方式和指令系统 3 18086的寻址方式 指令有单操作数 双操作数和无操作数之分 如果是双操作数指令 要用逗号将两个操作数分开 逗号右边的操作数称为源操作数 逗号左边的为目的操作数 MOV功能 将BX中的源操作数 AX 目的 而象单操作数指令INCAX其中AX既是源操作数 又是目的操作数 其功能是 AX 1 AX 而象指令NOP 没有操作数 前面举的例子都是操作数在寄存器中 操作数还可以在存储器或I O端口中 也可以是立即数 8086的寻址方式 下面主要以MOV指令来说明8086的这些寻址方式 一 立即寻址方式 操作数直接包含在指令中 它是一个8位或16位的常整数 也叫立即数 例如MOVAL 30HMOVAX 0FFFCHMOV 1000H 1234H注意 1 常数以A F开头时 应在其前加0 以区别其它符号 如0FFFCH 2 立即数只能作源操作数 不能作目的操作数 如MOV23H BL 二 寄存器寻址方式 操作数包含在寄存器中 对于16位操作数 寄存器可以是AX BX CX DX SI DI SP BP等等 对于8位操作数 寄存器可以是AH AL BH BL CH CL DH DL 例1 MOVDX AX2 MOVBL CL注意 源操作数的长度必须与目的操作数一致 三 直接寻址方式 存储器寻址 1 直接寻址方式 有效地址 EA 操作数的偏移地址 使用直接寻址方式的指令时 存储单元的有效地址直接由指令给出 而段地址如没有指令前缀 默认由数据段寄存器给出 例如MOVAX 2000H 存储单元的有效地址EA 2000H 段地址由数据段DS指定 设DS 3000H 此指令的执行过程如下图所示 指令MOVAX 2000H 的执行过程 2 段超越前缀如果要对代码段 堆栈段或附加段寄存器所指出的存储区进行直接寻址 应在指令中指定段超越前缀 3 符号地址 变量名 在汇编语言中还允许用符号地址代替数值地址 实际上就是给存储单元起一个名字 这样 要与这些单元打交道 只要使用其名字即可 不必记住具体数值是多少 例如MOVAX AREA1这里的AREA1就是操作数的符号地址 该指令执行后 将从有效地址为AREA1的存储单元中取出一个字送到AX中去 注意 光从指令的形式上看 AREA1不仅可代表符号地址 也可以表示它是一个16位的立即数 两者之间究竟如何来区别呢 程序中还必须事先安排说明语句也叫做伪指令来加以说明 四 寄存器间接寻址方式 指令中给出的寄存器中的值不是操作数本身 而是操作数的有效地址EA 这种寻址方式称为寄存器间接寻址 寄存器名称外面必须加方括号 以与寄存器寻址方式相区别 这类指令中使用的寄存器有基址寄存器BX BP及变址寄存器SI DI 例如MOVBX SI 设DS 1000H SI 2000H 12000H 3456H则物理地址 DS 16 SI 10000H 2000H 12000H此指令的功能就是 12000H 字 BX 因此指令执行后BX 3456H 执行过程如下图所示 指令MOVBX SI 的执行过程 例如指令MOVAX BP 则默认操作数在堆栈段中 操作数的物理地址 SS 16 BP 设SS 4000H BP 1000H 41000H 5678H则物理地址 SS 16 BP 40000H 1000H 41000H此指令的功能就是 41000H 字 AX 因此指令执行后AX 5678H 执行过程如下图所示 指令MOVAX BP 的执行过程 寄存器间接寻址方式的指令中也可以指定段超越前缀来从默认段以外的段中取得数据 如 MOVBX DS BP 物理地址 DS 16 BPMOVAX ES DI 物理地址 ES 16 DI 五 寄存器相对寻址方式操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量之和 这种寻址方式与寄存器间接寻址十分相似 主要区别是前者在有效地址的基础上还要加一个位移量 同样 当指令中指定的寄存器是BX SI或DI时 默认的段寄存器是DS 当指定寄存器是BP时 默认的段寄存器是SS 指令MOVBX COUNT SI 的执行过程 六 基址变址寻址方式操作数的有效地址是一个基址寄存器 BX或BP 和一个变址寄存器 SI或DI 的内容之和 两个寄存器均由指令指出 若基址寄存器BX时 段寄存器用DS 若基址寄存器BP时 段寄存器用SS 指令MOVAX BX SI 的执行过程 七 相对基址变址寻址方式操作数的有效地址是一个基址寄存器 BX或BP 和一个变址寄存器 SI或DI 的内容 再加上指令中指定的8位或16位位移量之和 若基址寄存器BX时 段寄存器用DS 若基址寄存器BP时 段寄存器用SS 指令MOVAX MASK BX SI 的执行过程 从以上这些寻址方式可以看到 在涉及到操作数的地址时 常常要在指令中使用方括号 有关带方括号的地址表达式必须遵循下列规则 立即数可以出现在方括号内 表示直接寻址 如 1000H 只有BX BP SI和DI这四个寄存器可以出现在方括号内 它们可以单独出现 也可以由两个寄存器组合起来 只能相加 同时还可以加上一个8位或16位的位移量 但BX和BP不能同时出现在方括号中 SI和DI也不能同时出现在方括号中 由于方括号有相加的含义 下面几种写法都是等价的 6 BX SI BX 6 SI BX SI 6 BX SI 6 若方括号内出现BP 则隐含使用SS段来提供段地址 物理地址 SS 16 EA 其他情况均使用DS段来提供段地址 物理地址 DS 16 EA 当然我们可以通过加段超越前缀来修改段地址 八 其它寻址方式 1 隐含寻址指令中不指明操作数 但有隐含规定的寻址方式 例如指令DAA 它的含义是对寄存器AL中的数据进行十进制数调整 结果仍保留在AL中 2 I O端口寻址分为直接端口寻址和间接端口寻址 直接 端口号由指令直接给出 是一个8位的立即数 端口号范围为 00 FFH 间接 端口号由寄存器DX指定 端口范围为 0000 FFFFH 3 一条指令有几种寻址方式前面介绍的各种寻址方式都是针对源操作数的 目的操作数均用寄存器来表示 实际上 目的操作数也可以除立即寻址方式以外的所有寻址方式指定 4 转移类指令寻址将在后面章节详细介绍 作业 P120 1 2 3 其中1 1 3 5 2 2 4 6 3 2 4 6 8 10 3 2指令的机器码表示方法 一 机器语言指令的编码目的和特点1 机器语言指令用汇编语言 即主要由指令系统组成的语言 编写的程序称为汇编语言源程序 若直接将它送到计算机 机器并不认识那些构成程序的指令和符号的含义 还必须由汇编程序将源程序翻译成计算机能认识的二进制机器语言 机器码 后 才能被计算机识别和执行 得到运算结果 通常 计算机用户采用汇编语言编写程序时 一般可不必了解每条指令的机器码 不过 若要透彻了解计算机的工作原理 以及能看懂包含机器码的程序清单 对程序进行正确的调试 排错等 就需要熟悉机器语言 所以我们要简单介绍一下机器语言指令的基本概念和编码方式 2 机器语言指令的编码特点对于Z80 8085等8位微处理器 进行指令编码是很容易的事 只要有一张指令编码表 汇编语言源程序与机器码之间的 对应关系就一目了然 很容易通过查表求出每条指令的机器码 但对于8086系统来说 由于其很多种寻址方式 很难列出一张8086指令与机器语言的对照表 但我们可以为每种基本指令类型给出一个编码格式 对照格式填上不同的数字来表示不同的寻址方式 数据类型等 就能求得每条指令的机器码 指令通常由操作码和操作数两部分组成 每条指令的操作码列于附录B中 二 机器语言指令代码的编制1 编码格式说明我们用寄存器之间或寄存器与存储器之间交换数据的MOV指令 来说明指令的编码格式 具体格式如图3 7所示 图3 7典型的MOV指令的编码格式 W 位 说明传送数据的类型 W 0 为字节W 1 为字D 位 标明数据传送的方向 D 0 数据从寄存器传出D 1 数据传送到寄存器REG 3位 说明寄存器 段寄存器除外 的名称 与W位共同决定使用的是哪个寄存器 若使用的是段寄存器 则只需REG的低两位来决定 最高位为0 具体编码见表3 1 表3 18086寄存器编码表 在这类MOV指令中有两个操作数 其中有一个必为寄存器 其编号由REG决定 另一个操作数可能是寄存器 也可能是存储单元 由指令代码的MOD和R M来指定 表3 2给出MOD和R M的编码格式 其中D8表示8位位移量 D16为16位位移量 表3 2MOD和R M的编码表 2 寄存器间传送指令的编码例3 18求指令MOVSP BX的机器码 REG决定寄存器SP 图3 8指令MOVSP BX的编码 8BE3H 图3 8 1指令MOVSP BX在代码段中的存放 REG决定寄存器BX 89DCH 图3 9指令MOVSP BX的另一种编码 图3 9 1指令MOVSP BX在代码段中的存放 3 寄存器与存储器间传送指令的编码例3 19求指令MOVCL BX 1234H 的机器码 图3 10指令MOVCL BX 1234H 的编码 8A8F3412H 图3 10 1指令MOVCL BX 1234H 在代码段中的存放 4 立即数寻址指令的编码例3 20求指令MOVDX 5678H的机器码 BA7856H 求指令MOVBH 34H的机器码 B734H 例3 21求指令MOV BX 2100H 0FA50H的机器码 C787002150FAH 图3 11 1指令MOV BX 2100H 0FA50H在代码段中的存放 5 包含段寄存器的指令的编码例3 22求指令MOVDS AX的机器码 8ED8H 6 段超越前缀指令的编码对于带有段超越前缀的指令编码时 要在指令代码前加一个8位的段超越前缀代码 代码的格式为001 110 其中 位表明段超越前缀寄存器 编码与上面列出的相同 指令的其他代码仍按前面的方法求得 例3 23若指令MOV BX DL的机器码为8817H 试求指令MOVCS BX DL的代码 解 需增加的字节为001 110CS 01所以 需增加的字节为00101110 2EH所以 所求的指令机器码为2E8817H 3 38086的指令系统 8086指令系统中包含133条基本指令 分六大类 数据传送指令 算术运算指令 逻辑运算和移位指令 字符串操作指令 控制转换指令 处理器控制指令 一 数据传送指令 分4类 通用数据传送指令 输入输出指令 地址目标传送指令 标志传送指令 1 通用数据传送指令 1 MOV传送指令指令格式 MOV目的 源指令功能 将源操作数 一个字节或一个字 传送到目的操作数 几点说明 指令中 立即数不能作为目的操作数 CS和IP也不能作为目的操作数 即它们的值不能随意修改 同时IP还不能作为源操作数 两个内存单元之间 以及两个段寄存器之间不能直接传送数据 立即数不能直接传送给段寄存器 必须通过寄存器传送给段寄存器 当指令是给SS段寄存器赋值时 系统会自动禁止外部中断 等到本条指令和下条指令执行之后 又自动开中断 目的 针对第 点说明 我们简单了解一下一个数据段的定义 以及段地址 DS 例如 下面是某个程序的数据段 DATASEGMENT 数据段开始AREA1DB14H 3BHAREA2DB3DUP 0 ARRAYDW3100H 01A6HSTRINGDB GOOD DATAENDS 数据段结束 图3 13数据段占用存储空间的情况 2 PUSH进栈指令指令格式 PUSH源指令功能 将源操作数压入堆栈 源操作数可以是16位通用寄存器 段寄存器或存储器中的数据字 但不能是立即数 3 POP出栈指令指令格式 POP目的指令功能 将当前SP和SP 1所指向的单元内容 目的操作数 源操作数可以是16位通用寄存器 段寄存器或存储器中的数据字 但CS不能作为目的操作数 例3 29假如当前SS C000H SP 1000H AX 1234HBX 5678H CX ABCDH 则执行指令PUSHAX PUSHBX POPCX后 堆栈中的内容发生什么变化 AX BX CX中的内容又是多少 画图说明 4 XCHG交换指令指令格式 XCHG目的 源指令功能 把一个字或字节的源操作数和目的操作数相交换 几点说明 段寄存器 IP 立即数不能作为操作数 两个存储单元之间不能直接交换数据 目的和源操作数的长度必须一致 5 XLAT表转换指令 查表指令 指令格式 XLAT转换表指令功能 将一个字节从一种代码转换成另一种代码 使用过程 在内存中建立一个表格 就是定义一段字节数据 这些数据就是转换以后的代码 将表的首地址 BX寄存器中 只能是BX 在AL中存放一个数据 就是需要转换的代码 而这个数据实际是表的首地址与所要查找的某一项之间的位移量 表格中最多包含256个字节 执行XLAT指令 指令执行后 将转换后的代码 所查的字节内容 就 AL中 例3 31如下图所示的8段数码管 显示段码的格式为 dpgfedcba 2 当相应的位为 1 时 此段就显示 为 0 时 就不显示 如0的段码为 00111111 2 3FH 1的段码为 00000110 2 06H等等 现要求编一程序段 通过查表将5的显示段码 DL中 程序如下 DISPDB3FH 06H 5BH 4FH 66HDB6DH 7DH 07H 7FH 6FH MOVBX OFFSETDISP 表首址 BXMOVAL 5 5的段码与表首址之间的位移量 ALXLAT XLATDISP 5的段码6DH ALMOVDL AL 5的段码6DH保存到DL 2 输入输出指令用来完成I O端口与累加器之间的数据传送 指令中要给出I O端口的地址 1 IN输入指令指令格式 INAL 端口地址 INAX 端口地址 INAL DX INAX DX 指令功能 从8位端口读一个字节 AL 或从16位端口读一个字 AX INAL 50H 从50H端口读一个字节 AL 2 OUT输出指令指令格式 OUT端口地址 AL OUT端口地址 AX OUTDX AL OUTDX AX 3 地址目标传送指令 用来传送操作数的段地址和偏移地址 1 LEA取有效地址指令指令格式 LEA目的 源指令功能 取源操作数的偏移地址 目的要求 源操作数必须是内存单元 目的操作数必须是一个16位的寄存器 段寄存器除外 使用时 要注意与MOV指令的区别 2 LDS将双字指针送到寄存器和DS指令指令格式 LDS目的 源指令功能 从源操作数指定的存储单元中 取出一个变量的4字节地址指针 送到一对目的寄存器 其中前两个字节 表示变量的偏移地址 送到指令中指定的目的寄存器 后两个字节 表示变量的段地址 送到DS段寄存器中 要求 源操作数必须是内存单元 从该单元开始的连续4个字节单元中 存放着一个变量的地址指针 偏移地址和段地址 目的操作数必须是一个16位的寄存器 段寄存器除外 常使用SI寄存器 3 LES将双字指针送到寄存器和ES指令指令格式 LES目的 源指令功能 从源操作数指定的存储单元中 取出一个变量的4字节地址指针 送到一对目的寄存器 其中前两个字节 表示变量的偏移地址 送到指令中指定的目的寄存器 后两个字节 表示变量的段地址 送到ES段寄存器中 要求 源操作数必须是内存单元 从该单元开始的连续4个字节单元中 存放着一个变量的地址指针 偏移地址和段地址 目的操作数必须是一个16位的寄存器 段寄存器除外 常使用DI寄存器 4 标志传送指令 对标志寄存器FLAGS进行操作 1 LAHF 标志送到AH指令指令格式 LAHF指令功能 把标志寄存器的低8位对应 AH 2 SAHF AH送到标志寄存器指令指令格式 SAHF指令功能 把AH对应 标志寄存器的低8位 其高8位保持不变 3 PUSHF 标志入栈指令指令格式 PUSHF指令功能 把整个标志寄存器的内容压入堆栈 同时修改SP SP 2 SP 4 POPF 标志出栈指令指令格式 POPF指令功能 把当前堆栈指针SP所指的一个字 传送到标志寄存器 同时修改SP SP 2 SP 二 算术运算指令 算术运算指令可以处理4种类型的数 无符号二进制整数 带符号二进制整数 用补码表示 无符号压缩十进制整数 一个字节中存放两个BCD码十进制数 无符号非压缩十进制整数 只在一个字节的低半字节存放一个BCD码十进制数 而高半字节为0 8086指令系统提供了加 减 乘 除四种基本运算指令 可处理无符号或带符号的8位或16位二进制数的算术运算 还提供了各种调整操作指令 故可进行压缩的或非压缩的十进制数的算术运算 绝大部分算术运算指令都影响状态标志位 对于加法和减法运算指令 带符号数和无符号数的加法和减法运算的操作过程是一样的故可以用同一条加法或减法指令来完成 而对于乘法和除法运算 带符号数和无符号数的运算过程完成不同 必须分别设置无符号数的乘除法指令 1 加法指令 1 ADD不带进位的加法指令指令格式 ADD目的 源指令功能 源 目的 目的 2 ADC带进位的加法指令指令格式 ADC目的 源指令功能 源 目的 CF 目的 例3 41求下列指令执行后 对标志位有何影响 MOVAL 5EHADDAL 3CH 上述这些标志位我们程序员不是每个都需要关心 要分不同情况考虑 当程序员把上两数看成是无符号数相加时 在这里SF和OF就没有什么实际意义了 只要关心CF就可以了 当程序员把上两数看成是有符号数相加时 这时CF位就没有什么意义了 而需要考虑SF和OF位 当进行BCD码运算或需要进行奇偶校验时 才考虑AF或PF标志位 3 INC增量指令指令格式 INC目的指令功能 目的 1 目的 4 AAA加法的ASCII调整指令指令格式 AAA指令功能 在用ADD或ADC指令对两个非压缩十进制数或ASCII码表示的十进制数作加法后 运算结果已存在AL的情况下 用此指令将AL寄存器中的运算结果调整为1位非压缩十进制数 仍保留在AL中 如果AF 1 表示向高位有进位 则进位进到AH中 AAA指令执行时 对AL中的运算结果进行调整的过程如下 若AL低4位 9或辅助进位AF 1 则 AL 6 AL 用与操作将AL高4位清0 低4位不变 AF置1 CF置1 AH 1 AH否则 仅将AL寄存器的高4位清0 例3 44若AL BCD9 BL BCD5 求两数之和 设AH 0 下面看看运算过程 例3 45求ASCII码表示的数9 39H 和5 35H 之和 设AH 0 则运算过程如下 5 DAA加法的十进制调整指令指令格式 DAA指令功能 将两个压缩BCD数相加后的结果调整为正确的压缩BCD数 相加后的结果必须在AL中 才能使用DAA指令 例3 46若AL BCD38 BL BCD15 求两数之和 下面看看运算过程 例3 47若AL BCD88 BL BCD49 求两数之和 下面看看运算过程 2 减法指令 1 SUB不带借位的减法指令指令格式 SUB目的 源指令功能 目的 源 目的 2 SBB带借位的减法指令指令格式 SBB目的 源指令功能 目的 源 CF 目的 3 DEC增量指令指令格式 DEC目的指令功能 目的 1 目的 4 NEG取负指令 求补指令 指令格式 NEG目的指令功能 0 目的 目的 5 CMP比较指令指令格式 CMP目的 源 6 AAS减法的ASCII调整指令指令格式 AAS指令功能 在用SUB或SBB指令对两个非压缩十进制数或ASCII码表示的十进制数作减法后 运算结果已存在AL的情况下 对AL中的所得结果调整 在AL中得到一个正确的非压缩十进制数之差 如果有借位 则CF置1 AAS指令必须紧跟在SUB或SBB指令之后 例3 54设AL BCD3 CL BCD8 求两数之差 显然 结果为BCD5 但要向高位借位 调整过程如下 7 DAS减法的十进制调整指令指令格式 DAS指令功能 将两个压缩BCD数相减后的结果调整为正确的压缩BCD数 相减后的结果必须在AL中 才能使用DAS指令 例3 55设AL BCD56 CL BCD98 求两数之差 调整过程如下 3 乘法指令 1 MUL无符号数乘法指令指令格式 MUL源指令功能 把源操作数和累加器中的数都当成是无符号数 然后将两数相乘 源操作数可以是字节或字 2 IMUL有符号数乘法指令 指令格式 IMUL源指令功能 把源操作数和累加器中的数都当成是有符号数 然后将两数相乘 源操作数可以是字节或字 3 AAM乘法的ASCII调整指令指令格式 AAM指令功能 对已存在AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整 使得在AX中得到正确的非压缩十进制数的乘积 高位放在AH中 低位放在AL中 两个ASCII码数相乘之前 必须先屏蔽掉每个数字的高半字节 从而使每个字节包含一个非压缩十进制数 再用MUL指令相乘 乘积放到AL寄存器中 然后用AAM指令进行调整 4 除法指令 1 DIV无符号数除法指令指令格式 DIV源指令功能 把源操作数和累加器中的数都当成是无符号数 然后将两数相除 源操作数可以是字节或字 2 IDIV带符号数除法指令指令格式 IDIV源指令功能 该指令执行的操作与DIV相同 但操作数都必须是带符号数 商和余数也都是带符号数 而且规定余数的符号和被除数的符号相同 25 3 商 8 余数 1 规定 商 9 余数 2 3 CBW把字节转换成字指令指令格式 CBW指令功能 把寄存器AL中字节的符号位扩充到AH的所有位 这时AH被称为是AL的符号扩充 4 CWD把字转换成双字指令指令格式 CWD指令功能 把寄存器AX中字的符号位扩展到DX寄存器的所有位中去 5 AAD除法的ASCII调整指令指令格式 AAD指令功能 在做除法之前 把BCD码转换成二进制数 三 逻辑运算和移位指令逻辑运算和移位指令对字节或字操作数进行按位操作 1 逻辑运算指令 1 NOT取反指令指令格式 NOT目的指令功能 将目的操作数求反 结果送回目的操作数 即 目的 2 AND逻辑与指令指令格式 AND目的 源指令功能 对两个操作数进行按位逻辑与操作 结果送回目的操作数 3 OR逻辑或指令指令格式 OR目的 源指令功能 对两个操作数进行按位逻辑或操作 结果送回目的操作数 4 XOR异或操作指令指令格式 XOR目的 源指令功能 对两个操作数进行按位逻辑异或操作 结果送回目的操作数 5 TEST测试指令指令格式 TEST目的 源指令功能 对两个操作数进行按位逻辑与操作 并修改标志位 但不送回结果到目的 即指令执行后 两个操作数都不变 仅影响标志位 2 算术逻辑移位指令 非循环移位指令 可对寄存器或存储器中的字或字节的各位进行算术移位或逻辑移位 移位的次数由指令中的计数值决定 1 SAL算术左移指令指令格式 SAL目的 计数值 2 SHL逻辑左移指令指令格式 SHL目的 计数值 3 SHR逻辑右移指令指令格式 SHR目的 计数值 4 SAR算术右移指令指令格式 SAR目的 计数值 3 循环移位指令上述的算术逻辑移位指令 移出操作数的数位均被丢失 而循环移位指令把操作数从一端移到操作数的另一端 这样从操作数中移走的位就不丢失了 1 ROL循环左移指令指令格式 ROL目的 计数值 2 ROR循环右移指令指令格式 ROR目的 计数值 3 RCL带进位的循环左移指令指令格式 RCL目的 计数值 4 RCR带进位的循环右移指令指令格式 RCR目的 计数值 习题 10 1 字符串传送指令2 字符串比较指令3 字符串检索指令4 取字符串指令5 存字符串指令6 I O串操作指令 四 字符串处理指令 1 字符串传送指令 MOVSB MOVSW MOVSD操作 1 ES DI DS SI 可传送字节 字 2 自动修改地址指针 3 每次只传送一个字节或字 2 字符串比较指令CMPSB CMPSW指令格式 CMPSB目的串 源串或CMPSW目的串 源串 例比较两个字符串 一个是你在程序中设定的口令串PASSWORD 另一个是从键盘输入的字符串IN WORD 若输入串与口令串相同 程序将开始执 否则 程序驱动PC机的扬声器发声 警告用户口令不符 拒绝往下执行 这可以用CMPSB指令来实现 有关程序段如下 LEASI PASSWORD 源串指针LEADI IN WORD 目的串指针MOVCX COUNT 串长度CLD 使DF 0 SI DI自动增加REPZCMPSB CX 0且串相同时重复JNZSOUND 若不相等 转发声程序OK 比较完且相同 往下执行 SOUND 3 字符串检索指令SCASB SCASW SCASD MOVDI OFFSETSTRING DI 字符串偏移地址 0MOVCX COUNT CX 字符串长度MOVAL A AL 关键字A的ASCII码CLD DF 0 DI自动加1REPNESCASB CX 0 没查完 且不相同时重复JZFIND 若ZF 1 表示已搜索到 转出MOVDI 0 若ZF 0 表示没搜索到 则DI 0FIND MOVBX DI 搜索次数 BX 上述程序中 DI初值存起始地址偏移量0 搜索一次后DI自动加1 使DI的值等于1 以后 每执行一次搜索操作 DI自动加1 所以 正好可用DI的值来表示搜索次数 4 取字符串指令LODSB LODSW LODSD 5 存字符串指令STOSB STOSW STOSD 6 I O串操作指令 INSB OUTSB INSW OUTSW INSD OUTSD INSB INSW INSD 从一个输入端口读一串数据送到DI或EDI 在DF控制下每输入一次 DI或EDI自动修改 并修改CX或ECX OUTSB OUTSW OUTSD 从SI或ESI输出一串数据到输出端口 在DF控制下每输入一次 SI或ESI自动修改 并修改CX或ECX 注意 1 I O串操作指令在用时 必须将端口号预先存在DX中 2 可使用重复前缀 要求I O端口的速度和指令执行速度匹配 例INSBOUTSD 字符串操作指令共同特点如下 1 关于转移指令和调用指令的寻址2 过程调用和返回指令3 无条件转移指令和条件转移指令4 循环控制指令5 中断指令INT和中断返回指令IRET IRETD 五 控制转移指令 1 关于转移指令和调用指令的寻址 1 段内直接转移方式JMPSHORT如 JMP1000H 2 段内间接转移方式JMP16位寄存器如 JMPCX 3 段间直接转移方式JMPFARPTR标号如 JMP2000H 1000H 4 段间间接寻址方式JMPDWORDPTR 存储单元 如 JMPDWORDPTR SI 2 子程序调用和返回指令 CALLCALL1000H 段内直接调用CALLAX 段内间接调用CALL2500H 3600H 段间直接调用CALLDWORDPTR DI 段间间接调用RETRETRETn 3 无条件转移指令和条件转移指令 1 JMP 2 J 代表各种条件 1 JMP无条件转移指令指令格式 JMP目的指令功能 使程序无条件地转移到指令中指定的目的地址去执行 无条件转移指令可分为 段内直接转移 段内间接转移 段间直接转移 段间间接转移 2 条件转移指令根据某一状态标志位的值或某个比较结果作为判别转移的依据 若条件成立 便转向指令中给出的目的地址 去执行那里的指令 否则 程序仍顺序执行 条件转移指令通常用在比较指令后 根据比较结果决定是否转移 在指令中 目的地址均用标号表示 因此指令的格式为 条件操作符标号 条件转移指令共有18条 可以归类成以下两大类 直接标志转移指令这类转移指令在指令助记符中直接给出标志状态的测试条件 它们以CF ZF SF OF和PF等5个标志的10种状态为判断的条件 共形成10条指令 ADDAL BL 两数相加JCNEXT 若有进位 转NEXTMOVAH 0 无进位 AH清0JMPEXIT 往下执行NEXT MOVAH 1 有进位 AH置1EXIT 程序继续进行 例求AL和BL寄存器中的两数之和 若有进位 则AH置1 否则AH清0 可用如下程序段来实现该操作 间接标志转移这类指令以某一个标志的状态或几个标志的状态组合 作为测试的条件 若条件成立则转移 否则程序顺序往下执行 间接标志转移指令共有8条 列于下表中 每条指令都有两种不同的助记符 中间用 隔开 4 循环控制指令 1 LOOP 2 LOOPZ LOOPE 3 LOOPNZ LOOPNE 1 LOOP计数循环指令指令格式 LOOP短标号 例将位于DS段连续的100个字节的单元内容都加1 其中第一个字节单元的偏移地址由SI来指定 程序段如下 MOVCX 100 共100个字节JIA1 ADD SI 1INCSILOOPJIA1 2 LOOPE LOOPZ相等或结果为0循环指令格式 LOOPE短标号或LOOPZ短标号 例设以SSS开始的内存单元中存放了100个字节的数据 编程要求找出其中第一个非0元素 并记下其偏移地址送到DI中 若全是0 则将DI清0 3 LOOPNE LOOPNZ不相等或结果不为0循环指令格式 LOOP

温馨提示

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

评论

0/150

提交评论