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
  • 相关阅读:
    git命令
    WPF让绑定支持表达式
    WPF多语言动态切换的一种方法
    C#监测系统事件,睡眠状态
    记一次渗透测试
    Relay
    ECShop相关漏洞复现/分析
    人工智能学习路线图
    抽奖算法
    关于微信开发的 appid,openid,unionid
  • 原文地址:https://www.cnblogs.com/Jer-/p/3176551.html
Copyright © 2011-2022 走看看