递增具有最大值的寄存器?

逆向工程 艾达 部件
2021-06-12 09:10:17

我正在查看一些汇编代码并且无法理解它。下面的代码显示在 IDA 中。我的问题是关于循环中发生了什么。

让我解释一下我在循环中完全不理解的内容:上面的小循环eax设置为FFFFFFFFh,在eax(?)中的所有 32 位中基本上都是“1” 在小循环eax中递增。eax是否处于最大值?当我增加时会发生什么eax会回到0吗?

在此处输入图片说明

2个回答

正如评论的那样,增加最大值确实会回到 0。但是,我想解释一下为什么代码看起来像这样。原始来源可能类似于:

int pos = 0;
while (buf[pos]==0) pos++;

现在,对汇编的简单/字面翻译将在开始时进行检查和有条件跳出循环,并在结束时进行无条件向后跳转。但是,通过将其转换为 do-while 循环,您可以摆脱无条件跳转,并在最后只有条件跳转:

int pos = -1;
do
{
  pos++;
} while (buf[pos]==0);

虽然是次要优化,但它可以改进分支预测,并且通过错误二进制文件可以显着提高性能。这很可能是您看到初始值 -1(表示为 0FFFFFFFFh)的原因。

inc 没有设置进位标志(我之前错误地评论为溢出标志)

添加 eax, 1 也会设置进位标志

在此处输入图片说明