【问题标题】:why does movsw instruction increments the si and di registers by2 while movsb instruction increments the si and di registers by 1?为什么 movsw 指令将 si 和 di 寄存器增加 2 而 movsb 指令将 si 和 di 寄存器增加 1?
【发布时间】:2015-07-23 14:46:39
【问题描述】:

我正在使用平面汇编程序处理汇编语言中的 movsb 和 movsw 指令。现在,我注意到当执行 movsb 指令时,SI 和 DI 寄存器增加 1,而 movsw 指令将 SI 和 DI 寄存器增加 2。我有点困惑为什么?谁能解释一下原因。我在下面为 cmets 的指令添加了我的代码。请帮帮我。谢谢!

使用 movsb 指令(平面汇编器)

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

【问题讨论】:

    标签: assembly fasm


    【解决方案1】:

    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。

    【讨论】:

      【解决方案2】:

      因为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;
      

      【讨论】:

        【解决方案3】:

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

        我希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2010-12-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-16
          • 1970-01-01
          相关资源
          最近更新 更多