这是GNU的汇编
xorl %eax, %eax(这句起什么作用)
按位异或,相同的位置为0,不同的位置为1,eax和eax的每一位都相同,所以相当于清零。
movl 8(%ebp), %ecx
testl %ecx, %ecx(这句起什么作用)
jle .L3
8(%ebp)是第一个参数,检验它的值,若小于等于0则转
其它的,看看GNU汇编的语法吧。
在汇编代码中经常看到
这个指令可以将寄存器 %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转移 | | |
|
|
|
|
[第6楼] [ 回复时间:2007-11-14 09:39 ] [引用] [回复] [ top ]
|
|
荣誉值:106 信誉值:0 注册日期:2007-06-26 15:10 |
JL 指令是有符号当选条件转移指令 含义是小于/不大于转移 其标志位 是SF≠OF AND ZF=0转移 | | |
|
|
|
|
[第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,所以上面的用法的确令人费解!!!! | | |
|
|
|
|
[第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 这两条是不是更令人费解? | | |