VCHELP上我一些以前的有趣的post. 注定要当support阿
下面是我问的第一个问题
http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=18335
请高手给我解释一下几个c语言到汇编原代码中间我觉得迷惑的地方,谢谢。我的解释和问题我写在<>中,而且编号
--- E:\term3\mas.c ----------------------------------------------------------------------------------------------------
1: int ff();
2: int main()
3: {
0040B4F0 push ebp <保存基地址>
0040B4F1 mov ebp,esp 〈设定新的基地址 问题1:为什么用sp??>
0040B4F3 sub esp,50h <设定stack顶位置,开辟50h个空间>
0040B4F6 push ebx <save ebx>
0040B4F7 push esi <save esi>
0040B4F8 push edi <save edi>
0040B4F9 lea edi,[ebp-50h] <保存 rep stos起始空间>
0040B4FC mov ecx,14h <设定rep stos执行数目 问题3:为什么是14h>
0040B501 mov eax,0CCCCCCCCh <设定rep stos放进去的内容>
0040B506 rep stos dword ptr [edi] <问题4:为什么要放具体的数进去?>
4: char *f;
5: int x,y,z;
6: f=(char*)malloc(32*sizeof(char));
0040B508 push 20h <传递malloc的参数>
0040B50A call malloc (004026d0) <调用malloc>
0040B50F add esp,4 <问题5:为什么要add 4??因为如果不malloc就没有这句话>
0040B512 mov dword ptr [ebp-4],eax<保存char *f>
7: f[20]='a';
0040B515 mov eax,dword ptr [ebp-4] <取出*f>
0040B518 mov byte ptr [eax+14h],61h <在f[20]放'a'>
8: z=ff();
0040B51C call @ILT+5(_ff) (0040100a)<调用ff() 问题6:为什么要先call一个
jmp语句,然后再jmp到ff()的地址>
0040B521 mov dword ptr [ebp-10h],eax <保存ff()返回结果>
9: if(z>0)
0040B524 cmp dword ptr [ebp-10h],0 <比较>
0040B528 jle main+3Ch (0040b52c) <语句跳转>
10: goto test;
0040B52A jmp test (0040b539) <语句跳转>
11: x=10;
0040B52C mov dword ptr [ebp-8],0Ah <保存10到x>
12: y=x;
0040B533 mov ecx,dword ptr [ebp-8] <保存x到ecx>
0040B536 mov dword ptr [ebp-0Ch],ecx <保存ecx到y>
13: test:
14: free(f);
0040B539 mov edx,dword ptr [ebp-4] <准备传递free()参数>
0040B53C push edx <传递free()参数>
0040B53D call free (00403110) <调用free()>
0040B542 add esp,4 <问题7:为什么又要add 4???>
15: return 0;
0040B545 xor eax,eax <设定返回结果>
16: }
0040B547 pop edi <load edi>
0040B548 pop esi <load esi>
0040B549 pop ebx <load ebx>
0040B54A add esp,50h <问题8:为什么要add 50h而不是直接pop ebp>
0040B54D cmp ebp,esp <问题9:为什么要cmp然后在__cheksp,有什么用>
0040B54F call __chkesp (0040b4b0)
0040B554 mov esp,ebp <load esp>
0040B556 pop ebp <load ebp>
0040B557 ret
--- No source file ------
还好从来没有客户问过类似的问题
/********************************/
接下来的post是关于汇编的,一个完全的汇编mp3播放器,下载地址:
http://www.heijoy.com/mp3/xlmp3.rar
http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=20431
今天测试了一下那个程序,在Windows 2003上工作的也不错啊。
/********************************/
然后是关于Exception handler的。当时也不知道是在什么地方看到了__try/__except这样的语法,莫名其妙就去问了:
http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=24019
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int k(void (*d)())
{
d();
return 0;
}
void j(void (*d)())
{
d();
}
void test()
{
cout <<0;
}
int main()
{
// int *jkm=(int*)malloc(sizeof(int));
/* void (*p)(void (*)());
p=j;
j(test);
int (*pp)(void (*)());
pp=k;
p(test);*/
_CrtDumpMemoryLeaks();
return 0;
}
以上是一段随便写的代码,按照msdn,这样可以dump出malloc造成的memory leak.但是我再main里面直接return,debug里面居然显示
Loaded 'C:\WINNT\System32\ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\KERNEL32.DLL', no matching symbolic information found.
Detected memory leaks!
Dumping objects ->
c:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {62} normal block at 0x004815A0, 33 bytes long.
Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD
c:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {61} normal block at 0x004815F0, 40 bytes long.
Data: <t F > 74 B2 46 00 16 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.
The thread 0x514 has exited with code 0 (0x0).
The program 'C:\Documents and Settings\Administrator\桌面\subject_1_19199\Debug\node_lev.exe' has exited with code 0 (0x0).
说有内存泄漏.这是第一个不解
同时我想问,在c++/vc++里面如何检查new造成的内存泄漏.我在msdn上看到一些方法,比如用
CMemoryState
但是我记得我以前看到过一种简单dump的方法,也是前面include,然后好像要define new __new的.能给一个例子吗??
第三个问题.常常看到一些关键字前面有__.比如__int 32 __try __catch等等.我想问一下,这代表什么??
谢谢
现在终于大概明白了。不过那个CMemoryState,还是没有用过。
/********************************/
然后问题是关于网络的,我现在都忘记问这些问题是干啥?帮助寝室的兄弟上XX网站?
http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=38150
几个问题,关于网络的
几个问题哈,谢谢
1,防火墙跟路由器有什么差别
注意,我这里定义的路由器是能够在两个子网里面交换数据的东西.如果你有一个router,这个router的两个ip是202.120.80.1 192.168.1.1,那么,这个router就不是真正的路由器.因为192.168.1.xxx这个子网的数据永远都不会发送到lan外面去的.但是这个router却可是是一个防火墙,192.168.1.xxx的电脑都可以通过这个防火墙上网.那么,也就是说,这个防火墙,这个router,其实也就是一个代理服务器。好,问题是,防火墙跟路由器有什么差别
2,防火墙跟代理服务器有什么差别?
3,网关是什么?跟代理服务器,路由器,防火墙有什么差别?
网关是不是就是default router?
如果我电脑ip:192.168.1.2,我在这块网卡上指定网关192.168.1.1,这个192.168.1.1的确切含义是什么?一般来说,每台上网的电脑都有一个ip,同时有一个default router地址,这个地址是要手动设定的.有时候拨号程序帮你设定好了.那么,我填写的网关地址是不是其实就是指的这个default router的地址?但是,如果遇上我的ip是192.168.1.2的情况,我填写的网关是192.168.1.1,上面说了,192.168.1.1这台电脑其实不是real router,那么系统是不是把这个所谓的网关悄悄解释成我指定的代理服务器?但是如果我不设定这个网关,我在ie的代理服务器设置里面去设定地址为192.168.1.1,就不能上网,这说明这两个还是有区别的,区别是什么呢?
4,主要问题就上面的。剩下的问题是,代理服务器是可以级联的,我在win2k server里面应该如何设置。比如我win2k server有两个ip,同时我有一个可以上网的router,router的其中一个ip是192.168.1.1,我的win2k的两个ip 是192.168.1.2 192.168.2.1。我在192.168.1.2的默认网关上设定为192.168.1.1,那么我的win2k server就可以上网了,但是如果我连接的192.168.2.xxx的客户要上网,我在客户端就因该设定网关是192.168.2.1,但是我在win2k server上应该如何设定?
其实现在看来,这些东西就是一个: network device. 你看现在我跟pt上网那个东西,router, firewall, switch, NAT proxy, port mapper......什么都有了
/********************************/
下面是我最喜欢的一个问题,如果要让一个学过C语言的人抓狂,就是让他解释下面这个定义是什么:
char * const *(*ss[23][200])(void (*)(int h,void (*)(void)));
http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=38522&page=1
大家这样理解
char p;
char *p;
char * const p;
const char * p;
const char * const p;
char p[100];
char *(p[100]);
char (*p)[100];
char **p[100];
char *(*p)[100];
void (*p)(void);
int (*p)(int);
int (*p)(void (*)(void));
char * const * (*p[23][200])(void);
char * const * (*p[23][200])(int,void(*)(void));
final
char * const *(*ss[23][200])(void (*)(int h,void (*)(void)));
一个一个看下来就ok了
我现在看到,还是很抓狂的。还好有我当时自己的解释在那里,不然今天又要浪费几小时去复习C语法了
/********************************/
我居然也有对算法感兴趣的时候。如果写程序来求全排列呢?你能想到更好的方法吗?
http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=20790
define NUM 6
int nLevel=0,List[256]={0},ALL;
p()
{
int nCount,nJudge,key;
nLevel++;
if(nLevel>NUM)
{
print();
nLevel--;
return;
}
for(nCount=1;nCount<=NUM;nCount++)
{
key=0;
for(nJudge=0;nJudge<=nLevel-1;nJudge++)
if(nCount==List[nJudge])
{
key=1;
break;
}
if(key==0)
{
List[nLevel]=nCount;
p();
}
}
nLevel--;
}
print()
{
int nCount;ALL++;
for(nCount=1;nCount<=NUM;nCount++)printf("%d ",List[nCount]);
printf("\t%d\n",ALL);
}
main()
{p();
}
到目前为止,这也就是我研究的唯一的一个算法
/********************************/
下面这个是跟我没啥关系的,大家有兴趣可以看看。我这一辈子不指望了
http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=39448&forum_id=55
http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=39569
/********************************/
no5论坛的朋友马舒德提供了下面一段全排列算法,比我的算法好
public class allsort {
/** Creates a new instance of allsort */
public allsort() {
}
public static void swap(int[] a,int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static void perm(int[] list,int k,int m){
if(k==m){
for(int i=0;i<=m;i++)
System.out.print(list[i]);
System.out.println();
}
else
for(int i=k;i<=m;i++)
{
swap(list,k,i);
perm(list,k+1,m);
swap(list,k,i);
}
}
public static void main(String args[]){
int[] list={1,2,3,4,5,6,7,8,9,0};
perm(list,0,9);
}
}
http://spaces.msn.com/eparg/blog/cns!59BFC22C0E7E1A76!742.entry