文章目录
- In this article - 此文
- Register - 寄存器
- Calling Conventions - 调用约定
- Debugger Display of Registers and Flags - 调试器显示寄存器与标记
- x86 Flag - x86 的标记位
- Conditions - 条件
- Data Types - 数据类型
- Notation - 符号
- Addressing Modes - 寻址模式
- Pipelining - 流水线
- Synchronized Memory Access - 同步的内存访问
- Jump Prediction - 跳转预测
- Alignment - 对齐
系列目录: Processor Architecture - 处理器体系架构
原文: x86 Architecture
In this article - 此文
Intel x86 处理使用的是复杂指令集的计算机(complex instruction set computer (CISC),还有什么是RISC?,RISC架构)体系架构,意味着使用的是少量的特定寄存器的数量,而不是使用巨量的通用寄存器的方式。也意味着复杂的特定指令将更有优势。
x86 处理器至少可以追溯到 8位的Intel 8080 处理器。x86指令集中的许多特性都是原由于处理器(及其Zilog Z-80变体)的向后兼容性。
Microsoft Win32 的Flat Mode(平坦模式1)使用的是 x86 处理。这个文档将近关注于在flat mode上的。
Register - 寄存器
x86 体系架构由以下非特权的整形寄存器组成。
| 寄存器 | 描述 |
|---|---|
| eax | 累加器,运算用(Accumulator) |
| ebx | 基地址寄存器(Base Register) |
| edx | 数据寄存器 - 用于I/O端口访问及算术函数(Data Register) |
| esi | 源索引寄存器(Source index register) |
| edi | 目标索引寄存器(Destination index register) |
| ebp | 基地址指针寄存器(Base poinster register) |
| esp | 栈指针寄存器(Stack pointer) |
所有整形寄存器都是32位的。然而,有许多的16位或是8位的子寄存器。
| 寄存器 | 描述 |
|---|---|
| ax | eax的低16位寄存器(Low 16 bits of eax) |
| bx | ebx的低16位寄存器(Low 16 bits of ebx) |
| cx | ecx的低16位寄存器(Low 16 bits of ecx) |
| dx | edx的低16位寄存器(Low 16 bits of edx) |
| si | esi的低16位寄存器(Low 16 bits of esi) |
| di | edi的低16位寄存器(Low 16 bits of edi) |
| bp | ebp的低16位寄存器(Low 16 bits of ebp) |
| sp | esp的低16位寄存器(Low 16 bits of esp) |
| al | eax的低8位寄存器(Low 8 bits of eax) |
| ah | ax的高8位寄存器(High 8 bits of ax) |
| bl | ebx的低8位寄存器(Low 8 bits of ebx) |
| bh | bx的高8位寄存器(High 8 bits of bx) |
| cl | ecx的低8位寄存器(Low 8 bits of ecx) |
| ch | cx的高8位寄存器(High 8 bits of cx) |
| dl | edx的低8位寄存器(Low 8 bits of edx) |
| dh | dx的高8位寄存器(High 8 bits of dx) |
操作子寄存器影响的仅仅只有子寄存器,而不会影响之外的其他子寄存器。例如,储存一些数据到 ax 寄存器,eax 剩余的高16位寄存器是不会有变化的。
当使用 ?(计算表达式) 命令,寄存器的前缀要带上 “at” 标记(@)。例如,你使用使用 ? @ax 而不是 ? ax 。确保调试器能认出 ax 是个寄存器(Register)而不是一个 标记符号(Symobl)。
然而,在r(寄存器)命令下不需要(@)。例如, r ax = 5 将会被正确解析。
还有其他两个表示处理器当前状态的重要寄存器:
| 寄存器 | 描述 |
|---|---|
| eip | 指令指针寄存器(instruction pointer) |
| flags | 标志寄存器(flags) |
指令指针寄存器(instruction pointer)指向的是即将被执行的指令的地址。
标记寄存器(flags register)是单个bit位(single-bit)的标记集合。许多的指令都会修改 flags 的为,代表指令的结果。这些flags标记可以被后续的条件跳转指令(conditional jump)用于测试用。详情查考 x86 Flags。
Calling Conventions - 调用约定
x86 体系架构有一些不同的调用约定。还好的是,他们都是下面一些寄存器的备份恢复与方法返回规则:
- 函数必须备份恢复所有寄存器,除了 eax,ecx 和 edx,通过
call可以改变这些寄存器,而 esp,必须通过对应的调用约定来更新。(译者jave.lin:文档真的不用心,call汇编是先push eip + sizeof(eip),就是先把call的以下个指令的地址push到栈中,在跳转到方法签名中的函数指令地址,所以有两个步骤在里头,但这个文档说的不够详细,这微软写x86指令文档这么儿戏的吗?手动哭笑一下。) - eax 寄存器用于函数结果的=value2。这些值被当作有符号整型。
LE NG ZF=1 or SF!=OF value1value2。这些值被当作有符号整型。 L NGE SF!=OF value1=value2。这些值被当作无符号整型。 BE NA CF=1 or ZF=1 value1value2。这些值被当作无符号整型。 B NAE CF=1 value1 关注打赏热门博文- 3D Assets (Textures & Model & Animations) & Game Design Ideas & DCC Tutorials & TA
- LearnGL - 学习笔记目录
- Unity - Timeline 知识汇总
- Unity Graphics - 知识点目录 - 停止翻译,因为发现官方有中文文档了
- Graphic资料
- Unity Lightmap&LightProbe局部动态加载(亲测2020以及以上版本官方修复了)
- Unity - 踩坑日志 - 低版本线性颜色空间渲染异常的 “BUG”
- Unity Shader - PBR 渲染 SP 导出的素材
- 什么是 3A 游戏?
- Photosohp - 实现 2D MetaBall、MetaFont
立即登录/注册
微信扫码登录
