xorl %eax, %eax

这是GNU的汇编
xorl    %eax, %eax(这句起什么作用)
按位异或,相同的位置为0,不同的位置为1,eax和eax的每一位都相同,所以相当于清零。
        movl    8(%ebp), %ecx
        testl   %ecx, %ecx(这句起什么作用)
    jle     .L3
8(%ebp)是第一个参数,检验它的值,若小于等于0则转

其它的,看看GNU汇编的语法吧。


在汇编代码中经常看到  

[plain]  view plain copy
  1. xorl %edx, %edx  

        这个指令可以将寄存器 %edx 设置为 0,运用了对任意x,x^x = 0 这一属性。将寄存器 %edx 设置为 0 的更直接的方法是用指令 movl $0, %edx。使用 objdump 对比发现使用 xorl 的版本只需要 2 个字节,而是用 movl 的版本需要 5 个字节。



TEST 指令是进行与运算 不保留结果 
JL  指令是有符号当选条件转移指令  含义是小于/不大于(A>B) 转移   
其标志位 是SF≠OF AND ZF=0转移
sunshine  
      [第6楼]   [ 回复时间:2007-11-14 09:39 ]   [引用]   [回复]   [ top ]
荣誉值:106 
信誉值:0 
注册日期:2007-06-26 15:10
JL  指令是有符号当选条件转移指令  含义是小于/不大于转移    
其标志位 是SF≠OF AND ZF=0转移
nekaxi  
      [第7楼]   [ 回复时间:2007-11-14 18:39 ]   [引用]   [回复]   [ top ]
荣誉值:9 
信誉值:6 
注册日期:2007-10-10 08:31
test    ebx, ebx  
jl      short 0044ABC5 ----------->摘自反汇编代码,使用应该不会有错吧? 

test    ebx, ebx一般用来判断EBX是否为0,所以上面的用法的确令人费解!!!!
cxn  
      [第8楼]   [ 回复时间:2007-11-14 22:33 ]   [引用]   [回复]   [ top ]
荣誉值:179 
信誉值:6 
注册日期:2007-07-09 19:18
这个是汇编的技巧,刚开始也很费解呵呵. 
TEST影响 C,O,P,Z,S  而JL根据 SF≠OF AND ZF=0跳转 
要想跳转至少ebx中的数不能为0 (为0了ZF就该为1了) 
而OF位没有溢出所以始终为0 所以只能是SF为 1 才跳转 
所以 条件满足SF=1 OF=0 ZF=0时也就是当ebx中的数为负数时才跳转. 
也就是如果ebx中的数为负跳到0044ABC5 

同上指令还可以写为  
AND EBX,EBX 
JL SHORT 0044ABC5 
或 
OR EBX,EBX 
JL SHORT 0044ABC5 
这两条是不是更令人费解?

你可能感兴趣的:(xorl %eax, %eax)