【发布时间】:2016-10-23 08:51:12
【问题描述】:
我的问题涉及 RETurn 指令在 64 位模式 及其操作数大小,它指定从堆栈弹出多少信息到 RIP 以及 RSP 递增多少字节由。
我注意到一些汇编程序保留了 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 ?
-
你的程序是汇编程序?我认为这并不重要,真的没有任何理由在 64 位代码中编写远回报。 RETF 也不是正式的指令,所以如果你记录它,你可以做任何你想做的事情。
-
@RossRidge 是的,我发生的一个原因是编写中断处理程序、调用门等。助记符 RETF 正式记录在 AMD 程序员手册第 3 卷第 280 页。support.amd.com/TechDocs/24594.pdf
-
英特尔只是将 RET 用于远近回报。没有人调用门等代码......并且中断处理程序使用 IRET。
标签: assembly x86 64-bit nasm x86-64