首页
社区
课程
招聘
[旧帖] [求助]汇编中的AND指令 0.00雪花
发表于: 2009-2-21 23:07 12691

[旧帖] [求助]汇编中的AND指令 0.00雪花

2009-2-21 23:07
12691
教程上说是 说AND 为逻辑与运算   不懂```没   然后在网上搜到说AND 有个屏蔽作用 懂了  

但不知道到底是有什么用的~    刚才  看了一位大大的一段代码  就更疑惑了   先贴出来(后面括

号中的是我自己的理解  各位大虾看下有什么不对的地方没):

  001 MOV EDI 00000004           (将 4 存入EDI中)
  002 AND EAX 00000003            (将 EAX 中存储的值和  3  进行逻辑与运算 结果存入EAX)
  003 JMP [EAX+EDI]                   (跳转到 EXA+EDI 的值所代表的地址去)
  004 ...                                       (相当于下面C语言中的case 0)
  005 ...                                       (相当于下面C语言中的case 1)
  006 ...                                       (相当于下面C语言中的case 2)
  007 ...                                       (相当于下面C语言中的case 3)
  相当于
  switch(EAX%4)         /"选择语句为: EAX代表的值除以4 后 的余数"/
  {
     case 0:004;            /"EAX除以4后余0的选择"/
     case 1:005;            /"EAX除以4后余1的选择"/
     case 2:006;            /"EAX除以4后余2的选择"/
     case 3:007;            /"EAX除以4后余3的选择"/
  }  

研究了2个小时了  就是不懂  AND在句中起何作用 还有后面一句无条件跳转所指的值  教材上也

没有类似的列子  只有来这里寻求各位前辈的帮助了   也许你们会觉得很简单   但作为一个汇编

初学者 我实在是看不懂     还忘各位不吝赐教

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是按位与操作
2009-2-21 23:12
0
雪    币: 0
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
逻辑与和按位与不同
比如 if 2=3 && 2=2
如果2等于3和2=2都是真的话就为真
按位与的意思是 2 and 3
00000010
00000011
------------
00000010
知道意思了吧?
2009-2-22 04:49
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
把你的数转成二进制

在计算
2009-2-22 08:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
各位没理解我的意思啊~   我是想问
  002 AND EAX 00000003
   003 JMP [EAX+EDI]

是怎样实现   switch(EAX%4)    的功能的
2009-2-22 14:05
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
若这不是讲解用的PCode, 就可能是你抄错了
全贴出来看看
2009-2-22 14:27
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
EAX是一个32位数,从右到左可以标成0到31位,第n位代表2的n次方,比如数字7的最后4位是0111,就是0*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 0 + 4 + 2 + 1 = 7,从这里可以看出,第2位以及第二位以上的每一位都是4的倍数,所以只有第0位和第一位决定余数。这里AND EAX,3就是你理解的“屏蔽”掉后面的所有位,而只留下第0位和第一位。

AND EAX,3 的结果可能是0,1,2或者3,它实现了EAX%4。而switch的实现是通过跳转的地址表实现的,EDI指向地址表的开始,EAX可以看作这个表的元素的偏移。比如表里存的数值如下
004: 30
005: 50
006: 70
007: 90
edi开始被赋值为004,如果EAX%4==2,那么003这句里面 EAX+EDI 就是 2+004 = 006,[006]的值是 70,结果就是 JMP 70,而地址70对应的就是 case 2 的代码。
2009-2-22 14:47
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你太强了

膜拜+学习
2009-2-22 14:52
0
雪    币: 201
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
恩,学习中!
2009-2-22 16:52
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
膜拜七楼,再拜
2009-2-22 23:44
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了
2009-3-3 12:22
0
雪    币: 59
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
and使EAX只能取0,1,2,3+ESI,来实现CASE 4,5,6,7.有道理啊学习了
2009-3-3 12:40
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
mark

新人就得靠多学习
2009-3-3 14:12
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
是逻辑与和按位与有区别的,
执行AND EAX,3H
后,eax只用四中结果
0H,1H,2H,3H
2009-9-7 09:55
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
and的意思的搞懂:and  eax,00000003 就是把十六进制的3 写成二进制数11,并且eax中的也写成二进制数,按每一位分别与11做与运算,最后结果存入eax。这里关键看EAX,假设为0,那么那么and  eax,00000003 的结果:eax中为0;JMP [EAX+EDI] 就为jmp 004。
2009-9-7 12:47
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
进来学习下在
2009-9-9 12:20
0
游客
登录 | 注册 方可回帖
返回
//