Where the operand shows f, d you can
specify whether the d(estination) for the operation is the file register (F)
(think RAM) or the working register (W) (think Accumulator in 8086,
6502,68xx etc). In a way this doubles up each of these instructions,
so although there are only 35 instructions, each of the fourteen byte
oriented instructions can store its result in the F or W register,
effectively giving you 28 instructions.

Because all the data memory is internal the
RAM works like an extended set of registers on a 'big' CPU. There is no
distinction between instructions that work on CPU registers and instructions
that work on RAM, it's all File Registers.

For example MOVF 0x20, F moves the
contents of the file register at 0x20 back into 0x20, may seem pointless but
in the process it sets the Z(ero) flag in the STATUS register according to
the value in the file register, so you can test for zero without altering
the data in F, or affecting the W register.

You can also do something like RLF 0x20,W
which rotates the contents of 0x20 left 1-bit with the MSB ending up in the
STATUS C(arry) flag, but the actual data in 0x20 isn't changed because the
rotated data ends up in W. You can then do a RLF 0x21,F followed by RLF
0x20,F which performs a 16 bit rotate left with the MSB of the Hi byte being
fed into the LSB of the lo byte.

All the Byte oriented instructions allow
you to specify whether the data is stored back in the File Register or the
Working Register, except the two that explicitly work on the W register (CLRW,
MOVWF). Once you get the hang of this you can do some really trick
code.

There's a bit more to it than that and I
recommend you browse through the Microchip Mid-Range MCU family data
sheet to get the full story, it's a big document, but it's well
sectioned and easy to find what you looking for.