For 16-bit programs, the only supported addressing forms are:
[BX+SI]
[BX+DI]
[BP+SI]
[BP+DI]
[SI]
[DI]
[BP]
[BX]
Each of these may include either an 8- or 16-bit constant displacement.
(Source: Intel Developer's Manual volume 2A, page 38)
The problem with the example provided is that bl
and bh
are eight-bit registers and cannot be used as the base pointer. However, if you set bx
to the desired value then inc [di+bx]
(with a suitable size specifier for the pointer) is valid.
As for swapping "the high and low bits of a register," J-16 SDiZ's suggestion of ror bx, 8
is fine for exchanging bl
and bh
(and IIRC, it is the optimal way to do so). However, if you want to exchange bit 0 of (say) bl
with bit 7 of bl
, you'll need more logic than that.