длина инструкции сборки 32-битной программы - PullRequest
1 голос
/ 06 февраля 2020

Я создаю простую программу и использую команду file для проверки программы в 32-битном формате. в свою очередь, я использую objdump для дизассемблирования программы и обнаружил, что некоторые инструкции по сборке имеют длину больше 4 байт.

Я ожидаю, что программа имеет 32-битный формат. следовательно, длина этих инструкций по сборке не должна превышать 4 байта. очевидно, я ошибаюсь. не могли бы вы сказать мне, почему он имеет 6-байтовую или 7-байтовую инструкцию по сборке? спасибо.

$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=09aa196a671a6e169f09984360133ad9488f7e53, not stripped
$ objdump -d a.out
a.out:     file format elf32-i386

Disassembly of section .init:

 080482a8 <_init>:
 80482a8:       53                      push   %ebx
 80482a9:       83 ec 08                sub    $0x8,%esp
 80482ac:       e8 8f 00 00 00          call   8048340 <__x86.get_pc_thunk.bx>
 80482b1:       81 c3 4f 1d 00 00       add    $0x1d4f,%ebx
 80482b7:       8b 83 fc ff ff ff       mov    -0x4(%ebx),%eax
 80482bd:       85 c0                   test   %eax,%eax
 80482bf:       74 05                   je     80482c6 <_init+0x1e>
 80482c1:       e8 3a 00 00 00          call   8048300 <__libc_start_main@plt+0x10>
 80482c6:       83 c4 08                add    $0x8,%esp
 80482c9:       5b                      pop    %ebx
 80482ca:       c3                      ret

Ответы [ 2 ]

4 голосов
/ 07 февраля 2020

Почему? Одна очевидная причина заключается в том, что одна инструкция может включать 32-битную немедленную, например mov $address, %register. И поэтому call rel32 может достичь любого 32-битного адреса с текущего адреса.

Этим инструкциям требуется место для кода операции (1 байт), а иногда и байта ModR / M, чтобы указать, какой регистр (ы) / память - это операнды.

Если бы инструкция была ограничена 4 байтами, потребовалось бы несколько инструкций для помещения адреса stati c в регистр, и вы не могли бы использовать его в качестве режима прямой адресации памяти , RIS C ISA обычно требуется 2 инструкции для построения произвольных 32-битных констант (включая адреса) в регистре, например, MIPS lui $t0, high_half / ori $t0, $t0, low_half


x86 - CISC переменной длины ; общие инструкции короткие, но более длинные инструкции возможны вместо того, чтобы заставлять вас создавать адрес или константу в регистре с отдельной инструкцией.

например, вы можете сделать movl $123456, some_static_variable и получить кодировку инструкции с эти компоненты:

mov_opcode (1B)   Mod/RM (1B)    disp32 absolute address (4B)    imm32=123456 (4B)

в общей сложности 10 байтов, включая два 4-байтовых значения. (В справочном руководстве по набору инструкций Intel (том 2 для x86 SDM) это форма MOV mov r/m32, imm32 с режимом адресации [disp32].)

You может сделать его длиннее с помощью префиксов, например префикса переопределения сегмента fs: для локального хранилища потока. И / или режим адресации может включать в себя регистр масштабированного индекса, например movl $123456, array(,%ecx,4), поэтому после ModRM потребуется байт SIB (масштаб / индекс / основание) для кодирования режима адресации.

Вместо mov, мы могли бы использовать add, а затем мы могли бы также использовать префикс lock, чтобы сделать его атомарной c чтение-модифицировать запись.

Жесткое ограничение на длину инструкции 15 байтов. Если декодирование не находит конца инструкции к тому времени, возникает исключение #UD недопустимой инструкции. (Ядро Linux доставит SIGILL в процесс, вызывающий ошибку.)

(Забавный факт: исходный 8086 не имеет ограничений и будет с удовольствием продолжать цикл, пытаясь декодировать весь сегмент 64 КБ, полный префиксов rep )

3 голосов
/ 06 февраля 2020

Длина инструкции не ограничена 32 битами. Со страницы x86 в Википедии:

Архитектура x86 представляет собой переменную длину инструкции, в первую очередь "CIS C".

и

Переменная кодирования (от 1 до 15 байтов)

И из Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32 :

Процессор Intel386 устанавливает ограничение в 15 байтов на длину инструкции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...