Questions tagged «x86-64»

x86-64是Intel x86架构的64位扩展



2
什么是“ rep; 没事;” 在x86汇编中意味着什么?它与“暂停”指令相同吗?
什么rep; nop意思 与pause指示相同吗? 是否与rep nop(不含分号)相同? 简单nop指令有什么区别? 它在AMD和Intel处理器上的行为是否有所不同? (奖金)这些说明的正式文件在哪里? 这个问题的动机 在讨论另一个问题的评论后,我意识到我不知道rep; nop;x86(或x86-64)汇编的含义。而且我在网上也找不到很好的解释。 我知道这rep是一个前缀,表示“重复下一个指令cx时间”(或者至少在旧的16位x86汇编中是这样)。根据这一维基百科汇总表,似乎rep只能与使用movs,stos,cmps,lods,scas(但也许是对新的处理器去掉这个限制)。因此,我认为rep nop(没有分号)会重复一个nop操作cx时间。 但是,经过进一步的搜索,我变得更加困惑。似乎rep; nop和pause 映射到完全相同的操作码,并且pause行为与刚刚不同nop。2005年的一些旧邮件说了不同的话: “尽量不要消耗太多功率” “仅用2字节编码就相当于'nop'。” “这在英特尔上是神奇的。就像'nop,但让其他HT兄弟运行一样'” “在Intel上暂停,在Athlon上快速填充” 由于这些不同的意见,我无法理解正确的含义。 它是在Linux内核(两个正在使用的i386和x86_64的),这条评论在一起:/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */它也正在贝尔托斯使用,具有相同的注释。

4
内存对齐:如何使用alignof / alignas?
我现在正在使用共享内存。 我无法理解alignof和alignas。 cppreference不清楚:alignof返回“ alignment”,但是什么是“ alignment”?要为下一个要对齐的块添加的字节数?填充尺寸?堆栈溢出/博客条目也不清楚。 有人能解释清楚alignof和alignas?

2
x86_64汇编器中RBP寄存器的用途是什么?
所以我尝试学习一些汇编,因为计算机架构课程需要它。我写了一些程序,例如打印斐波那契数列。 我认识到,每当我编写一个函数时,我都会使用这三行代码(正如我从将生成的汇编代码gcc与其C等效代码进行比较中学到的那样): pushq %rbp movq %rsp, %rbp subq $16, %rsp 我对此有2个问题: 首先,为什么我需要使用%rbp?%rsp它的内容移至%rbp第二行,使用起来更简单吗? 为什么我必须从中减去任何东西%rsp?我的意思是,并非总是如此16,当我要printf输入7或8个变量时,我会减去24或28。 我在虚拟机(4 GB RAM)和Intel 64位处理器上使用Manjaro 64位

3
如何使用CMAKE从命令行在Windows上构建x86和/或x64?
一种使用cmake在Windows上使用Visual Studio构建x86的方法如下: 启动x86的Visual Studio命令提示符 运行cmake: cmake -G "NMake Makefiles" \path_to_source\ 纳马克 一种使用cmake在Windows上使用Visual Studio构建x64的方法如下: 启动x64的Visual Studio命令提示符 运行cmake: cmake -G "NMake Makefiles" \path_to_source\ 纳马克 使用Cmake,如何编译一个或两个体系结构?(例如Visual Studio如何在IDE中执行此操作)

3
强制gcc在64位平台上编译32位程序
我有一个专有程序,试图在64位系统上使用。 当我启动安装程序时,它工作正常,但是在尝试更新自身并编译某些模块后,它无法加载它们。 我怀疑这是因为它正在使用gcc,而gcc试图将它们编译为64位系统,因此该程序无法使用这些模块。 是否有任何方法(一些环境变量或类似的东西)强制gcc为32位平台执行所有操作。32位chroot可以工作吗?
70 linux  gcc  32-bit  x86-64 


