2013-10-25 3 views
0

Когда я пишу в реестр, все нормально,MOVQ и 64-разрядные числа

movq $0xffffffffffffffff, %rax 

Но я получаю ошибки: Операнд несоответствие размера, когда я пишу в ячейку памяти,

movq $0xffffffffffffffff, -8(%rbp) 

Почему в том, что? Я вижу в скомпилированном C-коде, что в asm эти числа разбиты на две и две команды movl.

Возможно, вы можете сообщить мне, где указаны документы и другие инструкции.

+1

@jww: Вы пропустили удаление пупка «спасибо» вместе с другим наполнителем. Если вы собираетесь вообще отредактировать старую запись, обязательно удалите это тоже (https://meta.stackoverflow.com/questions/288160/no-thanks-damn-it). –

+0

'0xffffffffffffffff' представляется в виде расширенного знака imm32 (' -1'). Я думаю, что вы составили этот пример без фактической проверки этой конкретной константы, потому что газовая версия 2.29.1 собирает ее просто отлично; '48 c7 45 f8 ff ff ff movq $ 0xffffffffffffffff, -0x8 (% rbp)' (дизассемблирование из objdump). ** Если высокие 32 бита были не всеми копиями бит 31, они не были бы кодированы с назначением памяти. ** –

+0

И BTW, мнемосхема AT & T для 'mov r64, imm64' является' movabs'. Ассемблеры Intel-синтаксиса выбирают кодировку, основанную на константе, когда вы используете 64-битный регистр. –

ответ

3

Why is that?

Поскольку MOV r64, imm64 является действительной инструкцией x86, но MOV r/m64, imm64 нет (нет кодирования для него).


I see in compiled C code that in asm these numbers are split in two and two movl instructions show up.

MOV r/m64, imm32 является действительной инструкцией x86, поэтому вы видите два из них используются для хранения 64-битовых непосредственного а к памяти.


Maybe you can tell me where the mowq and other instructions are documented

В Intel's Software Developer Manuals.

+0

Спасибо, но какова логика, что этой инструкции нет? – ericj

+0

Intel не думала, что такая инструкция будет очень полезна, поэтому они решили не тратить на нее скудную инструкцию кодирования. – markgz

+1

@markgz: AMD разработала расширения ISA x86-64, а не Intel. Но да, они решили, что большинство 64-битных инструкций будут по-прежнему использовать 32-битные непосредственные (расширенные знаки), поскольку большие константы встречаются редко (а 64-разрядные адреса обычно обрабатываются RIP-относительным LEA). Но да, версия REX.W = 1 из 5-байтового специального кодирования 'mov r32, imm32' (с номером регистра в байтах операций) становится' mov r64, imm64', а REX.W = 1 'mov r/m32, imm32' становится 'mov r/m64, sign_extended_imm32'. Уже было два разных кода операций, которые могли сразу перемещаться в регистр, поэтому AMD воспользовалась преимуществами. –