Возможно ли запустить сборку x86 в операционной системе x64?
Недавно я решил, что стоит попробовать создать базовую сборку x86, чтобы было легче отлаживать программы и т.д. Итак, я начал (примерно неделю назад) обучение сборке x86, в то время я обновил мой компьютер до 8 ГБ оперативной памяти, так что obviusly моя установка x86 Windows XP расходует всю эту память, теперь я запускаю копию x64 для Windows 7, поэтому вопрос:
Возможно ли работать с сборкой x86 в операционной системе x64? Будет ли она работать правильно в эмуляторе? Или я должен изучить сборку x64?
Ответы
Ответ 1
Да, конечно. Большинство программ по-прежнему 32 бит и отлично работают в 64-битных системах Windows. Эти программы являются машинным языком, который имеет сопоставление "один к одному" с сборкой (и его можно легко разобрать в ассемблерный код x86).
Ответ 2
Можно ли работать со сборкой x86 в операционной системе x64? Будет ли он нормально работать в эмуляторе?
Да, это возможно, и он будет работать правильно. Архитектура набора команд всегда обратно совместима.
Регистрируется в x86-64:
(источник: usenix.org)
Например: Здесь вы можете видеть, что rax
- это новый 64 регистр общего назначения, но вы все равно можете использовать eax
поскольку он относится к младшим 32 битам rax
.
Или я должен изучить сборку x64?
Архитектура x86-32 является подмножеством архитектуры x86-64. Это как сначала вы изучили x86, а затем идите и узнаете, что нового в сборке x86-64. Как только вы изучите x86 asm. Тогда это будет полезный ресурс: http://www.cs.cmu.edu/~fp/courses/15213-s06/misc/asm64-handout.pdf
Ответ 3
Я хотел бы немного поработать над этим вопросом (кажется довольно уместным и не увлекается этим): в мире есть много ресурсов для x86-32. Похоже, что между 32/64 на уровне сборки не так много различий. Учитывая богатство 32 материалов, стоит ли выкидывать 64 ресурса и на самом деле просто сосредоточиться на 64 на данный момент (если кто-то хочет учиться 64), или, поскольку он (по крайней мере, кажется), что важный концептуальный материал - все в 32 и только такие вещи, как 64-битные регистры, действительно важны, что он просто отлично ограничивает себя до 32 для просто случайных образовательных целей.
Другими словами, существуют ли существенные различия в установках, которые существенно отличались бы в 64 против 32?
Ответ 4
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:
#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