我的问题涉及RET在64位模式和它们的操作数大小,它指定有多少信息从堆栈弹出到RIP以及RSP增加了多少字节的指令。RET默认的操作数大小是多少?
我注意到一些汇编程序留下了Intel定义的默认操作数大小。即近返回64位,远远回32位:
1 ; Assembled with NASM 2.12 command "nasm TestRET.asm -l TestRET.lst"
2 BITS 64
3 00000000 66CF IRETW ; Opsize 16.
4 00000002 CF IRETD ; Opsize 32.
5 00000003 48CF IRETQ ; Opsize 64.
6 00000005 66CF o16 IRET ; Opsize 16.
7 00000007 CF o32 IRET ; Opsize 32.
8 00000008 48CF o64 IRET ; Opsize 64.
9 0000000A CF IRET ; Opsize 32, default.
10
11 0000000B 66CB o16 RETF ; Opsize 16.
12 0000000D CB o32 RETF ; Opsize 32.
13 0000000E 48CB o64 RETF ; Opsize 64.
14 00000010 CB RETF ; Opsize 32, default.
15
16 00000011 66C3 o16 RETN ; Opsize 16.
17 00000013 C3 o32 RETN ; Opsize 32 should not be available, NASM error?
18 00000014 48C3 o64 RETN ; Opsize 64, REX.W ignored as RETN is promoted to 64 bits.
19 00000016 C3 RETN ; Opsize 64, default.
我不是在写呼叫门和任务门经历,但我认为默认的操作数的大小应与段大小,这是64对应在64位模式下。
程序员在没有进一步规范的情况下使用IRET,RETF和RETN时,希望从64位模式的汇编程序得到什么操作数大小?
谁知道?我怀疑有人做过调查。你真正的问题是什么? –
@RossRidge我的程序是否应该将RETF转换为CB或48CB? – vitsoft
你的程序是汇编程序?我认为它不会太重要,实际上没有任何理由在64位代码中编写远程返回。此外,RETF不是正式的指令,所以如果你记录它,你可以做任何你想做的事情。 –