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…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
