小编Kro*_*oma的帖子

x86_64:堆栈帧指针几乎没用?


  • Linux x86_64.
  • gcc 5.x

我正在研究两个代码的输出,使用-fomit-frame-pointer和without(gcc at"-O3"默认启用该选项).

pushq    %rbp
movq     %rsp, %rbp
...
popq     %rbp
Run Code Online (Sandbox Code Playgroud)

我的问题是:

如果我全局禁用该选项,即使是在极端情况下编译操作系统,是否有一个问题?

我知道中断使用该信息,那么该选项仅适用于用户空间吗?

c assembly gcc x86-64 stack-frame

13
推荐指数
1
解决办法
2588
查看次数

X86_64 - 汇编 - 为什么位移不是 64 位?

我正在阅读Intel x86_64 指南 vol.1以刷新内存寻址的工作方式。

仍然,

3.7.5 指定偏移

内存地址的偏移部分可以直接指定为静态值(称为位移)或通过由以下一个或多个组件组成的地址计算指定:

• 位移— 8 位、16 位或32 位值。

我在Agner Fog 的汇编指南中读到,当与 (r/e)ax 寄存器一起使用时,64 位绝对寻址是可能的。

所以..

是否可以使用具有 64 位地址的绝对寻址来 jmp、mov 和 call(使用所有寄存器),或者我是否必须继续使用 Base + 位移组合

assembly x86-64 memory-address

5
推荐指数
2
解决办法
2185
查看次数

向量迭代编译成非常不同的指令

我感到惊讶的是,使用最新的编译器对向量进行迭代显示的结果相同的代码非常不同。这是代码:

void fun1(vector <uint8_t> &a,unsigned num) {

    for (auto &&value : a) {
        value += num;
    }
}

void fun2(vector <uint8_t> &a,unsigned num){

    for (uint32_t x = 0, p = a.size(); x < p; x++){
        a[x] += num;
    }
}
void fun4(vector <uint8_t> &a,unsigned num){

    for (uint32_t x = 0; x < a.size(); x++){
        a[x] += num;
    }
}
void fun3(vector <uint8_t> &a,unsigned num) {

    for (auto it = a.begin(); it!=a.end(); ++it) {
        *it += num;
    }
}
void fun5(vector …
Run Code Online (Sandbox Code Playgroud)

c++ loops

5
推荐指数
1
解决办法
123
查看次数

x86_64 - 汇编 - 循环条件和乱序

不是要求基准.

(如果是这样的话,我会自己做的.)


我的问题:

为方便起见,我倾向于避免间接/索引寻址模式.

作为替代,我经常使用立即,绝对或寄存器寻址.

代码:

; %esi has the array address. Say we iterate a doubleword (4bytes) array.
; %ecx is the array elements count
(0x98767) myloop:
    ... ;do whatever with %esi
    add $4, %esi
    dec %ecx
    jnz 0x98767;
Run Code Online (Sandbox Code Playgroud)

在这里,我们有一个序列化的组合(dec和jnz),它可以防止正常的乱序执行(依赖).

有没有办法避免/破坏dep?(我不是装配专家).

assembly loops x86-64 conditional-statements

4
推荐指数
1
解决办法
1070
查看次数

x86_64 - cmpxchg。返回值

我正在阅读英特尔手册,卷。2A。

将 AL、AX、EAX 或 RAX 寄存器中的值与第一个操作数(目标操作数)进行比较。如果两个值相等,则将第二个操作数(源操作数)加载到目标操作数中。否则,目标操作数将加载到 AL、AX、EAX 或 RAX 寄存器中。RAX 寄存器仅在 64 位模式下可用。

如果失败,将目的地加载到累加器中的目的是什么?

assembly x86-64 compare-and-swap

3
推荐指数
1
解决办法
882
查看次数

c++ - mt19937 的 std::uniform_XXX_distribution 的确定性替代方案?

我需要一种方法来获取整数和双精度数的确定性序列。

template <class U>
constexpr auto get_random_value (std::mt19937 &gen, U min_value, U max_value)->U
{
    if constexpr ( std::is_same_v <U, double> or std::is_same_v <U, float> ){
        std::uniform_real_distribution <U> distrib( min_value, max_value );
 
        return distrib( gen );
    }
    else if constexpr ( std::is_same_v <U, u32> or std::is_same_v <U, i32> ){
        std::uniform_int_distribution distrib( min_value, max_value );

        return distrib( gen );
    }
    else {
        throw std::runtime_error( "error value type" );
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,日复一日,相同的种子值会导致不同的结果。分布是罪魁祸首,因为它在很大程度上避免了模数的陷阱。

但我需要一种精确的方法来始终确保从给定种子开始的序列始终相同。我需要一个无偏分区(所以 % 和 rand() 已经出局了)。

什么样的实施才能保证这一点?

c++ random distribution

3
推荐指数
1
解决办法
288
查看次数