热门标签 | HotTags
当前位置:  开发笔记 > 小程序 > 正文

《IBM-PC汇编语言程序设计》(清华大学出版社)笔记(四)

2.2.1.7逻辑指令1)逻辑运算a)ANDb)ORc)NOTa)不允许使用立即数d)
2.2.1.7 逻辑指令

1)      逻辑运算

a)      AND

b)      OR

c)       NOT

a)      不允许使用立即数

d)      XOR              异或

e)      TEST             做与运算,但是不保存结果,只根据结果设置条件码

f)        除了NOT不允许使用立即数,其他的四种,只有源操作数可以是立即数,至少有一个操作数必须在寄存器中,另一个操作数可以使用任意寻址方式

2.2.1.8

2)      位测试并修改指令

a)      BT                 位测试

                    i.           BT DST, SRC         将目的操作数中,由源操作数指定位的值,送CF

b)      BTS               位测试并置1

                    i.           将目的操作数中,由源操作数指定位的值,送CF,并且将目的操作数该位置的值+1

c)       BTR               位测试并置0

                    i.           将目的操作数中,由源操作数指定位的值,送CF,并且将目的操作数该位置的值置为0

d)      BTC               位测试并变反

                    i.           将目的操作数中,由源操作数指定位的值,送CF,并且将目的操作数该位置的值变反

e)      SRC,可以使用,立即数或者寄存器方式,直接指明是第几位,也可以用任意一字寄存器或双字寄存器的内容给出同一个值

f)        目的操作数可以是用除了立即数之外的任意一种寻址方式

g)      因为目的操作数的字长最大为32位,所以位位置的范围是0~31

3)      位扫描指令

a)      BSF               正向位扫描

                    i.           从0位置开始,左←右

                   ii.           目的是检索第一个为1 的位置,并且记录,如果遇到第一个为1 的位,则将ZF置0,并把位置装入目的存储器中;如果源操作数为0àZF= 1,此时目的存储器无定义

                 iii.           源操作数可以使用除立即数意外的任意一种寻址方式,目的操作数必须用字或双字寄存器

b)      BSR               反向位扫描

                    i.           自左à右扫描

                   ii.           其他与BSF一致

4)      移位指令

a)      SHL               逻辑左移

                    i.           SHL OPR,CNT

                   ii.           CNT大于1时,移位次数存放在CL中,直接用CL代替CNT,当=1 时,直接写1

b)      SHR

c)       SAL               算术左移

                    i.           与SHL一致

d)      SAR

                    i.           SAR  OPR,CNT

                   ii.           CNT大于1时,移位次数存放在CL中,直接用CL代替CNT,当=1 时,直接写1

                 iii.           最高位右移,补其本身,本身是0,补0,是1,补1

e)      ROL               循环左移

f)        ROR

g)      RCL               带进位左移

h)      RCR

i)        SHLD             双精度左移

j)        SHRD


2.2.1.8 串处理指令

1)      MOVS

2)      CMPS

3)      SCAS             串扫描

4)      LODS            从串取

5)      STOS             存入串

6)      INS                串输入

7)      OUTS            串输出

8)      串处理的指令处理存放在存储器中的数据串

9)      配合以上指令使用的前缀有:

a)      REP

b)      REPE/REPN

c)       REPNE/REPXZ

10)   与REP相配合工作的MOVS,STOS,LODS,INS,OUTS

a)      REP  str

                    i.           重复str操作,知道CX计数器中的值为0

b)      MOVS   

                    i.           MOVSB

                   ii.           MOVSW

                 iii.           MOVSD

                 iv.           目的操作数必须存储在ES源操作数必须存储在DS,源串允许使用段超越前缀

                   v.           源串首地址存放在SI,目的串首地址存放在DI,串长度存放在CX计数器中

                 vi.           CLDàDF=0,地址自动增量;STDàDF=1,地址自动减量

                vii.           执行MOVS的准备工作             P77

1.      源串首地址存放在SI,目的串首地址存放在DI

2.      串长度存放在CX计数器中

3.      建立方向标志