4
为什么构造std :: optional <int>比std :: pair <int,bool>昂贵?
考虑以下两种可以表示“可选int”的方法: using std_optional_int = std::optional&lt;int&gt;; using my_optional_int = std::pair&lt;int, bool&gt;; 鉴于这两个功能... auto get_std_optional_int() -&gt; std_optional_int { return {42}; } auto get_my_optional() -&gt; my_optional_int { return {42, true}; } ... g ++干线和clang ++干线 (带有-std=c++17 -Ofast -fno-exceptions -fno-rtti)都会产生以下汇编: get_std_optional_int(): mov rax, rdi mov DWORD PTR [rdi], 42 mov BYTE PTR [rdi+4], 1 …

2
IBM示例代码,不可重入函数在我的系统中不起作用
我正在研究编程的重入性。在IBM的这个站点上(确实不错)。我建立了一个代码,复制到下面。这是在网站上滚动的第一个代码。 该代码尝试通过打印在“危险上下文”中不断变化的两个值来显示涉及在文本程序的非线性开发中共享访问变量的问题(异步性)。 #include &lt;signal.h&gt; #include &lt;stdio.h&gt; struct two_int { int a, b; } data; void signal_handler(int signum){ printf ("%d, %d\n", data.a, data.b); alarm (1); } int main (void){ static struct two_int zeros = { 0, 0 }, ones = { 1, 1 }; signal (SIGALRM, signal_handler); data = zeros; alarm …
11 c  gcc  signals  x86-64  data-race 

1
为何编译器坚持在此处使用被调用者保存的寄存器?
考虑下面的C代码: void foo(void); long bar(long x) { foo(); return x; } 当我在GCC 9.3上使用-O3或编译它时-Os,得到以下信息: bar: push r12 mov r12, rdi call foo mov rax, r12 pop r12 ret clang的输出是相同的,除了选择rbx而不是r12作为被调用者保存的寄存器。 但是,我希望/希望看到看起来像这样的程序集: bar: push rdi call foo pop rax ret 用英语,这就是我所看到的: 将已保存被调用者的寄存器的旧值推入堆栈 移动x到该被调用方保存寄存器 呼叫 foo 移动x从被调用者被保存的寄存器到返回值寄存器 弹出堆栈以恢复被调用方保存的寄存器的旧值 为什么要弄乱所有保存在被调用方中的寄存器?为什么不这样做呢?它看起来更短,更简单,并且可能更快: 推x入栈 呼叫 foo x从堆栈弹出到返回值寄存器 我的大会错了吗?它比以多余的寄存器搞乱效率低吗?如果对这两个问题的回答都是“否”,那么为什么GCC或clang都不这样做呢? …
10 c  gcc  assembly  clang  x86-64 

1
C11原子获取/发布和x86_64缺乏加载/存储一致性?
我在C11标准的5.1.2.4节中苦苦挣扎,尤其是Release / Acquire的语义。我注意到https://preshing.com/20120913/acquire-and-release-semantics/(以及其他)指出: ...释放语义可防止以程序顺序在写释放之前进行任何读或写操作,从而对写释放进行内存重新排序。 因此,对于以下情况: typedef struct test_struct { _Atomic(bool) ready ; int v1 ; int v2 ; } test_struct_t ; extern void test_init(test_struct_t* ts, int v1, int v2) { ts-&gt;v1 = v1 ; ts-&gt;v2 = v2 ; atomic_store_explicit(&amp;ts-&gt;ready, false, memory_order_release) ; } extern int test_thread_1(test_struct_t* ts, int v2) { …

2
L2 HW预取器真的有用吗?
我在Whiskey Lake i7-8565U上,分析性能计数器和复制512 KiB数据的时间(是L2缓存大小的两倍),并且对L2 HW预取器的工作遇到了一些误解。 在英特尔手册第4卷MSR中,有MSR 0x1A4的位0用于控制L2硬件预取器(禁用1)。 考虑以下基准: memcopy.h: void *avx_memcpy_forward_lsls(void *restrict, const void *restrict, size_t); memcopy.S: avx_memcpy_forward_lsls: shr rdx, 0x3 xor rcx, rcx avx_memcpy_forward_loop_lsls: vmovdqa ymm0, [rsi + 8*rcx] vmovdqa [rdi + rcx*8], ymm0 vmovdqa ymm1, [rsi + 8*rcx + 0x20] vmovdqa [rdi + rcx*8 + 0x20], ymm1 add …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.