为什么 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 它们两个字节(一个词)。这些指令中的每一个基本上都做同样的事情,除了它们移动不同的大小内存。
希望对您有所帮助!
movsw
、movsb
、movsd
、movsq
是用于将数据从源位置 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.
我正在使用平面汇编程序以汇编语言处理 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 它们两个字节(一个词)。这些指令中的每一个基本上都做同样的事情,除了它们移动不同的大小内存。
希望对您有所帮助!
movsw
、movsb
、movsd
、movsq
是用于将数据从源位置 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.