Assembly x86汇编寄存器和mov指令以及跳转偏移量
我有一个问题,似乎找不到像样的答案。Assembly x86汇编寄存器和mov指令以及跳转偏移量,assembly,x86,offset,cpu-registers,Assembly,X86,Offset,Cpu Registers,我有一个问题,似乎找不到像样的答案。 我得到了以下代码: 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 执
我得到了以下代码:
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不会跳吗
提前感谢加载
cl
后ecx
中的值为0xabcd1282
cl
(有符号-126/无符号130)小于al
(有符号-1/无符号255),无论它被视为有符号还是无符号。(在这种情况下,它被视为由jl
签名),因此不进行跳转。由于我们不知道0x2b和0x3c之间的指令是什么,因此无法知道eax
和ecx
的最终值是什么
跳转的偏移量为0x12(0x3c-0x2a,目标地址减去下一条指令的地址)。
jl
是一个小于的符号。您需要将数字解释为带符号2的补码。i、 e.0xff-256
和0x82-256
,因为它们都设置了符号位。写入low8/low16寄存器不会修改高位字节。这与写入32位寄存器不同,32位寄存器会将整个64位寄存器归零。这里至少有3个完全独立的问题。请不要那样做,看。如果您想了解汇编程序如何从指令末尾计算jmp位移,请汇编该代码,然后查看机器代码字节的反汇编+hextump。有关手册和指南的链接,请参见。英特尔x86手册涵盖了指令编码的所有细节。这些都是与同一代码相关的问题,所以我认为就同一代码分别问三个相关问题是没有意义的。我正在修一门大学课程,我并不是真的写代码,它只是主要理解概念。所以我不知道如何运行这些。不过,感谢您的输入,Peter。如果您去掉地址,它将与NASM或MASM组合。如果您有一台Linux机器,请参阅以获取Hello World示例以及用于将其构建到可执行文件中的命令。将这些指令与适当的存储一起放入内存中,以在内存中创建正确的值(在mov ebp、esp
之后),然后在GDB中单步执行。(在页面底部使用gdb的示例)。