Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86汇编寄存器和mov指令以及跳转偏移量_Assembly_X86_Offset_Cpu Registers - Fatal编程技术网

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的示例)。