Сборка x86 - mov и movzx из dword в qword?

Я тестирую следующий код:

.intel_syntax noprefix

.data
.Ltest_data:
    .byte 0xEF, 0xBE, 0xAD, 0xDE, 0xBE, 0xBA, 0xED, 0xFE

.text
...
    movzx rax, BYTE PTR[.Ltest_data]  # 0xEF
    movzx rax, WORD PTR[.Ltest_data]  # 0xBEEF
    movsx rax, DWORD PTR[.Ltest_data] # 0xFFFFDEADBEEF (sign-extension)
    mov   rax, QWORD PTR[.Ltest_data] # 0xFEEDBABEDEADBEEF

    # These don't work:
    # mov rax, DWORD PTR[.Ltest_data]
    # movzx rax, DWORD PTR[.Ltest_data]
...

Глядя на руководство Intel, кажется, что нет возможности использовать mov/movzxпереместить двойное слово в двойное слово; единственный способ, который я вижу, это использоватьmovsxи замаскируйте верхние 32 бита. Это удивительно, учитывая безумное количество инструкций, доступных для x86_64.

Это правильно, или я что-то упускаю?

0 ответов

Другие вопросы по тегам