Win-MASM64汇编语言-标志寄存器(EFLAGS/PSW/PUSHF/POPF)
CPU内部需要一种特殊的寄存器来完成下面三个功能
1.用来存储相关指令的执行结果是否满足某些特性
2.为cpu执行相关指令提供行为依据
3.用来控制cpu的相关工作方式
能完成上面三个功能的寄存器被成为标志寄存器,标志寄存器简称flag,里面存的内容叫psw(程序状态字)
注:标志寄存器指的是一个寄存器,而不是多个寄存器的类型是标志寄存器
用来存放各种标志位,在Visual Sudio中打开标志寄存器调试界面,调试->窗口->寄存器,此时打开寄存器窗口,但是该窗口只有通用寄存器,这个时候右键,选择"标志",然后在寄存器窗口中会显示出标志寄存器的值
一:进位标志位CF(Carry Flag)也叫CY
用途1:计算指令(add等)产生的结果,最高有效位发生进位(加法)或者发生借位(减法),则将其置1,反之清0,注意,是最高位,比如一个int,最高位是32位,只有当第32位继续进位(溢出)的时候,CY会由0变1,在无符号整数运算中用来表示溢出,而OF是在有符号整数中表示溢出
用途2:在多倍精度运算中使用,可以将上次产生的进位或借位传递到下一次运算中
int a = 0x80000000;int b = 0x80000000;_asm mov eax, a;_asm mov ebx, b;_asm add eax, ebx;// 在这里CY的值会由0变成1
int a = 0x08000000;int b = 0x08000000;_asm mov eax, a;_asm mov ebx, b;_asm add eax, ebx;// 在这里CY的值依然是0不会改变,因为最高位没有进位
int a = 0x80000000;int b = 0x70000000;_asm mov eax, a;_asm mov ebx, b;_asm sub eax, ebx;// eax减去ebx,8-7,没有借位,所以CY值一直是0
int a = 0x70000000;int b = 0x80000000;_asm mov eax, a;_asm mov ebx, b;_asm sub eax, ebx;// eax减去ebx,7-8,有进位,所以CY由0变1
二:奇偶标志位PF(ParityFlag)也叫PE:计算指令(add等)产生的结果如果低8位有偶数个1,则PF为1,有奇数个1则为0
int a = 0x10;//注意是低8位,如果是0x110,右数第三位那个1不算int b = 0x01;_asm mov eax, a;_asm mov ebx, b;// 调试的时候注意程序刚开始运行的时候,PE可能会保留之前的信息// 所以会出现刚执行程序的时候PE有时候是0有时候是1,这并不影响结果,但是容易造成误解_asm add eax, ebx;// 此处代码走完PE会变成1
三:辅助进位标志AF也叫AC
计算指令(add等)产生的结果如果右数第4个bit发生了进位或借位,则置1,否则置0,在BCD算数运算中中会被用到,此处初学千万注意,右数第4个bit,指的是2进制,像0x1111这不叫右数4个bit,这叫右数16个bit了(通俗的说就是最低字节有没有进位或借位)
int a = 0x8;//0x8=1000,相当于右数第4个bit为1int b = 0x8;_asm mov eax, a;_asm mov ebx, b;_asm add eax, ebx;// 此处执行完毕AC会置1,因为发生了进位
int a = 0x7;int b = 0x8;_asm mov eax, a;_asm mov ebx, b;// AC依然保持0,因为7+8=F,没有发生进位_asm add eax, ebx;
四:零标志位ZF(ZeroFlag)也叫ZR
计算指令(add等)产生的结果为0则置1,否则置0,注意如果两个数相加溢出了,也会置1,不管是如何得出0的,只要最终结果是0,那么ZR就会置1
int a = 0x0;int b = 0x0;_asm mov eax, a;_asm mov ebx, b;// 下面这行代码走完之后,ZR变成1,因为0+0=0_asm add eax, ebx;
五:符号标志位SF(SignFlag)也叫PL
用来表示最高有效位,最高位是0,则置0,最高位是1则置1,在计算机中该标志位用来表示正负数
int a = 0x00000000;int b = 0x88000000;_asm mov eax, a;_asm mov ebx, b;_asm add eax, ebx;//这行代码走完PL会置1
日记:
如果SF/PL=1,则说明这个数是某个数的补码形式,应该根据补码求解出原码,然后前面加上负号,但是,要注意,不能以SF/PL=1,就说明本次运算真正的结果是负数,当结果溢出之后,那么这个结果其实是正数,但是SF/PL依然是1,例如下面这段代码
mov ah,22H
mov bh,0A0H
// 实际结果应该是+130
// 但是ah里存的是82H,十进制是-126
sub ah,bh
所以要想得到一个结果真正是否是正负,还需要配合OF标志位(OV标志位),最终的结论如下
如果没溢出:SF/PL=1,则说明真正的结果为负,SF/PL=0说明结果为正
如果溢出:SF/PL=1,则说明真正的结果为正,SF/PL=0说明结果为负
六:陷阱标志位TF
陷阱标志指的是当前是一个单步调试的状态
七:中断标志位IF(Interrupt)
置1可屏蔽中断,后续再补上这个标志位 TODO
八:控制标志位DF(Direction),也叫方向标志
置1表示内存从高地址往低地址操作(减),置0则恰好相反
九:溢出标志位OF(Overflow)也叫OV
CF是无符号整数运算中用来表示溢出,而OF是在有符号整数中表示溢出,注意他俩的区别
int a = 0x80000000;int b = 0x80000000;_asm mov eax, a;_asm mov ebx, b;// 发生了进位,算溢出,所以在这里OV的值会由0变成1_asm add eax, ebx;
int a = 0x70000000;int b = 0x80000000;_asm mov eax, a;_asm mov ebx, b;// 发生了借位,也算溢出,所以在这里OV的值会由0变成1_asm add eax, ebx;
PUSHF和POPF指令
pushf是将标志寄存器(EFLAG)的值压入栈
popfs是从栈中弹出数据,放到标志寄存器中
Win-MASM64汇编语言-标志寄存器(EFLAGS/PSW/PUSHF/POPF)相关推荐
- [汇编语言]标志寄存器
目录 一.ZF标志 二.PF标志 三.SF标志 四.CF标志 五.OF标志 六.adc指令 七.sbb指令 八.cmp指令 九.检测比较结果的条件转移指令 十.DF标志和串传送指令 十一.pushf和 ...
- 汇编语言--标志寄存器
标志寄存器 CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下3种作用. 用来存储相关指令的某些执行结果: 用来为CPU执行相关指令提供行为依据: 用 ...
- 状态标志寄存器--EFLAGS
EFLAGS寄存器有控制CPU的操作或反映CPU某些运算的结果的独立二进制位构成. 标志位 名称 全称 作用 CF 进位标志 Carry Flag 无符号算术运算的结果太大而目的操作数无法容纳时置位 ...
- Intel 64/x86_64/x86/IA-32处理器标志寄存器详解(2) - 32位EFLAGS - 80386(386, Intel386)/80486(486, Intel486)
80386/386/Intel386标志寄存器EFLAGS 80386增加了RF/VM标志位,用于支持虚拟8086模式与指令断点调试. 80486/486/Intel486标志寄存器EFLAGS (1 ...
- 标志寄存器的详细解释
简介: CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有三种作用. (1)用来存储相关指令的某些执行结果. (2)用来为CPU执行相关指令提供行 ...
- Intel 64/x86_64/IA-32/x86处理器 - 通用指令(7) - 标志寄存器/标志控制指令 段寄存器指令
Flag Control (EFLAGS) Instructions 下列指令用于控制(即修改)标志寄存器EFLAGS中的标志位. 指令 描述 STC 设置CF标志为1 CLC 清除CF标志为0 CM ...
- 贺利坚老师汇编课程54笔记:标志寄存器
指路老师的博客 8086状态标志寄存器含义 FLAG标志寄存器:PSW/FLAGS,别称:程序状态字 8086CPU指令集中,有的指令的执行是影响标志寄存器,比如:add,sub,mul,div,in ...
- 汇编语言 标志位介绍
一.运算结果标志位 1.进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位.如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0. 使用该标志位的情 ...
- 二十二、标志寄存器与栈(代码设计安全,与子程序寄存器安全类似)
1.子程序安全调用 子程序的设计要以保持寄存器值的平衡,栈空间的平衡为原则. 子程序的设计在必要时候,需要保持标志寄存器的平衡. 2.标志寄存器 在计算机中,有一个专用16位的寄存器FLAGS ...
最新文章
- 那些年,我们见过的 Java 服务端乱象
- ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...
- 创建java的可执行文件
- 所有库在门不显示封装_COB全天候通透屏,在商业显示中的场景应用
- 实现工控机4U断电后自动重启功能
- Not enough memory. Please load a smaller dataset or use larger heap size.
- NAT的extendable参数,使得一个地址被不同接口NAT出去测试
- Webdriver使用Chrome模拟手机浏览器测试移动版网站
- 58-混沌感悟.(2015.2.11)
- python时间序列滞后命令,时间序列-相关性和滞后时间
- SAP License:数据导入时的问题与总结
- 如何安装Ruby(Windows)
- JS事件流与DOM事件处理程序
- Python之字体反爬详细操作
- 仿iGoogle自定义首页模块拖拽效果
- diy服务器个人主机_DIY个人服务器
- 江苏各大高校开学具体时间,快来看看有你的学校吗?小伙伴们想开学了吗?
- Windows系统封装总结
- Office 2016 卡顿问题!如果其他方法都没有用就关掉硬件加速!
- LANDESK操作系统部署时,网卡启动后,自动进入pe选择菜单,而不用按F8 进行选择启动菜单的情况下,如何操作?...
热门文章
- 同步类容器与并发类容器
- Java中提取字符串中的数字
- IDEA导入Gradle项目后,重现构建项目并导入jar包后但是External Libraries目录中无任何引入的jar包
- oracle中季末最后一天,oracle有关时间计算,得到季度第一天、最后一天
- 两个表点击分页的时候怎么判断点的是哪一个表_如何对指数估值,估值表怎么用?...
- kafka入门综合概要介绍
- css不继承上级样式_CSS基础知识(一)
- 根据线程名获取线程及停止线程
- RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较(转)
- 子慕谈设计模式系列(二)——设计模式六大原则