为什么movsw指令将si和di寄存器递增2,而movsb指令将si和di寄存器递增1?

时间:2015-07-23 14:46:39

标签: assembly fasm

我使用平面汇编程序使用汇编语言处理movsb和movsw指令。现在,我注意到当执行movsb指令时,SI和DI寄存器递增1,而movsw指令将SI AND DI寄存器递增2.我有点困惑为什么?任何人都可以解释我的原因。我在下面添加我的代码用于带注释的指令。请帮帮我。谢谢!

使用movsb指令(Flat assembler)

cld ;clear direction flag

lea si,[val]  ;the memory address of source is loaded in the source register

lea di,[v];the memory address of the destination is loaded in the destination register

mov cx,5 ; the counter basically executes for the number of characters in the array

rep movsb ; repeats the instruction for 5 times

val:
     db 'A' 
     db 'B'
     db 'C'
     db 'D'
     db 'E'

v db 5 DUP(?)

使用movsw指令(Flat assembler)

cld    ;clear the direction flag

lea si,[a];load the address of a in source
;register
lea di,[b] ;load the address of b in destination
;register
mov cx,3
rep movsw  ;copy each word from source to
;destination and increment the source register
;by 2 and destination register by 2

a: 
  dw '1'
  dw '2'
  dw '3'

b dw 3 DUP(?)

3 个答案:

答案 0 :(得分:2)

movswmovsbmovsdmovsq是用于将数据从源位置DS:(ER)SI复制到目标位置ES:(ER)DI的说明。

它们非常有用,因为IA32e中没有 mem-to-mem 移动指令。

它们意味着在循环中使用(例如通过使用rep前缀),因此除了移动数据之外,它们也会递增(如果 DF 标志,方向标志为0 )或递减(如果 DF 标志为1)指向源和目标位置的指针,即(ER)SI(ER)DI寄存器。

从汇编程序员的角度来看,内存是字节可寻址的,这意味着每个地址存储一个字节。

  • movsb移动一个字节,因此寄存器递增/递减1.
  • movsw移动WORD(2个字节),因此寄存器递增/递减2.
  • movsd移动一个DWORD(双字,2个字,4个字节),因此寄存器递增/递减4。
  • movsq移动QWORD(四字,4个字,8个字节),因此寄存器递增/递减8。

答案 1 :(得分:1)

因为movsb移动(或复制,实际上)一个字节,而movsw移动一个字。 x86术语中的一个单词是2个字节。

来自英特尔的手册:

  

移动操作后,(E)SI和(E)DI寄存器自动递增或递减   在EFLAGS寄存器中设置DF标志。
寄存器递增或   字节操作递减1,字操作递减2,双字操作递减4。

或者,更正式地说:

IF (Byte move)
  THEN IF DF = 0
    (E)SI ← (E)SI + 1;
    (E)DI ← (E)DI + 1;
  ELSE
    (E)SI ← (E)SI – 1;
    (E)DI ← (E)DI – 1;
  FI;
ELSE IF (Word move)
  THEN IF DF = 0
    (E)SI ← (E)SI + 2;
    (E)DI ← (E)DI + 2;
  FI;
  ELSE
    (E)SI ← (E)SI – 2;
    (E)DI ← (E)DI – 2;
  FI;

答案 2 :(得分:0)

movsb将一个字节从SI移动到DI,并将它们递减/递增一个字节。 movsw将一个单词从SI移动到DI,并将它们递减/递增两个字节(一个单词)。这些指令中的每一个基本上都做同样的事情,除了它们移动不同的尺寸的内存。

我希望这有帮助!