汇编语言学习13:32位CPU指令运行环境

目录

32位CPU的指令运行环境

寄存器

通用寄存器

段寄存器

标志寄存器

其他寄存器

寻址方式

32位机器代码格式

总结


32位CPU的指令运行环境

32位微处理器全面支持32位数据、32位操作数和32位寻址方式,而且向下兼容8086实地址工作方式,还新增虚拟8086工作方式,可以更好地运行多个实方式程序。

32位处理器新增保护工作模式,简称保护方式。保护方式提供页式存储功能,利用32位和段基地址和32位的偏移地址,那么可寻址的寻址范围达到了4GB,被称为“32位段”。

寄存器

32位CPU有7类寄存器:除了8086具有的通用寄存器与指令指针、段寄存器和标志寄存器之外,还新增了控制寄存器、系统地址寄存器、调试寄存器,以及测试寄存器。事实上,一般的应用程序依然只使用前三种寄存器,系统程序才使用所有的寄存器。

通用寄存器

原来的通用寄存器被拓展为EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP。原来的寄存器寻址方式依然有效,但是现在可以使用上面的标号操作整个32位寄存器。对32位寄存器数据进行操作时,依然采用小端方式。

段寄存器

32位CPU除了原有的CS,DS,ES,SS之外,还增加了两个用于数据段的段寄存器FS和GS。

为了和8086的实方式保持兼容,段寄存器的长度依然是16位。

在保护方式下,16位段寄存器的内容是段选择器,段选择器指向段描述符,由段描述符中取得32位偏移地址。也就是16位段寄存器实际上是索引。

标志寄存器

32位的CPU 的标志寄存器是32位的EFLAGS。其中,除了原来16位CPU具有的标志之外,还新增了以下微处理器控制的标志。

  • NT:任务嵌套标志。若NT=1,表示当前执行的任务,嵌套于另外一个任务之中
  • IOPL:I/O特权层标志,有2位。表示4个特权级别,指定任务的I/O处于的4个特权级别。
  • VM:当处于保护模式时,如果使VM=1,将进入虚拟8086模式。
  • RF:恢复标志,和调试寄存器一起使用。
  • AC:对齐检测标志,设置是否在存储器访问时进行数据对齐检测。
  • VIF:虚拟模式的中断允许标志,与VIP连用。
  • VIP:虚拟中断挂起标志,指示有一个中断被挂起。
  • ID:CPU识别标志。程序如果能够操作这个标志位,说明该微处理器支持CPU识别指令。
其他寄存器
  1. 控制寄存器:保存影响系统中所有任务的机器状态CRn(n=0~4)。
  2. 系统地址寄存器:全局描述表符寄存器GDTR,中断描述符表寄存器IDTR,局部描述符表寄存器LDTR和任务状态段寄存器TR。
  3. 调试寄存器:系统用于进行断点调试的寄存器。
  4. 测试寄存器:控制对分页单元转换后背缓冲器的测试。

他们具体的作用会在以后使用需要时详细介绍

寻址方式

以下是32位CPU所有的寻址方式 

  • 立即数寻址
    mov eax,44332211h
    
  • wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    寄存器寻址

    mov eax,edx
    
  • 直接寻址

    mov eax,[1234h]
  • 寄存器间接寻址

    mov eax,[ebx]
  • 寄存器相对寻址

    mov eax[ebx+80h]
  • 基址变址寻址

    mov eax,[ebx+esi]
  • 相对基址变址寻址

    mov eax,[ebx+esi+80h]
  • 带比例的变址寻址

    mov eax,[esi*2]
  • 带比例基址变址寻址

    mov eax,[ebx+4*esi]
  • 基址带位移量带比例变址寻址

    mov eax,[ebx+esi*8+80h]
  • I/O端口直接寻址

    in eax,80h
  • I/O端口寄存器寻址

    in eax,dx

    注意:BP、ESP、EBP的默认访问段寄存器是SS,其他寻址方式都默认使用DS使用段寄存器。另外,在合法的情况下依然可以使用段超越前缀。

32位机器代码格式

在讲解32位机器代码之前,先复习一下16位机器代码的格式。16位机器代码的格式如下:

字节数0/10/11/20/10/1/20//1/2
内容指令前缀段超越操作码mod reg r/m位移量立即数

 32位的机器代码格式如下:

字节数0/10/10/10/1
内容指令前缀段超越地址长度超越操作数长度超越
字节数1/20/10/10/1/2/40/1/2/4
内容操作码mod reg r/ms-i-b位移量立即数

地址长度超越:地址超越长度决定了指令中位移量的长度和有效地址计算时产生的的地址偏移长度。在原来的的功能做方式下,默认为0表示偏移4位。

操作数长度超越:一条指令会默认使用16位或者32位操作数,当使用操作数长度前缀后,会改变 位使用另外一种操作数位数类型。

s-i-b:表示带比例因子的变址寻址方式。

以上就是32位机器码格式的所有新增内容。

总结

随着内存的拓张,寄存器结构和32位的机器代码指令都在原有的基础上新增或者改变了不少功能,使得32位CPU相比16位可以完成相比更多复杂的任务和更高的效率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值