2016-08-27 9 views
2

я нахожусь в данный момент изучает код сборки скомпилированные из простых программ С с использованием objdump, но это меня смущает:приставной Инструкция по монтажу с использованием байт вместо длинного

4004f1:  c7 45 fc 02 00 00 00 movl $0x2,-0x4(%rbp) 
4004f8:  83 45 fc 05    addl $0x5,-0x4(%rbp) 

ли не «л» префикс в инструкции долго стоят, для movl он выглядит отлично, но addl, кажется, использует один байт для операнда, почему это?

+2

Инструкция была закодирована как [ADD г/m32, imm8] (http://www.felixcloutier.com/x86/ADD .html). Поскольку 5 байт в байте, ассемблер решил его кодировать таким образом. Значение 5 получает знак, расширенный до 32 бит и сохраняемый в месте назначения. –

+0

Сохранено = добавлено oops. –

ответ

4

Многие инструкции, которые работают на непосредственных пользователях, могут иметь либо 8-битный немедленный, либо 32-разрядный немедленный (mov r/m32,i32 особо не относится). Цель этого проекта, вероятно, уменьшит размер кода. Тем не менее, немедленное расширение неявно расшифровывается до 32 бит. В случае add код операции 83 /0 - add с 8-битным непосредственным операционным кодом 81 /0 - add с 32-битным немедленным. Ваш ассемблер должен автоматически выбрать кратчайшую кодировку. Вы можете собрать этот небольшой фрагмент кода, а затем разобрать результат наблюдать разницу:

.byte 0x83,0xc0,0x00 # addl $0,%eax with an 8 bit immediate 
.byte 0x81,0xc0,0x00,0x00,0x00,0x00 # addl $0,%eax with a 32 bit immediate 
+0

См. Http://www.felixcloutier.com/x86/ADD.html для доступных кодировок 'add'. –

+0

@PeterCordes Я обычно смотрю в [этот] (http://ref.x86asm.net/geek32-abc.html#A). Меньше шума, более компактная информация. – fuz

+1

Это хорошо, если вы просто заботитесь о кодировании. Однако я забыл, что у него есть столбцы для измененных/неопределенных флагов. Это одна из основных причин поиска инструкций. Но в любом случае, часто я хочу дважды проверить детали раздела Operation (для более сложных инструкций). Кроме того, HTML-выдержки из руководства Intel полезны для связи с другими людьми, которые, возможно, не знакомы с тем, насколько хороши/подробно описаны руководства Intel. –