能力值:
( LV3,RANK:20 )
2 楼
1.告诉你一个最简单的方法,在C中用宏
asm{
}
2.另,多定义变量取代寄存器。。
3.拉到IDA中,按F5
能力值:
( LV2,RANK:10 )
3 楼
标记了一下.
push ebp mov ebp,esp sub esp,0e8h push ebx push esi push edi lea edi,[ebp-0e8h] mov edi,[ebp-0e8h] mov ecx,3ah mov eax,0xcccccccch rep stos,dword ptr [edi] ;memset '\cc' mov eax,dword ptr [a] add eax,dword ptr mov dword ptr [d],eax ;d = a + b; mov dword ptr ,1 mov dword ptr [c],0 addr 1: cmp dword ptr [c],64h ;for (c=0;c<100;c++) jge myfunction+46h (411a66h) (addr 2) mov eax,dword ptr [c] add eax,dword ptr mov dword ptr [c],eax jmp myfunction+35h (411a55h) (addr 1) addr 2 mov eax,dword ptr [c] ;100 mov dword ptr [ebp-0e8h],eax cmp dword ptr [ebp-0e8h],0 je myfuction+63h (411a83h) (addr 3) cmp dword ptr [ebp-0e8h],1 je myfuction+6ah (611a8ah) (addr 4) jmp myfuction+72h (411a92h) (addr 5) addr 3 mov dword ptr [d],1 addr 4 mov eax,dword ptr [c] mov dword ptr [d],eax jmp myfuction+79h (411a99h) (addr 6) addr 5 mov dword ptr [d],0 addr 6 mov eax,dword ptr [d] pop edi pop esi pop ebx mov esp,ebp pop ebp ret
能力值:
( LV2,RANK:10 )
4 楼
int myfunction(int a, int b)
{
int d,i,c;
d = a + b;
i = 1;
c = 0;
while (c < 100)
{
c = c + i;
}
switch(c)
{
case 0:
d = 1;
case 1:
d = c;
break;
default:
d = 0;
}
return d;
}
能力值:
( LV2,RANK:10 )
5 楼
嗯,按楼上的写吧,不过没必要用memset,那句rep stos应该是VC++在debug编译模式下自己加进去的。
能力值:
( LV2,RANK:10 )
6 楼
汇编 以前看的 王爽的 书 现在 忘了
现在 还得重新看汇编
能力值:
( LV2,RANK:10 )
7 楼
看着好像是这么回事
还有一个地方搞不清:
00411a2c lea edi,[ebp-0e8h]
00411a32 mov ecx,3ah
00411a37 mov eax,0cccccccch
00411a3c rep stos dword ptr [edi] 我知道这段代码在干什么 可弄不明白为什么
能力值:
( LV2,RANK:10 )
8 楼
00411a2c lea edi,[ebp-0e8h]
00411a32 mov ecx,3ah
00411a37 mov eax,0cccccccch
00411a3c rep stos dword ptr [edi] rep stos dword ptr [edi]
填充EDI所指的 也就是开辟的堆栈空间[ebp-0e8h]
eax是循环次数
ecx是填充的值 0xCCCCCCCCH 相当于 四个 '\CC' (默认初始化用的值 int 3的opcode)
3ah × 4 = 0e8h
能力值:
( LV2,RANK:10 )
9 楼
[QUOTE=simplelxf;765111]看着好像是这么回事
还有一个地方搞不清:
00411a2c lea edi,[ebp-0e8h]
00411a32 mov ecx,3ah
00411a37 mov eax,0cccccccch
00411a3c rep stos dword ptr [edi] 我知道这段代码在干什...[/QUOTE]
这个是Debug版本的编译器插进去的代码,release版本的就不包含该信息。
具体可参考天书夜读第一个实例
main函数中只包含
return 0 语句
能力值:
( LV2,RANK:10 )
10 楼
明白了 谢谢大家
能力值:
( LV2,RANK:10 )
11 楼
学习了,
能力值:
( LV3,RANK:20 )
12 楼
没分啊!!!!
能力值:
(RANK:300 )
13 楼
[QUOTE=zapline;765145]00411a2c lea edi,[ebp-0e8h]
00411a32 mov ecx,3ah
00411a37 mov eax,0cccccccch
00411a3c rep stos dword ptr [edi] rep stos dword ptr [edi]
填充EDI所指的 ...[/QUOTE]
ECX 是循环次数,EAX是填充。
能力值:
( LV3,RANK:20 )
14 楼
如果写成[ebp+8],[ebp+0c]还容易理解点。
能力值:
( LV6,RANK:90 )
15 楼
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
int __cdecl myfunction(int a, int b)
{
int d=a+b;
int i=1;
int c=0;
while (c<100)
{
c=c+i;
}
switch (c)
{
case 0:
{
d=1;
d=c;
break;
}
case 1:
{
d=c;
break;
}
default:
d=0;
}
return d;
}
int main(int argc, char* argv[])
{
printf("Hello World! %d \n",myfunction2(10,20));
system("PAUSE");
return 0;
} VC6 编译出来和你发的图 一模一样哈~~~