您当前的位置: 首页 >  ar

Jave.Lin

暂无认证

  • 1浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

x86 Architecture -x86 体系架构

Jave.Lin 发布时间:2020-05-26 13:58:11 ,浏览量:1

文章目录
  • 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位的子寄存器。

寄存器描述axeax的低16位寄存器(Low 16 bits of eax)bxebx的低16位寄存器(Low 16 bits of ebx)cxecx的低16位寄存器(Low 16 bits of ecx)dxedx的低16位寄存器(Low 16 bits of edx)siesi的低16位寄存器(Low 16 bits of esi)diedi的低16位寄存器(Low 16 bits of edi)bpebp的低16位寄存器(Low 16 bits of ebp)spesp的低16位寄存器(Low 16 bits of esp)aleax的低8位寄存器(Low 8 bits of eax)ahax的高8位寄存器(High 8 bits of ax)blebx的低8位寄存器(Low 8 bits of ebx)bhbx的高8位寄存器(High 8 bits of bx)clecx的低8位寄存器(Low 8 bits of ecx)chcx的高8位寄存器(High 8 bits of cx)dledx的低8位寄存器(Low 8 bits of edx)dhdx的高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 NGZF=1 or SF!=OFvalue1value2。这些值被当作有符号整型。L NGESF!=OFvalue1=value2。这些值被当作无符号整型。BE NACF=1 or ZF=1value1value2。这些值被当作无符号整型。B NAECF=1value1
关注
打赏
1664331872
查看更多评论
立即登录/注册

微信扫码登录

0.0474s