问题标签 [x86-64]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2115 浏览

c - 比 x86_64/linux 上的 glibc 更快的数学库?

是否有更快的 x86_64-linux 的 glibc 的 libm(和头文件?)替代品?

0 投票
2 回答
2975 浏览

assembly - 程序员“隐形”寄存器呢?

这些是“程序员可见” x86-64 寄存器:

替代文字
(来源:usenix.org

看不见的寄存器呢?刚才我了解到MMU寄存器,中断描述符表(IDT)使用这些不可见的寄存器。我正在艰难地学习这些东西。是否有任何资源(书籍/文档/等)可以立即为我提供完整的图片?

我知道程序员可见的寄存器并且对它们进行编程很舒服。我只想了解隐形寄存器及其功能。我想得到一张完整的照片。我在哪里可以获得这些信息?

编辑:

我想得到一张完整的照片。我在哪里可以获得这些信息?

这两本书帮助我理解了这些底层细节。

  1. 计算机组织和设计基础 ~ Sivarama P. Dandamudi - 第 1 版 (2003 )
  2. 计算机组织与设计:硬件/软件接口,第 4 版,~ David A. Patterson,John L. Hennessy
0 投票
2 回答
869 浏览

assembly - P6 架构 - 除了寄存器重命名之外,有限的用户寄存器是否会导致更多的操作花费在溢出/加载上?

我正在研究有关动态语言 VM 实现的 JIT 设计。自从 8086/8088 天以来,我没有做太多的组装,只是在这里或那里做了一点,所以如果我心情不好,那就太好了。

据我了解,x86 (IA-32) 架构今天仍然具有与以往相同的基本受限寄存器集,但内部寄存器数量已大幅增长,但这些内部寄存器通常不可用,并与寄存器重命名一起使用实现代码的并行流水线,否则无法并行化。我非常理解这种优化,但我的感觉是,虽然这些优化有助于提高整体吞吐量和并行算法,但我们仍然坚持使用的有限寄存器集会导致更多的寄存器溢出开销,如果 x86 有两倍或四倍的寄存器对我们可用,典型指令流中的推送/弹出操作码可能会显着减少?或者是否有其他处理器优化也可以优化这一点,我不知道?基本上如果我

任何关于研究的参考,或者更好的是,个人经历?

编辑:x86_64 有 16 个寄存器,是 x86-32 的两倍,感谢您的更正和信息。

0 投票
2 回答
748 浏览

c++ - 如何从 Windows x64 的汇编程序访问 C 数组?

我编写了一个汇编函数来加速图像处理的一些事情(图像是用 CreateDIBSection 创建的)。

对于 Win32,汇编代码可以正常工作,但对于 Win64,我一尝试访问我的数组数据就会崩溃。

我把相关信息放在一个结构中,我的汇编函数得到一个指向这个结构的指针。将结构指针放入 ebx/rbx 并通过索引从结构中读取数据。

知道我做错了什么吗?我将 nasm 与 Visual Studio 2008 一起使用,对于 Win64,我设置了“默认 rel”。

C++ 代码:

汇编代码:

赢32:

Win64:

0 投票
2 回答
1108 浏览

assembly - x86 操作码对齐参考和指南

我正在 JIT 编译器中动态生成一些操作码,并且正在寻找操作码对齐的指南。

1)我已经阅读了通过在调用后添加 nop 来简要“推荐”对齐的评论

2)我还阅读了有关使用 nop 优化序列以实现并行性的信息。

3)我读过操作对齐有利于“缓存”性能

通常这些评论不提供任何支持参考。阅读博客或评论说“这样做是个好主意”是一回事,但实际编写实现特定操作序列并在线实现大多数材料(尤其是博客)的编译器是另一回事用于实际应用。所以我相信自己会发现事情(反汇编等,看看现实世界的应用程序做了什么)。这是我需要一些外部信息的一种情况。

我注意到编译器通常会在之前的任何指令序列之后立即启动奇数字节指令。所以编译器在大多数情况下并没有特别注意。我在这里或那里看到“nop”,但通常似乎很少使用 nop,如果有的话。操作码对齐有多重要?您能否为我可以实际用于实施的案例提供参考?谢谢。

0 投票
3 回答
12709 浏览

linux - 在 64 位 Linux 和 64 位处理器上运行 32 位汇编代码:解释异常

我遇到了一个有趣的问题。我忘记了我使用的是 64 位机器和操作系统并编写了 32 位汇编代码。我不知道如何编写 64 位代码。

这是 Linux 上 Gnu Assembler(AT&T 语法)的 x86 32 位汇编代码。

现在,这段代码应该在 32 位处理器和 32 位操作系统上运行良好,对吧?众所周知,64 位处理器向后兼容 32 位处理器。所以,这也不是问题。问题的出现是因为 64 位操作系统和 32 位操作系统中的系统调用和调用机制不同。我不知道为什么,但他们在 32 位 linux 和 64 位 linux 之间更改了系统调用号。

