# An example - Moving a large string using MOVSL and MOVSB (传送大型字符串)
#
# REP : 按照特定次数重复执行字符串指令,由ECX中的值进行控制。
#
# 和使用循环类似,但是不需要额外的LOOP指令。
#
# REP称为前缀指令。
#
# 当知道字符串的长度时,就容易执行整数除法以便确定字符串中包含多少个双字。
# 然后余数可以使用movsb进行传送(迭代次数应该小于3次)
#
.section .data
string1:
.asciz "This is a test of the conversion program!\n"
length:
.int 43
divisor:
.int 4
.section .bss
.lcomm buffer, 43
.section .text
.globl main
main:
nop
leal string1, %esi
leal buffer, %edi
movl length, %ecx
shrl $2, %ecx # 把长度向右移动2位(这和被4整除相同)
cld
rep movsl
movl length, %ecx
andl $3, %ecx # 如果除数是2的乘方(4就是),可以通过从除数中减去1,然后把它和被除数进行AND快速获取余数。
rep movsb
push $buffer
call printf
add $4, %esp
movl $1, %eax
movl $0, %ebx
int $0x80
# gcc -g -o 06 06-rep.s -m32