2014-05-20 2 views
3

Я пытаюсь добавить некоторые значения в ассемблер (синтаксис AMD AT & T). Но у меня проблемы с большими непосредственными значениями (> 32 бит).addq с 64 бит сразу?

.globl f 
    .type f, @function 
f: 
    movq %rdi, %r10 
    addq $0x0000000000000008, %r10 # no problem 
    addq $0x0000000122446688, %r10 # error 
    movq %r10, %rax 
    ret 

Выделенная линия возвращает следующий GCC-ошибка:

Error: operand type mismatch for `add'

Но addq должен быть в состоянии обрабатывать этот номер:

0000000122446688 (HEX) = 4869875336 (разл)

и log2 (4869875336) ~ 33 бит (что намного меньше 64 бит).

+0

Кроме того (не предназначен для каламбур), что сказал Шут; есть форма 'MOV', которая загружает 64-разрядную оперативную версию в 64-разрядный GPR. Поэтому вы можете использовать это, чтобы сначала загрузить немедленно в другой GPR, а затем добавить этот GPR в 'r10'. – Michael

+2

единственной инструкцией, которая принимает 64-битное мгновенное сообщение, является 'movabs' –

ответ

9

ADD не принимает 64-битную оперативную информацию, существует только версия, которая принимает 32-битный знак расширенного, а вторая константа не соответствует этому ограничению. См. Ссылку на набор инструкций.

Примечание: суффикс q указывает размер операции, а не размер немедленного. Это 64-битное дополнение, но операнд кодируется как 8 или 32-битный расширенный знак.