﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-HelloWorld 善战者,求之于势,不责于人;故能择人而任势。-随笔分类-Linux/C</title><link>http://www.blogjava.net/zhaochengming/category/26802.html</link><description> 知止而后有定，定而后能静，静而后能安，安而后能虑，虑而后能得。物有本末，事有终始。知所先后，则近道矣。</description><language>zh-cn</language><lastBuildDate>Tue, 23 Mar 2010 04:01:45 GMT</lastBuildDate><pubDate>Tue, 23 Mar 2010 04:01:45 GMT</pubDate><ttl>60</ttl><item><title>c++中const关键字使用详解 转自http://hi.baidu.com/nanting520/blog/item/28df02821bb9e793f703a6e1.html</title><link>http://www.blogjava.net/zhaochengming/archive/2009/02/06/253499.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Fri, 06 Feb 2009 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2009/02/06/253499.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/253499.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2009/02/06/253499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/253499.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/253499.html</trackback:ping><description><![CDATA[<div class="tit">c++中const关键字使用详解</div>
<div class="date">2007-11-17 00:36</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div id="blog_text" class="cnt">关于C++中的const关键字的用法非常灵活，而使用const将大大改善程序的健壮性。在网上搜寻相关主题，发现大多数文章雷同，而关键地方并不是很清楚。在网络资料，参考书的基础上，结合本人的一些体会总结如下，期望对大家有所帮助：<br />
            <br />
            <br />
            一 const基础<br />
            下面四个定义语句是大多数书籍讲解const关键字都会用到的，<br />
            [1]const int* a = &amp;b;<br />
            [2]int const *a = &amp;b;<br />
            [3]int* const a = &amp;b;<br />
            [4]const int* const a = &amp;b;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你能区分出上述四种情况，证明你基础不错，不过也不要高兴太早，这个只是最基础的部分了。不知道也很容易：如果const位于星号的左侧（不管const在类型修饰符的左还是右），则const就是用来修饰指针所指向的变量，即指针指向为常量；如果const位于星号的右侧，const就是修饰指针本身，即指针本身是常量。[1]和[2]的情况相同，都是指针所指向的内容为常量，这种情况下不允许对内容进行更改操作，如不能*a = 3 ；这样的一种声明方式的作用是可以修改pi这个指针所指向的内存地址却不能修改指向对象的值；[3]为指针本身是常量，而指针所指向的内容不是常量，这种情况下不能对指针本身进行更改操作，如a++是错误的;[4]为指针本身和指向的内容均为常量。<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外const 的一些强大的功能在于它在函数声明中的应用。在一个函数声明中，const 可以修饰函数的返回值，或某个参数；对于成员函数，还可以修饰是整个函数。有如下几种情况，以下会逐渐的说明用法：<br />
            A_class&amp; operator=(const A_class&amp; a);&nbsp;&nbsp;&nbsp; //A_class 为一个已经定义的类，下文同<br />
            void fun0(const A_class* a );<br />
            void fun1( ) const;&nbsp;&nbsp;&nbsp; // fun1( ) 为类成员函数<br />
            const A_class fun2( );<br />
            <br />
            二 const的初始化<br />
            先看一下const变量初始化的情况<br />
            1) 非指针const常量初始化的情况：<br />
            A_class b;<br />
            const A_class a = b;<br />
            2) 指针(引用)const常量初始化的情况：<br />
            A_class* d = new A_class(); <br />
            const A_class* c = d;<br />
            或者,<br />
            const A_class* c = new A_class();<br />
            引用： <br />
            A_class f; <br />
            const A_class&amp; e = f;&nbsp;&nbsp; // 这样作e只能访问声明为const的函数，而不能访问一般的成员函数；<br />
            [思考1]： 以下的这种赋值方法正确吗？<br />
            const A_class* c=new A_class();<br />
            A_class* e = c;<br />
            这种方法不正确，因为声明指针的目的是为了对其指向的内容进行改变，而声明的指针e指向的是一个常量，所以不正确；<br />
            [思考2]： 以下的这种赋值方法正确吗？<br />
            A_class* const c = new A_class();<br />
            A_class* b = c;<br />
            这种方法正确，因为声明指针所指向的内容可变；<br />
            <br />
            三 作为参数和返回值的const修饰符<br />
            <br />
            其实，不论是参数还是返回值，道理都是一样的，参数传入时候和函数返回的时候，初始化const变量<br />
            1 修饰参数的const,如,<br />
            void fun0(const A_class* a );<br />
            void fun1(const A_class&amp; a);<br />
            调用函数的时候，用相应的变量初始化const常量，则在函数体中，按照const所修饰的部分进行常量化，如形参为const A_class* a，则不能对传递进来的指针的内容进行改变，保护了原指针所指向的内容；如形参为const A_class&amp; a，则不能对传递进来的引用对象进行改变，保护了原对象的属性。<br />
            [注意]：参数const通常用于参数为指针或引用的情况;<br />
            2 修饰返回值的const，如,<br />
            const A_class fun2( ); const A_class* fun3( );<br />
            这样声明了返回值后，const按照"修饰原则"进行修饰，起到相应的保护作用。<br />
            const Rational operator*(const Rational&amp; lhs, const Rational&amp; rhs)<br />
            {<br />
            return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());<br />
            }<br />
            返回值用const修饰可以防止这样的操作发生:<br />
            Rational a,b;<br />
            Radional c;<br />
            (a*b) = c;<br />
            一般用const修饰返回值为对象本身（非引用和指针）的情况多用于二目操作符重载函数并产生新对象的时候。<br />
            [总结]一般情况下，函数的返回值为某个对象时，如果将其声明为const时，多用于操作符的重载。<br />
            通常，不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。<br />
            原因如下：如果返回值为某个对象为const（const A_class test = A_class 实例）或某个对象的引用为const（const A_class&amp; test = A_class实例），则返回值具有const属性，则返回实例只能访问类A_class中的公有（保护）数据成员和const成员函数，并且不允许对其进行赋值操作，这在一般情况下很少用到。<br />
            [思考3]： 这样定义赋值操作符重载函数可以吗？<br />
            const A_class&amp; operator=(const A_class&amp; a);<br />
            不正确；在const A_class::operator=(const A_class&amp; a)中，参数列表中的const的用法正确，而当这样连续赋值的时侯，问题就出现了：A_class a,b,c:(a=b)=c;因为a.operator=(b)的返回值是对a的const引用，不能再将c赋值给const常量。<br />
            <br />
            四 类成员函数中const的使用<br />
            一般放在函数体后，形如：<br />
            void fun() const;<br />
            如果一个成员函数的不会修改数据成员，那么最好将其声明为const，因为const成员函数中不允许对数据成员进行修改，如果修改，编译器将报错，这大大提高了程序的健壮性。<br />
            <br />
            五 使用const的一些建议<br />
            1 要大胆的使用const，这将给你带来无尽的益处，但前提是你必须搞清楚原委；<br />
            2 要避免最一般的赋值操作错误，如将const变量赋值，具体可见思考题；<br />
            3 在参数中使用const应该使用引用或指针，而不是一般的对象实例，原因同上；<br />
            4 const在成员函数中的三种用法（参数、返回值、函数）要很好的使用；<br />
            5 不要轻易的将函数的返回值类型定为const;6除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;<br />
            </div>
            </td>
        </tr>
    </tbody>