asm/unistd_32.h 定义:

asm/unistd_64.h 定义:

无论如何,使用宏而不是直接数字是有回报的。它确保正确的系统调用号码。

当我组装&链接&运行程序时。

它不打印helloworld

在 gdb 中显示:

  • 程序以代码 01 退出。

我不知道如何在 gdb 中调试。使用教程我尝试调试它并在每一步通过指令检查寄存器执行指令。它总是向我显示“程序以 01 退出”。如果有人能告诉我如何调试它,那就太好了。

我试着跑步strace。这是它的输出:

  1. 解释一下write(0, NULL, 12)strace输出中系统调用的参数?
  2. 到底发生什么?我想知道为什么它以exitstatus = 1退出的原因?
  3. 有人可以告诉我如何使用 gdb 调试这个程序吗?
  4. 他们为什么要更改系统调用号码?
  5. 请适当更改此程序,以便它可以在这台机器上正确运行。

编辑:

阅读 Paul R 的回答后。我检查了我的文件

我同意他的观点,这些应该是 ELF 32 位可重定位和可执行的。但这并不能回答我的问题。我所有的问题仍然是问题。在这种情况下到底发生了什么?有人可以回答我的问题并提供此代码的 x86-64 版本吗?

0 投票
4 回答
140448 浏览

linux - i386 和 x86-64 上 UNIX 和 Linux 系统调用(和用户空间函数)的调用约定是什么

以下链接解释了 UNIX(BSD 风格)和 Linux 的 x86-32 系统调用约定:

但是 UNIX 和 Linux 上的 x86-64 系统调用约定是什么?

0 投票
3 回答
20768 浏览

x86-64 - CentOs 5下如何安装python2.6-devel包

我需要在python2.6下安装mysql-python。mysql-python包需要python2.6-devel包,依赖于libpython2.6.so.1.0(64bit) 我在网上找了一些python2.6-devel包,但是找不到libpython2.6 服务器架构是x86_64 .

也许有人有这个库,或者知道我在哪里可以找到它。

感谢帮助)

0 投票
11 回答
116909 浏览

c++ - 现代硬件上的浮点与整数计算

我在 C++ 中做一些性能关键的工作,我们目前正在使用整数计算来解决本质上是浮点的问题,因为“它更快”。这会导致很多烦人的问题,并添加很多烦人的代码。

现在,我记得在大约 386 天时读到浮点计算如此缓慢,我相信(IIRC)有一个可选的协处理器。但是现在,随着 CPU 的复杂性和强大程度呈指数级增长,如果进行浮点或整数计算,“速度”肯定没有区别吗?特别是因为与导致管道停顿或从主内存中获取某些内容相比,实际计算时间很短?

我知道正确的答案是在目标硬件上进行基准测试,什么是测试这个的好方法?我编写了两个小型 C++ 程序,并将它们的运行时间与 Linux 上的“时间”进行了比较,但实际运行时间变化太大(无助于我在虚拟服务器上运行)。除了花费我一整天的时间来运行数百个基准测试、制作图表等,我能做些什么来对相对速度进行合理的测试吗?有什么想法或想法吗?我完全错了吗?

我使用的程序如下,它们无论如何都不相同:

方案二:

提前致谢!

编辑:我关心的平台是在桌面 Linux 和 Windows 机器上运行的常规 x86 或 x86-64。

编辑 2(从下面的评论中粘贴):我们目前拥有广泛的代码库。真的,我已经反对我们“不能使用浮点数,因为整数计算更快”的概括 - 我正在寻找一种方法(如果这甚至是真的)来反驳这个概括的假设。我意识到,如果不做所有的工作并在事后进行分析,就不可能为我们预测确切的结果。

无论如何,感谢您所有出色的答案和帮助。随意添加任何其他内容:)。

0 投票
2 回答
49582 浏览

linux - 检查 gdb 中的 C/C++ 堆内存统计信息

我正在尝试从 Linux amd64 上的 gdb 中调查 C/C++ 堆的状态,有没有一种很好的方法可以做到这一点?

我尝试过的一种方法是“调用 mallinfo()”,但不幸的是我无法提取我想要的值,因为 gdb 没有正确处理返回值。

我不容易为我所附加的进程编写一个要编译成二进制文件的函数,所以我可以简单地实现我自己的函数来通过在我自己的代码中调用 mallinfo() 来提取值。是否有一个聪明的技巧可以让我即时执行此操作?

另一种选择可能是定位堆并遍历 malloc 标头/空闲列表;我会很感激任何关于我可以从哪里开始找到这些位置和布局的指针。

我一直在尝试谷歌并围绕这个问题阅读了大约 2 个小时,我学到了一些有趣的东西,但仍然没有找到我需要的东西。