x86ASM:无用的条件跳转?
我正在查看以下 x86 汇编代码(英特尔语法):
movzx eax, al
and eax, 3
cmp eax, 3
ja loc_6BE9A0
在我看来,这在 C 中应该是这样的:
eax &= 0xFF;
eax &= 3;
if (eax > 3)
loc_6BE9A0();
这似乎没有多大意义,因为此条件永远不会为真(因为eax如果之前与 3 进行了与运算,则永远不会大于 3)。我在这里遗漏了什么还是这真的只是一个不必要的条件?
而且:movzx eax, al如果之后它被 3 和-ed 也不应该是必要的,是吗?
我问这个是因为我对汇编语言不太熟悉,所以我不完全确定我是否在这里遗漏了一些东西。
回答
你是对的:movzx鉴于以下内容是多余的and。它可能是由非优化编译器生成的。
是的,如果此代码直接执行,则ja永远不会进行跳转。但是,cmp/ja如果其他地方的代码直接跳转到cmp(甚至跳转到 ),则可能并非完全无用ja。