Можно ли запустить сборку x86 в операционной системе x64? - PullRequest
10 голосов
/ 24 января 2010

Недавно я решил, что стоит попробовать базовую сборку x86, чтобы было легче отлаживать программы и т. Д., И т. Д. Итак, я начал (около недели назад) изучать сборку x86, за это время я обновил мой компьютер на 8 ГБ оперативной памяти, так что, очевидно, моя установка Windows XP x86 тратит впустую всю эту память, теперь я использую копию Windows 7 x64, поэтому вопрос:

Можно ли работать с сборкой x86 в операционной системе x64? Будет ли она работать должным образом в эмуляторе? Или я должен изучить сборку x64?

Ответы [ 3 ]

18 голосов
/ 24 января 2010

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

12 голосов
/ 24 января 2010

Да, конечно. Большинство программ по-прежнему 32-разрядные и отлично работают на 64-разрядных системах Windows. Эти программы являются машинным языком, который имеет взаимно-однозначное сопоставление со сборкой (и может быть легко разобран в код сборки x86).

1 голос

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

Тогда мы можем легко проверить это с привет миром:

#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
...