相关疑难解决方法(0)

关于ADC -1(0xFFFFFFFF)有什么特别之处吗?

在我的一个研究项目中,我正在编写C ++代码。但是,生成的程序集是项目的关键点之一。C ++不提供对标志操作指令的直接访问,特别是对C ++,ADC但只要编译器足够聪明地使用它,这就不成问题。考虑:

constexpr unsigned X = 0;

unsigned f1(unsigned a, unsigned b) {
    b += a;
    unsigned c = b < a;
    return c + b + X;
}
Run Code Online (Sandbox Code Playgroud)

Variable c是一种变通方法,可让我掌握进位标志并将其添加到b和中X。看起来我很幸运,(g++ -O3,版本9.1)生成的代码是这样的:

f1(unsigned int, unsigned int):
 add %edi,%esi
 mov %esi,%eax
 adc $0x0,%eax
 retq 
Run Code Online (Sandbox Code Playgroud)

对于X我测试过的所有值,代码均与上面相同(当然,立即$0x0更改的立即值除外)。但我发现了一个例外:何时X == -1(或0xFFFFFFFFu~0u,...的拼写方式并不重要)生成的代码为:

f1(unsigned int, unsigned int):
 xor %eax,%eax
 add %edi,%esi
 setb %al
 lea -0x1(%rsi,%rax,1),%eax
 retq …
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly gcc bigint

38
推荐指数
1
解决办法
1672
查看次数

标签 统计

assembly ×1

bigint ×1

c++ ×1

gcc ×1

x86 ×1