学习笔记分享之汇编---3. 堆栈&标志寄存器
前言:
  此文章收录在本人的《学习笔记分享》分类中,此分类记录本人的学习心得体会,现全部分享出来希望和大家共同交流学习成长。附上分类链接:
  https://www.cnblogs.com/tibbors/category/1729804.html
学习内容:堆栈

- 堆栈的优点:临时存储大量数据,便于查找
- 堆栈中越往顶部地址编号越小
- 压栈出栈变的都是栈顶
堆栈的操作分解:
前提操作:
	MOV EBX,13FFDC	//BASE
	MOV EDX,13FFDC	//TOP
操作一:压入数据
	法一:
	MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA		//先压入数据
	SUB EDX,4								//再上移地址(寄存器)
	法二:
	SUB EDX,4								//先上移地址(寄存器)
	MOV DWORD PTR DS:[EDX],0xBBBBBBBB		//再压入数据
	法三:
	MOV DWORD PTR DS:[EDX-4],0xDDDDDDDD		//先压入数据
	LEA EDX,DWORD PTR DS:[EDX-4]			//再通过LEA指令上移地址(寄存器)
	法四:
	LEA EDX,DWORD PTR DS:[EDX-4]			//先通过LEA指令上移地址(寄存器)
	MOV DWORD PTR DS:[EDX],0xEEEEEEEE		//再压入数据
操作二:读取某个数据
	法一:
	//通过[BASE+偏移量]读取
	MOV ESI,DWORD PTR DS:[EBX-4]
	法二:
	//通过[TOP+偏移量]读取
	MOV EDI,DWORD PTR DS:[EDX+4]
操作三:弹出数据
	法一:
	MOV ECX,DWORD PTR DS:[EDX]				//先弹出数据(保存到其他存储空间)
	LEA EDX,DWORD PTR DS:[EDX+4]			//再下移地址(寄存器)
	法二:
	MOV ESI,DWORD PTR DS:[EDX]				//先弹出数据(保存到其他存储空间)
	ADD EDX,4								//再下移地址(寄存器)
	法三:
	LEA EDX,DWORD PTR DS:[EDX+4]			//先下移地址(寄存器)
	MOV EDI,DWORD PTR DS:[EDX-4]			//再弹出(下移前地址)数据(保存到其他存储空间)
堆栈的专用操作:
- 操作系统默认把ESP当栈底,EBP当栈顶
- PUSH(压栈) = 操作一
- POP(出栈) = 操作三
学习内容:标志寄存器(EFLAGS)

- 进位标志寄存器CF(Carry Flag)(针对无符号数): - 进位标志CF用于反映无符号数加减运算中最高位是否有进位。 - 有:1 
- 无:0 
 - e.g. - MOV AL,0xEF - ADD AL,2  - MOV AL,0xFE - ADD AL,2  
- 溢出标志寄存器OF(Overflow Flag)(针对有符号数): - 溢出标志OF用于反映有符号数加减运算所得结果是否溢出。 - (如果运算结果超过当前运算位数所能表示的范围,则称为溢出) - 溢出:1
- 未溢出:0
 - O位计算过程: 符号位有进位:1;无进位:0 最高有效数值位向符号位有进位:1;无进位:0 对 符号位有无进位 和 最高有效位有无进位 进行异或:所得值即为OF位的值
 
补充(CF与OF):
在有符号的运算中,有如下的规律:
- 正 + 正 = 正 如果结果是负数,则说明有溢出 
- 负 + 负 = 负 如果结果是正数,则说明有溢出 
- 正 + 负 永远都不会有溢出 - 可根据右图理解无符号数和有符号数不同情况:  - 也可根据此图找出以下四种情况: - 无符号、有符号都不溢出 - 无符号溢出、有符号不溢出 - MOV AL,8 ADD AL,8 - MOV AL,FF ADD AL,2 - 无符号不溢出、有符号溢出 - 无符号、有符号都溢出 - MOV AL,7F ADD AL,2 - MOV AL,FE ADD AL,80 
- 符号标志SF(Sign Flag): - 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。 - e.g. - 细心观察S位变化 - MOV EAX,0x0A7F  - ADD EAX,2  - SUB EAX,2  - ADD AL,2  - SUB AL,2  - 可以发现:S位只看参与运算的宽度的符号位的值是1还是0
 同样的结果,用EAX将32位全部参与运算时不论怎样,S值都为0,因为最高位为0
 而用AL只运算后八位时,S值被置为1,因为此时参与运算部分的最高位为1
 
- 辅助进位标志AF(Auxiliary Carry Flag): - 在发生下列情况时,辅助进位标志AF的值被置为1,否则被置为0: - (粗略理解:只要发生除最高位以外的进位或借位就会被置为1) - ①在字操作时,低字节向高字节进位或借位 - ②在字节操作时,低4位向高4位进位或借位 - e.g. - MOV EAX,55EEFFFF - ADD EAX,2  - MOV AX,5EFE - ADD AX,2  - MOV AL,4E - ADD AL,2  
- 奇偶标志PF(Parity Flag): - 奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。 - 偶数个1:1
- 奇数个1:0
 - e.g. - MOV EAX,AEF - ADD EAX,2  - 从上图可以看出,虽然0x0B00(即0000 1011 0000 0000)有奇数个1,P位应该为0 - 因此,对于P位寄存器,只看最低有效字节(低8位(十六进制的后两位))(不管是多少位寄存器)
 
