最近我决定值得尝试基本的 x86 汇编,以便更容易调试程序等。所以我(大约一周前)开始学习 x86 汇编,在那段时间,我将我的电脑升级到8GB 内存,很明显我的 x86 Windows XP 安装浪费了所有内存,现在,我正在运行 x64 Windows 7 副本,所以问题是:
是否可以在 x64 操作系统上使用 x86 程序集?它会在模拟器中正常运行吗?还是我应该学习 x64 汇编?
最近我决定值得尝试基本的 x86 汇编,以便更容易调试程序等。所以我(大约一周前)开始学习 x86 汇编,在那段时间,我将我的电脑升级到8GB 内存,很明显我的 x86 Windows XP 安装浪费了所有内存,现在,我正在运行 x64 Windows 7 副本,所以问题是:
是否可以在 x64 操作系统上使用 x86 程序集?它会在模拟器中正常运行吗?还是我应该学习 x64 汇编?
是否可以在 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
是的当然。大多数程序仍然是 32 位的,并且在 64 位 Windows 系统上运行良好。这些程序是机器语言,它与汇编具有一对一的映射关系(并且可以很容易地反汇编成 x86 汇编代码)。
如果编译选项,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