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…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
【技巧】dify前端源代码修改第一弹-增加tab页
回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码,在知识库增加一个tab页"HELLO WORLD",完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…...
【向量库】Weaviate概述与架构解析
文章目录 一、什么是weaviate二、High-Level Architecture1. Core Components2. Storage Layer3. 组件交互流程 三、核心组件1. API Layer2. Schema Management3. Vector Indexing3.1. 查询原理3.2. 左侧:Search Process(搜索流程)3.3. 右侧&…...
uni-app学习笔记二十三--交互反馈showToast用法
showToast部分文档位于uniapp官网-->API-->界面:uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容,长度与 icon 取值有关。iconString否图…...
