win32 寄存器
跳转指令分三类:
一、无条件跳转:
JMP ;无条件跳转
二、根据CX、ECX寄存器的值跳转:
JCXZ ;CX 为 0 则跳转
JECXZ;ECX 为 0 则跳转
三、根据EFLAGS寄存器的PSW标志位跳转, 这个太多了.
根据标志位跳转的指令:
JE ;等于则跳转 同JZ
JNE ;不等于则跳转 同JNZ
JA ;无符号大于则跳转
JNA ;无符号不大于则跳转
JAE ;无符号大于等于则跳转 同JNB
JNAE ;无符号不大于等于则跳转 同JB
JB ;无符号小于则跳转
JNB ;无符号不小于则跳转
JBE ;无符号小于等于则跳转 同JNA
JNBE ;无符号不小于等于则跳转 同JA
JG ;有符号大于则跳转
JNG ;有符号不大于则跳转
JGE ;有符号大于等于则跳转 同JNL
JNGE ;有符号不大于等于则跳转 同JL
JL ;有符号小于则跳转
JNL ;有符号不小于则跳转
JLE ;有符号小于等于则跳转 同JNG
JNLE ;有符号不小于等于则跳转 同JG
JZ ;为零则跳转
JNZ ;不为零则跳转 JS ;为负则跳转
JNS ;不为负则跳转 JC ;进位则跳转
JNC ;不进位则跳转 JO ;溢出则跳转
JNO ;不溢出则跳转
JP ;为偶则跳转
JNP ;不为偶则跳转
JPE ;奇偶位置位则跳转 同JP
JPO ;奇偶位复位则跳转 同JNP
跳转相关的PSW标志位:
11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||
溢 出 |
方 向 |
中 断 |
陷 阱 |
符 号 |
零 |
未 用 |
辅 助 |
未 用 |
奇 偶 |
未 用 |
进 位 |
影响标志位的汇编指令:
加法指令:ADD、ADC、INC、XADD 除了INC不影响CF标志位外,都影响条件标志位。
CF、ZF、SF、OF
CF最高位是否有进位
DF若两个操作数符号相同而结果符号与之相反OF=1,否则OF=0. 减法指令:SUB、SBB、DEC、NEG、CMP、CMPXCHG、CMPXCHG8B 前六种除了DEC不影响CF标志外都影响标志位。CMPXHG8B只影响ZF。
CF说明无符号数相减的溢出,同时又确实是被减数最高有效位向高位的借位。
OF位则说明带符号数的溢出
无符号运算时,若减数>被减数,有借位CF=1,否则CF=0.
OF若两个数符号相反,而结果的符号与减数相同则OF=1.否则OF=0. 乘法指令:MUL、IMUL MUL:如果乘积高一半为0,则CF和OF位均为0,否则CF和OF均为1.
IMUL:如果高一半是低一半符号的扩展,则CF位和OF位均为0,否则就均为1. 除法指令:DIV、IDIV 对所有条件位均无定义。 逻辑指令:AND、OR、NOT、XOR、TEST NOT不影响标志位,其余4种CF、OF、置0,AF无定义,SF、ZF、PF位看情况而定。 定位扫描指令:BSF正向位扫描、BSR反向位扫描 影响ZF位。
指令类型 |
助记符 |
对标志寄存器的影响 |
备注 |
||||||||||
ZF |
CF |
PF |
SF |
OF |
AF |
DF |
IF |
TF |
|||||
数据传送类 |
通用 |
MOV |
不影响标志位 |
||||||||||
交换 |
XCHG |
||||||||||||
堆栈操作 |
PUSH |
||||||||||||
POP |
|||||||||||||
地址传送 |
LEA |
||||||||||||
LDS |
|||||||||||||
LES |
|||||||||||||
累加器专用 |
IN |
||||||||||||
OUT |
|||||||||||||
XALT |
|||||||||||||
标志寄存器 |
LAHF |
||||||||||||
SAHF |
标志寄存器低八位的内容由AH的值决定 |
CF,AF,ZF,SF,PF的值会被影响 |
|||||||||||
PUSHF |
不影响标志位 |
||||||||||||
POPF |
标志寄存器的内容由装入的具体值决定 |
可能影响所有标志位 |
|||||||||||
算术运算类 |
加法 |
ADD |
√ |
√ |
√ |
√ |
√ |
√ |
|||||
ADC |
√ |
√ |
√ |
√ |
√ |
√ |
|||||||
INC |
√ |
√ |
√ |
√ |
√ |
INC指令不影响CF |
|||||||
AAA |
? |
√ |
? |
? |
? |
√ |
?表示不确定或者未定义 |
||||||
DAA |
√ |
√ |
√ |
√ |
? |
√ |
|||||||
减法 |
SUB |
√ |
√ |
√ |
√ |
√ |
√ |
||||||
SBB |
√ |
√ |
√ |
√ |
√ |
√ |
|||||||
DEC |
√ |
√ |
√ |
√ |
√ |
DEC指令不影响CF |
|||||||
AAS |
? |
√ |
? |
? |
? |
√ |
|||||||
DAS |
√ |
√ |
√ |
√ |
? |
√ |
DAA指令不影响OF |
||||||
乘法 |
MUL |
? |
√ |
? |
? |
√ |
? |
||||||
IMUL |
? |
√ |
? |
? |
√ |
? |
|||||||
AAM |
√ |
? |
√ |
√ |
? |
? |
|||||||
除法 |
DIV |
? |
? |
? |
? |
? |
? |
√ |
√ |
此指令可能会产生中断,故影响IF,TF |
|||
IDIV |
? |
? |
? |
? |
? |
? |
√ |
√ |
同上 |
||||
AAD |
√ |
? |
√ |
√ |
? |
? |
|||||||
符号位扩展 |
CBW |
不影响标志位 |
|||||||||||
CWD |
不影响标志位 |
||||||||||||
比较 |
CMP |
由计算结果确定标志位的值 |
不会影响到DF,IF,TF |
||||||||||
逻辑运算类 |
单 操 作 数 |
求反 |
NOT |
不影响标志位 |
|||||||||
移位 |
SAL |
√ |
√ |
√ |
√ |
见 备 注 |
? |
OF标志位只在移位次数是1时有效 AF未定义 |
|||||
SHL |
√ |
√ |
√ |
√ |
? |
||||||||
SAR |
√ |
√ |
√ |
√ |
? |
||||||||
SHR |
√ |
√ |
√ |
√ |
? |
||||||||
循环 移位 |
ROL |
√ |
√ |
? |
循环移位指令影响OF和CF AF未定义 |
||||||||
ROR |
√ |
√ |
? |
||||||||||
RCL |
√ |
√ |
? |
||||||||||
RCR |
√ |
√ |
? |
||||||||||
双 操 作 数 |
与 |
AND |
√ |
置0 |
√ |
√ |
置0 |
||||||
或 |
OR |
√ |
置0 |
√ |
√ |
置0 |
|||||||
异或 |
XOR |
√ |
置0 |
√ |
√ |
置0 |
|||||||
检测 |
TSET |
√ |
置0 |
√ |
√ |
置0 |
|||||||
字符串操作 |
传送 |
MOVS |
不影响标志位 |
||||||||||
比较 |
CMPS |
由计算结果确定标志位的值 |
不会影响DF,IF,TF |
||||||||||
搜索 |
SCAS |
由计算结果确定标志位的值 |
不会影响DF,IF,TF |
||||||||||
装入 |
LODS |
不影响标志位 |
|||||||||||
填充 |
STOS |
不影响标志位 |
|||||||||||
前缀 |
REP |
不影响标志位 |
|||||||||||
程序控制类 |
无条件转移 |
JMP |
不影响标志位 |
||||||||||
条 件 转 移 |
单个 标志 位 |
JS/JNS |
SF=1/0,则转移到目的地址 |
||||||||||
JZ/ JNZ |
ZF=1/0,则转移到目的地址 |
||||||||||||
JP/JNP |
PF=1/0,则转移到目的地址 |
||||||||||||
JB/JNB |
CF=1/0,则转移到目的地址 |
||||||||||||
JO/JNO |
OF=1/0,则转移到目的地址 |
||||||||||||
若干 标志 位的 逻辑 组合 |
JA |
两个无符号数比较,A>B |
|||||||||||
JBE |
两个无符号数比较,A <=B |
||||||||||||
JG |
两个带符号数比较,A>B |
||||||||||||
JGE |
两个带符号数比较,A>=B |
||||||||||||
JL |
两个带符号数比较,A<B |
||||||||||||
JLE |
两个带符号数比较,A <=B |
||||||||||||
循环控制 |
LOOP |
不影响标志位 |
|||||||||||
LOOPE |
|||||||||||||
LOOPNE |
|||||||||||||
JCXZ |
|||||||||||||
JECXZ |
|||||||||||||
中断控制 |
INT |
不影响标志位 |
|||||||||||
INTO |
|||||||||||||
IRET |
影响所有标志位 |
标志位到恢复中断以前的状态 |
|||||||||||
CPU控制指令 |
标志位操作 |
CLC |
√ |
此指令置CF=0 |
|||||||||
CMC |
√ |
此指令CF取反 |
|||||||||||
STC |
√ |
此指令置CF=1 |
|||||||||||
CLD |
√ |
此指令置DF=0 |
|||||||||||
STD |
√ |
此指令置DF=1 |
|||||||||||
CLI |
√ |
此指令置IF=0 |
|||||||||||
STI |
√ |
此指令置IF=1 |
|||||||||||
空操作 |
NOP |
不影响标志位 |
|||||||||||
暂停 |
HLT |
||||||||||||
等待 |
WAIT |
||||||||||||
交权 |
ESC |
||||||||||||
总线锁定前缀 |
LOCK |
JMP 测试
; Test28_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 .code
main proc
PrintText '1'
jmp @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main ;测试结果应该是:
;1
;4
;以下都应该是这样.
JE 测试
; Test28_2.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 .code
main proc
PrintText '1'
mov eax, 123
cmp eax, 123
je @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main
JZ 测试
; Test28_3.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 .code
main proc
PrintText '1'
xor eax, eax
jz @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main
JS 测试
; Test28_4.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 .code
main proc
PrintText '1'
xor eax, eax
dec eax
js @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main
JC 测试
; Test28_5.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 .code
main proc
PrintText '1'
mov al, 0FFh
add al, 1
jc @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main
JO 测试
; Test28_6.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 .code
main proc
PrintText '1'
mov al, -128
sub al, 1
jo @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main
JA 测试
; Test28_7.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 .code
main proc
PrintText '1'
mov eax, 22
cmp eax, 11
ja @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main
JG 测试
; Test28_8.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 .code
main proc
PrintText '1'
mov eax, 1
cmp eax, -1
jg @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main
JP 测试
; Test28_9.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 .code
main proc
PrintText '1'
mov al, 00001110b
inc al
jp @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main
JECXZ 测试
; Test28_10.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 .code
main proc
PrintText '1'
xor ecx, ecx
jecxz @F
PrintText '2'
PrintText '3'
@@: PrintText '4'
ret
main endp
end main
win32 寄存器的更多相关文章
- OD: Register, Stack Frame, Function Reference
几个重要的 Win32 寄存器 EIP 指令寄存器(Extended Instruction Pointer) 存放一个指针,指向下一条等待执行的指令地址 ESP 栈指针寄存器(Extended St ...
- DOS程序员手册(九)
第14章参考手册概述 本书余下的章节将向读者们介绍BIOS.DOS各种各样API函数和服务,作为一名程 序员,了解和掌握这些知识是很有好处的.在所介绍的参考手册中,每部手册都汇集了大 量的资源 ...
- 学 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位 溢出标志 方向 ...
- Virus.Win32.Virlock.b分析
0x00 样本说明 分析样本是被0b500d25f645c0b25532c1e3c9741667的样本感染得到.感染前的文件是Tcpview.exe,一款windows网络连接查看工具. 感染前后文件 ...
- 深入研究 Win32 结构化异常处理(好多相关文章)
摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...
- Win32多线程编程(1) — 基础概念篇
内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...
- Win32多线程编程(2) — 线程控制
Win32线程控制只有是围绕线程这一内核对象的创建.挂起.恢复.终结以及通信等操作,这些操作都依赖于Win32操作系统提供的一组API和具体编译器的C运行时库函数.本篇围绕这些操作接口介绍在Windo ...
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...
- OD调试1--第一个win32程序
OD调试一:第一个Win32程序的修改 在软件开发的过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误.而在逆向分析领域,分析者也会利用相关的调试工具来分析软件的行为并验证分析结果.由于 ...
随机推荐
- wxpython中控件对键盘输入无响应的可能原因
问题描述: 开发环境:Win7 32bit + Python2.7.6 + WxPython 3.0.1-b20140707 开发某初级CAD软件中,需要实现点击TreeCtrl控件的相应选择,实现G ...
- LeetCode(67)题解: Add Binary
https://leetcode.com/problems/add-binary/ 题目: Given two binary strings, return their sum (also a bin ...
- WebGIS中地图恢复初始位置及状态
我想实现这么一个效果:地图任意缩放后,点击一个按钮,将立刻回到地图初始加载时的位置,并且是没有缩放的状态. 怎么办呢?最好的办法就是用Home按钮. <!DOCTYPE HTML> < ...
- WIN7不能被远程桌面问题
不知从何时起,我的机器不能被远程桌面.在其他机器远程我,最后都提示"凭据不工作",账号和密码肯定是正确的. 我是开了远程桌面的: 也许是新近开了防火墙的缘故?检查防火墙,3389是 ...
- feed流,图片在左还是右的区别是
feed流设计:那些谋杀你时间APP | 人人都是产品经理 http://www.woshipm.com/pd/773523.html
- (C)strcpy ,strncpy与strlcpy
1. 背景 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 2. strcpy strcpy 是依据 /0 作为 ...
- Microsoft.XMLHTTP基本用法
客户端调用XMLHTTP的过程很简单,只有5个步骤:1.创建XMLHTTP对象2.打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等.客户端通过Open命令打开与服务端的服务网页 ...
- MYSQL进阶学习笔记九:MySQL事务的应用!(视频序号:进阶_21-22)
知识点十:MySQL 事务的应用 (21-22) 为什么要引入事务: 为什么要引入事务这个技术呢?现在的很多软件都是多用户,多程序,多线程的.对同一表可能同时有很多人在用,为保持数据的一致性,所以提出 ...
- JavaScript正则表达式API
1. [代码][JavaScript]代码 参考自<Core JavaScript Reference 1.5> JavaScript正则表达式有两种写法(随便哪种,看个人习惯): ...
- maven实战(4)-- maven构建自己的jar到本地仓库中
在平时的开发中,经常需要用到自己以前开发的一个jar包,那么如何使用将自己开发的jar提交到本地仓库中,供其他的项目依赖呢?主要有三种方法: (1)使用mvn的构建命令:mvn clean insta ...