CMP (short for "CoMPare") is the mnemonic for a machine language instruction which compares the contents of the accumulator against that of the specified operand by subtracting operand from accumulator value, and setting the negative and carry flags according to the result. Unlike SBC, the result of the subtraction is discarded rather than stored back into the accumulator, which is thus unaffected by the CMP operation.
Usage[edit | edit source]
- Main article: Comparisons in machine language
To compare integers in machine language, first use a comparison instruction such as CMP, CPX or CPY to compare the numbers, then "test" the result using a conditional branch instruction that acts on the carry or negative flags, i.e. BCC, BCS, BMI, or BPL:
- If the compared values are unsigned integers, use BCC to branch if the contents of the accumulator is less than that of the memory address, and BCS to branch if the accumulator holds a number equal to or larger than that in memory.
- If the compared values are signed integers, use BMI to branch if the contents of the accumulator is less than that of the memory address, and BPL to branch if the accumulator holds a number equal to or larger than that in memory.
Addressing modes[edit | edit source]
CMP supports eight different addressing modes, as shown in the table at right.
In the assembler formats listed, nn represents a single-byte (8-bit) figure, and nnnn is a two-byte (16-bit) address.
With some addressing forms (marked with an asterisk, *, in the "Number of cycles" column) the execution time for CMP depends on the circumstances: In cases where the indexing requires the CPU to "reach across" a page boundary from the base address, the execution time is 1 cycle longer than listed here.
CPU flags[edit | edit source]
CMP affects 3 of the CPU's status flags: