gpt4 book ai didi

assembly - NASM CMP 和 OR 之间的区别

转载 作者:行者123 更新时间:2023-12-03 06:25:53 25 4
gpt4 key购买 nike

我有 2 个问题。第一个:“or”和“cmp”有什么区别?我都见过,他们似乎做同样的事情。我的第二个问题:什么是

or al, al

是什么意思?它不应该始终返回 true (如 x == x)吗?

最佳答案

实际上,汇编并不像返回true那么简单。一般来说,条件执行通常基于状态寄存器。我将在本说明中使用 Intel x86 架构。请注意,其他架构有所不同,但据我所知,基本原理仍然存在。

如前所述,程序的流程由状态寄存器决定,在 x86 (http://en.wikipedia.org/wiki/FLAGS_register) 上名为 FLAGS。正如您所看到的,例如有 ZF(零标志)位。如果执行jzjnz等条件指令,则检查ZF并据此执行(或不执行)跳转状态。

FLAGS 寄存器在代码执行时更新,每条指令将一些(有时没有)位设置为适当的值。这些数据可以在给定架构的适当手册中阅读。例如,在 x86 上,add 指令会更改 CF(进位标志)。

如果您查找 or 指令,它会像这样更新 FLAGS:“OF 和 CF 标志被清除;SF、ZF 和 PF 标志根据到结果。” (http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf#G5.251049)。

因此,

or al, al

代码的功能基于后面的任何条件指令。它单独存在没有任何意义,因为 x |= x(在类 C 语言中)基本上对值没有影响,但对状态寄存器有副作用。

从我们读到的内容来看,我们可以使用

or al, al
jnz _someWhere

为了确定al寄存器的内容是否非零,如果是,则跳转到_someWhere

解释使用 test al, al 代替 cmp al, 0or al,al (所有这些设置相同的标志),我建议阅读 Peter Cordes 的精彩文章 Test whether a register is zero with CMP reg,0 vs OR reg,reg?

关于assembly - NASM CMP 和 OR 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508020/

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