跳至内容

x86 汇编/逻辑

来自维基教科书,开放的书本,开放的世界

逻辑指令

[编辑 | 编辑源代码]

本页面的指令处理的是位级逻辑指令。有关位级逻辑的更多信息,请参阅 数字电路/逻辑运算

本节中介绍的所有逻辑指令都在,顾名思义,算术逻辑单元中执行。

二进制运算

[编辑 | 编辑源代码]

这些指令需要两个操作数。

and 掩码, 目标 GAS 语法
and 目标, 掩码 Intel 语法


and 对两个操作数执行位级运算,并将结果存储在目标中。

副作用
[编辑 | 编辑源代码]

见下文.

movl $0x1, %edx ; edx ≔ 1
movl $0x0, %ecx ; ecx ≔ 0
andl %edx, %ecx ; ecx ≔ edx ∧ ecx
; here ecx would be 0 because 1 ∧ 0 ⇔ 0
  • and 可以用来计算两个“集合”的交集,或表示“掩码”的值。一些编程语言要求布尔值完全存储为10。一个and rax, 1将确保只有LSB被设置或没有被设置。
  • 如果在所需的尺寸中没有部分寄存器寻址,可以使用and进行 运算,即整数除法的余数。为此,掩码必须包含值(即所有较低位都被设置,直到某个阈值),其中 等于你想要的除数。

逻辑 or

[编辑 | 编辑源代码]
or 加数, 目标 GAS 语法
or 目标, 加数 Intel 语法


or 指令对两个操作数执行位级运算,并将结果存储在目标中。

副作用
[编辑 | 编辑源代码]

见下文.

movl $0x1, %edx ; edx ≔ 1
movl $0x0, %ecx ; ecx ≔ 0
orl  %edx, %ecx ; ecx ≔ edx ∨ ecx
; here ecx would be 1 because 1 ∨ 0 ⇔ 1
  • or 可以用来计算两个“集合”的并集,或表示“掩码”的值。

逻辑 xor

[编辑 | 编辑源代码]
xor 翻转, 目标 GAS 语法
xor 目标, 翻转 Intel 语法


对两个操作数执行位级异或运算,并将结果存储在目标中。

副作用
[编辑 | 编辑源代码]

见下文.

movl $0x1, %edx ; edx ≔ 1
movl $0x0, %ecx ; ecx ≔ 0
xorl %edx, %ecx ; ecx ≔ edx ⊕ ecx
; here ecx would be 1 because 1 ⊕ 0 ⇔ 1
  • xor rax, rax (或任何 GPR 两次) 将清除所有位。这是一个专门识别的单词。但是,由于 xor 影响标志,它可能会引入错误的依赖关系。

常见备注

[编辑 | 编辑源代码]
and, orxor 的副作用
[编辑 | 编辑源代码]
  • OF ≔ 0
  • CF ≔ 0
  • SF 变成计算出的 结果 的最高有效位的的值
  • ZF ≔ 结果 = 0
  • PF 根据结果设置

一元运算

[编辑 | 编辑源代码]

逻辑 not

[编辑 | 编辑源代码]

not 参数

参数 执行按位求反。

副作用
[编辑 | 编辑源代码]

无。

movl $0x1, %edx ; edx ≔ 1
notl %edx ; edx ≔ ¬edx
; here edx would be 0xFFFFFFFE because a bitwise NOT 0x00000001 = 0xFFFFFFFE
  • not 通常用于获取所有位都设置的寄存器。
华夏公益教科书