第21部分- Linux x86 64位汇编 字符串传送MOVS

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