我的問題涉及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不是正式的指令,所以如果你記錄它,你可以做任何你想做的事情。 –