SDM指令功能描述(MOVS/MOVSB/MOVSW/MOVSD/MOVSQ)
MOVS/MOVSB/MOVSW/MOVSD/MOVSQ)总体描述:
从DS:SI(16-bit)/DS:ESI(32-bit)/RSI(64-bit)指示的地址中复制一个byte/word/dword/qword到ES:DI(16-bit)/ES:EDI(32-bit)/RDI(64-bit)指示的地址中。
(R)(E)SI,(R)(E)DI根据eflags寄存器中DF的标志位决定是自增还是自减1/2/4/8。注1:SDM中描述了两种汇编形式,显式指定操作数以及隐式指定。但无论指定如何源操作数和目的操作数都是上述过程所指定的操作数。汇编里的指定只用来识别数据宽度。
注2:SDM中MOVSD这条指令助记符对应两条不同指令,另一条为操作浮点数寄存器用。
伪代码
非64位下:
DEST <- SRC
DataLength = 1/2/4;
if(EFLAGS.DF == 0) {
(E)SI += DataLength;
(E)DI += DataLength;
}
else {
(E)SI -= DataLength;
(E)DI -= DataLength;
}
64位下:
DEST <- SRC
DataLength = 1/2/4/8;
if(EFLAGS.DF == 0) {
RSI += DataLength;
RDI += DataLength;
}
else {
RSI -= DataLength;
RDI -= DataLength;
}
示例代码
do_move:
movw %ax, %es # destination segment
addw $0x1000, %ax
cmp $0x9000, %ax
jz end_move
movw %ax, %ds # source segment
sub %di, %di
sub %si, %si
movw $0x8000, %cx
rep
movsw
jmp do_move