Assembly x86的一段毫无意义的小代码还是?

Assembly x86的一段毫无意义的小代码还是?,assembly,x86,reverse-engineering,Assembly,X86,Reverse Engineering,我在学校有一个项目作业,那就是臭名昭著的x86炸弹。在代码中的某一点上,编译器执行以下指令: mov 0x1c(%esp),%eax 接 和$0xf,%eax 然后将%eax放回使用此指令获取它的位置: mov%eax,0x1c(%esp) 你认为这是编译器自动完成的,还是讲师只是为了让我困惑,让我更难弄明白到底发生了什么?因为据我所知,这部分代码完全没有任何作用。从堆栈中获取一个4字节的字,在其最后4位上使用and指令和二进制数“1111”,并将其放回堆栈上的同一位置。这对我来说似乎毫无意义。

我在学校有一个项目作业,那就是臭名昭著的x86炸弹。在代码中的某一点上,编译器执行以下指令:

mov 0x1c(%esp),%eax

和$0xf,%eax

然后将%eax放回使用此指令获取它的位置:

mov%eax,0x1c(%esp)


你认为这是编译器自动完成的,还是讲师只是为了让我困惑,让我更难弄明白到底发生了什么?因为据我所知,这部分代码完全没有任何作用。从堆栈中获取一个4字节的字,在其最后4位上使用and指令和二进制数“1111”,并将其放回堆栈上的同一位置。这对我来说似乎毫无意义。我遗漏了什么吗?

给@Lougler和@RossRidge的道具,说明

和$0xf,%eax


用于屏蔽%eax中除最后4位以外的所有内容。

它会更改堆栈上的值,因此为什么这毫无意义?
而l$0xf,0x1c(%esp)
会稍微快一些(2个融合域UOP而不是3个)。我确信周围的代码是混乱和嘈杂的,因为这看起来像是
-O0
的编译器输出。即使是古老的gcc和叮当声。因此,您可能正在查看大量的加载/修改/存储、重新加载/修改/存储说明。这就是为什么没有人认为
-O0
编译器输出可读,而且
-Og-fverbose asm
甚至
-O3-fno树向量化输出对于人类可读性更为可取。
和$0xf,%eax
在其最后4位上不使用指令。它实际上屏蔽了
%eax
中除最后4位以外的所有内容。
%eax
的内容可能会有所不同。下一条指令将新值
%eax
放回堆栈。因此,如果最初检索到堆栈值,
$0xa5a5
,那么新值将是
$0x00000005
@RossRidge,我不知道它如何更改堆栈上的值。如果对某个对象使用and运算,并且其中一个操作数为1,那么输出不总是与第二个操作数相同吗?它将EAX的所有32个独立位与立即数操作数0x0000000f的相应32个独立位进行and运算。该值只有4位为1,因此EAX中只有4位值保持不变。请参见上文潜伏者的评论,以了解发生了什么。