rep stosb是最简单的字符串指令,用于在目标字符串中填入指定的字符。首先看一个小程序:
section .data
EditBuff: db 'abcdefghijklm ',10
BUFFERLEN equ $-EditBuff
ENDPOS equ 12
INSRTPOS equ 0
FILLCHR equ 35 ;'#'
section .text
WriteStr:
push eax ; Save pertinent registers
push ebx
mov eax,4 ; Specify sys_write call
mov ebx,1 ; Specify File Descriptor 1: Stdout
int 80H ; Make the kernel call
pop ebx ; Restore pertinent registers
pop eax
ret ; Go home
global _start
_start:
nop
mov ecx,EditBuff
mov edx,BUFFERLEN
call WriteStr
cld
mov al, FILLCHR
mov edi,EditBuff+INSRTPOS
mov ecx,ENDPOS-INSRTPOS+1
rep stosb
mov ecx,EditBuff
mov edx,BUFFERLEN
call WriteStr
Exit: mov eax,1 ; Code for Exit Syscall
mov ebx,0 ; Return a code of zero
int 80H ; Make kernel call
程序分析:
cld //清除DF标志位,这样rep stosb的目标缓存地址的变化方向是由低到高。
mov al, FILLCHR //al = ‘#’
mov edi,EditBuff+INSRTPOS //edi= &EditBuff[0],edi存放目标字符串的起始地址。
mov ecx,ENDPOS-INSRTPOS+1 //ecx=13,用于循环计数
rep stosb //执行如下操作:先判断ecx是否为0,如果为0,循环结束,否则,填充al中的值到edi指向的缓存地址,然后ecx=ecx-1,edi=edi+1,再进行下一次循环。因ecx=13,所以循环13次,填充13个字节的’#’。
makefile文件:
movsbdemo: stosbdemo.o
ld -o stosbdemo stosbdemo.o
stosbdemo.o: stosbdemo.asm
nasm -f elf -g -F stabs stosbdemo.asm -l stosbdemo.lst
测试:
[root@bogon stosbdemo]# make
nasm -f elf -g -F stabs stosbdemo.asm -l stosbdemo.lst
ld -o stosbdemo stosbdemo.o
[root@bogon stosbdemo]# ./stosbdemo
abcdefghijklm
#############