?) Я уверен, что это сложно в том смысле, о котором мы понятия не имеем.

прочтенияэтот ответ переполнения стека, а такжеэтот документЯ до сих пор не понимаю разницу между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?

Я что-то пропустил?

Ответы на вопрос(1)

Ваш ответ на вопрос