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

why does movsw instruction increments the si and di registers by2 while movsb instruction increments the si and di registers by 1?

我正在使用平面汇编程序以汇编语言处理 movsb 和 movsw 指令。现在,我注意到当执行 movsb 指令时,SI 和 DI 寄存器递增 1,而 movsw 指令将 SI 和 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指令(扁平汇编)

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(?)

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

来自英特尔的手册:

After the move operation, the (E)SI and (E)DI registers are incremented or decremented automatically according to the setting of the DF flag in the EFLAGS register.
The registers are incremented or decremented by 1 for byte operations, by 2 for word operations, or by 4 for doubleword operations.

或者更正式地说:

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;

movsb 将一个字节从 SI 移动到 DI 并且 decrements/increments 它们都移动一个字节。 movsw 将一个词从 SI 移动到 DI 和 decrements/increments 它们两个字节(一个词)。这些指令中的每一个基本上都做同样的事情,除了它们移动不同的大小内存。

希望对您有所帮助!

movswmovsbmovsdmovsq 是用于将数据从源位置 DS:(ER)SI 复制到目标位置 ES:(ER)DI 的指令].

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

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

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

  • movsb 移动一个字节,所以寄存器 incremented/decremented 减 1.
  • movsw 移动一个 WORD(2 个字节),因此寄存器 incremented/decremented 乘以 2。
  • movsd 移动一个 DWORD(双字,2 个字,4 个字节),因此寄存器 incremented/decremented 乘以 4.
  • movsq 移动一个 QWORD(Quad Word,4 个字,8 个字节),所以寄存器 incremented/decremented 乘以 8.