assembly - 减法后 SBB RCX、RCX 的进位标志的使用

标签 assembly x86-64

我正在读一本书:[xchg rax, rax]。以下是本书的 0x03 片段,我无法理解这一点。

sub      rdx,rax
sbb      rcx,rcx
and      rcx,rdx
add      rax,rcx

一周以来我一直在研究这个问题(每天几分钟)。我研究了一些试图解决它的问题:数字的符号表示、减法的工作原理、减法后 CF 的作用。根据 this 答案和给出的列表 here 。我看不出在减法后检查 CF 的意义,除非在可能溢出的情况下。

在什么情况下检查减法后的进位标志有用?

最佳答案

实际上,该代码是一种聪明的无分支方式来执行 rax = min(rax, rdx)

sub rdx, rax ; rdx = rdx - rax; CF set if rdx < rax
sbb rcx, rcx ; rcx = all 1 bits if CF was set, 0 otherwise
and rcx, rdx ; rcx = rdx - rax if CF was set, 0 otherwise
add rax, rcx ; rax = rax + (rdx - rax) = rdx if CF was set, unchanged otherwise

一个更具可读性的分支版本是:

cmp rdx, rax
jnc done ; if rdx - rax produced no carry, rax is smaller or equal
mov rax, rdx ; otherwise rdx is the smaller one
done:

它仍然只是使用 CF 进行溢出检查。

关于assembly - 减法后 SBB RCX、RCX 的进位标志的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32771943/

相关文章:

0xFFE700DE >0xA 的汇编代码比较失败

gcc - GCC 上 x86 intel asm 方括号前的偏移量

assembly - CS :APP example uses idivq with two operands?

macos - 在OSX10.6上反汇编为x86_64(但使用_Intel_语法)

assembly - 英特尔 SDM 手册中的 "set according to the result"是什么意思?

c++ - 为什么我的反汇编 C++ 代码使用指令指针和偏移量来获取字符串文字?

c - 编译器生成的汇编代码中的.LFB .LBB .LBE .LVL .loc是什么

c - 如何编写从汇编代码调用的 C 函数

assembly - 如何打印MUL产品的输出?

c++ - OpenMP 原子和非原子读/写在 x86_64 上产生相同的指令