将数据从一个位置复制到另一个位置的指令是最频繁使用的指令。下面介绍下 MOV 类指令,MOV 类由三条指令组成, movb、movw 和 movl。这些指令都执行同样的操作;不同的只是它们分别是在大小为 1、2 和 4 个字节的数据上进行操作。
指令 |
效果 |
描述 |
MOV S, D |
D S |
传送 |
movb movw movl |
传送字节 传送字 传送双字 |
|
MOVS S, D |
D 符号扩展(S) |
传送符号扩展的字节 |
movsbw movsbl movswl |
将做了符号扩展的字节传送给字 将做了符号扩展的字节传送给双字 将做了符号扩展的字传送给双字 |
|
MOVZ S, D |
D 零扩展(S) |
传送给零扩展的字节 |
movzbw movzbl movzwl
pushl S
popl D |
将做了零扩展的字节传送给字 将做了零扩展的字节传给双字 将做了零扩展的字传给双字
R[%esp] R[%esp] – 4; M[R[%esp]] S
D M[R[%esp]]; R[%esp] R[%esp] – 4 |
双字节压栈
双字节出栈 |
MOV 类中的指令将源操作数的值复制到目标的操作数中。源操作数指定的值是一个立即数,存储在寄存器中或者存储器中。目的操作数指定一个位置,要么是一个寄存器,要么是一个存储器地址。
源操作数 |
目的操作数 |
立即数 |
寄存器 |
寄存器 |
存储器 |
存储器 |
|
注意:IA32 加了一条限制,传送指令的两个操作数不能都指向存储器位置。将一个值从存储器位置复制到另一个存储器位置需要两条指令 —— 第一条指令将源值加载到寄存器中,第二条将寄存器值写入目的位置。