11

最近我决定值得尝试基本的 x86 汇编,以便更容易调试程序等。所以我(大约一周前)开始学习 x86 汇编,在那段时间,我将我的电脑升级到8GB 内存,很明显我的 x86 Windows XP 安装浪费了所有内存,现在,我正在运行 x64 Windows 7 副本,所以问题是:

是否可以在 x64 操作系统上使用 x86 程序集?它会在模拟器中正常运行吗?还是我应该学习 x64 汇编?

4

3 回答 3

19

是否可以在 x64 操作系统上使用 x86 程序集?它会在模拟器中正常运行吗?

是的,这是可能的,它会正常运行。指令集架构始终向后兼容。

x86-64 中的寄存器:

替代文字
(来源:usenix.org

例如:在这里您可以看到这rax是新的 64 位通用寄存器,但您仍然可以使用eax它,因为它指的是rax.

还是我应该学习 x64 汇编?

x86-32 架构是 x86-64 的子集。就像你首先学习了 x86,然后去寻找 x86-64 程序集中的新内容。一旦你学习了 x86 asm。那么这将是一个有用的资源:http ://www.cs.cmu.edu/~fp/courses/15213-s06/misc/asm64-handout.pdf

于 2010-01-24T04:36:25.327 回答
14

是的当然。大多数程序仍然是 32 位的,并且在 64 位 Windows 系统上运行良好。这些程序是机器语言,它与汇编具有一对一的映射关系(并且可以很容易地反汇编成 x86 汇编代码)。

于 2010-01-24T04:32:09.607 回答
2

如果编译选项,Linux 显式实现 32 位支持:

CONFIG_IA32_EMULATION=y

已设置。

这是由大多数健全的发行版完成的,包括 Ubuntu 14.04。

32 位仿真当然是唯一可行的,因为 x86-64 处理器被设计为通过内核知道如何使用的 32 位仿真模式向后兼容 32 位可执行文件。

您需要担心的另一件事是库:要编译 32 位程序,您需要 32 位库。在 Ubuntu 14.04 AMD64 上:

sudo apt-get install gcc-multilib

然后我们可以很容易地用 hello world 测试它:

#include <stdio.h>
#include <stdlib.h>

int main() {
    puts("hello world");
    return EXIT_SUCCESS;
}

和:

gcc -m32 hello_world.c
./a.out

哪个打印:

hello world

和:

file a.out

确认它是 32 位的:

ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=358f7969deeb2f24a8dd932a0d296887af4eae30, not stripped
于 2015-09-20T18:49:00.837 回答