学习笔记分享之汇编---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:减
最新文章
- HTML基础标签
- php使用file函数、fseek函数读取大文件效率分析
- AngularJS快速入门指南06:过滤器
- Cordova开发环境的搭建
- CMWAP CMWAP是手机上网使用的接入点的名称
- JavaEE基础(二十二)/IO流
- apache commons Java包简介
- Session过期,跳出iframe等框架
- [iOS UI进阶 - 1] 自定义控件
- list-style无颜色问题解决,list-style-type无颜色解决
- We Chall-Training: Crypto - Caesar I-Writeup
- 【USACO09OCT】热浪Heat Wave
- Centos7安装JStorm2.1.1
- 从浏览器直接转跳到APP具体页面---(魔窗)MagicWindow使用教程
- git连接不上远程仓库---visualstudio提交代码报错:no upstream configured for branch 'master'
- Ubuntu下安装antlr-4.7.1
- 『Yaml』配置文件读写包
- 20135119_涂文斌 实验二 Java面向对象程序设计
- 通过Intent Flags ,从桌面返回到App最后Activity
- 短网址(short URL)系统的原理及其实现
热门文章
- M-Renamer方法名修改器,iOS项目方法名重构,Objective-C/Swift,代码模型预判,减少误改的机率,替换速度更快,可视化操作,傻瓜式操作,一键操作,引用处自动修改,马甲包的福音
- React Native新项目启动报错'React/RCTBridgeDelegate.h' file not found
- 2020 python web开发就业要求锦集
- 彻底明白equals和hashCode
- HOOK相关原理与例子
- 码云上开源JAVA项目收藏
- CSS盒子模型(boeder)+浮动(float)+定位(position)
- H - 蓬松的头发 HDU - 5504
- PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)
- CPU、内存、硬盘、指令之间的关系