x86_64 Невозможно добавить 64-битное значение в rax, "несоответствие операнда при 'add'" - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь собрать некоторый 64-битный код, и сборка завершается неудачно в строке:

addq $0xffffff7fc0005000, %rax

с ошибкой:

Ошибка несоответствия типа операнда для `add'

Первый операнд - это 64-битное значение, а последний - регистр, который должен хорошо сработать. Этой инструкции предшествует псевдооперация .code64. Я собираюсь с

x86_64-elf-as test.s -o test.o --64

Что касается самого ассемблера, то при вызове с --version он возвращает:

GNU assembler (GNU Binutils) 2.32
Copyright (C) 2019 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `x86_64-elf'.

1 Ответ

4 голосов
/ 06 октября 2019

Первый операнд - это 64-битное значение, а последний - регистр, который должен нормально собираться.

Не должно быть, 64-битная версия add может принимать 8-битный или 32-битныйнемедленное расширение с расширенным знаком, но не 64-битное немедленное, что обычно редко встречается в x64. Это можно проверить, посмотрев в Руководстве разработчика программного обеспечения Intel или в других местах, таких как эта онлайн-копия леммы ADD .

. Вы можете mov (или movabs какGAS любит называть этот вариант) 64-битным непосредственно в регистр, а затем использовать его или поместить значение в память и использовать его в add с операндом памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...