html tool

2018年11月27日星期二

转 : windows 汇编基础--cmp汇编指令



https://blog.csdn.net/wfq_1985/article/details/6166002

cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位。其他的指令通过识别这些被影响的标志位来得知比较结果。

     cmp指令格式:   cmp   操作对象1, 操作对象2

     计算 操作对象1 - 操作对象2 但不保存结果,只是根据结果修改相应的标志位。

     举例假如此时eax = 0h
     那么cmp eax, eax     (eax - eax = 0)
   
     此时我们的指令执行后, ZF标志位 = 1, PF = 0, SF =0 , CF =0 , OF = 0 。

     (因为我们结果为0,所以ZF标志位为1 . 前提是在PF操作数为0的情况下执行
ps:其实PF标志位无关紧要)


     在继续举例
   
     mov ebx, 05h
     mov eax, 08h
     cmp eax, ebx   (eax - ebx = 03h)
     此时我们的指令执行后(ZF = 0, PF = 1, SF = 0, CF = 0, OF = 0)
   
     因为此时我们就可以通过标志位判断出eax 是否大于ebx。 我们有时候想问题,可以逆序的想。
可以这样想,如果它小于的话会发生什么。。 举例假如al = 05h, bl = 08h (为了更直观,所以我采用低8位寄存器)
     
     mov al, 05h
     mov bl, 08h
     cmp al, bl   (al - bl = -3h)
     (注意:al是低8位寄存器,为了更直观,所以我采用低8位寄存器,计算机负数是以补码的形式在内存存放的,赶快拿起你的手,算算-3的补码是多少。)
     那么执行后 (ZF = 0, PF = 0, CF = 1, SF = 1, OF =0)
   
     (那么大家肯定会问:CF = 1, 为何存在了进位操作。   在我们计算机中两个数据做减法运算的时候,有可能象更高位借位,举例
                   mov al, 56h
                   mov bl, 57h
                   sub al, bl 
           借位后,将产生156 - 57h )
   SF我就不说了吧,符号标志位,我们的结果为负,所以SF = 1
 

没有评论:

发表评论