# Bit Fields tutorial

In this tutorial, you will learn how to enhance disassembly output by using bitfields.

Suppose the source code looked like this:

```

// 'flags' parameter is combination of the following bits:
// (don't use OOF_SIGNMASK and OOF_WIDTHMASK, they are for the kernel)

#define OOF_SIGNMASK    0x0003      // sign output:
#define   OOFS_IFSIGN   0x0000      //   output sign if needed
#define   OOFS_NOSIGN   0x0001      //   should not out sign     ()
#define   OOFS_NEEDSIGN 0x0002      //   always out sign         (+-)
#define OOF_SIGNED      0x0004      // output as signed if 


int m65_opflags(const op_t &x)
{
  switch ( x.type )
  {
    case o_displ:
      return OOF_ADDR|OOFS_NOSIGN|OOFW_16;
    case o_near:
    case o_mem:
      return OOF_ADDR|OOF_NUMBER|OOFS_NOSIGN|OOFW_16|OOF_ZSTROFF;
    default:
      return 0;
  }
}
```

We have a disassembly that looks like this:

![](https://3899235193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd4yKxBBBv1qcoSuL2US4%2Fuploads%2Fgit-blob-1ebb0d68a992e8d62ccbf19de6e9ebd6f16d8752%2FBefore.gif?alt=media)

Let’s improve it by using bitfields.

1. We first define a bitfield type by going to the Local types window (menu Open subviews -> Local types). We press <kbd>Ins</kbd> to add a new enum and make it a bitfield. The name given to the bitfield does not matter much.

![](https://3899235193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd4yKxBBBv1qcoSuL2US4%2Fuploads%2Fgit-blob-959380a460c74ecb3118b7fd921a95f6117dc9e7%2FCreateBitfieldenum.gif?alt=media)

Note that **Bitmask** has been checked. Click OK.

2. Then we edit the enum and update it using the C syntax tab as shown in the screenshot below.

![](https://3899235193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd4yKxBBBv1qcoSuL2US4%2Fuploads%2Fgit-blob-4071251516c97743b44256008bd5529ef7708299%2FDefine1.gif?alt=media)

Click OK.

The first bitfield mask is 3 (or 2 bits). The name of the mask is not used by IDA, it is intended as a memory helper. The enum definition becomes:

![](https://3899235193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd4yKxBBBv1qcoSuL2US4%2Fuploads%2Fgit-blob-84ba6a39029fe718c64455031e2c7241f12751fb%2FDefined.gif?alt=media)

3. We finally switch to the disassembly window. Through the Edit -> Operand types -> Enum member menu (or by pressing <kbd>M</kbd> on the second operand at addresses 0x130003E39 and 0x130003E40) we select the enum type we just defined and get this result…

![](https://3899235193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd4yKxBBBv1qcoSuL2US4%2Fuploads%2Fgit-blob-88504af08b8b46bb193ea4ce5f8704539c822c8e%2Fafter-1.gif?alt=media)

That’s all folks!
