【问题标题】:x86 Assembly registers and mov instruction, and jump offsetx86 汇编寄存器和 mov 指令,以及跳转偏移量
【发布时间】:2017-10-06 04:20:16
【问题描述】:

我只是有一个问题,我似乎找不到合适的答案。
我得到了这个代码:

0020 mov eax, [ebp+0x0c]; value inside = 0x000000ff
0023 mov cl, [ebp+ox08]; value inside- 0x82
0026 cmp al, cl  
0028 jl label             ;label is at address 003c, jl is signed
002a nop
002b
...
003c label:sub al,cl

如果[ebp+0x08]中的值是0x82,ecx是0xabcd1234在执行这段代码之前, 执行这段代码后eax的值是多少?
它会清除高位以使ecx 为0x00000082 还是ecx 为0xabcd1282?

另外,计算jl 指令的偏移量的地址是什么?
以及如何确定jl 指令的偏移值?

al的值不是大于cl吗?那么jl不会跳吗?

提前致谢

【问题讨论】:

  • jl 是一个 signed 小于。您需要将您的数字解释为带符号的 2 的补码。即0xff - 2560x82 - 256,因为它们都设置了符号位。
  • 写入 low8 / low16 寄存器不会修改高字节。这与写入 32 位寄存器不同,后者将完整的 64 位寄存器归零。 stackoverflow.com/questions/11177137/…
  • 您在这里至少有 3 个完全不同的问题。请不要这样做,请参阅How to Ask。如果您想查看汇编程序如何从指令末尾计算 jmp 位移,请汇编该代码,然后查看机器代码字节的反汇编 + hexdump。有关手册和指南的链接,另请参阅 stackoverflow.com/tags/x86/info。英特尔的 x86 手册涵盖了指令编码的所有细节。
  • 我的错。这些都是与同一代码相关的问题,因此我认为针对同一代码分别提出三个相关问题是没有意义的。我正在上一门大学课程,我并没有真正编写代码,它只是主要理解概念。所以我不知道如何运行这些。不过,感谢您的意见,彼得。
  • 如果去掉地址,它将与 NASM 或 MASM 组装。如果您有一台 Linux 机器,请参阅 stackoverflow.com/a/39551489/224132 以获取 Hello World 示例以及用于将其构建为可执行文件的命令。将这些指令与适当的存储一起放入内存中(在mov ebp, esp 之后),然后在 GDB 中单步执行。 (stackoverflow.com/a/39551489/224132底部使用gdb的例子)。

标签: assembly x86 offset cpu-registers


【解决方案1】:

加载clecx中的值为0xabcd1282。

cl (signed -126 / unsigned 130) 小于al (signed -1 / unsigned 255),无论它被视为有符号还是无符号。 (在这种情况下,它被视为由jl 签名。)因此不进行跳转。由于我们不知道 0x2b 和 0x3c 之间的指令是什么,因此无法知道 eaxecx 的最终值是什么。

跳转的偏移量为0x12(0x3c - 0x2a,目标地址减去下一条指令的地址)。

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 2016-11-11
    • 2011-08-18
    • 2018-04-17
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多