MOV レジスタ間
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 16/45。
数値をレジスタに直接入れる方法(MOV immediate)を学んだので、レジスタ間で値をコピーすることもできるようになりました。
構文:
mov destination_register, source_registersourceレジスタの値がdestinationレジスタにコピーされます。ソースレジスタは変更されません。
例:
mov rax, 5 ; rax = 5
mov rbx, rax ; rbx = 5 (raxからコピー)これら2つの命令の後、rax と rbx の両方に5が格納されます。
重要: 転送元レジスタ (rax) は依然としてその値を保持しています。MOVはコピーを行うものであり、切り取りや移動を行うものではありません。
別の例:
mov rax, 7 ; rax = 7
mov rcx, 3 ; rcx = 3
mov rdx, rcx ; rdx = 3 (rcxからコピー)
mov rbx, rax ; rbx = 7 (raxからコピー)これらの命令の後:
| レジスタ | 値 |
|---|---|
| rax | 7 |
| rcx | 3 |
| rdx | 3 |
| rbx | 7 |
これが重要な理由:
- 元の値を変更する前に、別のレジスタにコピーすることで値を保存できます
- メモリから再度ロードすることなく、値を再利用できます
- これは、ほとんどのアセンブリ操作の基礎となります
チャレンジ
これらのタスクのためのアセンブリコードを記述してください:
- 数値 4 を
raxに入れます raxからrbxに値をコピーしますrbxからrcxに値をコピーします
コードの実行後、3つのレジスタすべてに 4 が格納されている必要があります。
自分で試してみよう
section .data
msg_rax db 'rax = '
msg_rax_len equ $ - msg_rax
msg_rbx db 'rbx = '
msg_rbx_len equ $ - msg_rbx
msg_rcx db 'rcx = '
msg_rcx_len equ $ - msg_rcx
section .bss
digit resb 1
section .text
global _start
_start:
%include "solution.asm"
; 値を保存
mov r12, rax
mov r13, rbx
mov r14, rcx
; "rax = " を表示
mov rax, 1
mov rdi, 1
mov rsi, msg_rax
mov rdx, msg_rax_len
syscall
; rax の値を表示
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; "rbx = " を表示
mov rax, 1
mov rdi, 1
mov rsi, msg_rbx
mov rdx, msg_rbx_len
syscall
; rbx の値を表示
mov rax, r13
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; "rcx = " を表示
mov rax, 1
mov rdi, 1
mov rsi, msg_rcx
mov rdx, msg_rcx_len
syscall
; rcx の値を表示
mov rax, r14
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; 終了
mov rax, 60
mov rdi, 0
syscallこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。