Возможно ли запустить сборку 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:

alt text
(источник: 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