探 自谦 必胜

KISS:Keep It Simple and Stupid

Home / About / Contract / Wiki / Guestbook

C 专家编程中提到一个小故事

季军作品所花的时间比预想的时间还要稍少一些。该程序的构思最为周详,程序员殚精竭虑,用优化机器代码来解决问题,并把指令作为整型数组存储在程序中,由于在程序中覆盖堆栈上的返回地址是非常容易的(正如Bob Morris,Jr. 1988年在Internet蠕虫中所做的那样),所以程序可以跳转到这个整型数组并逐条执行这些指令。所记录的时间如实反映了这些指令解决问题的时间。

这里是完整版本

我们来看一个这样的程序:

                                                                                               
    typedef int(*MAX)(int ,int);                                                                     
    int main (int argc, char const *argv[])                                                          
    {                                                                                                
        char fun[]={0x55,0x89,0xe5,0x8b,0x45,0x08,0x39,0x45,0x0c,0x0f,0x4d,0x45,0x0c,0x5d,0xc3};     
        int a=5;                                                                                     
        int b=4;                                                                                     
        int c;                                                                                       
        MAX max=fun;                                                                                 
        c=max(a,b);                                                                                  
        printf("c=%d\n",c);                                                                          
        return 0;                                                                                    
    }

上述代码中的fun是如下函数的机器码实现


int max(int a,int b)                                                                             
{                                                                                                
    return (a>b)?a:b;                                                                            
} 

上述代码在x86, gcc4.3上编译运行通过


Commenting is closed for this article.