x86体系结构(WinDbg学习笔记)
寄存器
| eax | Accumulator | 累加器 |
|---|---|---|
| ebx | Base register | 基寄存器 |
| ecx | Counter register | 计数器寄存器 |
| edx | Data register - can be used for I/O port access and arithmetic functions | 数据寄存器-可用于I/O端口访问和算术函数 |
| esi | Source index register | 源索引寄存器 |
| edi | Destination index register | 目标索引寄存器 |
| ebp | Base pointer register | 基指针寄存器 |
| esp | Stack pointer | 堆栈指针 |
所有的整数寄存器均为32位。但是,其中这么多都有16位或8位子寄存器
| 寄存器 | 子寄存器 | 位置说明 |
|---|---|---|
| eax | ax | 低16位 |
| ah | 高16位 | |
| al | 低8位 | |
| ebx | bx | 低16位 |
| bh | 高16位 | |
| bl | 低8位 | |
| ecx | cx | 低16位 |
| ch | 高16位 | |
| cl | 低8位 | |
| edx | dx | 低16位 |
| dh | 高16位 | |
| dl | 低8位 | |
| esi | si | 低16位 |
| edi | di | 低16位 |
| ebp | bp | 低16位 |
| esp | sp | 低16位 |
注意:在WinDbg使用”?“(Evaluate Expression)查看子寄存器时,子寄存器前要加“@”符号,如? @ax ,而不是 ? ax。但用“r”(Registers)命令时,不需要“@”符号
| eip | Instruction pointer | 指令指针,正在执行的指令的地址 |
|---|---|---|
| flags | flags | 标志位 |
调用约定
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标志位

