zoukankan      html  css  js  c++  java
  • mov sreg, r/m16 在16位和32位编程中的区别

      总结于《X86汇编语言 从实模式到保护模式》

      仅适用于X86系列处理器

    1. 两者的区别:

      例:mov ds, ax
      A.在指定16位编译模式下,产生的二进制码是 8E D8
      B.在指定32位编译模式下(在某些老式的编译器中才会出现的),产生的二进制码是 66 8E D8

    2. 影响:
      A.加上0x66的前缀是为了反转默认的操作数大小。因为32位模式下,默认的操作数大小是4字节的,而指令中的源操作数是16位的AX。
      B.有前缀和没前缀相比,CPU在执行时会多花一个额外的时钟周期。

    3. 解决
      A. 使用32位的源操作数,但是高地址部分会被截断。也让人难以理解。如:
        mov ds, eax
        编译出来的二进制指令是:8E D8
      B. 使用NASM编译器,NASM编译器无论在什么样的处理器模式下,编译出来的指令都是一样的。

    [BITS 16]
    MOV DS, AX    ;8E D8
    MOV DS, EAX ;8E D8
    [BITS 32]
    MOV DS, AX    ;8E D8
    MOV DS, EAX    ;8E D8
  • 相关阅读:
    O021、创建 Image
    O020、理解 Glance
    O019、通过例子学习 Keystone
    O018、理解 Keystone 核心概念
    O017、部署DevStack
    O016、搭建实验环境
    O015、OpenStack 架构
    O014、云计算与OpenStack
    O013、动手实践Linux VLAN
    O012、Linux如何实现VLAN
  • 原文地址:https://www.cnblogs.com/Jer-/p/3176551.html
Copyright © 2011-2022 走看看