NASM - The Netwide Assembler

NASM Forum => Programming with NASM => Topic started by: TomodaMaki on March 18, 2013, 02:44:22 PM

Title: A doubt about "shl" instruction
Post by: TomodaMaki on March 18, 2013, 02:44:22 PM
There are two instructions:

Code: [Select]
shl ax,1
shl ax,2

and then I have assembly the above source file to *.bin file.  then I use ndisasm command to disassembly it. I have got the
below code:

Code: [Select]
D1E0              shl ax,1
C1E002            shl ax,byte 0x2

if the number is equal or bigger than 2. it will add "byte" in front of the number. I don't know why?
Title: Re: A doubt about "shl" instruction
Post by: TightCoderEx on March 18, 2013, 03:41:34 PM
It all comes down to instruction encoding, and that is why we have assemblers like NASM so we don't have to worry about those intricacies.

Even C1 E0 01
Title: Re: A doubt about "shl" instruction
Post by: TomodaMaki on March 18, 2013, 03:55:33 PM
thanks very much . the instruction "shl" means shift to the left by bit. not by byte. why it add byte in front of the number?
Title: Re: A doubt about "shl" instruction
Post by: TightCoderEx on March 18, 2013, 04:17:24 PM
For a lot of instructions there is a particular spot in the opcode that indicates when using 8, 16 or 32 bit operands.  NDISASM simply looks at these bits and even though redundant, as this particular set of instructions will only use an 8 bit value, byte is prepended.  As an example

Code: [Select]
        mov     byte [ Next_Index], 41

is required, otherwise the assembler doesn't know what type of data Next_Index is pointing to. Whereas;

Code: [Select]
       mov     [ Next_Index], al

isn't, because assembler knows AL is 8 bits

MASM you'd have to use;

Code: [Select]
     mov     byte ptr [ Next_Index], 41


Title: Re: A doubt about "shl" instruction
Post by: Frank Kotler on March 18, 2013, 05:19:36 PM
There are actually a bunch of "shl"s.

http://home.myfairpoint.net/fbkotler/nasmdocc.html#section-A.4.290

The variety with a specific second operand of 1, and with cl as a second operand, have been with us since the 8086. The variety with a "byte" operand wasn't introduced until the 80186 (for practical purposes, 286 - there weren't many 186's made). So it's a completely different instruction.

Note that "shl" and "sal" are the same instruction, but that "shr" and "sar" are different - the latter being for signed numbers...

As TightCoderEx points out, we can mostly trust Nasm to do the right thing (or one of 'em)... and not worry too much about what Ndisasm says. Sharp eyes to have spotted that difference!

Best,
Frank