Сборка 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.
Это правильно, или я что-то упускаю?