NASM - The Netwide Assembler
NASM Forum => Programming with NASM => Topic started by: nobody on June 09, 2007, 10:31:13 PM
-
Hello nasm people,
I have assembled some code which runs fine, but am at a loss to understand the following excert from the code :
1 [org 0x100]
2 [bits 16]
3 6631DB START: XOR EBX,EBX
4 8CDB MOV BX,DS
5 66C1E304 SHL EBX,4
6 6689D8 MOV EAX,EBX
I understand that the 66-prefix byte is due to using a 32-bit instruction after the [bits-16] command. But why on line 3 is the opcode '31' present when an xor on two 32-bit registers should generate an opcode of '33' ?
Also again on line 6. The opcode for a 32-bit reg-reg mov instruction should generate '8B' and not '89'. Can you enlighten me on this please ?
Regards, steve.
-
> But why on line 3 is the opcode '31' present when an xor on two 32-bit registers should generate an opcode of '33' ?
Why? For registers, the encodings are functionally equivalent:
31/r XOR r/m32,r32
33/r XOR r32,r/m32
i.e., both can encode XOR r32,r32
> The opcode for a 32-bit reg-reg mov instruction should generate '8B' and not '89'.
Why? For registers, the encodings are functionally equivalent:
89/r MOV r/m32,r32
8B/r MOV r32,r/m32
i.e., both can encode MOV r32,r32
Some instructions have a one byte size reduction if you preference the accumulator. I've seen some people complain that NASM doesn't assemble the same byte sequences as other assemblers. Supposedly, someone produced a MASM compatible version. Does anyone know if there any reason, besides compatibility, to prefer '31' over '33', etc?
Rod Pemberton
-
> I've seen some people complain that NASM doesn't assemble
> the same byte sequences as other assemblers.
Those people should use those other assemblers then. :-D
> Does anyone know if there any reason, besides compatibility,
> to prefer '31' over '33', etc?
Aside from watermarking code, there is absolutely none.