将数据从一个位置复制到另一个位置的指令是最频繁使用的指令。下面介绍下 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 加了一条限制,传送指令的两个操作数不能都指向存储器位置。将一个值从存储器位置复制到另一个存储器位置需要两条指令 —— 第一条指令将源值加载到寄存器中,第二条将寄存器值写入目的位置。