MOVS指令
MOVS指令把字符串从一个内存位置传送到另一个内存位置。
MOVS有多种格式:MOVSB,MOVSW,MOVSQ
MOVS指令使用隐含的源和目标操作数。源操作数是ESI寄存器,指向源字符串,目标操作数是EDI寄存器,指向字符串要被复制到的目标内存位置。每次数据传送后,ESI和EDI寄存器会自动改变。可以自动递增也可以自动递减,取决于EFLAGS寄存器的DF表示。
CLD用于将DF标志清零。
STD用于设置DF标志位。
可以通过movl 将内存地址加载到edi寄存器中个,也可以使用lea指令。
例如:
leal output,%edi
复制大型字符串时候,可以通过ECX来进行字符串长度控制。
传送数字示例
.extern printf ;//调用外部的printf函数
.section .data
value1:
.ascii "This is a test string.\n"
.section .bss
.lcomm output, 23
.section .text
.globl _start
_start:
nop
leal value1, %esi;//获取value1地址
leal output, %edi;//获取output地址
movl $23, %ecx
cld
loop1:
movsb
loop loop1
mov $output,%rdi
movq $23,%rsi
call printf
mov $60,%rax
syscall
as -g -o movstest.o movstest.s
ld -o movstest movstest.o -lc -I /lib64/ld-linux-x86-64.so.2