rep movsd ,repz CMPSB , CMPSW , CMPSD ,cld std用法

本文深入探讨了80x86汇编语言中的CLD和STD指令功能,包括它们如何影响方向标志位DF,以及在字符串操作中的作用。同时,详细解释了MOVSD指令的执行过程,并对比了REP与REPZ前缀的区别。此外,文章还讲解了CMPS系列指令的使用方法及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CLD指令功能:
标志寄存器Flag的方向标志位DF清零。
在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后。

相反功能指令是STD,将方向标志位DF置1,
在字串操作中使SI或DI的地址指针自动递减,字串处理由后往前。

 

movsd是把ds:[si]开始的DWORD传送到es:[di]开始的内存中(将ds:[si]处的4个字节数据送到es:[di]处),如果DF标志为0则si、di分别加4;如果DF为1则si、di分别减4。REP前缀表示重复执行该指令,每次执行后cx减1,直到cx为0结束。REPZ与REP类似,主要用于cmps、scas等指令,除了判断cx之外还判断ZF标志,如果ZF为0则结束。由于movs指令不会影响DF标志,所以用repz前缀没有意义,处理器会将repz当作rep处理。

CMPSB用来比较字节,而CMPSW用来比较字,CMPSD用来比较双字。

CMPS DWORD PTR [ESI], [EDI] 
但是你记住CMPS指令只能用于比较ESI指向的内存和EDI指向的内存值。

还有一点注意,CMPS和我们的CMP指令的操作数是相反的, 
CMP 目的操作数,源操作数 
CMPS 源操作数, 目的操作数 
我们最好使用其特定的版本也就是我们今天学习到的CMPSB , CMPSW , CMPSD 这样我们不容易出错。

此时我们通过 
   mov   esi, source 
   mov   edi, target 
   cmpsd 
   ja     xxxx 
   jmp   xxxx2 
   
   大家说这句指令执行完cmpsd后,ja xxxx 指令能实现跳转吗。     不知道大家还记得我们之前学习的标志位吗。那么如果我们之前的源数小于比较的数值的话,则产生借位,所以此时CF标志位=1. 而ja指令是不小于,那么它会检测我们的CF标志位,如果发现CF = 1,则表示我们的源数值小于。ja并没有实现,只有当cf = 0的时候ja才实现跳转。 所以我们的指令会执行到jmp xxxx2,跳转。

ja 是无符号的比较
jg是有符合的比较
 

参考博客:https://blog.youkuaiyun.com/ccboby/article/details/6011247

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值