【发布时间】: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 - 256和0x82 - 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