汇编学习6

进入32位x86处理器

寄存器的扩展

原有的AX,BX,CX,DX,SI,DI,BP,SP 通用寄存器,扩展成32位,在汇编语言中,用EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP来表示。

扩展后的通用寄存器具有一定的兼容性,可以在32位处理器上运行16位的软件。

每个程序有属于自己的内存空间,在16位模式下,一个程序可以访问不属于它自己的内存空间,这是不安全的,但在32位模式下,处理器要求在加载程序时,先定义该程序拥有的段,然后再允许使用这些段。定义段时,除了基地址(起始地址)外,还附加了段界限,特权级别,类型等

32位模式下,传统的段寄存器,比如DS,ES,CS,SS,保存的不再是16位的段基地址,而是段选择子(或称段选择器),用于要选择的段,同时包括一个不可见部分(描述符高速缓存器),里面有段的基地址和各种访问属性。

基本工作模式

实模式等同于8086模式,在此之后,还有一个少为人知的80286的16位保护模式时期,后来过度到了32位保护模式。

32位保护模式下,每个段的基地址是32位的,段内偏移量也是32位,所以可以访问高达4GB的内存空间。

线性地址

段的管理是由处理器的段部件负责进行的,段部件将段地址和偏移地址相加,得到访问内存的地址,一般来说,段部件产生的地址就是物理地址。

处理器是支持多任务的,在多任务环境下,任务的创建需要分配空间,有的程序大,多分配一点,有的小,少分配一点,时间长了,内存空间就会碎片化,就会出现一种情况,内存空间是有的,但是无法分配给某一个任务。为了解决这个问题,处理器支持分页功能(处理器存在一个页部件),即将内存空间分为逻辑上的页,页的大小是固定的,一般为4KB,这样可以简化内存管理。

当页功能开启的时候,段部件产生的就不再是物理地址了,而是线性地址,线性地址还要经过处理器页部件转换后,才是物理地址。未开启页功能时,线性地址就是物理地址。

现代处理器的结构和特点

流水线

这个概念的提出是为了加快处理器的效率,通过把一条指令的执行划分为细小的步骤,并分配给各个单元来完成。而各个单元是独立的、并行的。
举个例子,假设处理器的执行需要三个步骤,取指令、译码、执行。
在这里插入图片描述
从图上很直观的可以看出来,并行模式下,执行效率更高。当然,步骤仍然可以细分,效率进一步提高。

高速缓存

一般为了解决处理器需要等待内存和硬盘这样的慢速设备所耗费时间问题,高速缓存技术应运而生。

高速缓存简单来说,就是把内存中正在访问或者即将访问的命令调入到高速缓存中。或者最近刚刚访问过的指令和数据调入到高速缓存中。然后,每当处理器要访问内存的时候,首选检索高速缓存,如果内容已经在高速缓存中,那么直接取的,成为命中,否则称为不中。在不中的情况下,处理器在取的需要的内容之前必须重新装载高速缓存,而不是直接到内存中去取那个内容。且高速缓存的装载是以块为单位的。

乱序执行

为了实现流水线功能,可以将指令拆分成更小的可执行的微操作,一旦将指令拆成更小的微操作,处理器可以在必要的时候进行乱序执行。举个例子:
mov eax,[ mem1 ]
shl eax,5
add eax,[ mem2 ]
mov [ mem3 ],eax
这里可以将指令 add eax, [ mem2 ]拆分成两个微操作,即一个是从内存中取的数据保存到临时的寄存器,然后与 eax寄存器的值相加。 如此一来,可以在执行左移指令的同时,处理器可以提前从内存中读取mem2的内容。

寄存器重命名

IA-32架构的处理器只有8个通用的32位寄存器,但是在处理器内部,有很多临时寄存器可以用,处理器可以重命名这些寄存器以代表一个逻辑寄存器。

分支目标预测

这个是针对流水线存在的问题提出来的。
一个典型的情况,如果遇到了转移指令,则后面已经进入到流水线的指令也就都无效了。换句话说,我们必须清空流水线,从要转移到的目标位置重新取指令 重新放入流水线

流水线最大的问题是代码中经常遇到分支。举个例子,一个条件转移允许指令流前往任意两个方向,如果这里只有一个流水线,那么,直到那个分支开始执行,再此之前,处理器将不知道应该用哪个分支填充流水线。会造成不中代价增大。

分支预测的核心问题是,转移是发生还是不发生,必须提前预测,但基本上是不可能的,如果能提前知道结果,还执行干嘛。但是从统计学的角度来看,有些事情一旦出现,下一次出现的可能性会增大。

所以在处理器内部,有一个小容量的高速缓存器,叫分支目标缓存器,当处理器执行了一条分支语句后,它会在缓存器里面记录当前指令的地址,分支目标的地址,以及本次分支预测的结果。下一次,在那条转移指令实际执行前,处理器会查找缓存器,看有没有最近的转移记录,如果能找到对应的条目,则推测执行和上一次相同的分支,把该分支送入流水线。当该指令实际执行时,如果预测是失败的,那么,清空流水线,同时刷新一下缓存器记录,这个代价很大。

32位模式的指令系统

32位处理器的寻址方式

为了让16位和32位能够兼容,减少不必要的麻烦,提出了一个方案,让16位指令和32位指令使用相同的指令码,但通过不同的指令前缀,结合处理器当前的运行状态来决定指令的寻址方式。

比如 当处理器运行在16位模式时,如果没有指令前缀0x66,则认为指令是传统的16位寻址方式,如果有指令前缀0x66,则指令是新的32位寻址方式。如果指令在32位模式下,且没有指令前缀0x66,则视为32位寻址方式,否则就是传统的16位寻址方式。

值得说明的是,16位模式下,内存寻址方式的操作数不允许使用栈指针寄存器SP。
mov ax,[ sp ] 是不合法的
在32位模式下,允许在内存操作数中使用栈指针寄存器ESP。
mov eax, [ esp ] 是合法的

操作数大小指令前缀

汇编指令 都会被转换为机器指令 然后执行,那么指令的格式到底是什么样的?

IA-32指令的格式:
在这里插入图片描述
前缀包括 重复前缀(REP REPE REPNE) 段超越前缀( ES:) 总线封锁前缀(LOCK)等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值