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位




















使




使




使




上表是 32 位寄存器 EFLAGS 的低 16 位.

不能直接读写 EFLAGS, 但有些方便的指令, 如:
LAHF: 读取EFLAGS 低 8 位到 AH; SAHF 是 LAHF 的反向操作.


指令 STC、CLC、CMC 分别是给 CF(进位标志) 置位、复位、取反


; Test20_1.asm
.386
.model flat, stdcall include windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib .data
  szBin1 db dup(?),
  szBin2 db dup(?),
  szBin3 db dup(?),
  szBin4 db dup(?),
.code
main proc
  stc ;置位 CF, CF = 1
  lahf
  invoke byt2bin_ex, ah, addr szBin1
 
  clc ;复位 CF, CF = 0
  lahf
  invoke byt2bin_ex, ah, addr szBin2
 
  stc
  cmc ;取反 CF, CF = not CF
  lahf
  invoke byt2bin_ex, ah, addr szBin3
 
  clc
  cmc ;取反 CF, CF = not CF
  lahf
  invoke byt2bin_ex, ah, addr szBin4   PrintString szBin1 ;xxxxxxx1
  PrintString szBin2 ;xxxxxxx0
  PrintString szBin3 ;xxxxxxx0
  PrintString szBin4 ;xxxxxxx1
  ret
main endp
end main

如果要观察整个 EFLAGS 的 32 个位, 可用 PUSHFD 和 POPFD 指令让 EFLAGS 进栈、出栈


; Test20_2.asm
.586p
.model flat, stdcall include windows.inc
include kernel32.inc
include masm32.inc
include debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib .data
  szBin db dup(?),
.code
main proc
  stc
  pushfd
  invoke dw2bin_ex, dword ptr [esp+], addr szBin
  popfd
  PrintString szBin ;00000000000000000000001001000111
 
  clc
  pushfd
  invoke dw2bin_ex, dword ptr [esp+], addr szBin
  popfd
  PrintString szBin ;00000000000000000000001010000110
  ret
main endp
end main

发现标志寄存器里的数据有点捉摸不定, 看来不应该是这么观察的; 以后慢慢留意吧.

学 Win32 汇编[20]: 洞察标志寄存器的更多相关文章

  1. 学 Win32 汇编[22] - 逻辑运算指令: AND、OR、XOR、NOT、TEST

    AND: 逻辑与 ;该指令会置 CF=OF=; 其结果影响 SF.ZF.PF ;指令格式: AND r/m, r/m/i ; Test22_1.asm - 使用 AND 运算将一个数的第二.四位清零 ...

  2. 学习笔记分享之汇编---3. 堆栈&标志寄存器

    前言:   此文章收录在本人的<学习笔记分享>分类中,此分类记录本人的学习心得体会,现全部分享出来希望和大家共同交流学习成长.附上分类链接:   https://www.cnblogs.c ...

  3. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    http://www.cnblogs.com/del/archive/2010/04/16/1713886.html 跳转指令分三类:一.无条件跳转: JMP;二.根据 CX.ECX 寄存器的值跳转: ...

  4. 学 Win32 汇编[21] - 传送指令: MOV、LEA、XCHG、XLATB、XLAT、MOVZX、MOVSX

    汇编指令的一般性要求: 1.两个操作数的尺寸必须一致; 2.操作数不能同为内存. MOV(Move): 最常用的数据传送指令 ;该指令不影响 EFlags ;指令格式: (其中的 r.m.i 分别表示 ...

  5. 学 Win32 汇编[33] - 探讨 Win32 汇编的模块化编程

    我觉得所谓的模块化有两种: "假模块化" 和 "真模块化". 所谓 "假模块化" 就是通过 include 指令把 *.inc 或 *.as ...

  6. 学 Win32 汇编[34] - 宏汇编(1)

    从接触 C 语言时, 我就不大喜欢宏; 但为了看懂别人的代码也不得不去了解. 宏可定义在源程序的任意位置, 但一般放在 .data 前面.有些简单的宏可以用 equ.textequ 或 = 来代替, ...

  7. Win32汇编环境配置

    放假了,发现自己知识面窄,趁有时间就打算折腾下Win32汇编.其实在学校也上过汇编课,是基于dos的.那时老师不务正业,老跟我们讲政治经济文化,唯独不怎么讲课;再加上自己的问题,导致了dos汇编学得好 ...

  8. 标志寄存器PSW和汇编条件转移指令解释

    标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW)   标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标志 ...

  9. win32汇编基础

    win32汇编基础知识 Debug 版本|Release 版本 Debug 是"调试"的意思,Debug 版本就是为调试而生的,编译器在生成 Debug 版本的程序时会加入调试辅助 ...

随机推荐

  1. nucleus学习

    task的TCB结构: typedef struct TC_TCB_STRUCT { /* Standard thread information first. This information is ...

  2. Network基础(六):telnet远程管理

    一.telnet远程管理 目标: 在企业中为方便网络管理员对Cisco设备的配置,一般需事先在Cisco交换机及路由器上开启远程管理的服务,借助网络通过telnet方式远程访问. 方案: 网络管理员通 ...

  3. windows 下redis在后台运行

    打开命令终端,cd进入redis目录 安装redis服务:redis-server --service-install redis.windows.conf --loglevel verbose re ...

  4. git代码提交步骤

    常用的步骤: 1)假如本地想关联git仓库,那么先git  init,git remote add origin [git地址] 2)假如是想直接从git仓库拉下来,那么git clone [git地 ...

  5. BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)

    传送门 解题思路 异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度\(O(nlog^3n)\),并不知道咋过去的. 代码 #include<iostr ...

  6. 2.zabbix自定义模板

    zabbix自定义模板 zbx_base_templates.xml <?xml version="1.0" encoding="UTF-8"?> ...

  7. 提供 web前端、H5、html页面 技术服务

    如有前端页面的需求请在评论区留言  第一时间进行回复

  8. SAS创建和使用索引(SAS INDEX)

    一.概述 在合并数据集的时候,可以使用DATA步,但使用DATA 步时需要对KEY VALUE 排序,且KEY VALUE 的名字也必须一致:也可以用PROC SQL ,不需要进行上述排序.重命名的步 ...

  9. 使用Guzzle执行HTTP请求

    Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上.Guzzle提供了简单的接口,构建查询语句.POST请求.分流上传下载大文件.使用HTTP cookies ...

  10. 巧妙的使用jmeter来发送json格式数据

    1. header-manager 修改content-type值. 如果不修改该值, 则默认会是urlencode的数据格式(例如a=5&b=6). 修改为json后,会告诉服务器,发送的数 ...