MOV 即値
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 15/45。
MOVの最も単純な形式はMOVイミディエイトです。「イミディエイト」とは、値が命令自体の中に直接書き込まれていることを意味します。
構文:
mov register, value値がレジスタにコピーされます。
例:
| 命令 | 動作 |
|---|---|
mov rax, 5 | 数値 5 を rax にコピーします |
mov rbx, 100 | 数値 100 を rbx にコピーします |
mov rcx, 0 | 数値 0 を rcx にコピーします |
このコードは目に見える動作は何も行いません(まだ出力はありません)が、数値をレジスタに正常に格納しています。
注: これらのMOV命令の効果は、後のレッスンで出力やデバッグについて学ぶ際に確認できます。今は、数値がレジスタに格納されていることだけを覚えておいてください。
重要なルール:
| ルール | 説明 |
|---|---|
| 値はレジスタに収まる必要があります | rax は非常に大きな数(最大 2⁶⁴-1)を保持できます |
| 値は移動ではなくコピーされます | 元の数値は依然として存在します(それは単なる数値です) |
| レジスタは左側に記述します | mov rax, 5 は正しいです。mov 5, rax は誤りです |
チャレンジ
各タスクに対して、アセンブリコードを1行ずつ記述してください:
- 数値 5 を
raxレジスタに格納してください。 - 数値 7 を
rbxレジスタに格納してください。 - 数値 3 を
rcxレジスタに格納してください。
自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。