为什么 nasm 和 yasm 为 mov r16, word [r64 - 3] 指令产生 67 个操作码?
Why nasm and yasm yield 67 opcode for mov r16, word [r64 - 3] instruction?
在 x86-64 程序集中,我有以下说明
mov dx, word [esi-5]
Nasm 2.13.03
生成:
66 67 8B 56 FB
yasm 1.3.0
生成:
67 66 8B 56 FB
66 67
操作码是修饰符,因此 8B 56 FB
本身就是:
mov edx, dword [rsi-5]
我注意到:
66 8B 56 FB
也计算为:
mov dx, word [rsi-5]
我有两个问题:
1) 为什么 nasm
& yasm
发出这个 67
操作码字节填充? (67
本身不足以将 edx
减少到 dx
,它需要包括 66
)
2) 有没有办法在 nasm / yasm 中发出更短的 4 字节指令 without 67
?
题目做出假假设66 8B 56 FB
mov dx, word [rsi-5]
相当于
`66 67 8B 56 FB` or `67 66 8B 56 FB`
mov dx, word [esi-5]
66
将 edx
减少为 dx
67
将 [rsi-5]
减少到 [esi-5]
在 x86-64 程序集中,我有以下说明
mov dx, word [esi-5]
Nasm 2.13.03
生成:
66 67 8B 56 FB
yasm 1.3.0
生成:
67 66 8B 56 FB
66 67
操作码是修饰符,因此 8B 56 FB
本身就是:
mov edx, dword [rsi-5]
我注意到:
66 8B 56 FB
也计算为:
mov dx, word [rsi-5]
我有两个问题:
1) 为什么 nasm
& yasm
发出这个 67
操作码字节填充? (67
本身不足以将 edx
减少到 dx
,它需要包括 66
)
2) 有没有办法在 nasm / yasm 中发出更短的 4 字节指令 without 67
?
题目做出假假设66 8B 56 FB
mov dx, word [rsi-5]
相当于
`66 67 8B 56 FB` or `67 66 8B 56 FB`
mov dx, word [esi-5]
66
将 edx
减少为 dx
67
将 [rsi-5]
减少到 [esi-5]