2013-11-19 1 views
-2

У меня есть 32-битный ассемблерный код, который я написал. Очень просто.Должен ли весь код, скомпилированный для 32-битных машин, быть в 4 байтовых кусках?

movl $0x542412e6, %eax 
movl %ebp , %edx 
addl $0x30, %edx 
movl %edx, %ebp 
pushl 0x08048dd6 
ret 

Когда я запускаю эту команду:

gcc -m32 -c e.s 

Я получаю следующие 18 байт.

0: b8 e6 12 24 54   mov $0x542412e6,%eax 
5: 89 ea     mov %ebp,%edx 
7: 83 c2 30    add $0x30,%edx 
a: 89 d5     mov %edx,%ebp 
c: 68 d6 8d 04 08   push $0x8048dd6 
11: c3      ret 

Почему код объекта 18 байтов, а не 20 или 16? Разве это не должно быть 4 байта слов для 32-битной машины?

+3

Нет. Код должен находиться на границах, определенных архитектурой. Это может иметь некоторое отношение к «размеру слова» машины, но отношения редко бывают сильными. (И, в частности, набор инструкций x86 имеет свое наследие в 8 и 16-разрядных машинах, и есть некоторая степень совместимости в прямом/обратном направлении.) –

+0

@chux удалил его. –

ответ

1

Размер инструкции не, связанный с размером данных или адресом. Некоторые 16-разрядные процессоры x86 имеют 3 совершенно разных размера с 8-битной шиной данных, 20-битной адресной шиной и переменной длины переменной. Современные 32-разрядные или 64-разрядные x86 также имеют инструкцию переменной длины для обратной совместимости. Просто посмотрите на строку movl $0x542412e6, %eax и pushl 0x08048dd6, и вы увидите, что невозможно закодировать 32-битные мгновенные данные, код операции и регистр в 32 бит. Если в архитектуре используется 32-разрядная команда с фиксированной длиной, она должна использовать несколько инструкций или литеральный пул для загрузки 32-разрядной константы.

RISC-архитектура часто имеет фиксированную длину инструкцию для компромисса между кодом плотностью и декодером простотой. Но существуют 32-битные архитектуры RISC с размером команд, отличным от 32-битного, например MIPS16e или ARM thumb v1, которые имеют 16-разрядные инструкции. В то время как ARM thumb2 и dalvikVM имеют инструкцию переменной длины. Современные 64-битные архитектуры RISC также не будут иметь размер 64-разрядной команды, но довольно часто придерживаются 32-битного размера

0

x86 не имеет фиксированных инструкций длины и не требует выравнивания. Архитектуре необходимо, чтобы ее команды соответствовали определенному смещению. Это связано с тем, что процесс x86 требует гораздо больше логики для декодирования инструкций, которые RISC-процессоры.

В настоящее время большинство архитектур RISC имеют инструкции по фиксированной длине и будут отклонены.

+0

Большинство машин RISC, с которыми я знаком, имеют как 16, так и 32-разрядные инструкции. В том числе мать всех их - IBM 801. –

+0

Оригинальные машины RISC были устройствами, такими как машины серии IBM 7000 с простыми регистрами и простыми форматами команд. Эти машины были 36 бит. См. Http://en.wikipedia.org/wiki/IBM_7090 –

Смежные вопросы