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