小编Pet*_*des的帖子

"rdtsc"之前的"cpuid"

有时我会遇到使用rdtsc指令读取TSC的代码,但cpuid之前会调用.

为什么要打电话cpuid?我意识到这可能是与有TSC的值不同的内核,但什么究竟,当你调用序列这两个指令会发生什么?

x86 assembly rdtsc

18
推荐指数
2
解决办法
3826
查看次数

为什么内核代码不能使用Red Zone

强烈建议在创建64位内核(对于x86_64平台)时,指示编译器不要使用用户空间ABI所执行的128字节红区.(对于GCC,编译器标志是-mno-red-zone).

如果启用了内核,则内核不会是中断安全的.

但那是为什么呢?

x86-64 abi red-zone

18
推荐指数
3
解决办法
2874
查看次数

虽然,Do While,For汇编语言中的循环(emu8086)

我想将高级语言中的简单循环转换为汇编语言(对于emu8086)说,我有这样的代码:

 for(int x = 0; x<=3; x++)
 {
  //Do something!
 }
Run Code Online (Sandbox Code Playgroud)

要么

 int x=1;
 do{
 //Do something!
 }
 while(x==1)
Run Code Online (Sandbox Code Playgroud)

要么

 while(x==1){
 //Do something
 }
Run Code Online (Sandbox Code Playgroud)

我如何在emu8086中执行此操作?

assembly loops for-loop while-loop x86-16

18
推荐指数
1
解决办法
9万
查看次数

Bounds检查64位硬件

我正在hacks.mozilla.org上阅读64位Firefox版本的博客.

作者说:

对于asm.js代码,增加的地址空间还允许我们使用硬件内存保护来安全地从asm.js堆访问中删除边界检查.收益非常显着:asmjs-apps上的8%-17%- * - arewefastyet.com上报告的吞吐量测试.

我试图了解64位硬件如何对C/C++进行自动边界检查(假设编译器支持硬件).我在SO中找不到任何答案.我找到了一篇关于这个主题的技术论文,但我无法理解这是怎么做到的.

有人可以在边界检查中解释64位硬件辅助吗?

c c++ x86-64 sandbox virtual-memory

18
推荐指数
1
解决办法
548
查看次数

汇编文件:.a .s .asm之间的差异

在MIPS模拟器"QTSpim"中,接受三种类型的文件:

  • .a
  • .s
  • .asm

这些文件类型之间是否存在差异,如果是,那有什么区别?

assembly file-type file mips

18
推荐指数
1
解决办法
1万
查看次数

在x64上使用非临时存储获取/释放语义

我有类似的东西:

if (f = acquire_load() == ) {
   ... use Foo
}
Run Code Online (Sandbox Code Playgroud)

和:

auto f = new Foo();
release_store(f)
Run Code Online (Sandbox Code Playgroud)

您可以很容易地想象使用atomic with load(memory_order_acquire)和store(memory_order_release)的acquire_load和release_store的实现.但是现在如果release_store是用_mm_stream_si64实现的,这是一个非临时写入,而不是针对x64上的其他商店进行排序的?如何获得相同的语义?

我认为以下是最低要求:

atomic<Foo*> gFoo;

Foo* acquire_load() {
    return gFoo.load(memory_order_relaxed);
}

void release_store(Foo* f) {
   _mm_stream_si64(*(Foo**)&gFoo, f);
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

// thread 1
if (f = acquire_load() == ) {
   _mm_lfence(); 
   ... use Foo
}
Run Code Online (Sandbox Code Playgroud)

和:

// thread 2
auto f = new Foo();
_mm_sfence(); // ensures Foo is constructed by the time f is published to gFoo
release_store(f)
Run Code Online (Sandbox Code Playgroud)

那是对的吗?我非常肯定这里绝对需要sfence.但是那个lfence怎么样?是否需要或者简单的编译器障碍对于x64是否足够?例如asm volatile("":::"memory").根据x86内存模型,负载不会与其他负载重新排序.所以根据我的理解,只要存在编译器障碍,acquire_load()必须在if语句中的任何加载之前发生.

c++ multithreading x86-64 lock-free stdatomic

18
推荐指数
1
解决办法
1267
查看次数

如何理解VIPER清洁架构?

我最近发现了VIPER干净的架构,我开始寻找在Android平台上应用这种架构的示例教程.然而,我唯一发现的是样本项目让我感到困惑,这就是为什么我想按照一个简单的例子来理解VIPER的基本原则.我想知道是否有人可以在上面分享一些很好的教程.

architecture android software-design viper-architecture

18
推荐指数
2
解决办法
8567
查看次数

在C++代码中使用纯C库是否会降低性能?

我看到了这个链接,但我不是要求使用"extern"的代码性能下降.我的意思是没有"extern",在C++中使用C库时是否存在"上下文切换"? 在C++应用程序中使用纯C(非类包装)函数时是否有任何问题?

c c++ performance c-libraries

18
推荐指数
2
解决办法
1834
查看次数

实现允许使用不支持的类型实例化 std::complex 是否有原因

编辑说明:最初的问题说非法,现在说未指定

感谢最近 Jason Turner 视频的视频评论部分,我了解到这std::complex<int>是未指定的。

但所有(AFAIK)实现似乎都可以愉快地编译

std::complex<int>
Run Code Online (Sandbox Code Playgroud)

但有些功能如std::abs()已被破坏std::complex<int>,因此它实际上在那些主流实现中不可用。


我想知道是否有某种原因导致从未实现“不良”类型的检测。我知道 std lib 实现需要与较旧的标准一起工作,因此它们不能只是std::floating_point在各处停留概念,但即使在 C++20 之前,我们也有方法来约束模板。

换句话说:这只是“很好,但我们没有时间”问题,还是存在某些兼容性原因来保持此编译。我唯一能想到的是,有些人正在使用 std::complex 和 std lib“制造商”不想明显破坏他们已经损坏的代码。

c++ complex-numbers language-lawyer unspecified-behavior c++20

18
推荐指数
2
解决办法
695
查看次数

应用程序如何确定指令集是否可用并在可用时使用它?

有趣的是它在游戏和其他软件中的工作原理。
更准确地说,我正在寻求一个解决方案C++
就像是:

if AMX available -> Use AMX version of the math library
else if AVX-512 available -> Use AVX-512 version of the math library
else if AVX-256 available -> Use AVX-256 version of the math library
etc.  
Run Code Online (Sandbox Code Playgroud)

我的基本想法是在不同的 DLL 中编译库并在运行时交换它们,但这对我来说似乎不是最好的解决方案。

c++ windows assembly instruction-set cpuid

18
推荐指数
2
解决办法
2873
查看次数