cmpl $741354545, (%esi) 如何作为字符串比较“1,0,”?

how does cmpl $741354545, (%esi) work as a string compare for "1,0,"?

我在看一个asm程序,评论说:

# I check if the first 4 bytes of the string are "1,0,"
cmpl 1354545, (%esi)
jne printReset

现在,我所理解的是指令会检查前 4 个字节是否为 "1,0,",但我不明白 741354545 如何转换为 1,0,

是四个字节,不是位。 (1 字节 = 8 位)。

拆分为单独字节时的 32 位值 741354545 是(从最低有效字节开始):49、44、48、44。

为了验证我是否正确,您可以将其组合成 32 位整数 2560*49 + 2561* 44 + 2562*48 + 2563*44 = 1*49 + 256*44 + 65536*48 + 16777216*44 = 741354545。

或者如果您将检查十六进制格式的值,则单独的字节更容易看到:0x2C302C31 => 31 2C 30 2C.

这就是 ASCII 或 UTF8 编码字符串 "1,0," 存储在内存中时的样子。因此,当内存在地址 esi 处包含这样的 4 个字节时,将设置 ZF(零标志)(以及 sub 定义的其他标志,因为 cmp 基本上是 "sub" 指令,丢弃减法的结果,只保留标志设置)。所以当一些不同的 string/garbage 存储在地址 esi.

的内存中时,jne 将跳转到标签 printReset