我正在研究两个代码的输出,使用-fomit-frame-pointer和without(gcc at"-O3"默认启用该选项).
pushq %rbp
movq %rsp, %rbp
...
popq %rbp
Run Code Online (Sandbox Code Playgroud)
如果我全局禁用该选项,即使是在极端情况下编译操作系统,是否有一个问题?
我知道中断使用该信息,那么该选项仅适用于用户空间吗?
我正在阅读Intel x86_64 指南 vol.1以刷新内存寻址的工作方式。
仍然,
3.7.5 指定偏移
内存地址的偏移部分可以直接指定为静态值(称为位移)或通过由以下一个或多个组件组成的地址计算指定:
• 位移— 8 位、16 位或32 位值。
我在Agner Fog 的汇编指南中读到,当与 (r/e)ax 寄存器一起使用时,64 位绝对寻址是可能的。
所以..
是否可以使用具有 64 位地址的绝对寻址来 jmp、mov 和 call(使用所有寄存器),或者我是否必须继续使用 Base + 位移组合?
我感到惊讶的是,使用最新的编译器对向量进行迭代显示的结果相同的代码非常不同。这是代码:
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) (如果是这样的话,我会自己做的.)
我的问题:
为方便起见,我倾向于避免间接/索引寻址模式.
作为替代,我经常使用立即,绝对或寄存器寻址.
代码:
; %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?(我不是装配专家).
我正在阅读英特尔手册,卷。2A。
将 AL、AX、EAX 或 RAX 寄存器中的值与第一个操作数(目标操作数)进行比较。如果两个值相等,则将第二个操作数(源操作数)加载到目标操作数中。否则,目标操作数将加载到 AL、AX、EAX 或 RAX 寄存器中。RAX 寄存器仅在 64 位模式下可用。
如果失败,将目的地加载到累加器中的目的是什么?
我需要一种方法来获取整数和双精度数的确定性序列。
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() 已经出局了)。
什么样的实施才能保证这一点?