3.6 KiB
Section 2 / Bit Fields / Review of Newly Described Instructions
Overview
Our discussion of implementing ourselves what the C / C++ compiler gives us led us to use six new instructions. This chapter reviews those instructions.
and
The and instruction is pretty much what you would expect. It implements
the & operator from C and C++. That is, the bitwise and operator.
The and instruction comes in a number of flavors
and Immediate
This is the form of the instruction we used.
and rd, rs, imm
This performs a bitwise and of the imm value with the source register
rs placing the result in the destination register rd.
There are limits to the bit width of imm because it has to fit within
the and instruction. If you exceed the allowable width of imm, the
assembler will be glad to insult you.
It is possible that a mov
instruction will allow your immediate value. You'd follow up with an
and using a register than an immediate value.
If your immediate value is too large for a mov then put the value
in RAM and ldr it into a register and proceed.
We would love to tell you what the rules are for an immediate value in
the and instruction, but they are not obvious and in fact are very
complex. Our advice, try the immediate value you have in mind and if
it works, great. Otherwise, see above.
A slight variation on this and instruction uses a register where
the preceding one uses an immediate value.
and rd, rs, rm
This ands rm to rs and places the result in rd.
This instruction has a variation:
and rd, rs, rm, *shift* num_bits
*shift* can be one of lsl, lsr, asr or ror.
These mean:
*shift* |
Meaning | Meaning of the Meaning |
|---|---|---|
lsl |
logical shift left | shifts left introducing zeros on the right |
lsr |
logical shift right | shifts right introducing zeros on the left |
asr |
arithmetic shift right | shifts right introducing duplicates of the previous most significant bit |
ror |
rotate right | shifts right introducing the bits shifted out back in from the left |
There are other two similar and instructions. These are the immediate and
the register versions of ands. ands is the same as and with the addition
that the CPU's condition bits are updated by the instruction permitting a
conditional branch to follow the instruction.
bfi
This instruction mnemonic stands for Bit Field Insert. The word Insert should really be copy. The official ARM documentation explains this instruction very well so we'll repeat it here:
Bit Field Insert copies any number of low-order bits from a source register into the same number of adjacent bits at any position in the destination register, leaving other bits unchanged.
The instruction has the following format:
bfi rd, rs, lsb, width
Starting at bit 0 of rs, width bits are copied to rd starting at bit
lsb.
The bfi instruction replaces as many as three instructions: likely a shift,
an and and an orr.
mvn
This instruction takes only takes two operands (but permits an optional shift to be explained below).
The basic syntax is:
mvn rd, rs
This flips all the bits in the source and copies them to the destination.
In addition to the basic instruction, there is also:
mvn rd, rs, *shift* num_bits
The shift and num_bits function the same way as described above including
the option to use *shift* as one of lsl, lsr, asr or ror.