</table>
 <img src ="http://www.blogjava.net/zhaochengming/aggbug/253499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2009-02-06 10:27 <a href="http://www.blogjava.net/zhaochengming/archive/2009/02/06/253499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bcb中的dll调用dll例子</title><link>http://www.blogjava.net/zhaochengming/archive/2007/11/05/158275.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 05 Nov 2007 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/11/05/158275.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/158275.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/11/05/158275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/158275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/158275.html</trackback:ping><description><![CDATA[<p>#include &lt;windows.h&gt;<br />
#include "string.h"<br />
#include "Decode.h"</p>
<p>#pragma argsused<br />
typedef int (__stdcall *fun_AddFun)(int Data);<br />
HINSTANCE gLib = NULL;<br />
fun_AddFun gFun = NULL;<br />
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(reason) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_PROCESS_ATTACH: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char tPath[255];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetModuleFileName(hinst,tPath,255);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tSize = strlen(tPath)-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(tPath[tSize]!='\\') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --tSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tPath[tSize+1] = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(tPath,"Test.dll");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gLib = LoadLibrary(tPath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(gLib == NULL) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL,tPath,"Load Library Failed",MB_OK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gFun = (fun_AddFun)GetProcAddress(gLib,"AddFun");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_PROCESS_DETACH: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(gLib) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeLibrary(gLib);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gLib = NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br />
}</p>
<p>JNIEXPORT jint JNICALL Java_Encode_Add (JNIEnv *env, jclass cls, jint a, jint b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(gFun==NULL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tRe = gFun(100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a + b + tRe;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
}</p>
<p>&nbsp;int&nbsp; __declspec(dllexport) __stdcall fun_x(int a,int b)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(gFun==NULL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tRe = gFun(100);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a + b + tRe;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>}</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/158275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-11-05 15:37 <a href="http://www.blogjava.net/zhaochengming/archive/2007/11/05/158275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bcb中创建jni的dll要注意的地方</title><link>http://www.blogjava.net/zhaochengming/archive/2007/11/05/158258.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 05 Nov 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/11/05/158258.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/158258.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/11/05/158258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/158258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/158258.html</trackback:ping><description><![CDATA[C++Builder中创建jni的dll文件<br />
1.去除项目的Pakcages中的Build with runtime packages<br />
2.在Linker选项中去除Use dynamic RTL选项<br />
3.在Directories/conditionals中选择include path添加java的include和win目录
<img src ="http://www.blogjava.net/zhaochengming/aggbug/158258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-11-05 14:24 <a href="http://www.blogjava.net/zhaochengming/archive/2007/11/05/158258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c读写文件</title><link>http://www.blogjava.net/zhaochengming/archive/2007/11/02/157772.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Fri, 02 Nov 2007 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/11/02/157772.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/157772.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/11/02/157772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/157772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/157772.html</trackback:ping><description><![CDATA[<p>#include &lt;iostream.h&gt;<br />
#include &lt;cstdlib&gt;<br />
#include &lt;fstream&gt;&nbsp; <br />
#include &lt;stdio.h&gt; <br />
using namespace std;</p>
<p>int main(int argc, char *argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp; char* str = "e:/test/nihao.txt";<br />
&nbsp;&nbsp;&nbsp; FILE *t = fopen(str,"wb+");<br />
&nbsp;&nbsp;&nbsp; char tbuf[10]={0};<br />
&nbsp;&nbsp;&nbsp; fwrite(tbuf,1,100,t);<br />
&nbsp;&nbsp;&nbsp; fclose(t);<br />
&nbsp;&nbsp;&nbsp; system("PAUSE");<br />
&nbsp;&nbsp;&nbsp; return EXIT_SUCCESS;<br />
}<br />
</p>
<br />
<br />
FILE *tIn = fopen(szStr,"rb");<br />
&nbsp;&nbsp;&nbsp; if (tIn == NULL) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"文件不能打开!";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; fseek(tIn, 0, SEEK_END);<br />
&nbsp;&nbsp;&nbsp; int tSize = ftell(tIn);<br />
&nbsp;&nbsp;&nbsp; fseek(tIn, 0, SEEK_SET);<br />
&nbsp;&nbsp;&nbsp; char *tBuf = new&nbsp; char[tSize];<br />
&nbsp;&nbsp;&nbsp; fread(tBuf,tSize,1,tIn);<br />
&nbsp;&nbsp;&nbsp; fclose(tIn);
<img src ="http://www.blogjava.net/zhaochengming/aggbug/157772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-11-02 16:15 <a href="http://www.blogjava.net/zhaochengming/archive/2007/11/02/157772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用cpuid指令读取CPU信息</title><link>http://www.blogjava.net/zhaochengming/archive/2007/10/24/155600.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Wed, 24 Oct 2007 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/10/24/155600.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/155600.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/10/24/155600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/155600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/155600.html</trackback:ping><description><![CDATA[<p>用cpuid指令读取CPU信息<br />
#include &lt;stdio.h&gt;</p>
<p><br />
int main()<br />
{<br />
&nbsp;&nbsp;&nbsp; unsigned int eflags1, eflags2 = 0;<br />
&nbsp;&nbsp;&nbsp; unsigned int eax = 0;<br />
&nbsp;&nbsp;&nbsp; unsigned int ebx,ecx,edx;</p>
<p>&nbsp;</p>
<p><br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 测试CPU是否支持CPUID指令。<br />
&nbsp;&nbsp;&nbsp;&nbsp; * eflags寄存器的第21位，如果程序可以清楚/设置它，则说明CPU支持CPUID指令。否则不支持<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; /* 先取eflags */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("pushf\n\t"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "popl %%eax"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=a"(eflags1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "memory" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp; printf("original eflags is %p\n", eflags1);</p>
<p>&nbsp;&nbsp;&nbsp; /* 把eflags的第21位取反，写回寄存器中 */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("pushl %0\n\t"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "popf"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "g"(eflags1 &amp; ~( eflags1 &amp; (1&lt;&lt;21) ) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p>&nbsp;&nbsp;&nbsp; /* 检查一下现在的eflags，确认第21位和最初的值相反 */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("pushf\n\t"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "popl %%eax"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=a"(eflags2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "memory" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp; printf("modified eflags is %p\n", eflags2);</p>
<p>&nbsp;&nbsp;&nbsp; /* 把原来的eflags值设置回去 */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("pushl %0\n\t"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "popf"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "g"(eflags1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * FIXME: Intel文档并没有说，如果不支持CPUID的话，clear/set eflags的第21位会有什么错误。<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 它只说，在不支持CPUID指令的CPU上，如80386，执行CPUID会产生invalid opcode错误<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 所以，在这里我们不处理 读/写 eflags 第21比特失败的情形<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; eax == 1，则在eax中返回Family/Model/Stepping等信息<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; [0:3]&nbsp;&nbsp;&nbsp; stepping<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; [4:7]&nbsp;&nbsp;&nbsp; model<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; [8:11]&nbsp;&nbsp;&nbsp; family<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; [12:13]&nbsp;&nbsp;&nbsp; processor type<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; [16:19]&nbsp;&nbsp;&nbsp; extended model ID<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; [20:27]&nbsp;&nbsp;&nbsp; extended family ID<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("cpuid"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=a"(eax)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "0"(1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp; // printf("eax is %p\n", eax);</p>
<p>&nbsp;&nbsp;&nbsp; printf("Extended Family\t: %d\n", (0xff00000 &amp; eax) &gt;&gt; 20);<br />
&nbsp;&nbsp;&nbsp; printf("Extended Model\t: %d\n", (0xf0000 &amp; eax) &gt;&gt; 16);<br />
&nbsp;&nbsp;&nbsp; printf("Processor type\t: %d\n", (0x3000 &amp; eax) &gt;&gt; 12);<br />
&nbsp;&nbsp;&nbsp; printf("Family\t\t: %d\n", (0xf00 &amp; eax) &gt;&gt; 8);<br />
&nbsp;&nbsp;&nbsp; printf("Model\t\t: %d\n", (0xf0 &amp; eax) &gt;&gt; 4);<br />
&nbsp;&nbsp;&nbsp; printf("Stepping:\t: %d\n", (0xf &amp; eax));</p>
<p>&nbsp;&nbsp;&nbsp; printf("\n");</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * eax == 0x800000000<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 如果CPU支持Brand String，则在EAX中返 &gt;= 0x80000004的值。<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("cpuid"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=a"(eax)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "0"(0x80000000)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp; printf("Is CPU support Brand String? %s\n", eax &gt;= 0x80000004? "yes":"no");<br />
&nbsp;&nbsp;&nbsp; printf("\n");</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 如果支持Brand String，则EAX从0x80000002到0x80000004，每次增1，CPUID指令返回：<br />
&nbsp;&nbsp;&nbsp;&nbsp; * EAX&nbsp;&nbsp;&nbsp; : Processor Brand String<br />
&nbsp;&nbsp;&nbsp;&nbsp; * EBX&nbsp;&nbsp;&nbsp; : Processor Brand String Continued<br />
&nbsp;&nbsp;&nbsp;&nbsp; * ECX&nbsp;&nbsp;&nbsp; : Processor Brand String Continued<br />
&nbsp;&nbsp;&nbsp;&nbsp; * EDX&nbsp;&nbsp;&nbsp; : Processor Brand String Continued<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; if(eax &gt;= 0x80000004) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int brands[4]; //每次的eax、ebx、ecx、edx</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int i;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Brand String\t: ");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0x80000002; i &lt;= 0x80000004; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm volatile ("cpuid"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=a"(brands[0]), "=b"(brands[1]), "=c"(brands[2]), "=d"(brands[3])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "0" (i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s", (char *)brands);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //FIXME: 打出来的字符串是：In^Htel(R) Pentium(R^H) D CPU 2.80GHz</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //其中^H是个不可见字符，会把它前一个吃掉</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * eax == 0<br />
&nbsp;&nbsp;&nbsp;&nbsp; * eax&nbsp;&nbsp;&nbsp; : cpuid指令允许的最大eax输入值<br />
&nbsp;&nbsp;&nbsp;&nbsp; * ebx&nbsp;&nbsp;&nbsp; : "Genu"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * ecx&nbsp;&nbsp;&nbsp; : "ntel"<br />
&nbsp;&nbsp;&nbsp;&nbsp; * edx&nbsp;&nbsp;&nbsp; : "inel"<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("cpuid"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "0"(0) );<br />
&nbsp;&nbsp;&nbsp; printf("Maximum CPUID Input EAX : %p\n", eax);</p>
<p><br />
&nbsp;&nbsp;&nbsp; char string[128];<br />
&nbsp;&nbsp;&nbsp; snprintf(string, 5, "%s", (char *)&amp;ebx);<br />
&nbsp;&nbsp;&nbsp; snprintf(string + 4, 5, "%s", (char *)&amp;edx);<br />
&nbsp;&nbsp;&nbsp; snprintf(string + 8, 5, "%s", (char *)&amp;ecx);<br />
&nbsp;&nbsp;&nbsp; printf("Vendor\t\t: %s\n", string);</p>
<p>&nbsp;&nbsp;&nbsp; printf("\n");</p>
<p><br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * eax == 1, <br />
&nbsp;&nbsp;&nbsp;&nbsp; * edx的第18比特为1，则CPU支持serial number<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为0，则不支持，或者被disabled<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 序列号有96位，其中最高32位即是eax的输出值。应当把它保存下来，然后<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 再设置eax==3, 取剩下的64位<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("cpuid"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=a"(eax), "=d"(edx)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "a"(1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp; if ( edx &amp; (1 &lt;&lt; 18) ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* serial number supported */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* edx输出中间32位的序列号，ecx输出最低32位的序列号 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm volatile ("cpuid"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=c"(ecx), "=d"(edx)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "a"(3)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Serial Number\t : %x-%x-%x-%x-%x-%x\n", <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax &gt;&gt; 16, eax &lt;&lt; 16, edx &gt;&gt; 16, edx &lt;&lt; 16, ecx &gt;&gt; 16, ecx &lt;&lt; 16);<br />
&nbsp;&nbsp;&nbsp; } else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Serial Number not supported.\n");</p>
<p>&nbsp;&nbsp;&nbsp; printf("\n");</p>
<p><br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * eax == 80000006h，返回L2 Cache的信息<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * ecx[31:16]&nbsp;&nbsp;&nbsp; : L2 Cache size, in Kbytes<br />
&nbsp;&nbsp;&nbsp;&nbsp; * ecx[15:12]&nbsp;&nbsp;&nbsp; : L2 Cache Associativity<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00h disabled<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01h direct mapped<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 02h 2-Way<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 04h 4-Way<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 06h 8-Way<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 08h 16-Way<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0Fh Fully associative<br />
&nbsp;&nbsp;&nbsp;&nbsp; * ecx[7:0]&nbsp;&nbsp;&nbsp; : L2 Cache Line size in bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("cpuid"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=c"(ecx)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "a"(0x80000006)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp; printf("L2 Cache Size\t : %dKbytes\n", ( ecx &gt;&gt; 16 ) );<br />
&nbsp;&nbsp;&nbsp; printf("L2 Cache Line Size\t : %dbytes\n", (ecx &amp; 0xff));</p>
<p>&nbsp;&nbsp;&nbsp; printf("L2 Cache Associativity\t : ");<br />
&nbsp;&nbsp;&nbsp; switch ( (ecx &amp; 0xf000) &gt;&gt; 12 )<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x00:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\n", "disabled");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x01:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\n", "direct mapped");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x02:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\n", "2-Way");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x04:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\n", "4-Way");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x06:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\n", "8-Way");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x08:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s\n", "16-Way");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0x0f:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Fully associative");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("No such entry...\n");<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; printf("\n");</p>
<p><br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Input : eax == 4 &amp;&amp; ecx == 0<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * (eax[31:26] + 1) 是该物理处理器package上实现的core CPUs数目<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; asm volatile ("cpuid"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "0"(4), "2"(0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp;&nbsp; printf("Number of Cores on this physical package\t : %d\n", (eax &gt;&gt; 27) + 1 );</p>
<p>&nbsp;&nbsp;&nbsp; printf("\n");</p>
<p><br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Input : eax == 1，则edx返回feature flag<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; return 0;<br />
}</p>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/155600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-10-24 15:04 <a href="http://www.blogjava.net/zhaochengming/archive/2007/10/24/155600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux查看网卡mac</title><link>http://www.blogjava.net/zhaochengming/archive/2007/10/24/155599.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Wed, 24 Oct 2007 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2007/10/24/155599.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/155599.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2007/10/24/155599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/155599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/155599.html</trackback:ping><description><![CDATA[<p>#include &lt;stdio.h&gt;<br />
#include &lt;sys/ioctl.h&gt;<br />
#include &lt;sys/socket.h&gt;<br />
#include &lt;netinet/in.h&gt;<br />
#include &lt;net/if.h&gt;<br />
#include &lt;string.h&gt;</p>
<p>int main(int argc, char *argv[]){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct ifreq ifreq;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sock;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(argc!=2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Usage : ethname\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((sock=socket(AF_INET,SOCK_STREAM,0))&lt;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror("socket");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(ifreq.ifr_name,argv[1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ioctl(sock,SIOCGIFHWADDR,&amp;ifreq)&lt;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror("ioctl");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%02x:%02x:%02x:%02x:%02x:%02x\n",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (unsigned char)ifreq.ifr_hwaddr.sa_data[0],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (unsigned char)ifreq.ifr_hwaddr.sa_data[1],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (unsigned char)ifreq.ifr_hwaddr.sa_data[2],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (unsigned char)ifreq.ifr_hwaddr.sa_data[3],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (unsigned char)ifreq.ifr_hwaddr.sa_data[4],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (unsigned char)ifreq.ifr_hwaddr.sa_data[5]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char temp = (unsigned char)ifreq.ifr_hwaddr.sa_data[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a = temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%02x",a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
}</p>
 <img src ="http://www.blogjava.net/zhaochengming/aggbug/155599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2007-10-24 15:01 <a href="http://www.blogjava.net/zhaochengming/archive/2007/10/24/155599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>