第三章 指令系统_第1页
第三章 指令系统_第2页
第三章 指令系统_第3页
第三章 指令系统_第4页
第三章 指令系统_第5页
已阅读5页,还剩230页未读 继续免费阅读

下载本文档

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

文档简介

第3章8086寻址方式和指令系统 3 18088 8086的寻址方式3 2指令的机器码表示方法3 38088 8086的指令系统 3 18088 8086CPU的寻址方式 计算机的指令通常包含操作码和操作数两部分 前者指出操作的性质 后者给出操作的对象 寻找和获得操作数 操作数存放地址或指令转移地址的方法称为寻址方式 8086访问操作数采用多种灵活的寻址方式 使指令系统可以方便地在1M存储空间内寻址 指令有单操作数 双操作数和无操作数之分 如果是双操作数指令 要用逗号将两个操作数分开 逗号右边的操作数称为源操作数 左边的为目的操作数 指令的一般格式 操作码操作数 操作数计算机中的指令由操作码字段和操作数段组成 操作码 指计算机所要执行的操作 或称为指出操作类型 是一种助记符 操作数 指在指令执行操作的过程中所需要的操作数 该字段除可以是操作数本身外 也可以是操作数地址或是地址的一部分 还可以是指向操作数地址的指针或其它有关操作数的信息 一 立即寻址方式所提供的操作数直接包含在指令中 它紧跟在操作码的后面 与操作码一起放在代码段区域中 如图所示 例如 MOVCX 2A50H 立即寻址方式的指令常用来给寄存器赋初值 立即数不但可以送到寄存器中 还可以送到一个存储单元 8位 中或两个连续的存储单元 16位 中去 在所有的指令中 立即数只能作源操作数 不能作目的操作数 另外要注意 以A F打头的数字出现在指令中时 前面一定要加一个数字0 以免与其它符号相混淆 如将立即数FF00H送到AX的指令必须写成如下形式 MOVAX 0FF00H 二 寄存器寻址方式在这种寻址方式下 操作数包含在寄存器中 由指令指定寄存器的名称 对于16位操作数 寄存器可以是AX BX CX DX SI DI SP和BP等 对于8位操作数 则用寄存器AH AL BH BL CH CL DH和DL 例如 MOVDX AXMOVCL AH注意 源操作数的长度必须与目的操作数一致 否则会出错 例如 不能将AH寄存器的内容传送到CX中去 尽管CX寄存器放得下AH的内容 但汇编程序不知道将它放到CH还是CL中 这种寻址方式的优点是 寄存器数量一般在几个到几十个 比存储器单元少很多 因此它的地址码短 从而缩短了指令长度 节省了程序存储空间 另一方面 从寄存器里取数比从存储器里取数的速度快得多 从而提高了指令执行速度 三 直接寻址方式1 直接寻址方式在IBMPC机中 把操作数的偏移地址称为有效地址EA 使用直接寻址方式的指令时 存储单元的有效地址直接由指令给出 在它们的机器码中 有效地址存放在代码段中指令的操作码之后 而该地址单元中的数据总是存放在存储器中 所以必须先求出操作数的物理地址 然后再访问存储器 才能取得操作数 当采用直接寻址指令时 如果指令中没有用前缀指明操作数存放在哪一段 则默认为使用的段寄存器为数据段寄存器DS 操作数的物理地址 16 DS EA 10H DS EA 指令中有效地址上必须加一个方括号 以便与立即数相区别 例如 MOVAX 2000H MOVAL 2000H 2 段超越前缀如果要对代码段 堆栈段或附加段寄存器所指出的存储区进行直接寻址 应在指令中指定段超越前缀 例如 数据若放在附加段中 则应在有效地址前加 ES 这里的冒号 称为修改属性运算符 计算物理地址时要用ES作基地址 而不再是默认值DS 例如 MOVAX ES 500H 该指令的源操作数的物理地址等于16 ES 500H 3 符号地址在汇编语言中还允许用符号地址代替数值地址 实际上就是给存储单元起一个名字 这样 如果要与这些单元打交道 只要使用其名字即可 不必记住具体数值是多少 例如 MOVAX AREA1光从指令的形式上看 AREAl不仅可代表符号地址 也可以表示它是一个16位的立即数 两者之间究竟如何来区别呢 程序中还必须事先安排说明语句也叫做伪指令来加以说明 例如 AREA1EQU0867HMOVAX AREA1例如 AREA1DW0867HMOVAX AREA1 该指令也可写为MOVAX AREA1 符号地址也允许段超越 下面两条指令是等价的 即 MOVAX ES AREA1MOVAX ES AREA1 源操作数的物理地址 16 ES AREA1 四 寄存器间接寻址指令中给出的寄存器中的值不是操作数本身 而是操作数的有效地址 这种寻址方式称为寄存器间接寻址 寄存器名称外面必须加方括号 以与寄存器寻址方式相区别 这类指令中使用的寄存器有基址寄存器BX BP及变址寄存器SI DI 如果指令中指定的寄存器是BX SI或DI 则默认操作数存放在数据段中 这时要用数据段寄存器DS的内容作为段地址 操作数的物理地址由DS左移4位后与BX SI或Dl相加形成 例如 MOVBX SI 设DS 1000H SI 2000H 12000H 318BH则物理地址 16 DS SI 10000H 2000H 12000H 如果指令中用寄存器BP进行间接寻址 则默认操作数在堆栈段中 操作数的段地址在寄存器SS中 操作数的物理地址 16 SS BP 指令也可以指定段超越前缀来从默认段以外的段中取得数据 这种寻址方式一般用于访问表格 执行完一条指令后 通过修改SI DI BX或BP的内容就可访问到表格的下一数据项的存储单元 五 寄存器相对寻址方式操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量之和 这种寻址方式与寄存器间接寻址十分相似 主要区别是前者在有效地址上还要加一个位移量 同样 当指令中使用BX SI或DI寄存器时 段寄存器使用DS 当指定寄存器是BP时 段寄存器使用SS 物理地址 16 DS BX 8位或16位位移量或 16 DS SI 8位或16位位移量或 16 DS DI 8位或16位位移量或 16 SS BP 8位或16位位移量 例如 MOVBX COUNT SI 六 基址变址寻址方式操作数的有效地址是一个基址寄存器 BX或BP 和一个变址寄存器 SI或DI 的内容之和 两个寄存器均由指令指定 若 基址寄存器为BX时 段址寄存器用DS则 物理地址 16 DS十BX十SI或 16 DS BX十DI若 基址寄存器为BP时 段址寄存器应用SS则 物理地址 16 SS十BP SI或 16 SS十BP十DI 例如 MOVAX BX SI 设 DS 3000H BX 1200H SI 0500H 31700H 0ABCDH则 物理地址 16 DS十BX十SI 30000H 1200H 0500H 31700H执行结果AX 0ABCDH 指令中的方括号有相加的意思 上述指令也可以写成 MOVAX BX SI 七 相对基址变址寻址方式操作数的有效地址是一个基址寄存器和一个变址寄存器的内容 再加上指令中指定的8位或16位位移量之和 若 基址寄存器为BX时 用DS作段寄存器则 物理地址 l6 DS十BX十SI 8位或16位位移量或 l6 DS十BX十DI 8位或16位位移量若 基址寄存器为BP时 用SS作段寄存器则 物理地址 l6 SS十BP十SI 8位或16位位移量或 l6 SS十BP十DI 8位或16位位移量 例如 MOVAX MASK BX SI 设 DS 2000H BX 1500H SI 0300H MASK 0200H 21A00H 26BFH则 物理地址 16 DS BX SI MASK 20000H 1500H 0300H 0200H 21A00H执行结果 AX 26BFH 同样 上述指令也可写成 MOVAX MASK BX SI MOVAX 200H BX SI MOVAX MASK BX SI 八 其它1 隐含寻址指令中不指明操作数 但有隐含规定的寻址方式 例如指令DAA 它的含义是对寄存器AL中的数据进行十进制数调整 结果仍保留在AL中 2 I O端口寻址8086有直接端口和间接端口两种寻址方式 在直接端口寻址方式中 端口地址由指令直接提供 它是一个8位立即数 由于一个8位二进制数的最大值为255 所以在这种寻址方式中 能访问的端口号为00 FFH 即256个端口 例如 INAL 63H在间接寻址方式中 被寻址的端口号由寄存器DX提供 这种寻址方式能访问多达64K个I O端口 端口号为0000 0FFFFH 例如 MOVDX 213HINAL DX3 一条指令有几种寻址方式上面介绍的各种寻址方式都是针对源操作数的 目的操作数均用寄存器来表示 实际上 目的操作数也可以用除立即寻址方式以外的所有寻 址方式指定 许多指令还具有各自的隐含规则 所以一条指令可能包含几种寻址方式 例如 MOV BX AL设 BX 3600H DS 1000H AL 05H目的操作数的物理地址 16 DS十BX 10000H十3600H 13600H指令执行结果为 13600H 05H 3 2指令的机器码表示方式一 机器语言指令的编码目的和特点用汇编语言 即主要由指令系统组成的语言 编写的程序称为汇编语言源程序 若直接将它送到计算机 机器并不认识那些构成程序的指令和符号的含义 还必须由汇编程序将源程序翻译成计算机能认识的二进制机器语言指令 机器码 后 才能被计算机识别和执行 得到运算结果 8086指令系统采用变长指令 指令的长度可由l 6字节组成 一字节指令中只包含8位操作码 没有操作数 如清进位位指令CLC的机器码为11111000 可直接从指令编码表中查到 对于大部分指令来说 除了操作码 不一定是8位 外 还包含操作数部分 所以要由几个字节组成 不同的指令 其操作码和寻址方式都是不一样的 故指令的长度也不一样 二 编码格式说明以MOV指令为例MOV传送 寄存器 存储器与寄存器之间交换数据 指令编码格式为 3 38088 8086CPU的指令系统 3 3 1数据传送指令8086 8088有四类传送指令 分别是 通用传送指令 累加器专用传送指令 地址传送指令和标志传送指令 1 通用传送指令 表3 1通用传送指令 1 通用传送指令MOV可实现寄存器之间 寄存器和存储器之间传送数据 还可实现将立即数送至寄存器或存储单元的操作 汇编格式 MOV目的操作数 源操作数执行的操作 目的操作数 源操作数功能 将源操作数存入目的操作数的寄存器或存储单元中去 注意 目的操作数不能是立即寻址方式 源操作数与目的操作数不能同时为存储器寻址方式 即两个内存单元之间不能直接传送数据 立即数不能直接送段寄存器 即段寄存器只能通过寄存器或存储单元传送数据 两个段寄存器之间不允许直接传送数据 不允许给CS IP PSW三个寄存器传送数据 即这3个寄存器的值用户无权改变 源操作数和目的操作数必须字长相等 MOV指令不影响标志位 例 DATA是用户定义的一个数据段的段名 则 MOVAX DATAMOVDS AX两条指令完成对DS段寄存器的赋值 若写成 MOVDS DATA则是错误的 如果把CPU内部的寄存器细分为段寄存器和寄存器的话 则MOV指令有九种形式 从寄存器到寄存器 从寄存器到段寄存器 从寄存器到存储器 从段寄存器到寄存器 从存储器到寄存器 从段寄存器到存储器 从存储器到段寄存器 从立即数到寄存器 从立即数到存储器 MOV指令的九种形式如下图所示 MOV指令的九种形式 说明 存储器寻址有直接 寄存器间接 寄存器相对 基址变址和相对基址变址等五种寻址方式 2 进栈指令PUSH及出栈指令POP堆栈是由若干个连续存储单元组成的 后进先出 或 先进后出 存储区域 它的段地址存于SS寄存器中 它只有一个数据出入口 堆栈指针寄存器SP任何时候都指向当前的栈顶 入栈出栈都必须通过SP来确定 如果有数据PUSH压入或POP弹出 SP必须及时修改 以保证SP始终指向当前的栈顶位置 在子程序调用和中断处理过程中 分别需要保存返回地址和断点地址 即将当前CS和IP的值压栈 在进入子程序和中断处理后 还需要保存通用寄存器的值 子程序和中断处理程序将要返回时 则要恢复通用寄存器的值 子程序和中断处理程序返回时 要将返回地址或断点地址出栈 这些功能都要通过堆栈指令来实现 PUSH指令汇编格式 PUSH源操作数执行的操作 SP SP 2先修改指针 SP 1 SP 操作数功能 将16位寄存器 段寄存器 16位存储单元数据压入堆栈 POP指令汇编格式 POP目的操作数执行操作 操作数 SP 1 SP SP SP 2后修改指针 功能 将堆栈中的16位数据送入16位寄存器 段寄存器 16位存储单元中 说明 在8086 8088中 PUSH POP指令的操作数不能使用立即寻址方式 POP指令的操作数还不能使用CS寄存器 堆栈中数据的压入 弹出必须以字为单位 所以PUSH和POP指令只能作字操作 这两条堆栈指令不影响标志位 例 MOVAX 1234HPUSHAX设执行前SS 2000H SP 00FEH 指令执行过程如下图所示 执行后SS 2000H SP 00FCH 2000 0000H2000 0000H2000 0001H2000 0001H SP 2000 00FCH342000 00FDH12 SP 2000 00FEH2000 00FEH2000 00FFH2000 00FFH a b 压栈操作示意图 a 指令执行前情况 b 指令执行后情况 3 PUSHF指令 汇编格式 PUSHF执行的操作 SP SP 2 SP 1 SP PSW功能 将标志寄存器内容压入堆栈 4 POPF指令汇编格式 POPF执行的操作 PSW SP 1 SP SP SP 2功能 将16位堆栈数据弹出送入标志寄存器中 说明 8086 8088指令系统中没有设置改变TF标志位的指令 若要改变TF值 先用PUSHF指令将标志压栈 然后设法改变对应TF标志位的位值 再用POPF指令弹出送给PSW 即可完成改变PSW中TF标志位的值 例 若想设置TF 1 程序段如下 PUSHFPOPAXORAH 01H 修改TF位PUSHAXPOPF 5 XCHG指令互换指令XCHG可以实现字互换或字节互换 互换可以在寄存器之间进行 也可以在寄存器和存储单元之间进行 汇编格式 XCHG目的操作数 源操作数执行的操作 互换源 目的两个操作数的存放位置 说明 源 目的操作数的寻址方式不允许是立即寻址方式 两个寻址方式中 必须有一个是寄存器寻址 即两个存储单元之间不能直接互换数据 所有的段寄存器以及IP寄存器不允许使用本条指令与其他寄存器互换数据 此指令不影响标志位 例XCHGBX BP SI 指令执行前 BX 1234H BP 0100H SI 0020H SS 1F00H 1F120H 0000H 则源操作数物理地址 1F00H 10H 0100H 0020H 1F00H 10H 0120H 1F120H指令执行后 BX 0000H 1F120H 1234H 3 XLAT换表指令汇编格式 XLAT或XLAT转换表执行的操作 AL BX AL 说明 XLAT指令是将AL的内容替换成存储单元中的一个数 往往用于代码转换 例如 把字符的扫描码转换成ASCII码或者把十六进制数0 F转换成七段数码管显示代码 使用此指令前 先在数据段建立一个表格 表格首地址存入BX寄存器 欲取代码的表内位移量存入AL寄存器中 XLAT指令将AL值扩展成16位 与BX相加形成一个段偏移地址 段地址取DS 据此读出代码送入AL寄存器 该指令有两种格式 第二种格式中的地址标号是指代码表的表首地址 它只是为提高程序可读性而设置的 指令执行时只使用预先存入BX中的代码表首地址 而并不用汇编格式中指定的地址标号 AL是一个8位无符号数 所以表格中最多只能存放256个代码 此指令的执行结果不影响标志位 例3 21 一个七段LED显示代码转换表存于TABLE开始的存储区 则TABLEDB40H 79H 24H 30H 19HDB12H 02H 78H 00H 18H MOVAL 4MOVBX OFFSETTABLEXLAT完成了将BCD码4转换成七段LED显示代码的工作 2 输入输出指令这类指令都仅限于I O端口或存储单元与累加器AL AX 之间传送数据 具体包括IN输入指令 OUT输出指令 1 IN输入指令汇编格式 INAL 端口地址或INAX 端口地址INAL DX 端口地址存放在DX寄存器中或INAX DX执行的操作 AL 端口地址 或AX 端口地址 1 端口地址 说明 该指令的目的操作数仅限于累加器 即8位操作采用AL 16位操作采用AX 不能由其他任何寄存器代替 如果I O寻址的端口地址号在8位以内 可以用直接寻址方式 地址表达式则由一个8位立即数表示 如果I O寻址的端口地址号在16位以内 可以用寄存器间接寻址方式 所寻址的地址端口号则装入DX 间接寻址仅可以使用DX 例 IN指令中也可以使用符号来表示地址 例如下面指令从一个模 数转换器读入一个字节的数字量到AL中 ATODEQU54H A D转换器端口地址为54HINAL ATOD 将54H口的内容读入AL中 2 OUT输出指令汇编格式 OUT端口地址 AL或OUT端口地址 AXOUTDX AL DX 端口地址或OUTDX AX执行的操作 端口地址 AL 或 端口地址 1 端口地址 AX 说明 同1 下面是几个用OUT指令对输出端口进行操作的例子 OUT85H AL 85H端口 AL的内容MOVDX 0FF4HOUTDX AL FF4H端口 AL的内容MOVDX 300H DX指向300HOUTDX AX 300H端口 AL内容 301H端口 AH内容 3 地址传送指令这组指令都是将地址送到指定的寄存器中 具体有三条 如表3 2所示 表3 2地址传送指令 1 LEA取有效地址汇编格式 LEA16位寄存器名 存储器寻址方式执行的操作 16位寄存器 源操作数的偏移地址说明 这条指令常用在初始化程序段中使一个寄存器成为指针 16位寄存器不包括段寄存器 这条指令不影响标志位 例LEABX TABLETABLE是数据段中定义的地址标号 指令执行前 如果BX 0000H DS 2000H TABLE 20020H 则指令执行后 BX 0020H 2 LDS指针送指定寄存器和DS寄存器指令汇编格式 LDS16位寄存器名 存储器寻址方式执行的操作 将寻址到的存储单元的第一个源操作数 字 送16位寄存器 第二个源操作数 字 送DS寄存器 说明 本条指令中的16位寄存器不允许是段寄存器 本条指令不影响标志位 例LDSAX TABLE SI 假设 20050H 12345678H 指令执行前 如果AX 0000H DS 2000H TABLE 0020H SI 0030H 则物理地址 20000H 0020H 0030H 20050H 指令执行后 AX 5678H DS 1234H 3 LES指针送指定寄存器和ES寄存器指令汇编格式 LES16位寄存器名 存储器寻址方式执行的操作 将寻址到的存储单元的第一个源操作数 字 送16位寄存器 第二个源操作数 字 送ES寄存器 说明 16位寄存器不允许是段寄存器 本条指令不影响标志位 4 标志传送指令这组指令包括LAHF标志送AH和SAHFAH送标志寄存器 1 LAHF标志送AH指令汇编格式 LAHF执行的操作 AH PSW的低8位 说明 此指令具体操作如下图所示 2 SAHFAH送标志寄存器指令汇编格式 SAHF执行的操作 PSW的低8位 AH 图LAHF指令操作格式 3 3 2算术运算指令算术运算指令包括二进制数的运算及十进制数的运算指令 算术运算指令用来执行加 减 乘 除算术运算 它们有双操作数指令 也有单操作数指令 单操作数指令不允许使用立即寻址方式 乘法和除法指令的目的操作数采用隐含寻址方式 汇编指令只指定源操作数 源操作数不允许使用立即寻址方式 双操作数指令不允许目的操作数为立即寻址 不允许两个操作数同时为存储器寻址 另外 不论是双操作数还是单操作数 都不允许使用段寄存器 段寄存器只能被传送 压栈 出栈 特别要强调的是 当汇编程序无法确定指令中操作数的长度时 必须用BYTEPTR WORDPTR DWORDPTR伪指令来指定操作数的长度 1 加法指令加法指令包括三条指令 如表3 3所示 表3 3加法指令 1 ADD加法指令汇编格式 ADD目的操作数 源操作数执行的操作 目的操作数 源操作数 目的操作数2 ADC带进位加法指令汇编格式 ADC目的操作数 源操作数执行的操作 目的操作数 源操作数 目的操作数 CF3 INC增量指令汇编格式 INC操作数执行的操作 操作数 操作数 1 目的操作数可以在通用寄存器或内存中 如果要使内存单元的内容增1 程序中必须有说明该存储单元是字还是字节的符号或说明语句 PTR为类型说明符 前面加BYTE说明操作数类型为字节 加WORD则说明操作数类型为字 对于操作数类型不清楚的指令 可用PTR操作符进行说明 INCWORDPTR BX INCBYTEPTR BX SI 以上三条指令都可作字或字节运算 除INC指令不影响CF标志位外 其他标志位都受指令操作结果的影响 PSW中的标志位共有9位 其中最主要的是ZF SF CF OF四位 ZF表示结果是否为零 SF表示结果的符号位 CF表示最高有效位是否有向更高位的进位 OF表示结果是否溢出 对加法指令来讲 如果操作数是无符号数 则最高有效位有向更高位的进位说明运算结果超出了机器位数所能表示的最大数 因此 CF标志位实质上是表示无符号数有无溢出 而OF标志位表示有符号数有无溢出 例 ADDAL 18H AL AL 18HADCBL CL BL BL CL CFADCAX DX AX AX DX CFADDAL COST BX 将AL内容和物理地址 DS COST BX 的存储字节相加 结果送到ALADDCOST BX BL 将BL与物理地址 DS COST BX 的存储字节相加 结果保留在该存储单元中 例 完成双字长相加 被加数存放在DX与AX中 加数放在BX与CX中 和放在DX与AX中 程序段如下 ADDAX CXADCDX BX 高位运算时要考虑低位的进位 2 减法指令减法指令包括五条指令 如表3 4所示 表3 4减法指令 1 SUB减法指令汇编格式 SUB目的操作数 源操作数执行的操作 目的操作数 目的操作数 源操作数2 SBB带借位减法指令汇编格式 SBB目的操作数 源操作数执行的操作 目的操作数 目的操作数 源操作数 CF 3 DEC减量指令汇编格式 DEC操作数执行的操作 操作数 操作数 14 NEG求补指令汇编格式 NEG操作数执行的操作 操作数 0 操作数 说明 只有当操作数为0时求补运算的结果使CF 0 其他情况则均为1 只有当操作数为 128或 32768时使OF 1 其他情况则均为0 5 CMP比较指令汇编格式 CMP目的操作数 源操作数执行的操作 目的操作数 源操作数 说明 本条指令相减结果不保存 只是根据结果设置标志位 在实际应用中 CMP指令后往往跟着一个条件转移指令 根据比较结果产生不同的分支 以上五条指令都可作字或字节运算 另外 除DEC指令不影响CF标志位外 其他指令都对标志位有影响 减法指令对标志位的影响与加法指令类似 所不同的是CF位 前面说过 CF表示机器的最高有效位有向更高位的进位 对减法指令来讲 恰好相反 若机器最高有效位没有向更高位的进位时 CF 1 否则CF 0 对用户来讲 减数大于被减数 此时有借位则CF 1 否则CF 0 例 SUBAX BX AX AX BXSUBDX 1850H AX DX 1850HSUBBL DX BL中内容减去物理地址 DS BX 处的字节 结果存入BLSBBAL CL AL AL CL CFDECBX BX BX 1NEGAX 将AX中的数取负NEGBYTEPTR BX 对数据段中位于 BX 偏置处的字节取负 例 完成双字长相减操作 被减数存放在DX与AX中 减数存放在BX与CX中 差放在DX和AX中 程序段如下 SUBAX CXSBBDX BX 3 乘法指令乘法指令可对字节 字进行操作 且可对有符号数整数或无符号数整数进行操作 两个8位数相乘 结果为16位数 两个16位数相乘 结果为32位数 乘法指令有两条 MUL无符号数乘法指令汇编格式 MUL源操作数执行的操作 若为字节操作AX AL 源操作数若为字操作 DX AX AX 源操作数 2 IMUL有符号数乘法指令汇编格式 IMUL源操作数执行的操作 与MUL相同 只是处理的数据是有符号数 而MUL处理的数据是无符号数 说明 在乘法指令中 被乘数 即目的操作数 隐含在AX 字运算 或AL 字节运算 中 乘数 即源操作数 由指令寻址 其寻址方式可以是除立即寻址方式之外的任何数据寻址方式 它同时也决定了乘法是字运算还是字节运算 两个8位数相乘其积是16位 存放在AX中 两个16位数相乘其积是32位 存放在DX AX中 DX存放高位字 AX存放低位字 乘法指令对除CF和OF以外的标志位无定义 即这些标志位的状态是不定的 对于MUL指令 如果乘积的高一半为0 则CF和OF均为0 否则CF和OF均为1 对IMUL指令 如果乘积的高一半是低一半的符号扩展 则CF和OF均为0 否则均为1 测试这两个标志位 可知道乘积的高位字节或高位字是否是有效数字 例MULCLIMULDLMULBYTEPTR BX IMULNUMR NUMR是变量名 4 除法指令与乘法指令一样 除法指令也可对字节 字数据进行操作 而且这些数可以是有符号数整数或无符号数整数 除法指令要求被除数的长度必须是除数的两倍 也就是说 字节除法是用16位数除以8位数 字除法是用32位数除以16位数 除法指令也有两条 1 DIV无符号数除法指令汇编格式 DIV源操作数执行的操作 若为字节操作 AL AX 源操作数的商AH AX 源操作数的余数若为字操作 AX DX AX 源操作数的商DX DX AX 源操作数的余数商和余数均为无符号数 2 IDIV有符号数除法指令汇编格式 IDIV源操作数执行的操作 与DIV相同 只是操作数是有符号数 商和余数均为有符号数 余数符号同被除数符号 说明 在除法中 被除数 即目的操作数 隐含在AX 字节运算 或DX AX 字运算 中 除数 即源操作数 由指令寻址 其寻址方式可以是除立即寻址方式之外的任何数据寻址方式 寻址方式同时也决定了除法是字节运算还是字运算 16位数除以8位数 商是8位 存放在AL中 余数是8位 存放在AH中 32位数除以16位数 商是16位 存放在AX中 余数是16位 存放在DX中 一条除法指令可能导致两类错误 一类是除数为零 另一类是除法溢出 当被除数的绝对值大于除数的绝对值时 商就会产生溢出 如 AX 2000被2除 由于8位除法的商将存于AL中 而结果1000无法存入AL中 导致除法溢出 当产生这两类除法错误时 微处理器就会产生除法错中断警告 除法指令对所有标志位无定义 例 DIVCL AX的内容除以CL的内容 无符号商存于AL 余数存于AHIDIVDL AX的内容除以DL的内容 带符号商存于AL 余数存于AHDIVBYTEPTR BP AX的内容除以堆栈段中由BP寻址的字节存储单元的内容 无符号的商存于AL中 余数存于AH中IDIVWORDPTR BX DX AX的内容除以数据段中由BX寻址的字存储单元的内容 带符号的商存于AX中 余数存于DX中 5 符号扩展指令由于乘法指令要求字运算时 被乘数必须为16位 除法指令要求字节运算时 被除数必须为16位 字运算时 被除数必须为32位 因此 往往需要用扩展的方法获得所需长度的操作数 而完成这一转换 对无符号数和带符号数是不同的 对无符号数来说 必须进行零扩展 也就是说 AX的高8位必须清零或DX必须清零 对带符号数来说 必须用下面介绍的两条符号扩展指令来扩展 1 CBW字节转换为字指令汇编格式 CBW执行的操作 将AL的符号扩展到AH中去 如果AL的最高有效位为0 则AH 00H 如 AL 的最高有效位为1 则AH 0FFH 2 CWD字转换为双字指令汇编格式 CWD执行的操作 将AX的符号扩展到DX中去 如果AX的最高有效位为0 则DX 0000H 如AX的最高有效位为1 则DX 0FFFFH 这两条指令都不影响标志位 例 使NUMB字节存储单元的内容除以NUMB1字节存储单元的内容 将商存于ANSQ字节单元中 余数存于ANSR字节单元中 程序段如下 MOVAL NUMBCBWDIVNUMB1MOVANSQ ALMOVANSR AH 6 十进制调整指令计算机不但能进行二进制运算 还能进行十进制运算 进行十进制运算时 首先将十进制数据编码为BCD码 然后用前面介绍的二进制算术运算指令进行运算 之后再进行十进制调整 即可得正确的十进制结果 BCD码有两种存储格式 压缩和非压缩 压缩BCD码指每个字节存储两个BCD码 非压缩BCD码指每个字节存储一个BCD码 其中低4位存储数字的BCD码 高4位为0 数字0 9的ASCII码是一种准非压缩BCD码 即低四位为BCD值 高四位有数值 处理掉高四位的数值即为非压缩BCD码 1 压缩的BCD码调整指令 DAA 加法的十进制调整指令汇编格式 DAA执行的操作 调整AL中的二进制BCD码的和 调整方法如下 若AF 1或者AL的低4位是在AH FH之间 则AL加06H 且自动置AF 1 若CF 1或者AL的高4位是在AH FH之间 则AL加60H 且自动置CF 1 说明 本条指令对PSW中的OF标志无定义 会影响所有其他标志位 使用本条指令之前 需将十进制数先用ADD或ADC指令相加 和存入AL中 例 若AL BCD38 BL BCD15 求两数之和 运算过程如下 ADDAL BL 00111000 38 00010101 15 DAA 01001101 低四位 9 00000110 加6调整 01010011 结果为AL BCD53 CF 0 DAS 减法的十进制调整指令汇编格式 DAS执行的操作 调整AL中的差 调整方法如下 若AF 1 则AL减06H 若CF 1 则AL减60H 说明 本条指令对PSW中的OF标志无定义 会影响其他所有标志位 使用本条指令之前 需将十进制数BCD码用SUB或SBB指令相减 差存入AL中 2 非压缩的BCD码调整指令 AAA 加法的非压缩调整指令汇编格式 AAA执行的操作 调整AL中的和 其中和是非压缩BCD码或准非压缩BCD格式 调整步骤 1 若AF 1或者AL的低4位在AH FH之间 则AL 06H AH AH 1 置AF 1 2 清除AL的高4位 3 CF AF 说明 本条指令除影响AF和CF标志位外 对其余标志位均无定义 使用本条指令前 先将非压缩BCD码的和存入AL中 例 若AL BCD9 BL BCD5 求两数之和 若AH 0 则运算过程如下 ADDAL BL 00001001 00000101 AAA 00001110 低四位 9 00000110 加6调整 00010100 00001111 高四位清0 00000100 AL 4 CF 1 AF 1 AH 1 结果为AX 0104H 表示非压缩十进制数14 AAS 减法压缩调整指令 汇编格式 AAS执行的操作 调整AL中的差 其中AL中的内容是非压缩的BCD码或准非压缩BCD格式 调整步骤 1 若AF 1 则AL 06H AH AH 1 2 清除AL高4位 3 CF AF 说明 本条指令除影响AF和CF标志位外 对其余标志位均无定义 使用本条指令之前 先将非压缩BCD码的差存入AL中 3 AAM 乘法的ASCII调整指令指令格式 AAM指令功能 对已存在AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整 使得在AX中得到正确的非压缩十进制数的乘积 高位放在AH中 低位在AL中 两个ASCII码数相乘之前 必须先屏蔽掉每个数字的高半字节 从而使每个字节包含一个非压缩十进制数 BCD数 再用MUL指令相乘 乘积放到AL寄存器中 然后用AAM指令进行调整 调整过程为 把AL寄存器内容除以10 商放在AH中 余数在AL中 即AH AL 10所得的商AL AL 10所得的余数指令执行后 将影响ZF SF和PF 但AF CF和OF无定义 例 求两个非压缩十进制数09和06之乘积 MOVAL 09H 置初值MOVBL 06HMULBL AL 09与06之乘积36HAAM 调整得AH 05H 十位 AL 04H 个位 4 AAD除法的ASCII调整指令指令格式 AAD指令功能 在做除法前 把BCD码转换成二进制数 在把AX中的两位非压缩格式的BCD数除以一个非压缩的BCD数前 要先用AAD指令把AX中的被除数调整成二进制数 并存到AL中 才能用DIV指令进行运算 调整的过程为 AL AH l0 ALAH 00本指令根据AL寄存器的结果影响SF ZF和PF 对OF CF和AF无定义 例 编写程序 计算75 6 12 3FIRSTDB06H 除数6SECONDDB75H 被除数75 BCD THIRDDB2DUP 存商FOURDB MOVAH 00H 第一个被除数高位AH清0MOVAL SECOND AL 被除数75ANDAL 0F0H 截取高4位MOVCL 04HROLAL CL 移至4位 DIVFIRST AX 06 即0007 06得结果 AL 商为1 AH 余数1MOVTHIRD 1 AL 结果单元 第一个商1MOVAL SECOND AL 被除数75ANDAL OFH AL 截取低四位AAD 将AX中内容调整为0FDIVFIRST 0FH 6 结果 AL 商位2 AH 余数为3MOVETHIRD AL THIRD单元 第二个商2MOVEFOUR AH FOUR单元 第二个余数3 3 3 3逻辑运算和移位指令1 逻辑运算指令逻辑运算指令可对8位数或16位数进行逻辑运算 逻辑运算是按位操作的 如下表所示 逻辑运算指令表 AND OR XOR和TEST四条指令的使用形式很相似 都是双操作数指令 操作数的寻址方式的规定与算术运算指令相同 对标志位的影响也相同 使CF 0 OF 0 AF位无定义 SF ZF PF根据运算结果设置 1 AND逻辑与指令汇编格式 AND目的操作数 源操作数执行的操作 目的操作数 目的操作数 源操作数说明 符号 表示逻辑与操作 本条指令通常用于使某个操作数中的若干位维持不变 而使另外若干位为0的操作 也称屏蔽某些位 要维持不变的位必须和 1 相 与 而要置为0的位必须和 0 相 与 例 屏蔽 AL 中的高4位 ANDAL 00001111B例 ANDAL AL此指令执行前后 AL无变化 但执行后使标志位发生了变化 即CF 0 OF 0 2 OR逻辑或指令汇编格式 OR目的操作数 源操作数执行的操作 目的操作数 目的操作数 源操作数说明 符号 表示逻辑或操作 本条指令通常用于使某个操作数中的若干位维持不变 而使另外若干位置1的场合 要维持不变的位必须和 0 相 或 而要置为1的位必须和 1 相 或 例 ORAL 10000000B若执行前AL 0FH 则执行后AL 8FH 例 ORAL AL指令执行前后 AL不变 但执行后标志位发生了变化 即CF 0 OF 0 3 XOR逻辑异或指令汇编格式 XOR目的操作数 源操作数执行的操作 目的操作数 目的操作数 源操作数说明 符号 表示异或操作 本条指令通常用于使某个操作数清为零 同时使CF 0 或常用于判断两个数是否相等 也可用于使操作数中的若干位维持不变 而使另外若干位取反的操作 维持不变的这些位与 0 相 异或 而要取反的那些位与 1 相 异或 例 XORAL AL指令执行后 AL 0 CF 0 OF 0 例 测试AL是否等于33H XORAL 33HJZMATCH这种方法常用于检测数值是否匹配 例 使AL中的最高位和最低位取反 其他位保持不变 XORAL 10000001B 4 TEST测试指令汇编格式 TEST目的操作数 源操作数执行的操作 目的操作数 源操作数说明 本条指令中两操作数相与的结果不保存 本条指令通常用于在不改变原有操作数的情况下 用来检测某一位或某几位的条件是否满足 用于条件转移指令的先行指令 不检测的那些位与 0 相 与 即将不检测的位屏蔽掉 检测的那些位与 1 相 与 保持不变 6 逻辑运算指令对标志位的影响由于逻辑运算操作是按位进行的 所以对标志位的影响不同于算术运算操作 对标志位的具体影响见下表 逻辑运算指令对标志位的影响 2 移位指令这组指令可以对8位或16位操作数进行操作 按移位方式分为三种 1 逻辑移位指令 SHL逻辑左移指令汇编格式 SHL除立即数及段寄存器之外的操作数 移位次数执行的操作 将操作数逻辑左移指定次数 如图 a 所示 说明 移位次数可以指定为1或大于1的数 若大于1次 则在该移位指令之前把移位次数存入CL寄存器中 而在移位指令中的移位次数写为CL即可 移位次数的规定同样适用于以下所有的移位指令 例 MOVAH 06H AH 06HSALAH 1 将AH中的内容左移一位 AH 0CHMOVCL 03HSHLDI CL 将DI内容左移3次SALBYTEPTR BX 1 将内存单元的字节左移1位 SHR逻辑右移指令汇编格式 SHR除立即数及寄存器之外的操作数 移位次数执行的操作 将操作数逻辑右移指定次数 如图 b 所示 例 用右移的办法做除法133 8 16 5 即 MOVAL 10000101B AL 133MOVCL 03H CL 右移次数SHRAL CL 右移3次 循环移位指令操作示意图 a 逻辑左移指令 b 逻辑右移指令 c 算术左移指令 d 算术右移指令 e 小循环左移指令 f 小循环右移指令 g 大循环左移指令 h 大循环右移指令 2 算术移位指令 SAL算术左移指令汇编格式 SAL除立即数及段寄存器之外的操作数 移位次数执行的操作 将操作数算术左移指定次数 如图 c 所示 由上可看出 SAL和SHL执行的操作一样 例 用SAR指令计算 128 8 16的程序MOVAL 10000000 AL 128MOVCL 03H 右移次数为3SARAL CL 算术右移3 AL 0F0H 16 SAR算术右移指令汇编格式 SAR除立即数及段寄存器之外的操作数 移位次数执行的操作 将寻址到的操作数算术右移指定次数 如图 d 所示 上述两类移位指令对标志位的影响是一样的 CF位根据各条指令的移动结果设置 OF位只有当移动次数为1时才是有效的 当移位前后最高有效位的值发生了变化 则置OF 1 否则置OF 0 SF ZF PF位则根据移位后的结果而设置 上述两类移位指令的处理对象有所不同 逻辑移位适用于对无符号数的处理 算术移位适用于对有符号数的处理 每左移一位相当于乘以2 每右移一位相当于除以2 3 小循环移位指令循环移位按是否与 进位 位CF一起循环的情况 又分为小循环 自身循环 和大循环 包括CF一起 两种 ROL循环左移指令汇编格式 ROL除立即数和段寄存器之外的操作数 移位次数执行的操作 操作数循环左移指定次数 如图 e 所示 ROR循环右移指令汇编指令 ROR除立即数和段寄存器之外的操作数 移位次数执行的操作 操作数循环右移指定次数 如图 f 所示 4 大循环移位指令 RCL带进位循环左移指令汇编格式 RCL除立即数和段寄存器之外的操作数 移位次数执行的操作 操作数循环左移指定次数 如图 g 所示 RCR带进位循环右移指令汇编格式 RCR除立即数和段寄存器之外的操作数 移位次数执行的操作 操作数循环右移指定次数 如图 h 所示 循环移位指令只影响CF和OF标志位 具体规则同移位指令 不影响其他标志位 这类指令一般用于实现循环式控制 高低字节互换或与算术 逻辑移位指令一起实现双倍字长或多倍字长的移位 例 设CF 1 AL 10110100B若执行指令ROLAL 1 则AL 01101001B CF 1 OF 1若执行指令RORAL 1 则AL 01011010B CF 0 OF 1若执行指令RCRAL 1 则AL 11011010B CF 0 OF 1若执行指令ROLAL 3 则AL 10100110B CF 1 OF不确定 例 将 AX 乘以10 十进制数10的二进制形式为1010 即权为2和权为8的位为1 故采用2 AX 8 AX 结果为10 AX 程序段如下 SHLAX 1MOVBX AXSHLAX 1SHLAX 1ADDAX BX 上例说明 左移一位相当于乘2 右移一位相当于除2 意味着利用移位指令可以完成乘除运算 由于利用移位做乘除运算的程序运行速度大大快于乘除运算指令的执行速度 所以 移位指令适用于乘除运算的程序设计 3 3 4串操作指令1 串传送指令每条串传送指令都可传送一个字节或一个字 如果加上前缀REP可实现重复传送 传送一个字节块或一个字块 具体格式如下 REPMOVS LODS STOS执行的操作 1 如CX 0 则退出本条指令的执行 否则继续执行 2 CX CX 1 3 执行REP之后的串传送指令 4 重复 1 3 1 MOVS指令汇编格式1 MOVSB汇编格式2 MOVSW汇编格式3 MOVS目的操作数 源操作数格式说明 汇编格式1 2中明确注明了是传送字节还是字 若使用汇编格式3 则在操作数的寻址方式中 除数据段定义的变量名外 应表明是传送字还是字节 例如MOVSES BYTEPTR DI DS SI 因为MVOS的源操作数及目的的操作数的存放地点是隐含规定好了的 这在下面的介绍中可以看出 所以第1种格式中的源目的操作数只供汇编程序作类型检查用 执行的操作 1 ES DI DS SI 2 若传送字节是 SI SI 1 DI DI 1时 则当方向标志位DF 0时用 DF 1时用 若传送字是 SI SI 2 DI DI 2时 则方向标志位DF 0时用 DF 1时用 说明 本条指令不影响标志位 MOVS指令采用隐含寻址方式 实现将数据段中由SI指向的一个字节或字传送到附加数据段中由DI指向的一个字节或字存储单元中去 然后根据DF和字或字节的规定对SI和DI指针进行修改 一般情况下源操作数在数据段 目的操作数在附加段 如果同段数据传送 允许源操作数使用段超越前缀来修改所在段 也可以采用两段合一的方法 即DS和ES同时指向同一数据段 若想实现传送一个字节块或一个字块 必须先把传送字或字节的长度送CX寄存器中去 MOVS指令加前缀REP 指令在操作之前必须做好以下初始化工作 1 把存放于数据段中的源数据串的首地址 如反向传送则应是末地址 存入SI 2 把将要存放于附加段中的目的数据串的首地址 如反向传送则应是末地址 存入DI 3 把数据串长度存入CX 4 设置方向标志位DF的值CLD指令使DF 0 STD指令使DF 1 例 要求把数据段中以SRC MESS为偏移地址的一串字符 HELLO 传送到附加段中以NEW LOC开始的单元中 实现该操作的程序如下 DATASEGEMENT 数据段SRC MESSDB HELLO 原串DATAENDSEXTRASEGEMENT 附加段NEW LOCDB6DUP 存放目的串EXTRAENDSCODESEGEMENT 代码段ASSUMECS CODE DS DATA ES EXTRA START M

温馨提示

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

评论

0/150

提交评论