当前位置: 首页 > news >正文

x86体系结构(WinDbg学习笔记)

寄存器

eaxAccumulator累加器
ebxBase register基寄存器
ecxCounter register计数器寄存器
edxData register - can be used for I/O port access
and arithmetic functions
数据寄存器-可用于I/O端口访问和算术函数
esiSource index register源索引寄存器
ediDestination index register目标索引寄存器
ebpBase pointer register基指针寄存器
espStack pointer堆栈指针

所有的整数寄存器均为32位。但是,其中这么多都有16位或8位子寄存器

寄存器子寄存器位置说明
eaxax低16位
ah高16位
al低8位
ebxbx低16位
bh高16位
bl低8位
ecxcx低16位
ch高16位
cl低8位
edxdx低16位
dh高16位
dl低8位
esisi低16位
edidi低16位
ebpbp低16位
espsp低16位

注意:在WinDbg使用”?“(Evaluate Expression)查看子寄存器时,子寄存器前要加“@”符号,如? @ax ,而不是 ? ax。但用“r”(Registers)命令时,不需要“@”符号

eipInstruction pointer指令指针,正在执行的指令的地址
flagsflags标志位

调用约定

x86体系结构具有多个不同的调用约定。但都遵循相同的寄存器保留和函数返回规则:

  • 函数必须保留所有寄存器,但eax、ecx和edx除外(可在函数调用中更改),esp(必须根据调用约定进行更新)
  • 如果结果为32位或更小,则eax寄存器为返回值。如果结果为64位,则结果存储在edx:eax中。

x86体系结构上使用的调用约定:

  • Win32(__stdcall)
    函数参数在堆栈上传递,从右向左推送,被调用方清理堆栈。
  • 本机C++方法调用(也称为thiscall)
    函数参数在堆栈上传递,从右向左推送,"this"指针在ecx寄存器中传递,被调用方清理堆栈。
  • COM(适用于c++的__stdcall)
  • __fastcall
    前两个DWORD或较小的参数在ecx和edx寄存器中传递,其余参数在堆栈上传,从右向左推送。被调用方清理堆栈。
  • __cdecl
    函数参数在堆栈上传递,从右向左推送,被调用方清理堆栈。__cdecl调用约定用于具有可变长度参数的所有函数。

x86标志位

