Я пытаюсь добавить некоторые значения в ассемблер (синтаксис 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 бит).
Кроме того (не предназначен для каламбур), что сказал Шут; есть форма 'MOV', которая загружает 64-разрядную оперативную версию в 64-разрядный GPR. Поэтому вы можете использовать это, чтобы сначала загрузить немедленно в другой GPR, а затем добавить этот GPR в 'r10'. – Michael
единственной инструкцией, которая принимает 64-битное мгновенное сообщение, является 'movabs' –