gpt4 book ai didi

assembly - 为什么在循环中使用跳转时不需要 'cmp'?

转载 作者:行者123 更新时间:2023-12-03 23:10:29 30 4
gpt4 key购买 nike

我用我想要循环的次数填充ecxdec重新调整ecx如果不为零则跳转返回:

现在的问题是,为什么不:

cmp ecx, 0jnz back 之前必需的。jnz 如何自动知道跳转时要比较哪个寄存器? (在本例中为 ecx)。

int _tmain(int argc, _TCHAR* argv[])
{
int a = 0;

__asm
{
mov eax, 0
mov ecx, 4
back:
inc eax
sub ecx, 1
jnz back
mov a, eax
}

cout << a << endl; //outputs '4' properly

return 0;
}

最佳答案

在汇编中,有多个指令可用于执行“比较”。

一般来说(只有极少数异常(exception)),条件分支指令根本不比较任何寄存器。他们测试EFLAGS寄存器中所谓的“状态标志”(零标志、进位标志等),并根据这些标志的状态确定是否执行跳转.

如您所见in this list ,有些指令甚至有多个名称。例如,je (Jump if Equal) 只是 jz (J ump 如果设置了 Zero 标志)。

至于cmp指令,它只是一个减法。它设置标志,就像执行了减法一样,但不保存值或修改其任何操作数。例如,如果您从 12 中减去 10(通过 cmpsub),零标志将被清除(因为结果不为零)并且进位标志将被清除(没有必要借)。在这种情况下,根据零标志的状态,jnz(又名 jne)将采用分支,而 jz(又名je)不会。

几乎所有算术和位指令都会影响这些标志以及其他一些标志。官方文档非常清楚每条指令影响哪些标志。例如,dec cx 也设置标志。如果cx中的值在递减后为​​零,则将设置零标志。因此,jnz 不会跳转,您将脱离循环。

关于assembly - 为什么在循环中使用跳转时不需要 'cmp'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41446898/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com