Когда я пишу в реестр, все нормально,MOVQ и 64-разрядные числа
movq $0xffffffffffffffff, %rax
Но я получаю ошибки: Операнд несоответствие размера, когда я пишу в ячейку памяти,
movq $0xffffffffffffffff, -8(%rbp)
Почему в том, что? Я вижу в скомпилированном C-коде, что в asm эти числа разбиты на две и две команды movl.
Возможно, вы можете сообщить мне, где указаны документы и другие инструкции.
@jww: Вы пропустили удаление пупка «спасибо» вместе с другим наполнителем. Если вы собираетесь вообще отредактировать старую запись, обязательно удалите это тоже (https://meta.stackoverflow.com/questions/288160/no-thanks-damn-it). –
'0xffffffffffffffff' представляется в виде расширенного знака imm32 (' -1'). Я думаю, что вы составили этот пример без фактической проверки этой конкретной константы, потому что газовая версия 2.29.1 собирает ее просто отлично; '48 c7 45 f8 ff ff ff movq $ 0xffffffffffffffff, -0x8 (% rbp)' (дизассемблирование из objdump). ** Если высокие 32 бита были не всеми копиями бит 31, они не были бы кодированы с назначением памяти. ** –
И BTW, мнемосхема AT & T для 'mov r64, imm64' является' movabs'. Ассемблеры Intel-синтаксиса выбирают кодировку, основанную на константе, когда вы используете 64-битный регистр. –