?) Я уверен, что это сложно в том смысле, о котором мы понятия не имеем.
прочтенияэтот ответ переполнения стека, а такжеэтот документЯ до сих пор не понимаю разницу междуmovq
а такжеmovabsq
.
Мое нынешнее понимание заключается в том, что вmovabsq
первый операнд является 64-битным непосредственным операндом, тогда какmovq
знак расширяет 32-битный непосредственный операнд. Из второго документа, упомянутого выше:
Перемещение непосредственных данных в 64-битный регистр может быть сделано либо с помощьюmovq
инструкция, которая будет подписывать расширение 32-битного непосредственного значения или сmovabsq
инструкция, когда требуется полная 64-битная немедленная.
В первом упоминании Петр утверждает:
Интересный эксперимент:movq $0xFFFFFFFF, %rax
вероятно, не кодируется, потому что он не может быть представлен 32-битным немедленным расширением знака и нуждается в кодировке imm64 или%eax
кодировка назначения.
Тем не менее, когда я собираю / запускаю это, кажется, работает нормально:
.section .rodata
str:
.string "0x%lx\n"
.text
.globl main
main:
pushq %rbp
movq %rsp, %rbp
movl $str, %edi
movq $0xFFFFFFFF, %rsi
xorl %eax, %eax
call printf
xorl %eax, %eax
popq %rbp
ret
$ clang file.s -o file && ./file
печать0xffffffff
, (Это работает аналогично для больших значений, например, если вы добавите несколько дополнительных «F»).movabsq
генерирует идентичный вывод.
Clang выводит, что я хочу? Если это так, есть ли ещеmovabsq
надmovq
?
Я что-то пропустил?