- 零标志ZF(Zero Flag): - 零标志ZF用来反映运算结果是否为0。 - 为0:1
- 不为0
 - e.g. 
 XOR EAX,EAX //功能为清零
  
 注意:
 MOV EAX,0和XOR EAX,EAX虽然结果一样,但是意义不一样,因为MOV不是运算符,而XOR是,因此若用MOV,EFLAGS寄存器就不会有变化
- 方向标志DF(Direction Flag): - 方向标志DF用来决定 ① 执行MOVS指令时[ESI]和[EDI]中存储的地址 ② 执行STOS指令时的 加/减 - 为0:加
- 为1:减
 
学习笔记分享之汇编---3. 堆栈&标志寄存器的更多相关文章
- 大学四年的Python学习笔记分享之一,内容整理的比较多与仔细
		翻到以前在大学坚持记录的Python学习笔记,花了一天的时间整理出来,整理时不经回忆起大学的时光,一眨眼几年就过去了,现在还在上学的你们,一定要珍惜现在,有个充实的校园生活.希望这次的分享对于你们有学 ... 
- 学 Win32 汇编[20]: 洞察标志寄存器
		15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向 ... 
- JavaScript学习笔记之  数组方法一 堆栈 和队列
		数组的方法 以及 堆栈的操作的方法 JavaScript是一种弱类型语言,不像其它程序语言需要严格定义数据类型.在JavaScript中数组可以任意修改变动,这样也就出现了一个问题,如果边遍历数组边操 ... 
- ARM学习笔记9——ARM汇编汇编语言中的伪指令
		ARN汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或Thumb指令.ARM伪指令包含ADR.ADRL.MOV32和LDR.一.ADR伪指令 1.作用 ADR是小范围地址读取伪指令,基于P ... 
- 字节跳动内部微服务架构-Docker实战学习笔记分享 真香
		前言 基于 Spring Cloud 的微服务设计和开发,已经越来越多地得到了更多企业的推广和应用,而 Spring Cloud 社区也在不断的迅速发展壮大之中,近几年时间,Spring Cloud ... 
- MVC学习笔记(分享)
		一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ... 
- JavaScript01天学习笔记分享
		01知识点 JavaScript 代码运行在浏览器(后缀名.js) 和java完全不同的东西,只是名称类型而已 src 引用脚本 <Script></Script> ale ... 
- JavaScript构造函数学习笔记分享
		构造函数就是一个普通的函数,创建方式和普通函数没有区别 不同的是构造函数名习惯上首字母大写 普通函数是直接调用,而构造函数需要使用new关键字来调用 构造函数的执行流程: 立刻创建一个新的对象 将新建 ... 
- JavaScript数组的方法 | 学习笔记分享
		数组 数组的四个常用方法 push() 该方法可以向数组的末尾添加一个或多个元素,并返回数组的新长度 可以将要添加的元素作为方法的参数传递,这些元素将会自动添加到数组的末尾 pop() 该方法可以删除 ... 
随机推荐
- 五分钟学后端技术:如何学习Redis、memcache等常用缓存技术
			原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类 ... 
- java基础-Map
			简介 Map是一种接口,实现类有 hashMap SortedMap是继承自Map的接口,实现类为TreeMap,在内部会对Key进行排序 遍历Map 使用for each循环遍历Map实例的keyS ... 
- MongoDB操作符之$elemMatch
			问题 如果MongoDB 数据库集合中仅存在一条记录 { "_id" : ObjectId("5e6b4ef546b5f44e5c5b276d"), " ... 
- display:flex 简单记录
			1.有写了 display:flex:这个就是 采用了 flex布局的 元素 这个元素可以 写 6个属性: flex-direction : row | column | row-reverse ... 
- pd库dataframe基本操作
			一.查看数据(查看对象的方法对于Series来说同样适用) 1.查看DataFrame前xx行或后xx行 a=DataFrame(data); a.head(6)表示显示前6行数据,若head()中不 ... 
- javaWeb课程体系介绍
			javaWeb课程体系介绍-一般必须学的课程: JavaSE开发Java基础编程Java核心编程Java高级编程DataBase开发MySQLJDBCJavaEE开发Web基础SpringSpring ... 
- Apache服务的主要目录和配置文件详解
			Apache服务的主要目录和配置文件详解 2014-01-14 19:05:14 标签:httpd配置文件详解 apache配置文件 httpd配置文件 apache文件目录 原创作品,允许转载,转载 ... 
- ReentrantLock源码解析——虽众但写
			在看这篇文章时,笔者默认你已经看过AQS或者已经初步的了解AQS的内部过程. 先简单介绍一下ReentantLock,跟synchronized相同,是可重入的重量级锁.但是其用法则相当不同,首先 ... 
- 图像配准:从SIFT到深度学习
			图像配准(Image Registration)是计算机视觉中的基本步骤.在本文中,我们首先介绍基于OpenCV的方法,然后介绍深度学习的方法. 什么是图像配准 图像配准就是找到一幅图像像素到另一 ... 
- 好记性-烂笔头:JDK8流操作
			1):对象 List<User> 转 Map<String,Object> 案例如下: public class User { private Integer id; priv ... 
