![[计算机硬件及网络]第3章指令系统.ppt_第1页](http://file.renrendoc.com/FileRoot1/2019-1/2/3c7b47d4-28ed-450d-b3cd-4374969f9250/3c7b47d4-28ed-450d-b3cd-4374969f92501.gif)
![[计算机硬件及网络]第3章指令系统.ppt_第2页](http://file.renrendoc.com/FileRoot1/2019-1/2/3c7b47d4-28ed-450d-b3cd-4374969f9250/3c7b47d4-28ed-450d-b3cd-4374969f92502.gif)
![[计算机硬件及网络]第3章指令系统.ppt_第3页](http://file.renrendoc.com/FileRoot1/2019-1/2/3c7b47d4-28ed-450d-b3cd-4374969f9250/3c7b47d4-28ed-450d-b3cd-4374969f92503.gif)
![[计算机硬件及网络]第3章指令系统.ppt_第4页](http://file.renrendoc.com/FileRoot1/2019-1/2/3c7b47d4-28ed-450d-b3cd-4374969f9250/3c7b47d4-28ed-450d-b3cd-4374969f92504.gif)
![[计算机硬件及网络]第3章指令系统.ppt_第5页](http://file.renrendoc.com/FileRoot1/2019-1/2/3c7b47d4-28ed-450d-b3cd-4374969f9250/3c7b47d4-28ed-450d-b3cd-4374969f92505.gif)
已阅读5页,还剩301页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章16位和32位微处理器的指令系统 本章要点 汇编语言的寻址方式8086的传送指令尤其是堆栈操作指令 交换指令和换码指令的用法算术运算指令涉及的规则和各种算术运算指令的使用逻辑运算指令和移位指令的用法 5条串操作指令的特点和使用方法 尤其是串操作指令和DF标志的关系控制转移指令特别是段内转移指令 带参数的返回指令和循环控制指令的用法各内部中断的含义汇编语言程序的规范格式 伪指令及其使用80386对寻址方式的补充教材中表3 4所列出的传送指令的含义和使用80386的条件设置指令和位操作指令的用法Pentium和80486新增加的指令的含义和用法 教学建议 以8086的指令系统为基础 在讲述汇编语言规范程序基础上 让学生按本书配套教材 习题与实验题集 的软件实验部分要求 设计5 8个程序并上机调试 对32位机的指令扩充部分 重点讲清双字交换指令 32位比较指令 字交换加法指令 64位比较指令和读时钟周期指令 学时分配 本章用8学时 其中 基本指令系统6学时规范程序1学时32位扩充指令1学时 3 18086的寻址方式和指令系统 汇编语言指令要解决的两个问题 要指出进行什么操作 操作符 要指出操作数和操作结果放在何处 寻址方式 3 1 18086的寻址方式 立即数寻址寄存器寻址输入 输出端口寻址存储器寻址 立即数寻址 操作数就在指令中提供 叫立即数寻址方式 比如 MOVAL 80H 将16进制数80H送入ALMOVAX 1090H 将1090H送AX AH中为10H AL中为90H 寄存器寻址 操作数用内部寄存器 寄存器寻址方式 比如 INCCX 将CX的内容加1ROLAH 1 将AH中的内容循环左移一位 输入 输出端口寻址 1 I O直接寻址 端口地址直接在指令中提供 最大寻址范围0 255INAL 82H 82H端口中的字节输入到ALOUT80H AX 将AL中的数据送80H端口 将AH中的数据送81H端口寻址范围0 255 最大端口号为FFH 输入 输出端口寻址 2 I O间接寻址先在DX寄存器中设置好I O端口地址 I O指令用DX进行寄存器间接寻址 例如 事先在DX中设置端口号80H 则INAL DX 将端口80H中的字节读入ALOUTDX AX 将AL中内容输出到端口80H 将AH中的内容输出到端口81H 只能用DX寄存器 寻址范围0 255 最大端口号为FFFFH 存储器寻址 存储单元的地址由段基址和偏移量组成 有效地址 EA 的表达式 通用 EA 基址 变址 比例因子 位移量 直接寻址 数据在存储器中 有效地址由指令直接给出 默认段地址寄存器DS 比如 MOVAX 1070H 将DS段的1070H和1071H两单元的内容取到AX中 寄存器间接寻址 寄存器间接寻址可分为四种 1 以BX寄存器进行间接寻址 数据段基址寻址MOVAX BX MOVCX ES BX 2 以BP寄存器进行间接寻址 堆栈段基址寻址MOVBX BP 3 以SI DI寄存器进行间接寻址 变址寻址 4 将BX BP和SI DI寄存器组合起来进行间接寻址 基址加变址的寻址MOVAX BX SI 寄存器相对寻址 EA为寄存器中内容和指令中给出的位移量的和 MOVAX SI 100H 如SI 2000H 则将DS段2100H 2101H中内容送AX 基址加变址的寻址 通常将BX BP称为基址寄存器 将SI DI称为变址寄存器 把基址寄存器和变址寄存器组成起来可构成一种新的寻址方式 MOVAX BX SI 将BX和SI中的内容之和所指单元开始的2字节送AX 注意 段寄存器的约定规则 如果将BP作为基址寄存器 则默认段为SS 在其他情况下 默认段为DS 相对的基址加变址的寻址 用基址加变址来指出存储单元地址时 也允许带一个位移量 MOVAX BP SI 0050 将DS段由BP和SI中的内容与0050相加作为有效地址 例 设BX 0158H DI 10A5H 位移量 1B57H DS 2100H 各种寻址方式下 有效地址和物理地址如下 直接寻址 MOVAX 1B57H 有效地址 1B57H物理地址 21000H 1B57H 22B57H 寄存器间接寻址 寄存器为BX MOVAX BX 有效地址 0158H物理地址 21000H 0158H 21158H BX寄存器相对间接寻址 MOVAX BX 1B57H 有效地址 0158H 1B57H 1CAFH物理地址 21000H 1CAFH 22CAFH 变址寻址 寄存器为DI MOVAX DI 有效地址 10A5H物理地址 21000H 10A5H 220A5H DI寄存器相对变址寻址 MOVAX DI 1B57H 有效地址 10A5H 1B57H 2BFCH物理地址 21000H 2BFCH 23BFCH 基址加变址的寻址 BX为基址寄存器 DI为变址寄存器 MOVAX BX DI 有效地址 0158H 10A5H 11FDH物理地址 21000H 11FDH 221FDH 相对的基址加变址的寻址 BX为基址寄存器 DI为变址寄存器 MOVAX BX DI 1B57H 有效地址 0158H 10A5H 1B57H 2D54H物理地址 21000H 2D54H 23D54H 已知内存中的情况如下表 写出下面的指令执行后寄存器AX BX CX中的值 MOVAX 1000HMOVDS AXMOVAX 0 MOVBX 2 MOVCX 1 ADDBX 1 ADDCX 2 寄存器AX BX CX中的值分别为 1123H 8833H 8833H 例题 设DS 1200H BX 05A6H SS 5000H BP 40A0H SI 2000H DI 3000H位移量DISP 1618H 试判断下列指令的寻址方式 并写出各种寻址方式下的有效地址EA和物理地址PA 并说明执行结果 1 直接寻址 MOVAX 0618H EA 0618HPA DS右移4位 EA 12000H 0618H 12618H结果 将数据段12618H和12619H两单元的内容取出送AX 2 寄存器间接寻址 MOVAX BX EA BX 05A6HPA DS右移4位 EA 12000H 05A6H 125A6H结果 将数据段125A6H和125A7H两单元的内容取出送AX 3 寄存器间接寻址 MOVAX BP EA BP 40A0HPA SS右移4位 EA 50000H 40A0H 540A0H结果 将数据段540A0H和540A1H两单元的内容取出送AX 4 寄存器间接寻址 变址寻址 MOVAX DI EA DI 3000HPA DS右移4位 EA 12000H 3000H 15000H结果 将数据段15000H和15001H两单元的内容取出送AX 5 基址加变址寻址 MOVAX BX DI EA BX DI 35A6HPA DS右移4位 EA 12000H 35A6H 155A6H结果 将数据段155A6H和155A7H两单元的内容取出送AX 6 相对的基址加变址寻址 MOVAX BP DI DISP EA BP DI DISP 86B8HPA SS右移4位 EA 50000H 86B8H 586B8H结果 将数据段586B8H和586B9H两单元的内容取出送AX 8086指令系统 传送指令逻辑运算和移位指令控制转移指令算术运算指令串操作指令 传送指令 通用传送指令累加器专用传送指令地址传送指令标志传送指令 通用传送指令 1 最基本的传送指令 MOV MOVAL BL BL中的8位数据送ALMOVES DX DX中16位数据送ES 几点注意 通用传送指令可传送8位和16位数据 通用传送指令中总是既含源操作数 又含目的操作数 不能在两个内存单元之间直接传送数据 CS和IP寄存器不能作为目的操作数 用BX SI DI来间接寻址时 默认的段寄存器为DS 而用BP来间接寻址时 默认的段寄存器为SS 执行SS寄存器赋值的传送指令时 系统自动禁止外部中断 所有的通用传送指令都不改变标志 2 堆栈操作指令推入堆栈指令PUSH和弹出堆栈指令POP 如 PUSHAX 将AX的内容推入堆栈 栈顶为低字节 堆栈指针减2 PUSHDSPOPDS 将栈顶两个单元弹出送DS 栈顶地址加2POPAX 几点注意 堆栈操作总是按字进行的 推入指令 SP减2 数据在栈顶 弹出指令正好相反 允许PUSHCS 但不允许POPCS 堆栈的后进先出 3 交换指令交换指令XCHG可以实现字节或字交换 如 XCHGAL BLXCHGBX CXXCHG 2530 CX 交换指令注意点 目的操作数和源操作数不能均为内存单元 段寄存器和IP不能作为交换指令的操作数 累加器专用传送指令 1 输入输出指令IN OUT分为 直接的输入输出指令间接的输入输出指令 直接的输入输出指令提供端口号 如 INAL 50H 将50H端口的字节读入ALINAX 70H 分别将70H 71H端口的内容读入AL AHOUT44H AL 将AL中的内容输出到44H端口OUT80H AX 将AL AH中的内容分别输出到80H 81H两端口 间接的输入输出指令 如 INAL DX 从DX所指的端口中读取 INAX DX 从DX和DX 1所指出的两个端口中读取 OUTDX AL 将AL中的字节输出到DX所指的端口中 OUTDX AX 将AL中的字节输出到DX所指的端口中 同时将AH中的字节输出到DX 1所指的端口中 输入输出指令注意点 只能用累加器作为执行输入输出的机构 寻址范围 直接输入输出指令为0 255间接输入输出指令为0 65535 2 换码指令换码指令为XLAT 使累加器中的一个值变换为内存表格中的某一个值 换码指令的功能 例 通信系统中使用格雷码 其中每个码由二个1 三个0组成 具体编码规则如下 0 11000 1 00011 2 00101 3 00110 4 01001 5 01010 6 01100 7 10001 8 10010 9 10100 从二进制数的角度看这些编码 之间没有什么规律 可采用转化指令来实现 注意 转换指令对一些不规则代码的转换非常方便 已知二进制数字5 如何能转换成对应格雷码 程序部分编码 MOVAL 05HMOVBX 1000HXLAT执行程序后 AL 地址传送指令 1 取有效地址指令 LEA 将存储器的有效地址送到一个寄存器 如 LEAAX 2728H 将内存单元的偏移量2728H送AX LEABX BP SI 指令执行后 BX中内容为BP SI的值 LEASP 0482H 使堆栈指针SP为482H LEADI BX指令等价与MOVDI OFFSET BX 指令 注意 1 LEA指令执行以后 目的寄存器中为内存的有效地址 而不是内存单元中的值 2 当目的寄存器位数多而数据位少时 则进行高位零扩展 2 装入段地址指令LDS LES LSS功能 将4字节的地址指针传送到2个目的寄存器 比如 LDSDI 2130H 使2130H和2131H中的偏移量送DI 2132H和2133H中的段值DS 3 装入地址的指令LES功能 将一个地址指针装入ES和另一个寄存器 例 LESDI BP 04 将堆栈中存放的字符串首址送到ES和DI中 LESDI 1000H 将1000H 1001H中存偏移量送DI中 将1002H 1003H中的段码送ES 指令特点 1 随着寄存器的位数不同 传送的字节数也不同 2 源操作数总是来自存储器 存储器的地址可以直接和间接指出 3 目的操作数只指出了存放偏移量的寄存器名 并没有出现段寄存器名 但是在指令执行中指出了段寄存器名称 标志传送指令 1 读取标志指令 LAHF 将标志寄存器的低8位送AH 2 设置标志指令SAHF将AH寄存器的相应位送标志寄存器的低8位 例题 要修SF改标志位的内容 该如何修改 标志位只有少数几个标志位 如CF DF IF 有专门的指令置0或置1 大部分标志位没有直接操作指令 如何修改 首先用LAHF把SF标志位的标志的低8位送AH 然后对第AH的相应为进行修改或放置 再用SAHF指令送回标志寄存器 LAHFORAH 80HSAHF SF 1 其余标志位不变 3 对标志寄存器的堆栈操作指令PUSHF将标志寄存器的值推入堆栈顶部 POPF从堆栈弹出一个字送标志寄存器 进栈指令先使堆栈指针SP减2 然后把一个字操作数存入堆栈顶部 堆栈操作的对象只能是字操作数 进栈时 低字节存放于低地址 高字节存放在高地址 SP相应向低地址移动两个字节单元 例 将7812h压入堆栈 movax 7812hpushax 将栈顶一个字7812H的内容弹出送AX寄存器 popax 例 置位单步标志TF pushf 保存全部标志到堆栈popax 从堆栈中取出全部标志orax 0100h 设置D8位 TF 1 而ax其他位不变pushax 将ax压入堆栈popf 将堆栈内容取到标志寄存器 即FLAGS AX 标志位操作指令 CLC 复位进位标志 CF 0STC 置位进位标志 CF 1CMC 求反进位标志 CF CFCLD 复位方向标志 DF 0STD 置位方向标志 DF 1CLI 复位中断标志 禁止可屏蔽中断 IF 0STI 置位中断标志 允许可屏蔽中断 IF 1 算术运算指令 算术运算指令涉及两种类型的数据无符号数8位无符号数的范围为0 25516位无符号数的范围为0 65535有符号数8位有符号数的范围为 128 12716位有符号数的范围为 32768 32767 3 2 2算术运算指令 无符号数和有符号数采用同一套加法指令及减法指令有两个条件 同为无符号数或有符号数用不同的方法检测无符号数或有符号数的运算结果是否溢出 机器数的三种表示方法 原码 反码和补码 1 原码 正数的符号位用0表示 负数的符号位用1表示 绝对值的编码与无符号数编码相同 例 X 1010011则 X 原 01010011X 1010011则 X 原 110100110的原码表示为 0 原 00000000正零 0 原 10000000负零 要了解补码 先了解反码 2 反码 正数的反码与原码相同 最高位是符号位 用0表示正 其余为数值位 负数的反码 表示为该数对应的正数按位取反 包括符号位 例 4 反 00000100 4 反 111110110的反码表示为 0 反 00000000正零 0 反 11111111负零 计算机中有符号数用补码表示 3 补码 正数的补码与原码相同 最高位是符号位 用0表示正 其余为数值位 负数的补码等于其相应的反码加1 最低位加1 例 4 补 00000100 4 反 4 原 4 补 4 反 1 11111011 1 111111000的补码表示为 0 反 0 反 00000000正零 负零 所有算术运算指令均影响状态标志 规则 当无符号数运算产生溢出时 CF为1 当有符号数运算产生溢出时 OF为1 如运算结果为0 则ZF 1 如运算结果为负数 则SF 1 如运算结果中有偶数个1 则PF 1 例题 ADD BX 106BH 1234H 设CS 1000H IP 0300H DS 2000H BX 1200H 执行结果 EA BX 106BH 226BHPA DS 10H EA 2226BH将立即数1234H与存储单元2226BH和2226CH中的3344H相加 和为4578H 结果保留在目的地址2226BH和2226CH单元中 运算结果对标志位的影响 加法指令 1 不带进位位的加法指令如 ADDAL 50H AL和50H相加 结果放在AL中 ADDDI SI DI和SI的内容相加 结果在DI ADD BX DI AX BX DI和BX DI 12个单元和AX相加 结果在BX DI和BX DI 1所指单元ADDAX BX 2000H BX 2000H和BX 2001H所指单元内容和AX的内容相加 结果在AX中ADD指令影响OF SF ZF AF PF和CF标志 2 带进位位的加法指令如 ADCAX SI AX和SI中的内容以及CF的值相加 结果在AX ADCDX SI SI和SI 1所指的单元的内容和DX的内容以及CF的值相加 结果在DX ADC指令影响OF SF ZF AF PF和CF标志 立即数相加 若将立即数12H取入DL 然后将34H加到DL上 所得的结果放DL P MOVDL 12H ADDDL 34H 对标志位的影响 3 增量指令将操作数的内容加1 如 INCAL 将AL中的内容加1INCCX 将CX中的内容加1INCBYTEPTR BX DI 500 将BX DI 500所指单元的内容加1INC指令影响位OF SF ZF AF和PF 特别注意 INC指令不影响进位标志位CF 4 字交换加法指令XADD 比如 AX 1234H BX 1111H 执行指令 XADDAX BX比如 EAX 20000002H 而1000H开始的内存单元中为30000003H 执行指令XADD 1000H EAX 减法指令 1 不考虑借位的减法指令SUB完成2个字节或2个字的相减 如 SUBBX CX 将BX中的内容减去CX中的内容 结果在BX中SUB BP 2 CL 将BP 2所指的单元中的值减去CL中的值 结果在BP 2所指的堆栈单元中SUB指令影响OF SF ZF AF PF和CF标志 SUBAL 20 AL中的数减去20 结果在AL中SUBSI 5010H SI中的数减去5010H 结果在SI中SUBWORDPTR DI 1000H DI和DI 1所指的两单元中的数减去1000H 结果在DI和DI 1所指的单元中 例 假设DL 0A9H 内存DA BYTE单元中为0B7H 那么指令SUBDA BYTE DL执行后的结果及各个标志位的设置 DA BYTE B7 10110111 DL A9 10101001 00001110 DA BYTE 减法运算 moval 0fbh al 0fbhsubal 07h al 0f4h CF 0movwordptr 200h 4652h 200h 4652hmovbx 1feh bx 1fehsubal bl al 0f6h CF 1subwordptr bx 2 0f0f0h 200h 5562h CF 1 2 考虑借位的减法指令如 SBBAX 2030H 将AX的内容减去2030H 并减去CF值SBBWORDPTR DI 2 1000H 将DI 2和DI 3所指两单元的内容减去1000H 并减去CF值 结果在DI 2和DI 3所指的单元SBB指令影响OF SF ZF AF PF和CF标志 3 减量指令 将操作数减1 如 DECAX 将AX的内容减1 再送回AX中DECBL 将BL的内容减1 结果送回BL中DECBYTEPTR DI 2 将DI 2所指单元的内容减1 结果送回此单元DNC指令影响位OF SF ZF AF和PF 4 求补指令NEG操作数取补码 再将结果送回 相当于用0减去此操作数 所以NEG也是减法操作 如 NEGAL 将AL中的数取补码NEGCX 将CX中的内容取补码NEG指令影响OF SF ZF AF PF和CF标志 movax 0ff64hnegal ax ff9ch OF 0 SF 1 ZF 0 PF 1 CF 1subal 9dh ax ffffh OF 0 SF 1 ZF 0 PF 1 CF 1negax ax 0001h OF 0 SF 0 ZF 0 PF 0 CF 1decal ax 0000h OF 0 SF 0 ZF 1 PF 1 CF 1negax ax 0000h OF 0 SF 0 ZF 1 PF 1 CF 0 5 比较指令如 CMPAX 2000H 将AX的内容和2000H相比较 结果影响标志位CMPAL 50H 将AL中的数和50H比较 结果影响标志位CMP指令会影响OF SF ZF AF PF和CF标志 例 比较AL是否大于100 cmpal 100 al 100jbbelow al 100 跳转到belowsubal 100 al 100 al al 100incah ah ah 1below 怎么根据这些标志来判断比较结果 1 ZF 1 判断两个数相等 2 如果两个无符号数 CF 0 被减数 减数 CF 1 被减数 减数 3 如果两个有符号数并且符号相同 则SF 0 被减数 减数 SF 1 被减数 减数 4 如果两个有符号数并且符号不同 则OF和SF的值相同 被减数 减数 OF和SF的值不同 被减数 减数 CMP CMPXCHG CMPXCHG8B 6 比较并交换指令CMPXCHG比如 AL 11H BL 24H 1000H 22H 执行指令CMPXCHG 1000H BL又如 EBX 76543210H ECX 01234567H EAX 01234567H 则执行指令CMPXCHGECX EBX7 8字节比较指令CMPXCHG8B比如 EAX 11111111H EBX 22222222H ECX 33333333H EDX 44444444H 设DS段1000H所指单元开始的8字节为4444444411111111H 执行指令CMPXCHG8B 1000H 乘法指令 1 无符号数的乘法指令如 MULBL AL中数和BL中数相乘 结果在AX中MULCX AX中数和CX中数相乘 结果在DX和AX中MULBYTEPTR DI AL中数和DI所指的单元中数相乘 结果在AX中 例 无符号数0B4H与11H相乘 moval 0b4h al b4h 180dmovbl 11h bl 11h 17dmulbl ax Obf4h 3060d OF CF 1 AX高8位不为0 2 有符号数的乘法指令如 IMULCL AL中有符号数与CL中有符号数相乘 结果在AX中IMULBX AX和BX中的两个有符号数相乘 结果在DX和AX中 IMULBYTEPTR BX AL中的8位有符号数和BX所指单元的8位有符号数相乘 结果在AXIMULWORDPTR DI AX中的16位有符号数和DI DI 1所指的单元16位有符号数相乘 结果在DX和AX中MUL和IMUL执行时 会影响标志位CF和OF 但 AF PF SF和ZF无意义 有符号数0B4H与11H相乘 moval 0b4h al b4h 76dmovbl 11h bl 11h 17dimulbl ax faf4h 1292d OF CF 1 AX高8位不是低8位的符号扩展 表示含有有效数字 除法指令 注意 当被除数为16位 除数为8位时 8位的商放在AL 8位的余数放在AH当被除数为32位 除数为16位 16位的商放在AX中 16位的余数放在DX 1 无符号数的除法指令如 DIVCL AX中的数据除以CL中的数据 商在AL中 余数在AH中DIVWORDPTR DI DX和AX中的32位数除以DI DI 1所指的16位数 商在AX中 余数在DX中 无符号数0400H除以B4H movax 0400h ax 400h 1024dmovbl 0b4h bl b4h 180ddivbl 商al 05h 余数ah 7ch 124d 2 有符号数的除法指令如 IDIVBX 将DX和AX中的32位数除以BX中的16位数 商在AX中 余数在DX中IDIVBYTEPTR DI 将AX中16位数除以DI所指单元中的8位数 商在AL 余数在AH 除法指令几点注意 标志位AF CF OF PF SF和ZF无意义 商范围如下 超出了范围则产生0号中断 双字除以字为 32768 32767字除以字节 128 127 有符号数除法规定余数的符号和被除数的符号相同 要求用16位数除以8位数 或者用32位数除以16位数 有符号数0400H除以B4H movax 0400h ax 400h 1024dmovbl 0b4h bl b4h 76didivbl 商al f3h 13d 余数ah 24h 36d 3 将字节扩展成字的指令CBW功能 将AL寄存器中的符号位扩展到AH中 执行时 不影响标志位 即 如果AL的最高有效位是0 则AH 00 AL的最高有效位为1 则AH FFH AL不变 moval 80h al 80hcbw ax ff80haddal 255 al 7fhcbw ax 007fh 4 将字扩展成双字的指令CWD功能 将AX中的被除数扩展成双字 即把AX中的符号位扩展到DX中 执行时 不影响标志位 例 进行有符号数除法AX BXcwdidivbx BCD码运算指令 1 BCD码的加法十进制调整指令AAA对非组合BCD码相加结果调整 DAA对组合的BCD码相加结果进行调整 DAA AL 将AL中的加和调整为压缩BCD码 非压缩BCD码的加法运算 movax 0608h ax 0608h 表示非压缩BCD码68movbl 09h bl 09h 表示非压缩BCD码9addal bl 二进制加法 al 08h 09h 11haaa 十进制调整 ax 0707h 实现非压缩BCD码加法 68 9 77 压缩BCD码的加法运算 moval 68h al 68h 表示压缩BCD码68movbl 28h bl 28h 表示压缩BCD码28addal bl 二进制加法 al 68h 28h 90hDaa 十进制调整 al 96h 实现压缩BCD码加法 68 28 96 2 BCD码的减法十进制调整指令AAS对非组合BCD码相减结果进行调整DAS对组合的BCD码相减结果进行调整 AAS AL 将AL中的减差调整为非压缩BCD码 AH AH 调整产生的借位 DAS AL 将AL中的减差调整为压缩BCD码 非压缩BCD码的减法运算 movax 0608h ax 0608h 表示非压缩BCD码68movbl 09h bl 09h 表示非压缩BCD码9subal bl 二进制减法 al 08h 09h ffhaas 十进制调整 ax 0509h 实现非压缩BCD码减法 68 9 59 压缩BCD码的减法运算 moval 68h al 68h 表示压缩BCD码68movbl 28h bl 28h 表示压缩BCD码28subal bl 二进制减法 al 68h 28h 40hdas 十进制调整 al 40h 实现压缩BCD码减法 68 28 40 3 BCD码的乘法十进制调整指令AAM功能 对非组合的BCD码相乘结果进行调整 AAM AX 将AX中的乘积调整为非压缩BCD码 非压缩BCD码的乘法运算 movax 0608h ax 0608h 表示非压缩BCD码68movbl 09h bl 09h 表示非压缩BCD码9mulbl 二进制乘法 ax 08h 09h 0048haam 十进制调整 ax 0702h 实现非压缩BCD码乘法 8 9 72 4 BCD码的除法十进制调整指令AAD功能 在除法之前 对除数和被除数进行非组合的BCD码调整 AAD AX 将AX中的非压缩BCD码扩展成二进制数 即 AL 1Od AH AL AH 0 非压缩BCD码的除法运算 movax 0608h ax 0608h 表示非压缩BCD码68movbl 09h bl 09h 表示非压缩BCD码9aad 二进制扩展 ax 68 0044hdivbl 除法运算 商al 07h 余数ah 05h 实现非压缩BCD码除法 68 7 9 5 逻辑运算和移位指令 逻辑运算指令移位指令 逻辑运算指令 逻辑运算指令包括AND 与 OR 或 NOT 非 XOR 异或 TEST 测试 按位逻辑运算 逻辑运算AND 与 ANDdest src dest dest src 符号 表示逻辑与 比如 ANDAL 0FH AL中内容和0FH相与 结果在AL 逻辑与运算 moval 45handal 31h al 01h CF OF 0 SF 0 ZF 0 PF 0 例 将BL中D0和D3清0 其余位不变andbl 11110110b 逻辑或运算 moval 45horal 31h al 75h CF OF 0 SF 0 ZF 0 PF 0 例 将BL中D0和D3置1 其余位不变orbl 00001001b 逻辑异或运算 moval 45hxoral 31h al 74h CF OF 0 SF 0 ZF 0 PF 1 例 将BL中D0和D3求反 其余位不变xorbl 00001001bXOR指令经常给寄存器清0 同时使CF也清0 例如 xorax ax ax 0 CF OF 0 SF 0 ZF 1 PF 1 NOT指令求操作数的反码 比如 NOTAL AL中内容求反码 结果AL中 moval 45hnotal al 0bah 标志不变 ORAX 00F0H AX和00F0H相或 结果在AXXORAX AX AX内容本身进行异或 结果AX清零TEST和AND执行同样操作 但TEST指令不送回操作结果 而仅仅影响标志位 如 TESTAX 8000H 如AX的最高位为1 则ZF 0 否则ZF 1 例 TEST指令用于测试某一 几 位是否 同时 为0或为1 testal 01h 测试AL的最低位D0jnzthere 标志ZF 0 即D0 1 则程序转移到there 否则ZF 1 即D0 0 顺序执行there 例题1 对某个字节清零 1 MOVAX 00H2 ANDAX 00H3 XORAX AX 例题2 对某个指定位清零 对最低位清零 ANDAX FEH 11111110B 对最高位清零 ANDAX 0F0H 11110000B 例题3 比较两个操作数是否相同 如判断AL中数据是否为3CH XORAL 3CH 结果 判断ZF 1 则AL 3CH 否则ZF 0 则AL 3CH 例题4 将指定的数据取反 如AL 3AH 将该数据取反 XORAL 0FFH 结果 AL 11000101B C5H 检测指定位是1 还是0 例题5 测试AL的最高位D7是否为1 即正数或负数 TESTAL 80H 结果 判断ZF 0 则AL最高位为1 负数 否则ZF 1 则AL最高位为0 正数 例题6 测试BX的最低位D0是否为1 即奇数或偶数 TEST BX 01H 结果 判断ZF 0 则AL最低位为1 奇数 否则ZF 1 则AL最低位为0 偶数 例7 程序中要求把标志寄存器中溢出位OF取反 程序 PUSHFPOPAXXORAX 800H 100000000000B PUSHPOPF 移位指令 1 非循环移位指令4条移位指令 算术左移指令SAL逻辑左移指令SHL算术右移指令SAR逻辑右移指令SHR 移位指令SALSHLSARSHR 非循环移位指令 四条 实际为三条 移位指令的目的操作数可以是寄存器或存储单元 后一个操作数表示移位位数 该操作数为1 表示移动一位 当移位位数大于1时 则用CL寄存器值表示 该操作数表达为CL 移位指令按照移入的位设置进位标志CF 根据移位后的结果影响SF ZF PF 对AF没有定义 如果进行一位移动 则按照操作数的最高符号位是否改变 相应设置溢出标志OF 如果移位前的操作数最高位与移位后操作数的最高位不同 有变化 则OF 1 否则OF 0 当移位次数大于1时 OF不确定 例2 33 移位指令的功能 movcl 4moval 0f0h al f0hshlal 1 al e0h CF 1 SF 1 ZF 0 PF 0 OF 0shral 1 al 70h CF 0 SF 0 ZF 0 PF 0 OF 1saral 1 al 38h CF 0 SF 0 ZF 0 PF 0 OF 0saral cl al 03h CF 1 SF 0 ZF 0 PF 1 利用移位指令计算DX 3 AX 7 BX 假设为无符号数运算 无进位 movsi axshlsi 1 si 2 axaddsi ax si 3 axmovdx bxmovcl 03hshldx cl dx 8 bxsubdx bx dx 7 bxadddx si dx 7 bx 3 ax 例 用移位指令实现把AL中的数X乘10 用移位指令实现SALAL 1 2X 2T MOVAH AL 2T SALAL 1 4X 2T SALAL 1 8X 2T ADDAL AH 10X 3T 乘法指令实现 MOVBL 10MULBL 共需要70 77个T周期 用移位操作代替乘除发 可提高运算速度 2 循环移位指令4条循环移位指令循环左移指令ROL循环右移指令ROR带进位位的循环左移指令RCL带进位位的循环右移指令RCR 循环移位指令ROLRORRCLRCR 例 将DX AX中的32位数值左移一位shlax 1rcldx 1例 把AL最低位送BL最低位 但保持AL不变rorbl 1roral 1rclbl 1rolal 1利用移位或循环移位指令可以方便地实现BCD码转换 例 AH AL分别存放着非压缩BCD码的两位 现将它们合并成为一个压缩BCD码存入ALmovcl 4rolah cl 也可以用shlah claddal ah 也可以用oral ah 串操作指令 字符串传送指令字符串比较指令字符串检索指令取字符串指令存字符串指令 字符串传送指令 字符串传送指令MOVSB MOVSWMOVSB用于字节传送MOVSW用于字传送 特点 指令前面常加重复前缀REP MOVSB 字节串传送 ES DI DS SI SI SI 1 DI DI 1MOVSW 字串传送 ES DI DS SI SI SI 2 DI DI 2 如 MOVSI 1000H 源地址为1000HMOVDI 2000H 目的地址为2000HMOVCX 100 字符串长100个字节CLD 方向标志清0 使指针按增量方向修改REPMOVSB 将源地址开始的100个字节传送到目的地址 MOVSB指令注意点 源地址用SI寄存器指出 目的地址用DI寄存器指出 并且默认源地址在DS 目的地址在ES CX中为字节数或字数 用CLD将方向标志DF清0 若DF为0 则用MOVSB时 每传送一次 SI和DI自动增1 用MOVSW时 每传送一次 SI和DI自动增2 反过来 用STD将方向标志DF置1 若DF为1 则用MOVSB时 每传送一次 SI和DI自动减1 字符串比较指令 字符串比较指令CMPSB CMPSW功能 把DS段由SI所指的字节或者字和ES段由DI所指的字节或者字相比较 例2 52 将数据段source指示的100个字节数传送到附加段destination指示的主存区 movsi offsetsource 汇编伪指令offset指示source的偏移地址movdi offsetdestinationmovcx 100 cx 传送次数cld 设置DF 0 实现地址增加again movsb 传送一个字节deccx 传送次数减1jnzagain 判断传送次数cx是否为0 不为0 ZF 0 则转移到again位置继续执行 否则 结束 CMPSB CMPSW指令注意点 预先将源字符串的首址设置到DS段和SI中目的字符串的首址设置到ES段和DI中比较的字节数或字数设置到CX中设置方向标志 在DF为0或为1 影响比较SI和DI的修改方向 CMPSB CMPSW指令功能 两个字符串中找到第一个 不 相同元素 CMPSB 字节串比较 DS SI ES DI SI SI 1 DI DI 1CMPSW 字串比较 DS SI ES DI SI SI 2 DI DI 2 通常加前缀 REPNZ REPNE REPZ REPE 例 比较数据段中string1字符串和附加段中string2字符串是否相同 假设两个字符串长度一样 为count个字节 比较的结果存入result单元 为0表示相等 为 1 即ffh 表示不等 movsi offsetstring1movdi offsetstring2movcx countcldagain cmpsb 比较两个字符jnzunmat 出现不同的字符 转移到unmat 设置ffh标记deccxjnzagain 进行下一个字符的比较moval 0 字符串相等 设置00h标记jmpoutpt 转向outptunmat moval 0ffhoutpt movresult al 输出结果标记 例题 比较两个字符串是否相同 并找出其中第一个不相等字符的地址 将该地址送BX 不相等字符送AL 两个字符串的长度均为200个字节 M1为源串首地址 M2为目的串首地址 LEASI M1 SI 源串首地址LEADI M2 DI 目地串首地址MOVCX 200 CX 串长度CLD DF 0 地址按增量方向修改REPECMPSB 若相等 则地址重复比较 ANDCX 0FFH 检查 CX 是否是0 JZSTOP CX 0则转STOPDECSI 否则 SI 1 指向不相同单元MOVBX SI BX 不相等单元的地址MOVAL SI AL 不相等单元的内容STOPHLT 停止 例 用重复前缀实现两个字符串相等比较 movsi offsetstring1movdi offsetstring2movcx countcldrepzcmpsb 重复比较 直到比较完或出现不等字符jnzunmat 字符串不等 转移到unmat 设置ffh标记moval 0 字符串相等 设置00h标记jmpoutpt 转向outptunmat moval 0ffhoutpt movresult al 输出结果标记 字符串检索指令 SCASB或者SCASW功能 将AL中的字节或者AX中的字与位于ES段由DI寄存器所指的内存单元的字节或字相比较 SCASB 字节串扫描 AL ES DI DI DI 1SCASW 字串扫描 AX ES DI DI DI 2 例 在字符串中查找 空格 ASCII码为20H 字符 该字符串在附加段 首地址由string指示 具有count个字节 字符串不含空格则继续执行 含有空格则转到found执行 movdi offsetstringmoval 20hmovcx countcldagain scasb 搜索jzfound 为0 ZF 1 发现空格 转移到founddeccx 不是空格jnzagain 搜索下一个字符 不含空格 则继续执行found 例 用重复前缀实现字符串查找 movdi offsetstringmoval 20hmovcx countcldrepnzscasb 搜索jzfound 为0 ZF 1 发现空格 转移到found 不含空格 则继续执行 取字符串指令 LODSB LODSW功能 将位于DS段由SI所指的存储单元的内容取到AL或AX中 LODSW取字 DF 1时地址作减量修改DF 0时地址作增量修改 存字符串指令 STOSB STOSW功能 把AL或AX中的数据存到ES段DI寄存器所指的内存单元 LODS指令和STOS指令功能互逆 它将SI寄存器指向的主存单元的内容送至AL或AX寄存器 并相应修改SI使其指向下一个元素 LODS指令不影响标志 例 使0404H开始的256个单元清0 BBB CLD 清除方向标志LEADI 0404H 将目的地址送DIMOVCX 0080H 共有128个字XORAX AX AX清0REPSTOSW 将256个字节清0 例 数据段DS中有一个数据块 具有count个字节 起始地址为block 现在要把其中的正数 负数分开 分别存入同一个段的两个缓冲区 存放正数的起始地址为dplus 存放负数的起始地址为dminus movsi offsetblockmovdi offsetdplusmovbx offsetdminusmovax dsmoves ax 所有数据都在一个段中 所以设置es dsmovcx count cx 字节数cldgo on lodsb 从block取出一个数据testal 80h 检测符号位 判断是正是负jnzminus 符号位为1 是负数 转向minusstosb 符号位为0 是正数 存入dplusjmpagain 程序转移到again处继续执行minus xchgbx distosb 把负数存入dminusxchgbx diagain deccx 字节数减1jnzgo on 完成正负数据分离 控制转移指令 控制转移指令中包括5类指令 即子程序调用和返回指令无条件转移和条件转移指令循环控制指令中断指令处理器控制指令 转移指令 能够改变CS和IP内容的指令被统称为转移指令 无条件转移 就是无任何先决条件就能使程序改变执行顺序 关于转移指令和调用指令的寻址 段内直接转移 指令中给出相对位移量 JMPlabel IP IP 位移量段内间接转移 EA在寄存器或内存单元中 JMPr16 m16 IP r16 m16段间直接转移 指令中给出转移地址的段码和位移量 JMPfarptrlabel IP label的偏移地址 CS label的段地址段间间接转移 CS和IP用内存中内容来装入 JMPfarptrmem IP mem CS mem 2 JMP指令可以将程序转移到1MB存储空间的任何位置 根据跳转的距离 JMP指令分成了段内转移和段间转移 段内转移是指在当前代码段64KB范围内转移 因此不需要更改CS段地址 只要改变IP偏移地址 如果转移范围可以用一个字节 128 127 表达 则可以形成所谓的 短转移shortjump 如果地址位移用一个16位数表达 则形成 近转移nearjump 它是在 32KB范围 通常 汇编程序能够根据位移量大小自动形成短转移或近转移指令 段内转移 间接寻址 例如 jmpax IP AXjmpwordptr 2000h IP 2000h 目标地址在寄存器或主存单元中 就是通过寄存器或存储器的间接寻址方式 段间转移 间接寻址 例 movwordptr bx 0movwordptr bx 2 1500hJMPfarptr bx 转移到1500h 0 注意 凡是段间转移和段内间接转移都必须是无条件转移指令 条件转移指令只能用段内直接寻址方式 条件转移指令中的条件cc 例 设2000H开始的区域中 存放着14H个数据 要求找出其中最大的一个数 并存到2000H单元 GETMAX MOVBX 2000H BX指向2000H单元MOVAL BX 取第一个数MOVCX 14H CX作为计数器P1 INCBX BX指向下一个数CMPAL BX 和下一个数比较JAZP2 如比下一个数大或相等 则转P2MOVAL BX 如下一个数大 则将其取到ALP2 DECCX 计数减1 如不为0 则转P1JNZP1 MOVBX 2000H 比较完毕 则使BX再指向2000HMOV BX AL 将最大的一个数送到2000H 条件转移指令中的条件cc 例 如果AL最高位为0 则设置AH 0 如果AL最高位为1 则设置AH FFh 也就是用一段程序实现符号扩展指令CBW的功能 使用 不等于零转移JNZ指令 testal 80h 测试最高位jnznext0 最高位为0 ZF 1 转移到next0movah 0ffh 最高位为1 顺序执行jmpdone 无条件转向donenext0 movah 0done 也可以用 等于零转移JZ指令 testal 80h 测试最高位jznext1 最高位为1 ZF 0 转移到next1movah 0h 最高位为0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年食品增味剂行业市场调研及前景趋势预测报告
- 中国正畸材料行业市场调查研究及投资前景预测报告
- 2025年 昆明市快开门式压力容器R1证考试练习题附答案
- 中国生态畜牧业行业市场运营现状及行业发展趋势报告
- 中国渗晶弹性防水材料行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 2025年 甘肃临夏州中医医院招聘笔试试题附答案
- 2024-2030年中国刨床行业市场深度研究及发展趋势预测报告
- 2024年中国萤石采选行业市场调查报告
- 中国成都市集成电路行业市场运行态势及投资战略研究报告
- 2020-2025年中国气胀轴行业发展潜力分析及投资方向研究报告
- 露天矿山开采工艺及安全技术
- 青少年抑郁药物治疗
- 仓库货架规划方案
- 班组安全工作总结汇报
- 学校公共设施设备的管理制度
- GB/T 44570-2024塑料制品聚碳酸酯板材
- 高三一轮复习训练 湖泊专题
- 安全生产月关爱生命注意安全
- 肌少症的诊治浅析
- 2024年海南省中考数学试卷真题及答案详解(精校打印)
- 三菱FX3u-PLC应用实例教程全套课件配套课件完整版电子教案
评论
0/150
提交评论