gpt4 book ai didi

c++ - testb $1, %al 的语义是什么

转载 作者:行者123 更新时间:2023-11-27 23:46:30 26 4
gpt4 key购买 nike

我想了解这个 testb 指令 (x86-64) 会做什么。

testb $1, %al

这里 $1 的值(value)是多少。是全部 (0xFF) 还是单个 1 (0x1)?

程序集由 clang 为以下程序生成:

#include <atomic>
std::atomic<bool> flag_atomic{false};

extern void f1();
extern void f2();

void foo() {
bool b = flag_atomic.load(std::memory_order_relaxed);
if (b == false) {
f1();
} else {
f2();
}
}

(clang++ -s test.cpp -O3) 的相关程序集如下:

Lcfi2:
.cfi_def_cfa_register %rbp
movb _flag_atomic(%rip), %al
testb $1, %al ; <<<<------------
jne LBB0_2

最佳答案

在 AT&T 语法中,$ 是立即数的前缀 (see also); $1 是普通的 1,因此您的指令根据 al 的最低有效位设置标志。

is it all ones (0xFF) or a single 1 (0x1)?

所有的都是

testb $-1, %al

或(完全相同的机器代码,只是反汇编首选项)

testb $0xff, %al

顺便说一下,它与

具有完全相同的语义
testb %al, %al

(因为 8 位寄存器上的 0xff 掩码不会掩码任何内容),在这种情况下对您的代码也有效,对于 bool 值,不需要掩码任何检查它是否真实的东西(实际上 gcc 更喜欢你的代码的最后一个版本)。


movb  _flag_atomic(%rip), %al 
testb $1, %al
jne LBB0_2

在 Intel 语法中(无前缀、无后缀、dest、source 操作数顺序、显式内存寻址语法)这是

mov al, [rip+_flag_atomic]
test al, 1
jne LBB0_2

并且,在伪 C 中:

%al = _flag_atomic;
if(%al & 1 != 0) goto LBB0_2;

(jnejnz 的别名,在这种情况下可能更清楚)。

关于c++ - testb $1, %al 的语义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50135074/

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