2013-06-27 4 views
1

код сборкиже инструкция x86 сборка отличается от NASM и GAS

mov eax, 0x3a14a5 
jmp eax 

ГАЗ производит опкода

0xB8, 0xA5, 0x14, 0x3A, 0x00 
0xFF, 0xE0 

в то время как NASM производит и опкода

0x66, 0xB8, 0xA5, 0x14, 0x3A, 0x00 
0x66, 0xFF, 0xE0 

Так вы см. NASM, предварительно предваряет код 0x66 перед кодом. В моей программе (о которой я не буду вдаваться в подробности) код операции GAS работает правильно, а код NASM вызывает сбои, указывающие, что эти два кода операций не равны. Почему NASM предугадывает 0x66 и как я могу избавиться от него?

обновление: bits 32 директива работала. Спасибо за быстрый ответ, ссылки и объяснения!

ответ

3

Поместите директиву bits 32 в начале файла сборки, и NASM должен сгенерировать для этой инструкции тот же машинный код, что и GAS.

Более подробная информация в the NASM manual:

В BITS 32 режима ... 32-разрядные команды не требуют никаких префиксов, в то время как инструкции, использующих 16-разрядных данные нуждаются в 0x66 и тех, кто работает на 16-битные адреса нужно 0x67.

3

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html:

кодов, O16 и O32 показывают, что данная форма инструкции должны быть собраны с размером операнда 16 или 32 бита. Другими словами, o16 указывает префикс 66 в состоянии BITS 32, но не генерирует код в состоянии BITS 16; и O32 указывает на 66 префикс в BITS 16, но состояние не создает ничего в битах 32

MOV кодирования инструкция:

МОВ reg32, imm32; o32 B8 + R ID

Так вы, видимо, в бит 16 режиме. Попробуйте добавить файл с флагом бит, например.