对于stosd,movsb的理解
在TSS相关的代码中,发现通常会有这样一段:
mov edi,[app_i_param]
add edi,[app_mem_pos]
mov ecx,256/4
cld
rep stosd
mov esi,[esp+4]
cmp esi,0
jz no_app_params
。。。。。。。。。。。。。。。
cld会清除方向标记,而std会设置方向标记。
方向标志用于影响字符串指令偏移指针寄存器的方向。这些指令可以与REP前缀一起使用以重复操作。
简而言之,当方向标记为0时,指令将通过在每次迭代后递增指向数据的指针(eax放入要拷贝的内容,edi是递增的,将eax中的内容放入edi指向的地址中,ecx逐步递减为0)
stosd最后一个字母是d表示每次四个字节。
关于movsb的一个例子(摘自[转]汇编语言:MOVSB,MOVSW,MOVSD - 挥剑了得失 - 博客园 (cnblogs.com))
cld ;方向标志
mov esi, 内存地址1 ;(也就是存放字符串的内存地址)
mov edi, 内存地址2 ;(要移动到目的处的地址)
mov ecx, 要移动的数量 ;
rep movsb
cld是来控制重复移动时候的esi 和edi的递增方式。 cld是将方向标志位DF设置为0,每次rep循环的时候,esi和edi自动+1。 std是将方向标志位DF设置为1,每次rep循环的时候,esi和edi自动-1。
rep循环前缀在执行循环的时候,ecx寄存器是每次减1的。和我们的loop循环一样。
浙公网安备 33010602011771号