我正在测试以下代码:
.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]
...
查看英特尔手册,似乎没有办法使用mov
/movzx
将 dword 移动到 qword;我看到的唯一方法是使用movsx
和屏蔽前 32 位。这是令人惊讶的,提供了可用于 x86_64 的大量指令。
这是正确的,还是我错过了什么?