registerSize on X86 confused?

Hi,

In file X86DisassemblerDecoder.c, we have function readPrefixes() with below code:


} else if (insn->mode == MODE_32BIT) {
insn->registerSize = (hasOpSize ? 2 : 4);
insn->addressSize = (hasAdSize ? 2 : 4);
insn->displacementSize = (hasAdSize ? 2 : 4);
insn->immediateSize = (hasOpSize ? 2 : 4);
}

This is confused to me: so we have registerSize to be either 2 or 4 bytes.

But we might have instruction like:

adc al, 0x89

This case we should have registerSize = 1 for AL. So is this a bug, or I am misunderstanding the meaning of this “registerSize” ??

Thank you.

Jun

any help please?

thanks.

I looked at this briefly, I think it causes some mistakes that get reversed later in fixupReg. The disassembler design is a bit of a mess with regards to prefixes and operand size.

I looked at this briefly, I think it causes some mistakes that get
reversed later in fixupReg.

so this is indeed a bug, right?

The disassembler design is a bit of a mess with regards to prefixes and
operand size.

do you mean the bug related to "0x66 0xf2" sequence? any hope to get it
fixed?

thanks,
Jun

I looked at this briefly, I think it causes some mistakes that get
reversed later in fixupReg.

so this is indeed a bug, right?

I can't prove that it causes any bad behavior. Can you?

The disassembler design is a bit of a mess with regards to prefixes and
operand size.

do you mean the bug related to "0x66 0xf2" sequence? any hope to get it
fixed?

It's a pretty fundamental flaw in the disassembler's design. The "repne"
when it gets printed is treated as an instruction itself by the assembly
printer and everything else. With the current design, there's really no way
to get that to emit and to get the 0x66 to bind to the "scas". I would like
to fix it, but I'll need to devote some time to do it that I don't have
right now.