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 
这两条是不是更令人费解?

7. (14 分)现有两段 C 程序如下: mapvec.c 与 main.c 经编译后得到的可重定位目标文件 mapvec.o 和 main.o, 经反汇编后分别如下: (1) 请列出汇编代码 mapvec.o 中需要重定位的全局变量的引用地址(相对此函数第一条指令地址的字节数), 并给出其对应的 C 程序中的定义名. (6 分) (2) 请列出汇编代码 main.o 中全局变量和函数 mapvec 的重定位引用地址, 并计算 mapvec 在最终可执行目标文件中重定位引用地址处的值(以 16 进制给出, 小 端机器). (8 分) 注:可执行目标文件的.text 节是由 main.o 和 mapvec.o 各自的.text 节拼接而成, 即: 从地址 0x0804853d 开始 main.o 中.text 节, 随后是 mapvec.o 的.text 节. /* main.c */ int vec[4] = {1,2,3,4}; int count = 4; extern int factor; void mapvec(int); int main(){ mapvec(factor); } /* mapvec.c */ extern int count; extern int vec[]; int factor = 3; void mapvec(int f){ int k; for ( k = 0; k < count; k++) vec[k] = vec[k] * f; } struct node { int *p; struct { int x; int y; } s; struct node *next; } void np_init(struct node *np) { np -> s.x = ; np -> p = ; np -> nx = ; } return (4) ; } movl 8(%ebp), %eax movl 8(%eax), %edx movl %edx, 4(%eax) leal 4(%eax), %edx movl %edx, (%eax) movl %eax, 12(%eax) int f1(unsigned x) { int y = 0; while ( (1) ){ (2) ; (3) ; } return y & 0x1; } movl 8(%ebp), %ebx movl $0, %eax testl %edx, %edx je .L1 .L2: xorl %edx, %eax shrl $1, %edx jne .L2 .L1: andl $1, %eax ……………………………… 装 ……………………………… 订 ………………………………… 线 ……………………………… 学号________________________姓名________________________班级__________________________任课教师_____________________ ……………………………… 密 ……………………………… 封 ………………………………… 线 ……………………………… 安 徽 工 业 大 学 试 题 纸 第3页,共5页 00000000 <mapvec>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 10 sub $0x10,%esp 6: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) d: eb 1e jmp 2d <mapvec+0x2d> f: 8b 45 fc mov -0x4(%ebp),%eax 12: 8b 04 85 00 00 00 00 mov 0x0(,%eax,4),%eax 19: 0f af 45 08 imul 0x8(%ebp),%eax 1d: 89 c2 mov %eax,%edx 1f: 8b 45 fc mov -0x4(%ebp),%eax 22: 89 14 85 00 00 00 00 mov %edx,0x0(,%eax,4) 29: 83 45 fc 01 addl $0x1,-0x4(%ebp) 2d: a1 00 00 00 00 mov 0x0,%eax 32: 39 45 fc cmp %eax,-0x4(%ebp) 35: 7c d8 jl f <mapvec+0xf> 37: 90 nop 38: c9 leave 39: c3 ret 00000000 <main>: 0: 8d 4c 24 04 lea 0x4(%esp),%ecx
最新发布
09-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值