(图片引用自:https://blog.csdn.net/weixin_46013401/article/details/111823010)
| 标志 代码 | 标志名称 | 值 | 状态与说明 | 其它 |
|---|---|---|---|---|
| OF | Overflow Flag 溢出标志 | 0 1 | nv-No overflow(无溢出) ov-Overflow(溢出) | 有符号数 |
| DF | Direction Flag 方向标志 | 0 1 | up-Direction up(递增,低往高) dn-Direction down(递减,高往低) | 仅仅用于串处理指令中, 控制SI、DI的改变方向 CLD指令:将DF置为0 STD指令:将DF置为1 |
| IF | Interrupt Flag 中断标志 | 0 1 | di-Interrupts disabled(禁用中断) ei-Interrupts-enabled(启用中断) | STI指令:将IF设置为1 CLI指令:将IF设置为0 |
| SF | Sign Flag 符号标志 | 0 1 | pl-Positive(or zero)正或零 ng-Negative(负数) | 结果为负数,则SF=1 结果为非负,则SF=0 |
| ZF | Zero Flag 零标志 | 0 1 | nz-Nonzero(非零) zr-Zero(零) | 结果为零,则ZF=1 结果为非零,则ZF=0 |
| AF | Auxiliary Carry Flag 辅助进位标志 | 0 1 | na-No auxiliary carry(无辅助进位) ac-Auxiliary carry(辅助进位) | 反映加减运算时最低半字节有无进位或者借位 最低半字节有进位或借位时,AF=1, 否则AF=0。 |
| PF | Parity Flag 奇偶标志 | 0 1 | pe-Parity even(奇) po-Parity odd(偶) | 所有bit位中的1的个数是否为偶数 偶数:则PF=1,奇数:则PF=0 |
| CF | Carry Flag 进位标志 | 0 1 | nc-No carry(无进位) cy-Carry(有进位) | 无符号数 有进位或借位时CF=1,否则为0 |
| TF | Trap Flag 跟踪标志 | 0 1 | 0-正常状态 1-单步状态 | 是否允许单步中断 |
| iopl | I/O Privilege Level | 00~11 | 操作系统用来控制对硬件的访问 |
用"r"命令查看或更改标志位的值
条件Conditions
条件描述一个或多个标志的状态。
汇编程序使用一个或两个字母缩写来表示条件。
| 条件名称 | 标志 | 说明 |
|---|---|---|
| Z | ZF=1 | 最后一个操作的结果为零 |
| NZ | ZF=0 | 最后一个操作的结果不为零 |
| C | CF=1 | 最后一个操作进位或借位(对于无符号整数,表示溢出) |
| NC | CF=0 | 最后一个操作不需进位或借位 |
| S | SF=1 | 最后一个操作具有高位集 |
| NS | SF=0 | 最后一个操作没有高位集 |
| O | OF=1 | 当视为有符号整数运算时,最后一个运算导致溢出 |
| NO | OF=0 | 当视为有符号整数运算时,最后一个运算没有溢出 |
条件还可以用于比较两个值。cmp指令比较其两个操作数,然后设置标志,类似从一个操作数减去一个操作数。
| 条件名称 | 标志 | CMP操作后的含义 |
|---|---|---|
| E | ZF=1 | value1 == value2 |
| NE | ZF=0 | value1 != value2 |
| GE、NL | SF=OF | value1 >= value2(有符号整数) |
| LE、NG | ZF=1 or SF!=OF | value1 <= value2(有符号整数) |
| G、NLE | ZF=0 and SF=OF | value1 > value2 (有符号整数) |
| L、NGE | SF!=OF | value1<value2(有符号整数) |
| AE、NB | CF=0 | value1 >= value2 (无符号整数) |
| BE、NA | CF=1 or ZF =1 | value1 <= value2(无符号整数) |
| A、NBE | CF=0 and ZF=0 | value1 > value2 (无符号整数) |
| B、NAE | CF=1 | value1 < 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) |
| accT | T大小的累加器 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
相关文章:
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 reg…...
Hadoop的第二个核心组件:MapReduce框架第四节
Hadoop的第二个核心组件:MapReduce框架 十、MapReduce的特殊应用场景1、使用MapReduce进行join操作2、使用MapReduce的计数器3、MapReduce做数据清洗 十一、MapReduce的工作流程:详细的工作流程第一步:提交MR作业资源第二步:运行M…...
算法通关村第十九关——最少硬币数
LeetCode322.给你一个整数数组 coins,表示不同面额的硬币,以及一个整数 amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。 示例1&…...
Linux ifconfig只显示 lo 网卡,没有ens网卡解决方案
项目场景: 虚拟机中linux无网络问题 问题描述 之前在调试linux的时候,由于一些不太清楚的误操作,导致ubuntu linux出现无网络问题,现象如下 ifconfig 只显示了 lo 网卡 lo 网卡:它是本地环回接口。 这意味着您的虚…...
Java复习-26-枚举
枚举(替换多例设计) 目的(使用场景) 不用也没啥 定义一个描述性别的类,那么该对象只有两个:男、 女。或者描述颜色基色的类,可以使用: 红色、绿色、蓝色。 功能 用于定义有限个数对象的一种结构&#x…...
NLP(六十八)使用Optimum进行模型量化
本文将会介绍如何使用HuggingFace的Optimum,来对微调后的BERT模型进行量化(Quantization)。 在文章NLP(六十七)BERT模型训练后动态量化(PTDQ)中,我们使用PyTorch自带的PTDQ&…...
Tomcat多实例和负载均衡动静分离
目录 一、Tomcat多实例部署 二、负载均衡动静分离 2.1.动静分离 2.11 nginx负载均衡 192.168.30.203 2.22 Tomcat服务器:192.168.30.200:80 2.23 Tomcat服务器:192.168.30.100:80 2.24 配置nginx 192.168.30.203静态页面 2…...
企业ERP和泛微OA集成场景分析
轻易云数据集成平台(qeasy.cloud)为企业ERP和泛微OA系统提供了强大的互通解决方案,特别在销售、采购和库存领域的单据审批场景中表现出色。这些场景涉及到多个业务单据的创建和审批,以下是一些具体的应用场景描述: 采购…...
31 WEB漏洞-文件操作之文件包含漏洞全解
目录 文件包含漏洞原理检测类型利用修复 本地包含-无限制,有限制远程包含-无限制,有限制各种协议流玩法文章介绍读取文件源码用法执行php代码用法写入一句话木马用法每个脚本支持的协议玩法 演示案例某CMS程序文件包含利用-黑盒CTF-南邮大,i春…...
qmake.exe xxx.pro -spec win32-g++ 作用
作用 qmake.exe xxx.pro -spec win32-g的作用是使用win32-g构建系统规范来生成针对xxx.pro项目的构建脚本。 具体来说,这个命令的含义如下: qmake.exe:使用qmake命令行工具。xxx.pro:指定了要构建的项目文件,.pro文…...
SpringMVC实现增删改查
文章目录 一、配置文件1.1 导入相关pom依赖1.2 jdbc.properties:配置文件1.3 generatorConfig.xml:代码生成器1.4 spring-mybatis.xml :spring与mybatis整合的配置文件1.5 spring-context.xml :上下文配置文件1.6 spring-mvc-xml:…...
React 配置别名 @ ( js/ts 项目中通过 webpack.config.js 配置)
一、简介 在 Vue 项目当中,可以使用 来表示 src/,但在 React 项目中,默认却没有该功能,因此需要进行手动的配置来实现该功能。 别名主要解决的问题:每个页面都使用路径的方式进行引入,这样很麻烦ÿ…...
Android 在TextView前面添加多个任意View且不影响换行
实现效果如下: 如上,将头像后面的东西看作一个整体,因为不能影响后面内容的换行,且前面控件的长度是可变的,所以采用自定义View的方法来实现: /*** CSDN深海呐 https://blog.csdn.net/qq_40945489/articl…...
字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例 1: 输入ÿ…...
uni-app直播从0到1实战
1.安装开发工具 2.创建项目 参考:uniapp从零到一的学习商城实战_云澜哥哥的博客-CSDN博客...
Python UI自动化 —— pytest常用运行参数解析、pytest执行顺序解析
pytest常用Console参数: -v 用于显示每个测试函数的执行结果-q 只显示整体测试结果-s 用于显示测试函数中print()函数输出-x 在第一个错误或失败的测试中立即退出-m 只运行带有装饰器配置的测试用例-k 通过表达式运行指定的测试用例-h 帮助 首先来看什么参数都没加…...
LeetCode刷题笔记【25】:贪心算法专题-3(K次取反后最大化的数组和、加油站、分发糖果)
文章目录 前置知识1005.K次取反后最大化的数组和题目描述分情况讨论贪心算法 134. 加油站题目描述暴力解法贪心算法 135. 分发糖果题目描述暴力解法贪心算法 总结 前置知识 参考前文 参考文章: LeetCode刷题笔记【23】:贪心算法专题-1(分发饼…...
java基础面试题 第四天
一、java基础面试题 第四天 1. String 为什么不可变? **不可变对象:**不可变对象在java中就是被final修饰的类就称为不可变对象,具体含义是,不可变对象一但被赋值以后,他的引用地址就不能被修改(它的属性…...
postgresql-常用日期函数
postgresql-常用日期函数 简介计算时间间隔获取时间中的信息截断日期/时间创建日期/时间获取系统时间时区转换 简介 PostgreSQL 提供了以下日期和时间运算的算术运算符。 获取当前系统时间 select current_date,current_time,current_timestamp ;-- 当前系统时间一周后的日…...
【业务场景】用户连点
处理用户连点 1.时间戳处理 思路:通过检查当前时间和上一次触发事件的时间之间的间隔,判断是否允许继续执行。 代码如下: // clickThrottle.js /* 防止重复点击 */ let clickTimer 0function clickThrottle(interval 3000) {let now n…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
