zoukankan      html  css  js  c++  java
  • 学 Win32 汇编[20]: 洞察标志寄存器

    1514131211109876543210
     NTIOPLOFDFIFTFSFZF 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  8 dup(?), 0
        szBin2  db  8 dup(?), 0
        szBin3  db  8 dup(?), 0
        szBin4  db  8 dup(?), 0
    .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 32 dup(?), 0
    .code
    main proc
        stc
        pushfd
        invoke dw2bin_ex, dword ptr [esp+4], addr szBin
        popfd
        PrintString szBin ;00000000000000000000001001000111
        
        clc
        pushfd
        invoke dw2bin_ex, dword ptr [esp+4], addr szBin
        popfd
        PrintString szBin ;00000000000000000000001010000110
        ret
    main endp
    end main


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

    不追热点、不关时政、不要喧哗、不惹纷争、做自己喜欢的事,过宁静的生活。
  • 相关阅读:
    delphi RTTI 反射技术
    delphi 自我删除和线程池(1000行代码,需要仔细研究)
    寻找两个已序数组中的第k大元素
    OpenCV中的神器Image Watch
    PYTHON 之 【RE模块的正则表达式学习】
    Call U
    微软IE11浏览器的7大变化
    集群应用及运维经验小结
    逆序对:从插入排序到归并排序
    Jquery 图片轮播实现原理总结
  • 原文地址:https://www.cnblogs.com/dsli/p/7221508.html
Copyright © 2011-2022 走看看