4.1 数据传送指令
操作数类型【记忆】
- 操作数分类:汇编指令中的操作数分为三种类型:
- 立即数(imm):直接给定的数值,如
MOV AX, 1234h
中的 <font style="color:#DF2A3F;">1234h</font>
- 寄存器操作数(reg):CPU寄存器中的数据,如
MOV AX, BX
,这里<font style="color:#DF2A3F;">AX</font>
、BX
都是寄存器
- 内存操作数(mem):存储器中某个位置的数据,它可以是内存地址、指针,或者加上偏移量来访问内存中指定位置的数据,如
MOV AX, [var1]
,这 <font style="color:#DF2A3F;">[var1]</font>
是 var1 所指的内存地址
- 常见寄存器示例:
reg8
:8位通用寄存器(例如:AH
, AL
, BH
, BL
等)。
reg16
:16位通用寄存器(例如:AX
, BX
, CX
, DX
等)。
reg32
:32位通用寄存器(例如:EAX
, EBX
, ECX
, EDX
等)。

MOV 指令
- 指令格式:MOV指令的格式为
MOV 目的操作数, 源操作数
,如:
.data var1 BYTE 10h
.code MOV al, var1
机器指令:A0 00010400
(A0
为操作码)。
- 常见MOV指令格式:
MOV reg, reg
:将一个寄存器的值传送到另一个寄存器。
MOV mem, reg
:将寄存器的值存储到内存中。
MOV reg, mem
:将内存中的值加载到寄存器。
MOV mem, imm
:将立即数存储到内存中。
MOV reg, imm
:将立即数加载到寄存器。
- MOV指令的限制:
- 不能直接从内存到内存传输数据(需要使用寄存器作为中介)。
MOV [var1], [var2]
(错误:需要使用寄存器作为中间变量)
- 操作数的大小必须匹配(如8位与8位、32位与32位等)。
MOV AX, 12345678h
(错误:AX 是 16 位寄存器,而立即数是 32 位)
- 内存操作数不能与指令指针寄存器(IP、EIP、RIP)一起使用。
MOV EIP, 1000h
(错误:EIP 不能作为目标操作数)
- 不同数据大小操作:
- 8位、16位、32位数据的赋值:可以通过不同大小的数据赋值给32位寄存器,例如:
.data
oneByte BYTE 78h
oneWord WORD 1234h
oneDword DWORD 12345678h
.code
MOV al, oneByte
MOV ax, oneWord
MOV eax, oneDword
- 符号扩展
MOVZX``MOVSX
:
- 无符号数:使用
MOVZX
指令,将较小的数据类型扩展到较大的数据类型,并用零填充高位(如:MOVZX eax, word1
)。
- 有符号数:使用
MOVSX
指令,将较小的数据类型扩展到较大的数据类型,并用符号位填充高位(如:MOVSX ax, byteVal