flag寄存器各位示意图
(图片引用自:https://blog.csdn.net/weixin_46013401/article/details/111823010)

标志
代码
标志名称状态与说明其它
OFOverflow Flag
溢出标志
0
1
nv-No overflow(无溢出)
ov-Overflow(溢出)
有符号数
DFDirection Flag
方向标志
0
1
up-Direction up(递增,低往高)
dn-Direction down(递减,高往低)
仅仅用于串处理指令中,
控制SI、DI的改变方向
CLD指令:将DF置为0
STD指令:将DF置为1
IFInterrupt Flag
中断标志
0
1
di-Interrupts disabled(禁用中断)
ei-Interrupts-enabled(启用中断)
STI指令:将IF设置为1
CLI指令:将IF设置为0
SFSign Flag
符号标志
0
1
pl-Positive(or zero)正或零
ng-Negative(负数)
结果为负数,则SF=1
结果为非负,则SF=0
ZFZero Flag
零标志
0
1
nz-Nonzero(非零)
zr-Zero(零)
结果为零,则ZF=1
结果为非零,则ZF=0
AFAuxiliary Carry Flag
辅助进位标志
0
1
na-No auxiliary carry(无辅助进位)
ac-Auxiliary carry(辅助进位)
反映加减运算时最低半字节有无进位或者借位
最低半字节有进位或借位时,AF=1,
否则AF=0。
PFParity Flag
奇偶标志
0
1
pe-Parity even(奇)
po-Parity odd(偶)
所有bit位中的1的个数是否为偶数
偶数:则PF=1,奇数:则PF=0
CFCarry Flag
进位标志
0
1
nc-No carry(无进位)
cy-Carry(有进位)
无符号数
有进位或借位时CF=1,否则为0
TFTrap Flag
跟踪标志
0
1
0-正常状态
1-单步状态
是否允许单步中断
ioplI/O Privilege Level
00~11操作系统用来控制对硬件的访问

用"r"命令查看或更改标志位的值

条件Conditions

条件描述一个或多个标志的状态。
汇编程序使用一个或两个字母缩写来表示条件。

条件名称标志说明
ZZF=1最后一个操作的结果为零
NZZF=0最后一个操作的结果不为零
CCF=1最后一个操作进位或借位(对于无符号整数,表示溢出)
NCCF=0最后一个操作不需进位或借位
SSF=1最后一个操作具有高位集
NSSF=0最后一个操作没有高位集
OOF=1当视为有符号整数运算时,最后一个运算导致溢出
NOOF=0当视为有符号整数运算时,最后一个运算没有溢出

条件还可以用于比较两个值。cmp指令比较其两个操作数,然后设置标志,类似从一个操作数减去一个操作数。

条件名称标志CMP操作后的含义
EZF=1value1 == value2
NEZF=0value1 != value2
GE、NLSF=OFvalue1 >= value2(有符号整数)
LE、NGZF=1 or SF!=OFvalue1 <= value2(有符号整数)
G、NLEZF=0 and SF=OFvalue1 > value2 (有符号整数)
L、NGESF!=OFvalue1<value2(有符号整数)
AE、NBCF=0value1 >= value2 (无符号整数)
BE、NACF=1 or ZF =1value1 <= value2(无符号整数)
A、NBECF=0 and ZF=0value1 > value2 (无符号整数)
B、NAECF=1value1 < value2 (无符号整数)

条件通常用于处理cmp 或 test 指令的结果。

数据类型

  • byte:8 bits
  • word:16 bits
  • dword:32 bits
  • qword:64 bits(包括浮点双精度)
  • tword:80 bits(包括浮点扩展双精度)
  • oword:128 bits

符号

表示法含义
r,r1,r2…寄存器
m内存地址
#n即时常量
r/m寄存器或内存地址
r/#n寄存器或即时常量
r/m/#n寄存器/内存地址/即时常量
cc条件代码
T“B”,“W” or “D” (byte,word,dword)
accTT大小的累加器
T=“B”,则为al;T=“W”,为ax;T=“D”,为eax

寻址模式

采用 T PTR [expr]的形式寻址,其中T是某种数据类型,expr是涉及常量和寄存器的一些表达式。
图片来源出网络
图片来源于网络
引用:
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/x86-architecture
https://blog.csdn.net/weixin_46013401/article/details/111823010

http://www.lryc.cn/news/161482.html

相关文章:

  • Hadoop的第二个核心组件:MapReduce框架第四节
  • 算法通关村第十九关——最少硬币数
  • Linux ifconfig只显示 lo 网卡,没有ens网卡解决方案
  • Java复习-26-枚举
  • NLP(六十八)使用Optimum进行模型量化
  • Tomcat多实例和负载均衡动静分离
  • 企业ERP和泛微OA集成场景分析
  • 31 WEB漏洞-文件操作之文件包含漏洞全解
  • qmake.exe xxx.pro -spec win32-g++ 作用
  • SpringMVC实现增删改查
  • React 配置别名 @ ( js/ts 项目中通过 webpack.config.js 配置)
  • Android 在TextView前面添加多个任意View且不影响换行
  • 字符串相加
  • uni-app直播从0到1实战
  • Python UI自动化 —— pytest常用运行参数解析、pytest执行顺序解析
  • LeetCode刷题笔记【25】:贪心算法专题-3(K次取反后最大化的数组和、加油站、分发糖果)
  • java基础面试题 第四天
  • postgresql-常用日期函数
  • 【业务场景】用户连点
  • zabbix企业微信告警
  • (高频面试1)Redis缓存穿透、缓存击穿、缓存雪崩
  • c++推箱子小游戏
  • SpringMVC:从入门到精通
  • jmeter 数据库连接配置 JDBC Connection Configuration
  • TVC广告片制作成本多少
  • 【Express.js】代码规范
  • Vue2+Vue3基础入门到实战项目(前接六 副线一)—— 面经 项目
  • QT tcpserver
  • Android adb shell svc 知识详解
  • Debian12系统下LAMP环境中Nubuilder4.5的安装