最近我决定尝试基本的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
的低32位。
还是我应该学习x64汇编语言?
x86-32架构是x86-64的子集。就像您先学习x86,然后再去了解x86-64汇编语言中的新内容。 一旦您学会了x86汇编语言,那么这将是一个有用的资源:http://www.cs.cmu.edu/~fp/courses/15213-s06/misc/asm64-handout.pdf
r
代表寄存器。 e
代表扩展。如果你去其他的 ISAs,你会发现像 r1、r2、r3 这样的寄存器名称。 - claws是的,当然可以。大多数程序仍然是32位的,并且在64位Windows系统上运行良好。这些程序是机器语言编写的,具有与汇编语言一一对应的映射关系(并且可以轻松地反汇编为x86汇编代码)。
如果编译选项为:
Linux 明确实现了 32 位支持。
请注意保留 HTML 标签。
CONFIG_IA32_EMULATION=y
已设置。
大多数合理的发行版都会这样做,包括Ubuntu 14.04。
32位模拟当然是可能的,因为x86-64处理器设计成向后兼容32位可执行文件,通过32位模拟模式,内核知道如何使用。
另一件你需要担心的事情是库:要编译32位程序,你需要32位库。在Ubuntu 14.04 AMD64上:
sudo apt-get install gcc-multilib
#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
CONFIG_IA32_EMULATION=n
的Linux。它无法运行32位二进制文件或64位代码中的32位int 0x80
系统调用(首先没有人应该这样做,但新手编写的汇编代码有时会这样做)。 - Peter Cordes