【问题标题】:What is the main difference between `JMP EBX` and `JMP DWORD PTR DS:[EBX]`?`JMP EBX` 和 `JMP DWORD PTR DS:[EBX]` 之间的主要区别是什么?
【发布时间】:2012-09-03 11:03:28
【问题描述】:

我正在尝试将参数传递给EIP 寄存器作为跳转指令到EBX 寄存器。

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    JMP EBX 表示指示CPU 跳转到EBX 寄存器值所指向的地址。如果EBX12345678h,它将跳转到地址12345678h。所以指令被解释为JMP 12345678h

    JMP DWORD PTR DS:[EBX] 表示指示 CPU 跳转到从EBX 寄存器值和DS 选择器指向的内存地址读取的DWORD 值指向的地址。如果EBX11111111h,CPU 将从内存地址DS:11111111h 处读取DWORD 值,然后跳转到DWORD 值所指向的地址(内存中的值)。如果内存中的DWORD 值为22222222h,它将跳转到地址22222222h。所以指令被解释为JMP DWORD PTR DS:[11111111h]。读取内存后,会被解释为JMP 22222222h

    【讨论】:

      【解决方案2】:

      简答

      JMP EBX 将跳转到当前代码段内EBX 寄存器中存储的地址。JMP DWORD PTR DS:[EBX] 将跳转到@987654326 指向的代码段内内存偏移EBX 处存储的地址@。

      例如让DS = 0x0440EBX = 0x00006200,以及地址0x00006200的内存的前四个字节是 0x00003500(在 little-endian 机器上将存储为 00 35 00 00)。
      JMP EBX 变为 JMP 0x00006200
      @987654331 @变成JMP 0x0440:0x00003500

      长答案

      JMP EBX 具有以下签名:

      JMP r/m32
      

      在这种情况下,跳转地址存储在 32 位寄存器中(您的情况)或作为 32 位变量存储在内存中。处理器通过将值加载到EIP 中,在操作数指定的地址处执行近跳转(在同一代码段中)。

      另一方面,JMP DWORD PTR DS:[EBX] 具有以下签名:

      JMP ptr16:32
      

      这里的跳转地址分两部分提供。第一个值(在冒号之前)给出了要跳转到的代码段的地址,第二个值(在冒号之后)给出了该代码段内的偏移量。跳转可能是到与当前不同的代码段,因此是远跳转。处理器通过加载第一个 值进入CS,第二个进入EIP
      此外,第二条指令使用[EBX],而不是第一条中的EBX。这意味着它将读取存储在EBX 中的偏移量处的内存并使用该值。
      DWORD PTR 是一个 size 指令,它告诉汇编器内存应该被视为 32-位整数。

      Here 是使用中的第二个跳转示例。

      【讨论】:

      • 那不是jmp ptr16:32。那是 jmp r/m32,其内存操作数使用默认段 (DS),OP 的反汇编程序显式放入该段以使输出混乱并使其更难阅读。
      猜你喜欢
      • 2023-04-04
      • 2014-09-04
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2013-12-11
      • 1970-01-01
      相关资源
      最近更新 更多