首页
社区
课程
招聘
[求助]一个汇编函数的问题
发表于: 2008-12-17 19:02 5038

[求助]一个汇编函数的问题

2008-12-17 19:02
5038
00401025   .  90            nop
00401026   ?  EB 1A         jmp     short 00401042
00401028   ?  5F            pop     edi
00401029   ?  57            push    edi
0040102A   ?  5E            pop     esi
0040102B   .  33DB          xor     ebx, ebx
0040102D   ?  33C9          xor     ecx, ecx
0040102F   ?  B9 6C020000   mov     ecx, 26C//ecx赋值
00401034   ?  43            inc     ebx//EBX加1???
00401035   ?  3BD9          cmp     ebx, ecx//对比
00401037   ?  74 0E         je      short 00401047//跳转,读到最后一个字符串,跳出出
00401039   ?  AC            lods    byte ptr [esi]//串读取
0040103A      C0C8 03       ror     al, 3 //右移3位???
0040103D      34 20         xor     al, 20//异或运算
0040103F   .  AA            stos    byte ptr es:[edi]//串存储
00401040   .^ EB F2         jmp     short 00401034//住上跳,去循环
00401042   ?  E8 E1FFFFFF   call    00401028
00401047   .  55            push    ebp
00401048   .  8BEC          mov     ebp, esp
0040104A      81            db      81
0040104B      C4            db      C4
0040104C      B4            db      B4
0040104D      FE            db      FE
0040104E      FF            db      FF
0040104F      FF            db      FF

---------------------------------------------------
上面这段程序里的一个函数我看不懂,想请教一下各位老师
00401028应该是这个函数的开头,前面的都没有问题
主要是在0040103A的地方.有一个ror     al, 3
ror应该是循环右移3位
这里的右移3位我有点晕了,网上的资料说,右移3位,就是"每一次移动都表示"除以 2"",不知道这样算对不对
如果按这样的运算,5D 除3次2,应该等于B,10进制的11,可是下面的数据等于AB
下面是程序运行时候的数据

5D AB 8B  (93  171 139)  (01011101 10101011)
66 CC EC  (102 204 236)  (01100110 11001100)
0D A1 81  (13   161 129)  (00001101 10100001)
27 E4 C4  (39   228 196)  (00100111 11100100)
A4 94 B4  (164 148 180)   (10100100 10010100)

如果取的串是5D,经过ror al,3运算以后,al就变成AB,再xor 20就会变成8B,后面是10进制和2进制的数据

我就是想问一下
0040103A      C0C8 03       ror     al, 3 //右移3位???
这句起到什么作用?用c语言可以描述出来吗?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 180
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
LZ什么都只会问,你自己不会查手册么,!!!
2008-12-17 19:12
0
雪    币: 318
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
懂就回答,不懂就打的闪开...

那么多费话,我要是能查到还会问吗?你以为人人都像你一样?
2008-12-17 19:17
0
雪    币: 180
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
循环移位指令

格式: ROL OPRD1,COUNT ;不含进位标志位CF在循环中的左循环移位指令.
----  ROR OPRD1,COUNT ;不含进位示志位CF在循环中的右循环移位指令.
       RCL OPRD1,COUNT ;带进位的左循环移位指令.
       RCR OPRD1,COUNT ;带进位的右循环移位指令.

功能: 循环移位指令是指操作数首尾相连的移位操作.按进位标志CF是否参加循环移位,又可分为不带CF的循环移位和   ----  带CF的循环移位两类,每一 类都可进行左移或右移,循环移位的次数由COUNT操作数给出.

说明:

       1. 本指令组只影响标志CF、OF.OF由移入CF的内容决定,OF取决于移位一次后符号位是否改变,如改变,则OF=1.
----
       2. 由于是循环移位,所以对字节移位8次; 对字移位16次,就可恢复为原操作数.由于带CF的循环移位,可以将CF            的内容移入,所以可以利用它实现多字节的循环.

       3. 示例: 将AL中的组合的两个BCD分解为两个未组合的BCD数,存于BH及BL寄存器中.程序为:

                MOV AH,AL  ;保存AL内容至AH中
                MOVCL,4    ;循环次数4送CL
                SHR AL,CL  ;将AL右移4次,高4位移至低4位
                MOV BH,AL  ;高位BCD送BH中
                AND AH,0FH ;得到低位BCD数
                MOV BL,AH  ;低位BCD数送BL中

          注意: 以上程序中的指令SHR AL,CL如改为SAR AL,CL,虽然最高4位可移入低4位,但最高位不为0,故应加入一                 条指令AND AL,0FH.否则,若最高位不为0时,将得到错误结果.
2008-12-17 19:25
0
雪    币: 318
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢

是我错了,循环右移,关键在于循环.再看看
2008-12-17 19:31
0
雪    币: 180
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我是一个马甲,嘿嘿
2008-12-17 19:34
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
5D  ==>01011101
第一次  10101110
第二次  01010111
第三次  10101011
2008-12-17 19:38
0
雪    币: 318
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
总算明白了,可是怎么来实现呢?

转换以后,自动补齐8位,取最后一位,放到第一位,循环3次?
好吧.就这样试试,不知道谁能提供一个更好的算法
2008-12-17 19:54
0
雪    币: 318
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
终于写出来了,可能代码不太好看,不过我尽力了
<?
//$num为要循环的次数
function ROR_de ($str,$num){
	$str = base_convert($str,16,2);//把16进转成2进制
	$bin = substr("00000000",0,8 - strlen($str)) . $str;//不足8位前面补0
for($i = 0 ; $i < $num; $i++){
	$bin =substr($bin,-1,1).substr($bin,0,7);//循环右移1位
   }
return dechex(bindec($bin));//转回去
}
echo ROR_de('5D',3);
//显示ab
?>
2008-12-17 23:02
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主您这样的态度 以后很少人回答你问题的

你喜欢你的技术 但你的态度我不喜欢`````

如:感激拌倒你的人 因为他坚强了你的意志!
2008-12-17 23:10
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
11
2008-12-17 23:22
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
12
好伤心啊........
大家继续......
2008-12-18 08:57
0
雪    币: 427
活跃值: (65)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
不要吵了,安心玩游戏吧。
2008-12-18 09:31
0
雪    币: 318
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
呵呵..我上面已经认识到自已的错误了.感谢书呆头

不过个人感觉,没有营养的话,还是少说为好
2008-12-18 13:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
顶起。
没有营养就是浪费彼此的时间。

膜拜下看雪的牛人们
2008-12-20 09:45
0
游客
登录 | 注册 方可回帖
返回
//