CLD与STD是用来操作方向标志位DF(Direction Flag)。CLD使DF复位,即DF=0,STD使DF置位,即DF=1.用于串操作指令中。
汇编语言中,串操作指令LODSB/LODSW是块装入指令,其具体操作是把SI指向的存储单元读入累加器,其中LODSB是读入AL,LODSW是读入AX中,然后SI自动增加或减小1或2位.当方向标志位D=0时,则SI自动增加;D=1时,SI自动减小。
STOS
STOSB
STOSW
STOSD
存储字符串数据(Store String Data)
将累加器内容存储到由ES:E(DI)寻址的内存地址.如果使用STOS,必须指定目的操作数.
STOSB拷贝AL到内存中,STOSW拷贝AX到内存中,STOSD拷贝EAX到内存中.
INTEL指令集中有5组处理字节,字和双字数组的指令,称为基本字符串指令,但它们的用法并不
限于字符数组,LZ所问STOSW,LODSB都是属于这5组(另外3组是:MOVSB,CMPSB,SCASB)
以下代码转载于 罗云彬的《win32汇编》
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 在缓冲区中找出一行数据,处理换行并保存 Unix Text file -> PC Text file;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_FormatText proc uses esi _lpData,_dwSize,_hFile
local @szBuffer[128]:byte,@dwBytesWrite
mov esi,_lpData
mov ecx,_dwSize
lea edi,@szBuffer
xor edx,edx
cld
_LoopBegin:
or ecx,ecx
jz _WriteLine
lodsb
dec ecx
cmp al,0dh ;遇到0dh则丢弃
jz _LoopBegin
cmp al,0ah ;遇到0ah则扩展为0dh,0ah
jz _LineEnd
stosb
inc edx
cmp edx,sizeof @szBuffer-2
jae _WriteLine ;行缓冲区满则保存
jmp _LoopBegin
_LineEnd:
mov ax,0a0dh ;这个地方存入以后 al为0dh ah为0ah 这个地方要注意
stosw
inc edx
inc edx
_WriteLine:
push ecx
.if edx
invoke WriteFile,_hFile,addr @szBuffer,edx,addr @dwBytesWrite,NULL
.endif
lea edi,@szBuffer
xor edx,edx
pop ecx
or ecx,ecx
jnz _LoopBegin
ret
_FormatText endp
这个子程序 先把要筛选的字符串放到esi中 把要存储的放到edi中 然后用CLD把 esi edi以后的增长方向都设为加1正方向
然后在用 lodsb 取出esi中的到al中 处理以后把需要的执行 stosw esi加1 然后把AX拷贝到到edi中 从而实现了字符串的处理