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
  • 相关阅读:
    JAVA的向上转型 和 向下转型
    Mobx 常用函数整理
    HTTP错误代码对应
    D3官网上的力导图
    用D3画简单的力导图
    nodejs 爬图片
    nodejs 爬热搜
    canvas 图片旋转 导出下载
    canvas 电子签名
    canvas 音乐跳动效果
  • 原文地址:https://www.cnblogs.com/Jer-/p/3176551.html
Copyright © 2011-2022 走看看