我使用平面汇编程序使用汇编语言处理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(?)
答案 0 :(得分:2)
movsw
,movsb
,movsd
,movsq
是用于将数据从源位置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
,并将它们递减/递增两个字节(一个单词)。这些指令中的每一个基本上都做同样的事情,除了它们移动不同的尺寸的内存。
我希望这有帮助!