個人檔案共享空间标题相片部落格清單 工具 說明
4月25日

我的老问题集锦

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

回應 (7)

請稍候...
很抱歉,您輸入的回應過長。請縮短您的回應。
您尚未輸入內容,請再試一次。
很抱歉,目前無法新增您的回應,請稍後再試。
若要新增回應,您的父母必須先給您權限。要求權限
您的家長已關閉回應功能。
很抱歉,目前無法刪除您的回應,請稍後再試。
您已超過每日回應上限次數,請於 24 小時後再試一次。
由於系統顯示您可能傳送垃圾郵件給其他使用者,因此您帳號中的回應功能已遭停用。 如果您認為自己帳號遭錯誤停用,請連絡 Windows Live 支援
請完成下列安全檢查,以完成回應。
您輸入的安全檢查字元必須與圖片或音訊中的字元相符。

若要新增回應,請以您的 Windows Live ID 登入 (若您使用 Hotmail、Messenger 或 Xbox LIVE,則您已擁有 Windows Live ID)。登入


沒有 Windows Live ID?註冊

9 月 8 日
沒有名稱撰寫:
wow gold!All wow gold US Server 24.99$/1000G on sell! Cheap wow gold,wow gold,wow gold,Buy Cheapest/Safe/Fast WoW US EU wow gold Power leveling wow gold from the time you World of Warcraft gold ordered! wow power leveling wow power leveling power leveling wow power leveling wow powerleveling wow power levelingcheap wow power leveling wow power leveling buy wow power leveling wow power leveling buy power leveling wow power leveling cheap power leveling wow power leveling wow power leveling wow power leveling wow powerleveling wow power leveling power leveling wow power leveling wow powerleveling wow power leveling buy rolex cheap rolex wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling -318022707311508
6 月 21 日
1 月 17 日
yangjane撰寫:
“上海今夜将我埋葬”是您写的?
4 月 26 日
方枪枪撰寫:
深表同情……
4 月 26 日
W.Bonnie撰寫:
每次看到你在部落格贴这种
就很想拿板砖hai你~~
4 月 26 日
彭韬撰寫:
当年你还叫我看过2篇,一晃4年了
4 月 26 日

引用通告 (11)

此內容的引用通告是:
http://eparg.spaces.live.com/blog/cns!59BFC22C0E7E1A76!742.trak
引述這則內容的部落格