Assembly 针对intel x64 arch的Rex前缀解码

Assembly 针对intel x64 arch的Rex前缀解码,assembly,x86-64,intel,opcode,machine-code,Assembly,X86 64,Intel,Opcode,Machine Code,在英特尔文档中,表2-4显示了REX前缀位的重要性 有人能给我解释一下当W=0时如何解释吗?上面说0=由CS.D决定的操作数大小,但我不明白CS.D的意思 CS.D表示与当前代码段关联的段描述符的“默认操作大小”字段。这控制地址和操作数的默认大小,可以设置为默认为16位或32位操作数大小 在64位又称长模式(CS.L=1)中,CS.D=32位的唯一有效设置是,因此清除W位的REX前缀将默认操作数大小保留为32位。(操作数大小前缀可以将操作数大小覆盖到16位) 长模式下的默认地址大小为64位(指令

在英特尔文档中,表2-4显示了REX前缀位的重要性


有人能给我解释一下当W=0时如何解释吗?上面说
0=由CS.D决定的操作数大小,但我不明白
CS.D
的意思

CS.D
表示与当前代码段关联的段描述符的“默认操作大小”字段。这控制地址和操作数的默认大小,可以设置为默认为16位或32位操作数大小

在64位又称长模式(CS.L=1)中,CS.D=32位的唯一有效设置是,因此清除W位的REX前缀将默认操作数大小保留为32位。(操作数大小前缀可以将操作数大小覆盖到16位)

长模式下的默认地址大小为64位(指令上的地址大小前缀将其覆盖为32位)


段描述符在第3A卷-系统编程指南第1部分第3.4.5章段描述符中有详细描述


D
字段的影响也在第1卷-基本体系结构,第3.6章操作数大小和地址大小属性中讨论

参见第3A卷,段描述符。在本例中,它表示当前代码段的“默认操作大小”,即16、32或64位。@d为什么不回答这个问题?谢谢。竖起大拇指。不知道CS包含默认地址和操作数大小。将CS.D设置为32或16位大小有什么意义?@mathk:你不能,除了16位保护模式。(不是16位实模式;16位保护模式。是的,这是一个问题,没有人使用它。)但这与现有的REX前缀不兼容:0x40..4f仅在64位长模式下解码为REX前缀,设置了CS.L和CS.D。设置CS.L但清除CS.D是无效的;这个组合是保留的。@Peter,在长模式下D必须是0。@prl:crap,我认为D=1意味着32位。在我对答案的编辑中,我只是说CS.D=32位,这试图回避如何编码的问题。有/没有CS.L套件的意思是一样的吗?(我没有打开PDF,也记不起来了。)L=0,D=0是16位;L=0,D=1为32位;L=1,D=0为64位;L=1,D=1是保留的(128位?)@彼得