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
我在看一个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