On Wed, Apr 26, 2017 at 01:44:43PM -0700, Ricardo Neri wrote:
I regard that the role of this function is to obtain the the segment selector from either of the prefixes or inferred from the operands. It is the role of caller to determine if the segment selector should be ignored.
No, this is wrong. The function is called resolve_seg_selector() and it gives you the segment selector. CS, DS, ES, and SS in 64-bit mode are treated as null segments and your function should return/signal exactly that, i.e, saying that those should be ignored in that case.
I double-checked the latest version of the Intel Software Development manual [2], in the table 3-5 in section 3.7.4 mentions that DS is default segment for all data references, except string destinations. I tested this code with the UMIP-protected instructions and whenever I use %edi the default segment is %ds.
Yes, all correct. Except that we're adding a more-or-less generic x86 insn decoder so we should make it so...
Is this example valid? The documentation of MOVS specifies that it always moves DS:(E)SI to ES:(E)DI.
... that the decoder should do exactly that:
if (MOVS and rDI) return SEG_ES;
And you're handing in struct insn * so you can easily check which insn you're looking at.
Thanks.