Besides the flags, and differences in cycle count, the more important difference is that JMP x
uses the effective address of x
, while MOV x,R7
uses the value at x
. In other words, there's one level less of indirection, similar to the LEA
and MOV
opcodes for the x86.
So JMP R1
faults, and JMP @R1
is equivalent to MOV R1,R7
.
This means one can use JMP d(R7)
for relative jumps with a full 16-bit displacement (BR d
only has an 8-bit displacement, which is often not enough). In the same way, one can store the address of some block of code (library) in, say, R1
, and use JMP d(R1)
to jump to a fixed displacement inside this code block. All of this is not possible with a single MOV
instruction.
It doesn't make sense to access a register via the memory mapped address instead of just using it directly, because accessing them this way would need one more word per instruction, and therefore is inefficient.
MOVR
also was used forJMPR
and some others depending on what the source/destination registers are.