c)       STOS      存入串指令

                    i.           STOS

                   ii.           STOSB

                 iii.           STOSW

                 iv.           STOSD

                   v.           将存放在AL\AX\EAX的内容存入由目的寄存器(DI)指向的附加段的某个单元

                 vi.           根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)

                vii.           与REP联用时,将内容的长度存放在计数器中

               viii.           初始化某一缓冲区时很有作用

                  ix.           其他的特点和MOVS一致

d)      LODS     从串取指令

                    i.           从源变址寄存器(SI)所指向的数据段某单元取出内容,存放在AX\AL\EAX中

                   ii.           根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)

                 iii.           其他特点和STOS一致

e)      INS         串输入指令

                    i.           INS

                   ii.           INSB

                 iii.           INSW

                 iv.           INSD

                   v.           将端口号在DX中的I/O空间的内容传送到附加段中的目的变址寄存器(DI)所指向的存储单元中

                 vi.           根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)

                vii.           其他特点和STOS一致

               viii.           I/O端口处理的速度必须与REP INS一致

f)        OUTS     串输出指令

                    i.           OUTS

                   ii.           OUTSB

                 iii.           OUTSW

                 iv.           OUTSD

                   v.           把由源变址寄存器(SI)所指向的存储器中的内容传送到端口号在DX中的I/O端口中去

                 vi.           根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)

                vii.           其他特点和STOS一致

               viii.           I/O端口处理的速度必须与REP OUTS一致

11)   与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS

a)      CMPS    

                    i.           SI所指向的数据段(DS)中的内容与DI所指向的附加段(ES)中的一个字节、字或者双字相减,不保存结果,根据结果设置条件码

                   ii.           其他的特性与MOVS一致

b)      SCAS

                    i.           SACS

                   ii.           SACSB

                 iii.           SACSW

                 iv.           SACSD

                   v.           将AX\AL\EAX中的内容与DI所指向的附加段中的一个字节、字或者双字比较,不保存结果,根据结果设置条件码

                 vi.           其他的特性与MOVS一致

 

不允许使用“立即数寻址”的有:

1)      段内间接寻址

2)      段间间接寻址

3)      PUSH,POP操作

4)      XCHG

5)      LEA

6)      乘法运算,源操作数的寻址

7)      除法运算,源操作数的寻址

8)      位测试并修改指令

9)      NOT不允许使用立即数

10)   BSF/BSR

11)   SHL/SHR


条件标志位

1)      最主要的是CF,ZF,SF,OF四位

2)      CF,是根据最高有效位是否有向高位的进位设置的,有进位CF=1,否则CF=0

a)      可以用来表示无符号数的溢出,CF = 1 ,溢出,否则不溢出

3)      OF,根据操作书的符号以及其变化情况来设置。

a)      加法,当两个符号相同相加时,<0 则溢出,符号不同相加,不会出现溢出

b)      减法,当两个符号不相同相减时,> 0 则溢出,符号相同相减,不会溢出


       各个指令对标志位的影响

指令集

指令名

CF

ZF

AF

OF

SF

PF

备注

 

 

通用数据传送指令

MOV

-

-

-

-

-

-

无影响

MOVSX

-

-

-

-

-

-

无影响

MOVZX

-

-

-

-

-

-

无影响

PUSH/POP

-

-

-

-

-

-

无影响

PUSHA/POPA

-

-

-

-

-

-

无影响

累加器专用传送指令

IN/OUT

-

-

-

-

-

-

无影响

XLAT

-

-

-

-

-

-

无影响

地址传送指令

LEA等

-

-

-

-

-

-

无影响

标志寄存器指令

LAHF/PUSHF/PUSHFD

-

-

-

-

-

-

无影响

SAHF/POPF/POPFD

由装入的值确定标志位的值

影响

类型转换指令

CBD/CWD/CDQ/BSW

-

-

-

-

-

-

无影响

加法指令

ADD/ADC/XADD

1

1

-

1

1

-

影响

INC

-

 

 

 

 

 

 

 

减法指令

SUB/SBB/NEG/CMP

CMPXCHG/CMPXHCG8B

1

1

-

1

1

-

影响

DEC

-

 

 

 

 

 

 

 

逻辑运算指令

NOT

-

-

-

-

-

-

无影响

AND/OR/XOR/TEST

1

根据结果

-

根据结果

 

位测试指令

BT/BTS/BTR/BTC

1

-

-

-

-

-

影响

位扫描指令

BSF/BSR

-

1

-

-

-

-

影响

 

 

 

移位指令

SHL/SHR/SAL/SAR

 

根据各指令规定设置

根据移位后的结果设置

 

最高位移位后有变化,OF=1

根据移位后的结果设置

根据移位后的结果设置

 

ROL/ROR/RCL/RCR/SHLD/

SHRD

1

-

-

1

-

-

影响

串处理指令

MOVS/STOS/LODS/INS/OUTS/

SCAS

-

-

-

-

-

-

无影响

 

 

 

 

 

 

 

 

 

      

 

 

 

注意点:

1)      双操作数指令不允许两个操作数都使用存储器,所以必须有一个操作数是寄存器

2)      不允许用MOV 指令在两个存储单元之间直接传送数据,也不允许两个段寄存器之间直接传送信息

3)      几种传送信息的方式:

 
  

 

 

 

 

 

 

 

 








推荐阅读
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 【线段树】  本质是二叉树,每个节点表示一个区间[L,R],设m(R-L+1)2(该处结果向下取整)左孩子区间为[L,m],右孩子区间为[m ... [详细]
  • 深入RTOS实践,面对原子操作提问竟感困惑
    在实时操作系统(RTOS)的实践中,尽管已经积累了丰富的经验,但在面对原子操作的具体问题时,仍感到困惑。本文将深入探讨RTOS中的原子操作机制,分析其在多任务环境下的重要性和实现方式,并结合实际案例解析常见的问题及解决方案,帮助读者更好地理解和应用这一关键技术。 ... [详细]
  • Git命令基础应用指南
    本指南详细介绍了Git命令的基础应用,包括如何使用`git clone`从远程服务器克隆仓库(例如:`git clone [url/path/repository]`)以及如何克隆本地仓库(例如:`git clone [local/path/repository]`)。此外,还提供了常见的Git操作技巧,帮助开发者高效管理代码版本。 ... [详细]
  • 作文记录:合并区间的技巧与应用
    本文详细记录了合并区间问题的解题技巧与应用场景。首先介绍了问题背景和题目描述,接着从排序最大值的角度探讨了解决思路,并提供了具体的程序代码及运行结果。此外,还探讨了其他可能的解决方案。最后,对整个解题过程进行了总结,为读者提供了全面的理解和参考。 ... [详细]
  • 泰波那契数列与斐波那契数列类似,但其计算方法有所不同。本文详细解析了如何高效计算第 N 个泰波那契数,并提供了一种基于动态规划的优化算法。通过使用数组记录中间结果,避免了重复计算,显著提高了算法的执行效率。代码示例展示了具体的实现方法,帮助读者更好地理解和应用这一算法。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 基于 Vue 和 Element UI 实现的简洁登录界面设计
    本文介绍了一种利用 Vue.js 和 Element UI 框架构建的简洁登录界面设计。该设计不仅注重用户体验,还确保了界面的美观性和易用性。通过合理的布局和组件配置,实现了高效、响应式的登录功能,适用于多种前端应用场景。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 本文详细探讨了JavaScript中数组去重的各种方法,并通过实际代码示例进行了深入解析。文章首先介绍了几种常见的去重技术,包括使用Set对象、过滤方法和双重循环等。每种方法都附有具体的实现代码,帮助读者更好地理解和应用这些技术。此外,文中还讨论了不同方法在性能上的优劣,为开发者提供了实用的参考。 ... [详细]
  • 展开全部下面是实现Java批量打印功能的具体工具类,其中的Info类和UserClass为具体的快递面单中要打印的信息e68a8462616964757a686964 ... [详细]
author-avatar
全拼wangziyiva_632
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有