Section 01 Part 05 – The MOVE Instruction “Computers are like Old Testament gods; lots of rules and no mercy.”  ~Joseph Campbell

Introduction

MOVE – copy data from source to destination

You’ve seen this instruction used multiple times by now in the previous parts, so let’s look at it in more detail.

This instruction will copy the number from the source operand and move it to the destination operand, the source operand will remain unchanged.

Examples

Examples are always good; so we’ll start with moving a byte to a data register:

 move.b    #\$95,d0

This will copy the byte 95 into data register d0:

• if d0 started with 00000000, after the instruction d0 will contain 00000095
• if d0 started with 00000022, after the instruction d0 will contain 00000095
• if d0 started with 000000E0, after the instruction d0 will contain 00000095

As you can see, no matter what was in d0 before, it will always be replaced with the byte 95.

Here are a few more examples:

• if d0 started with 00001111, after the instruction d0 will contain 00001195
• if d0 started with 22222222, after the instruction d0 will contain 22222295
• if d0 started with 01234567, after the instruction d0 will contain 01234595

As you can see, only the right byte is replaced, the rest remains the same, this is because the instruction had .b telling the processor to move only a byte.

Here’s an example using .w for word:

 move.w    #\$40F5,d0

This will copy the word 40F5 into data register d0:

• if d0 started with 00000000, after the instruction d0 will contain 000040F5
• if d0 started with 00000126, after the instruction d0 will contain 000040F5
• if d0 started with 000053FB, after the instruction d0 will contain 000040F5

As you can see, no matter what was in d0 before, it will always be replaced with the word 40F5.

Here are a few more examples:

• if d0 started with 00010000, after the instruction d0 will contain 000140F5
• if d0 started with FFFFFFFF, after the instruction d0 will contain FFFF40F5
• if d0 started with 01A05009, after the instruction d0 will contain 01A040F5

As you can see, only a word of d0 was replaced, the rest of d0 remains the same, this is because the instruction had .w telling the processor to move only a word.

Here’s an example using .l for long-word:

 move.l    #\$55667788,d0

This will copy the long-word 55667788 into data register d0:

• if d0 started with 00000000, after the instruction d0 will contain 55667788
• if d0 started with FEDCB009, after the instruction d0 will contain 55667788
• if d0 started with 01234321, after the instruction d0 will contain 55667788

As you can see no matter what was in d0, it will always be replaced by 55667788.  Because the instruction had .l for long-word, the entire register gets changed.

Other Examples

You can move numbers from one register to another as well, for example:

 move.w    d0,d1

This will copy a word of data from d0 to d1.

• If d0 contains 01234567, and d1 contains FFEEDDCC, after the instruction d1 will contain FFEE4567.

The 4567 was copied from d0 over to d1, d0 will still contain 01234567 though.  Remember, the source operand always remains unchanged.

Moving to and from memory:

 move.w    d0,\$0000104E

This will copy the word in d0, and move it into memory at offset \$0000104E.  If d0 contains 99004980, then 4980 is copied to memory at offsets 0000104E and 0000104F:

 Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F etc 00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 49 80 00001050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 etc

You can copy data from memory to a data register:

 move.w    \$00001062,d0

If d0 contains 40414243, and the data in memory is:

 Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F etc 00001030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001060 00 00 00 22 00 00 00 00 00 00 00 00 00 00 00 00 etc

0022 is copied to d0, and d0 will then contain 40410022.

You can copy from memory to memory:

 move.l    \$00000800,\$00000822

This is moving a long-word, so if the data in memory is:

 Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F etc 000007F0 00 12 33 00 8E 00 00 00 00 00 7F 00 00 00 00 00 00000800 00 00 99 1A 00 00 00 00 00 00 00 00 00 00 00 00 00000810 00 00 00 00 00 00 00 44 00 00 00 00 34 44 45 00 00000820 00 12 34 43 99 08 FE 04 00 00 00 00 00 00 00 00 etc

The bytes from 00000800, 00000801, 00000802 and 00000803, are copied over to 00000822, 00000823, 00000824 and 00000825:

 Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F etc 000007F0 00 12 33 00 8E 00 00 00 00 00 7F 00 00 00 00 00 00000800 00 00 99 1A 00 00 00 00 00 00 00 00 00 00 00 00 00000810 00 00 00 00 00 00 00 44 00 00 00 00 34 44 45 00 00000820 00 12 00 00 99 1A FE 04 00 00 00 00 00 00 00 00 etc

You can copy data to memory through the “address registers” too, by indexing, the auto incrementing/decrementing, and others.

Here are a few examples just to give you a rough idea of the possibilities:

 move.w    (a0),(a1)           move.w    (a0),d0           move.w    d1,(a0)+           move.w    d1,\$10(a1)           move.b    #\$98,(a0)+           move.l    \$29(a0),\$00120020           move.b    \$00120020,(a1)+