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是有符合的比较