问题标签 [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 投票
7 回答
7360 浏览

winapi - 如何在 64 位 Windows 程序集中使用“GS:”(例如,移植 TLS 代码)

用户空间程序如何在 64 位 Windows(当前为 XP-64)下配置“GS:”?
(通过配置,将 GS:0 设置为任意 64 位线性地址)。

我正在尝试将“JIT”环境移植到最初为 Win32 开发的 X86-64。

一个不幸的设计方面是相同的代码需要在多个用户空间线程(例如,“光纤”)上运行。Win32 版本的代码为此使用 GS 选择器,并生成正确的前缀来访问本地数据——“mov eax,GS:[offset]”指向当前任务的正确数据。Win32 版本的代码会将一个值加载到 GS 中,只要它有一个可以工作的值。

目前发现64位windows不支持LDT,所以在Win32下用的方法不行。然而,X86-64 指令集包括“SWAPGS”,以及一种在不使用传统分段的情况下加载 GS 的方法——但这只适用于内核空间。

根据 X64 手册,即使 Win64 允许访问描述符——它不允许——也无法设置段基的高 32 位。设置这些的唯一方法是通过 GS_BASE_MSR(和相应的 FS_BASE_MSR - 其他段基在 64 位模式下被忽略)。WRMSR指令是Ring0,所以不能直接使用。

我希望有一个 Zw* 函数,它允许我在用户空间或 Windows API 的其他一些黑暗角落中更改“GS:”。我相信 Windows 仍然使用 FS: 作为自己的 TLS,所以必须有一些机制可用?


此示例代码说明了该问题。我提前为使用字节码道歉 - VS 不会为 64 位编译进行内联汇编,我试图将其保留为一个文件以用于说明目的。

该程序在 XP-32 上显示“PASS”,而在 XP-x64 上不显示。


0 投票
2 回答
5047 浏览

c - 来自 x86_64 Linux 中的内联 asm 的系统调用?

为什么这个打印垃圾而不是优雅地退出我的程序?我在 BSD 上以这种方式使用系统调用,我想知道我需要什么才能让它在 Linux 中工作。

谢谢。

0 投票
2 回答
7418 浏览

64-bit - 使用 Visual Studio (vcvarsall.bat) 编译时选择什么 64 位目标?

vcvarsall.bat确实 setup de build environment 让您在x86 | ia64 | amd64 | x86_amd64 | x86_ia64.

第一个选项对于 32 位是显而易见的,但问题是:如果您想为 64 位构建并且想要在所有 64 位机器上运行,那么其他 4 个之间的最佳选择是什么。

假设您没有时间/资源为 64 构建 4 个构建,而您只能选择其中一个?

0 投票
3 回答
619 浏览

macos - 关于 Assembly 和 Mac 的基本问题

好的。我想学习如何在我的 Mac 上组装程序(2009 年初 MBP,Intel Core 2 Duo)。到目前为止,我只了解汇编语言是由 CPU 指令的直接一对一助记符组成的。经过一番谷歌搜索,我看到了很多术语,主要是“x86”和“x86_64”。我还看到了 MASM、NASM 和 GAS 等。

如我错了请纠正我:

  1. x86 和 x86_64 是指令集。如果我使用这些指令集(作为原始机器代码)编写一些东西,只要我的程序停留在它设计的处理器上,我就可以了。
  2. NASM、MASM 和 GAS 都是不同的汇编程序。
  3. 有不同的汇编语言。例如,有 AT&T 语法和 Intel 语法。对这些语法的支持因汇编程序而异。

现在,问题:

  1. 作为 Mac 用户,我应该关注哪些指令集?
  2. Xcode 使用 GCC。这是否意味着它也使用 GAS?
  3. 如果它确实使用 GAS,那么我应该学习 AT&T 语法吗?
  4. 有没有一本书我可以得到这个。不是教程,也不是网络上的参考手册。这些事情对我来说很重要。例如,据我所知,寄存器只是 CPU 上的一点点内存。这就是我真正知道的很少。

谢谢你的帮助。

0 投票
2 回答
4770 浏览

visual-c++ - 为什么 MSVC 不支持 AMD64 和 Itanium 目标的内联汇编?

昨天我了解到,在为 AMD64 和 Itanium 目标编译时,Microsoft Visual C++ 不支持内联汇编(带有 __asm 关键字)。

那是对的吗?如果是这样,有谁知道他们为什么不支持这些目标的内联汇编?只是放弃似乎是一个相当大的功能......

0 投票
1 回答
1138 浏览

gcc - 内联汇编错误,阻止 gcc 编译尝试

问候,所以。

我有一些代码尝试使用 gcc 进行编译,但我的尝试遭到了挫败。任何更精通的人可以帮助我解决这个问题,也许我缺少一些东西。

我正在 Linux Kitchen 2.6.28-15-generic #49-Ubuntu SMP Tue Aug 18 19:25:34 UTC 2009 x86_64 GNU/Linux 上编译此代码。

返回的错误是:

谢谢大家。

0 投票
2 回答
13559 浏览

linux - 使用 gcc 编译 64 位 linux 内核

在尝试使用 gcc 编译 64 位 linux 内核时,我看到以下错误:

内核/bounds.c:1:错误:32 位模式不支持代码模型“内核”
内核/bounds.c:1:抱歉,未实现:未编译 64 位模式

这就是gcc -v报告的内容:
使用内置规范。
目标:i586-redhat-linux
配置:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl= http:// bugzilla.redhat.com/ bugzilla --enable-bootstrap --enable-shared --enable-threads=posix -- enable-checking=release --with-system-zlib --enable-__cxa_atexit -- disable-libunwind-exceptions --enable-languages= c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/ java-1.5.0-gcj-1.5.0.0/jre -- enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar - -disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch=i586 --build=i586-redhat- linux
线程模型:posix
gcc 版本 4.4.1 20090725 (红帽 4.4.1-2) (GCC)

我在内核 make 命令行上遗漏了什么吗?还是系统上的 gcc 不支持 64 位编译?

0 投票
1 回答
211 浏览

ffmpeg - ffmpeg:相同的编译在不同的机器上表现不同

我在我的两个 Ubuntu hardy 盒子上使用 ffmpeg。它们都具有来自 Medibuntu 的相同版本的 FFMPEG 预编译二进制文件。当我将 3GP 转换为 FLV 时,在一台机器上 ffmpeg 会扭曲声音,而在另一台机器上它工作正常。

我检查了版本和格式选项,它们在机器上都是相同的。

唯一的区别是一台机器是 64 位的,而另一台是 32 位的。这可能是问题的原因吗?如果是这种情况,我该如何解决?

0 投票
3 回答
3237 浏览

qt4 - 64 位雪豹上的 PyQt4

我刚刚在 64 位的 Snow Leopard 上编译了 Qt4.6 的最新预览版,没有任何重大问题。

http://qt.nokia.com/developer/qt-4.6-technology-preview#download-the-qt-4-1

现在,我正在尝试使用 River Bank 网站上的最新快照对 PyQt4.6 做同样的事情。但是,编译器退出并出现以下问题:

这是 PyQt4 尝试访问 Qt4 类的私有成员的错误吗?有人在雪豹上成功编译过 PyQt4 吗?

0 投票
19 回答
17753 浏览

c++ - 将 32 位 C++ 代码移植到 64 位 - 值得吗?为什么?

我知道 x64 架构的一些明显优势(更高的可寻址 RAM 地址等)......但是:

  • 如果我的程序没有真正需要在本机 64 位模式下运行怎么办。无论如何我应该移植它吗?
  • 结束 32 位支持是否有任何可预见的截止日期?
  • 我的应用程序会像原生 x64 代码一样运行得更快/更好/更安全吗?