汇编问题rep movsb 和 cld 是什么意思? 汇编语言中rep movsb于loop循环传送字符串有什么区...

\u8bf7\u6559\u6c47\u7f16\u95ee\u9898 CLD REP MOVSB

CLD\u5c31\u662f\u5b57\u7b26\u4e32\u6307\u9488\u505a\u81ea\u52a8\u589e\u91cf\u64cd\u4f5c
REP \u5c31\u662f\u5b57\u7b26\u4e32\u7684\u65e0\u6761\u4ef6\u91cd\u590d\u524d\u7f00 \u4f7fREP\u540e\u7684\u6307\u4ee4\u65e0\u6761\u4ef6\u91cd\u590dCX\u503c\u6307\u5b9a\u7684\u6b21\u6570
MOVSB \u5c31\u662f\u5c06\u6e90\u4e32\u4e00\u5b57\u8282\u4f20\u9001\u5230\u76ee\u5730\u4e32\uff0c\u5e76\u81ea\u52a8\u4fee\u6539\u6307\u9488\u503c
\u5408\u8d77\u6765\u5c31\u662f
LEA SI,DATA1
LEA DI,DATA2
MOV CX,5
CLD
REP MOVSB

\u628aDATA1\u4e2d5\u4e2a\u5b57\u8282\u4f20\u9001\u5230DATA2\u4e2d

rep movsb\u5b8c\u6210\u7684\u5de5\u4f5c\u5f88\u591a\uff0cDS:[SI]\u5b57\u8282\u5185\u5bb9\u8d4b\u503c\u7ed9 ES:[DI]\uff0cSI\u52a0\u4e00\uff0cDI\u52a0\u4e00(\u6ce8:\u65b9\u5411\u6807\u5fd7\u4e3a0\u662f\u9012\u589e\uff0c\u5426\u5219\u9012\u51cf)\uff0cCX\u51cf\u4e00\uff0c\u518d\u5224\u65adCX\u51b3\u5b9a\u662f\u5426\u7ee7\u7eed\uff0c\u800c\u8fd9\u4e9b\u64cd\u4f5c\u65e0\u987b\u5728\u7a0b\u5e8f\u91cc\u5199\u51fa\u6765\u3002\u800cloop\u76f8\u5f53\u9ebb\u70e6\uff0c\u9700\u8981\u5728\u7a0b\u5e8f\u91cc\u660e\u663e\u5199\u51fa\u5982\u4f55\u505a\u3002\u9ebb\u70e6\u662f\u9ebb\u70e6\u4e86\u4f46\u4e5f\u63d0\u4f9b\u4e86\u6700\u5927\u7684\u7075\u6d3b\u6027\u3002

先说说MOVSB(MOVe String Byte):即字符串传送指令,这条指令按字节传送数据(MOVSW为以字为单位传送字符串)。通过SI和DI这两个寄存器控制字符串的源地址和目标地址,比如DS:SI这段地址的N个字节复制到ES:DI指向的地址,复制后DS:SI的内容保持不变。

而REP(REPeat)指令就是“重复”的意思,术语叫做“重复前缀指令”。既然是传递字符串,如果程序设计者写成一个字(节)一个字(节)地传送,会显得相当繁琐。因此有必要用一个寄存器来控制串长度,用少量的代码达到一次性传送的目的。这个寄存器就是CX,指令每次执行前都会判断CX的值是否为0(为0结束重复,不为0,CX的值减1),以此来设定重复执行的次数。因此设置好CX的值之后就可以用REP MOVSB了。

CLD(CLear Direction flag)则是清方向标志位,也就是使DF的值为0,在执行串操作时,使地址按递增的方式变化,调整当前指针的执行方向。这条指令与STD(SeT Direction flag)的执行结果相反(指针方向递减),即置DF的值为1。

;example:把当前数据段中偏移1000H开始
;的100个字节数据传送到偏移2000H开始的
;单元中

cld ;指针方向递增
push DS ;当前数据段,因此压入栈中保存
pop ES ;使ES=DS
mov SI,1000H ;源串指针初值
mov DI,2000H ;目的串指针初值
mov CX,100 ;设置循环次数
Next:
lodsb ;取一个字节
stosb ;存一个字节
loop Next ;循环CX次

;以下程序片段与上面的等价:

cld ;方向增
……
mov CX,100 ;循环CX次
Next:
movsb ;每次传送一字节数据
loop Next

;或者用更简单的写法:
cld
……
mov CX,100 ;重复执行CX次movsb指令
rep movsb



扩展阅读:www.sony.com.cn ... mov指令表示repmovsb ... 汇编rep movw ... rep movsb等效指令 ... rep movsw ... remove bg官网 ... rep movsb的执行过程 ... remove一键抠图官网 ... paperpass免费入口 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网