Assembly 这是和+;相同两个操作数之间的CMP只是检查其中一个是否为零?

Assembly 这是和+;相同两个操作数之间的CMP只是检查其中一个是否为零?,assembly,x86,Assembly,X86,我对阅读汇编还不熟悉,但我想我基本上了解汇编指令是如何工作的。这是一个让我困惑的函数: mov ecx, dword [ecx + 0x28] mov eax, dword [esp + 0x04] and ecx, eax xor edx, edx cmp ecx, eax sete dl mov eax, edx ret 4 我相信这大致可以转化为以下伪代码: let ecx = <read memory at ecx+0x28> let eax = <re

我对阅读汇编还不熟悉,但我想我基本上了解汇编指令是如何工作的。这是一个让我困惑的函数:

mov  ecx, dword [ecx + 0x28]
mov  eax, dword [esp + 0x04]
and  ecx, eax
xor  edx, edx
cmp  ecx, eax
sete dl
mov  eax, edx
ret  4
我相信这大致可以转化为以下伪代码:

let ecx = <read memory at ecx+0x28>
let eax = <read from stack at 0x04, probably function argument>
ecx = ecx + eax;
if (ecx == eax) {
  return 1;
} else {
  return 0;
}
让ecx=
设eax=
ecx=ecx+eax;
if(ecx==eax){
返回1;
}否则{
返回0;
}

因此,添加后,
ecx
等于
eax
的唯一方法是如果
ecx==0
,加载
eax
和添加看起来完全没有必要。我错过了什么?这些附加操作的目的是什么?

这是
而不是
添加

x&mask==mask
是检查
mask
中的所有位是否在
x
中设置的标准习惯用法

如果设置了至少一个位,则单独使用
和ecx、eax
(或
测试ecx、eax
)将清除ZF,因此无法区分该位和所有位



此外,由于asm使用xor/cmp/setcc是无分支的,因此更接近C的音译应该是
return(x&mask)==mask不是
if/else
。xor零可能只是为了避免错误的依赖关系,但如果它是来自clang,那么这是因为返回值是
int
,而不是
bool
,这是
不是
add

x&mask==mask
是检查
mask
中的所有位是否在
x
中设置的标准习惯用法

如果设置了至少一个位,则单独使用
和ecx、eax
(或
测试ecx、eax
)将清除ZF,因此无法区分该位和所有位



此外,由于asm使用xor/cmp/setcc是无分支的,因此更接近C的音译应该是
return(x&mask)==mask不是
if/else
。xor zero可能只是为了避免错误的依赖关系,但如果它来自clang,那么这是因为返回值是
int
,而不是
bool

@InstructionPointer:真正的通用标题通常没有用。我要回过头来,因为我想不出一个更好的具体标题,而不把答案放在这个问题上(这是,而不是加上)@PeterCordes我明白,有很多人可以从这个问答中学习,但链接动词令人困惑。具有讽刺意味的是,“一般是……”之类的东西。不管怎样,彼得,我随时欢迎你的反馈。谢谢你的礼貌。@InstructionPointer:哦,是的,原来的标题有语法错误。这是可以解决的。@InstructionPointer:终于想出了一个更好的标题,其中包含了具体的问题。重复标题中的说明会使错误更加明显,但SO的要点是未来读者的可搜索性,因此始终优先考虑。大多数大脑放屁/误读错误都是不可搜索的,除非通过复制/粘贴相关说明,这仍然可以实现非常好的效果!也许我只是因为工作周太累了,而我仍然试图把自己推到这里,以便看到它。当我看到需要的时候,我会尽力贡献。这无疑是一次很好的学习经历。@InstructionPointer:真正的通用标题通常没有用处。我要回过头来,因为我想不出一个更好的具体标题,而不把答案放在这个问题上(这是,而不是加上)@PeterCordes我明白,有很多人可以从这个问答中学习,但链接动词令人困惑。具有讽刺意味的是,“一般是……”之类的东西。不管怎样,彼得,我随时欢迎你的反馈。谢谢你的礼貌。@InstructionPointer:哦,是的,原来的标题有语法错误。这是可以解决的。@InstructionPointer:终于想出了一个更好的标题,其中包含了具体的问题。重复标题中的说明会使错误更加明显,但SO的要点是未来读者的可搜索性,因此始终优先考虑。大多数大脑放屁/误读错误都是不可搜索的,除非通过复制/粘贴相关说明,这仍然可以实现非常好的效果!也许我只是因为工作周太累了,而我仍然试图把自己推到这里,以便看到它。当我看到需要的时候,我会尽力贡献。这无疑是一次很好的学习经历。