免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
匯編語(yǔ)言與C語(yǔ)言的混合使用
在C語(yǔ)言中如何使用匯編語(yǔ)言呢?這個(gè)問(wèn)題在不同的編譯器中,具體實(shí)現(xiàn)方法是不同的。不過(guò)在實(shí)現(xiàn)大方上也不過(guò)就是有兩種,而且各種編譯器的實(shí)現(xiàn)方法也是大同小異。一種是在C語(yǔ)言中嵌入?yún)R編語(yǔ)言代碼,另一種是讓C語(yǔ)言從外部調(diào)用匯編。下面我們就以Borland格式為例來(lái)說(shuō)一說(shuō)具體用法。但是,GCC與Microsoft的實(shí)現(xiàn)方法的與Borland只在格式上有點(diǎn)區(qū)別。當(dāng)然,GCC的嵌入?yún)R編是AT&T格式的。還好,不管什么格式,只是表達(dá)形式的不同而已,其內(nèi)在含義是一模一樣的。還是那句話各種編譯器的實(shí)現(xiàn)方法是大同小異的,并沒(méi)有本質(zhì)的區(qū)別。另外在最后還附帶了一篇介紹在GCC中使用內(nèi)嵌匯編的文章。

一、兩種實(shí)現(xiàn)方式

首先,我們看一看在C語(yǔ)言中如何嵌入?yún)R編語(yǔ)言代碼。在C語(yǔ)言中嵌入?yún)R編語(yǔ)言代碼,也有兩種格式,一種是單句的,一種是模塊的。

我們來(lái)看看一些簡(jiǎn)單的例子。

例子1:

單句格式的:

main()


asm     mov ah,2;
asm     mov bh,0;
asm     mov dl, 20;
asm     mov dh,10;
asm     int 10h; /*調(diào)用BIOS中斷設(shè)置光標(biāo)位置*/



模塊格式的:

main(){

asm{

mov ah,2
mov bh,0
mov dl, 20
mov dh,10
int 10h

      }
}
在這個(gè)小程序里面并沒(méi)有突出“嵌入”二字。不過(guò)從這個(gè)程序中可以看出其基本格式。嵌入的各行代碼前面加上asm關(guān)鍵字或者把匯編語(yǔ)句放入asm代碼塊中,每行以分號(hào)或換行符結(jié)束,而注釋必須是C語(yǔ)言格式的。

下面我們來(lái)看一個(gè)讓C語(yǔ)言和匯編協(xié)作的例子:

例子2:

main()

{

char const *MESSAGE=”O(jiān)utPut from asm..\n$”;

asm{

  mov ah, 9
            mov dx, MESSAGE
            int 21h

}

}

上面這個(gè)例子十分的簡(jiǎn)單,它的純C語(yǔ)言版本是:

#include <stdio.h>

main()

{

    printf(“OutPut from asm..\n$”);
        }

接下來(lái)我們看一看如何讓C語(yǔ)言調(diào)用匯編例程。我們還是看一個(gè)簡(jiǎn)單的小程序:

C語(yǔ)言部分如下:

extern cursor (int,int),

main()

{

        cursor(15,12);
        }

匯編語(yǔ)言部分如下:

.MODEL  SMALL
.CODE
PUBLIC

_CURSOR PROC

PUSH  BP
              MOV  BP,SP
              MOV  DH,[BP+4]
              MOV  DL,[BP+6]
              MOV  AH,02
              MOV  BH,00
              INT  10H
              POP  BP
              RET

_CURSOR ENDP

通過(guò)上面這個(gè)程序,你會(huì)看到調(diào)用匯編語(yǔ)言的關(guān)鍵就是如何傳遞參數(shù)。事實(shí)上,是通過(guò)堆棧來(lái)傳遞的但是具體規(guī)則是什么呢?下面我就來(lái)看看。

二、調(diào)用規(guī)則

       實(shí)際上,在C語(yǔ)言中使用匯編語(yǔ)言最困難的就是如何安全有效的傳遞參數(shù)。否則在調(diào)用匯編子程序時(shí)就會(huì)從堆棧中取出錯(cuò)誤的參數(shù)。更可惡的是這種錯(cuò)誤在編譯的時(shí)候是不會(huì)發(fā)現(xiàn)錯(cuò)誤提示的。

       下面是C與MASM匯編語(yǔ)言混合是用的時(shí)候采用的規(guī)則:

1、  參數(shù)傳遞的次序與它們出現(xiàn)的次序是相反的。例如上例中的cursor (x,y)中,首先傳遞的是y,然后才是x。這與我們的一般想法是不一樣的,所以在這兒容易出現(xiàn)錯(cuò)誤。

2、  傳遞完參數(shù)后,C程序還將保存(CS,IP)。如果C程序是SMALL或COMPACT存儲(chǔ)模式下編譯的(或者過(guò)程是NEAR型的),那么只保存IP,而在MEDIUM、LARGE或HUGE模式下編譯的(或者過(guò)程是FAR型的),那么CS和IP都會(huì)被壓入堆棧,其順序是CS在前,IP在后。不過(guò)這個(gè)過(guò)程是C語(yǔ)言自動(dòng)進(jìn)行的而不需要我們干預(yù)。這也就是我們?cè)诶?中為什么用MOV  DH,[BP+4]而不是MOV  DH,[BP]。因?yàn)榍懊媸荂S和IP而不是參數(shù),真正的參數(shù)從[BP+4]開(kāi)始。

3、  還有BP也必須保存在堆棧中,然后我們才可以通過(guò)BP和偏移地址來(lái)訪問(wèn)參數(shù)。

4、  最后一條指令應(yīng)當(dāng)是后面不帶數(shù)字的RET,因?yàn)榘讯褩5皆嘉恢玫墓ぷ鲗⒂蒀程序重新獲得控制權(quán)以后才會(huì)執(zhí)行。

5、  任何于C程序共享的名稱都必須在前面加下劃線,而且C語(yǔ)言只識(shí)別前8個(gè)字符。

6、  對(duì)于普通的參數(shù)C語(yǔ)言傳遞的是參數(shù)值,而對(duì)于數(shù)組,傳遞的是指針(也就是數(shù)據(jù)的地址)。

7、  如果C程序是在MEDIUM、LARGE或HUGE模式下編譯的,那么匯編語(yǔ)言過(guò)程應(yīng)該設(shè)為FAR型,C程序是SMALL或COMPACT存儲(chǔ)模式下編譯的,那么匯編語(yǔ)言過(guò)程應(yīng)該設(shè)為NEAR型。

不過(guò)在MASM5.1或TASM1.0以及更高的版本的時(shí)候就不必?fù)?dān)心偏移地址、在共享名稱前加下劃線以及保存BP這些瑣事了,因?yàn)樗鼈兛梢杂删幾g器自動(dòng)完成了。很顯然例子2是舊格式的。

三、把參數(shù)返回C程序

       當(dāng)C程序需要從匯編過(guò)程獲得某個(gè)參數(shù)時(shí),這個(gè)參數(shù)應(yīng)該通過(guò)寄存器來(lái)傳遞。具體使用哪些寄存器取決于參數(shù)的大小,請(qǐng)看下表:

寄存器                                        大?。ㄗ止?jié))                                 C數(shù)據(jù)類型

AL                                                  1                                                     Char,short
AX                                                  2                                                     Int
DX:AX                                            4                                                     Long


四、把匯編語(yǔ)言程序與C語(yǔ)言程序鏈接到一起

1、  確保匯編語(yǔ)言中的過(guò)程被定義為PUBLIC,過(guò)程名以下劃線開(kāi)始。例如,在C語(yǔ)言中叫做“sum”到匯編語(yǔ)言中就應(yīng)該是“_sum”.

2、  在C語(yǔ)言程序中過(guò)程定義為外部類型,例如在例子2中的extern cursor (int,int)。

3、  用匯編器對(duì)匯編語(yǔ)言程序匯編,得到XXX.obj文件。

4、  用C語(yǔ)言編譯器編譯C語(yǔ)言程序,得到Y(jié)YY.obj文件。

5、  用鏈接器將它們鏈接到一起生成可執(zhí)行文件:

link XXX.obj + YYY.obj

       以上就是混合使用C語(yǔ)言和匯編語(yǔ)言應(yīng)該注意的幾點(diǎn)問(wèn)題。關(guān)于在GCC中使用匯編語(yǔ)言大體上是和上面一樣的,只是實(shí)現(xiàn)細(xì)節(jié)上有一點(diǎn)區(qū)別而已。下面的這篇文章對(duì)于在GCC中使用內(nèi)嵌匯編進(jìn)行詳細(xì)的解釋。


GCC使用的內(nèi)嵌匯編語(yǔ)法格式小教程   

本文對(duì)內(nèi)嵌匯編語(yǔ)法,從基本語(yǔ)法、內(nèi)嵌匯編的格式介紹、和擴(kuò)展的內(nèi)嵌匯編格式進(jìn)行了詳細(xì)說(shuō)明,需要說(shuō)明的是GCC采用的是AT&T的匯編格式.

一、 基本語(yǔ)法

語(yǔ)法上主要有以下幾個(gè)不同.

★ 寄存器命名原則

AT&T: %eax Intel: eax

★源/目的操作數(shù)順序

AT&T: movl %eax,%ebx Intel: mov ebx,eax

★常數(shù)/立即數(shù)的格式

AT&T: movl $_value,%ebx Intel: mov eax,_value

把_value的地址放入eax寄存器

AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d

★ 操作數(shù)長(zhǎng)度標(biāo)識(shí)

AT&T: movw %ax,%bx Intel: mov bx,ax

★尋址方式

AT&T: immed32(basepointer,indexpointer,indexscale)

Intel: [basepointer indexpointer*indexscale imm32]

Linux工作于保護(hù)模式下,用的是32位線性地址,所以在計(jì)算地址時(shí)不用考慮egment
ffset的問(wèn)題.上式中的地址應(yīng)為:

imm32 basepointer indexpointer*indexscale

下面是一些例子:

★直接尋址

AT&T: _booga ;

_booga是一個(gè)全局的c變量注意加上$是表示地址引用,不加是表示值引用.

注:對(duì)于局部變量,可以通過(guò)堆棧指針引用.

Intel: [_booga]

★寄存器間接尋址

AT&T: (%eax)

Intel: [eax]

★變址尋址

AT&T: _variable(%eax)

Intel: [eax _variable]

AT&T: _array(,%eax,4)

Intel: [eax*4 _array]

AT&T: _array(%ebx,%eax,8)

Intel: [ebx eax*8 _array]  

二、 基本的內(nèi)嵌匯編

基本的內(nèi)嵌匯編很簡(jiǎn)單,一般是按照下面的格式

asm(statements);

例如:asm(nop); asm(cli);

asm 和 __asm__是完全一樣的.

yjtammmm(游客)發(fā)表評(píng)論于2006-3-25 19:43:26 個(gè)人主頁(yè) | 引用 | 返回 | 刪除


行間嵌入?yún)R編,怎么樣運(yùn)行呀,最好是步驟,本人笨呀

adminiyjta@163.com

main()
{
int i,j;
char *s;
printf("please input:i=");
scanf("%d",&i);
asm mov ax;
asm mov c1,i;
asm mul c1;
asm mov j,ax;
printf("The result is:%d*2=%d",i,j);
getch();
}




six思想
net is everything, net is nothing.
2006-6-4 21:07 #1
 
 
 
 
 
ss
版主

讓我安靜的想一會(huì)兒


UID 4
精華 1
積分 210
帖子 432
威望 210
WM幣 435
閱讀權(quán)限 100
注冊(cè) 2006-5-18
狀態(tài) 離線
讓C和匯編一起工作

這里用的平臺(tái)分別是DEV-CPP(mingw)和NASM匯編器。注意不是通常使用的MASM。我個(gè)人比較喜歡NASM,而MASM和TASM用得不是太多。下面分成兩部分說(shuō)明。需要查閱的參考文獻(xiàn)是NASM的用戶手冊(cè)。關(guān)于C語(yǔ)言調(diào)用約定方面的一些事項(xiàng)也可以在NASM的官方文檔中得到。

1、在匯編中調(diào)用C代碼
說(shuō)明:mingw編譯系統(tǒng)在所有C符號(hào)前加了一個(gè)下劃線前導(dǎo)符。所以在匯編代碼中要用extern指令進(jìn)行特殊處理。還是用實(shí)例來(lái)說(shuō)明比較直觀。假設(shè)我們分別建了兩個(gè)文件,一個(gè)是Calc.c,另一個(gè)是CallCalc.asm。兩個(gè)文件中各有一個(gè)函數(shù)。
Calc.c中內(nèi)容為:
/* Calc.c */
/* a simple example: */
/* add() as a callee, called by CallCalc.asm */
extern int add(int x, int y);

int add(int x, int y)
{
return(x + y);
}

CallCalc.asm中的內(nèi)容為:
;CallCalc.asm
;a simple example:
;EntryPoint() as a caller, call add() in Calc.c

[section .text]
extern _add

EntryPoint:
  push 1 ; param y
  push 2 ; param x
  call _add ; call add() in Calc.c
  add sp,2 ; remove params x and y
  ...
  ret

解釋:add()函數(shù)接受兩個(gè)整型參數(shù),相加后返回給調(diào)用者,返回值按照C語(yǔ)言調(diào)用約定存放在EAX寄存器中;在匯編代碼中要先要用extern關(guān)鍵字將_add聲明為外部符號(hào),然后才能在程序中使用。這里我們只需要知道C的符號(hào)規(guī)則是要加一個(gè)前導(dǎo)下劃線就可以了。在調(diào)用的地方用的也是call _add

2、在C中調(diào)用匯編代碼
同樣,我們假設(shè)有兩個(gè)文件,一個(gè)是SimpleRet.asm,一個(gè)是CallAsm.c
SimpleRet.asm中的內(nèi)容是:
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;do nothing,just return a integer value
;;;;;;;;;;;;;;;;;;;;;;;;;;;
[section .text]
[bits 32]
global _RetInt
_RetInt:
  mov ax,1
  ret

CallAsm.c中的內(nèi)容是:
/* a simple caller which call asm */
extern int RetInt(void);

int main(void)
{
printf("%d\n",RetInt());
return(0);
}

運(yùn)行結(jié)果將會(huì)打印1

總結(jié):所有的要點(diǎn)就是C調(diào)用約定和global關(guān)鍵字以及extern關(guān)鍵字的使用
global將符號(hào)導(dǎo)出給鏈接器
extern聲明外部的符號(hào)




six思想
net is everything, net is nothing.
2006-6-4 21:08 #2
 
 
 
 
 
ss
版主

讓我安靜的想一會(huì)兒


UID 4
精華 1
積分 210
帖子 432
威望 210
WM幣 435
閱讀權(quán)限 100
注冊(cè) 2006-5-18
狀態(tài) 離線
Dev-cpp 小型指南,原載于CSDN論壇

Dev-cpp是一個(gè)GCC在win32下的IDE程序,用Dephi 5編寫(xiě),只有2M
具有以下功能:

   1.集成編譯環(huán)境,支持工程模板.
   2.支持語(yǔ)法加高,自動(dòng)注釋,對(duì)中文的支持也不錯(cuò).
   3.支持CVS集成
   4.支持源碼分析,可以形成類樹(shù)圖.
   5.支持?jǐn)U展包.

Dev-cpp官方發(fā)布有集成MinGW32 gcc編譯套件,最新支持GCC 3.3(2003-7-15)
也可以支持MinGW其它版本和Cygwin gcc的各個(gè)版本.不過(guò)需要手動(dòng)設(shè)置.

Dev-cpp支持多語(yǔ)言環(huán)境,中文版界面由我的好友nyra(nyra@sohu.com)維護(hù),如果
大家發(fā)現(xiàn)中文版有翻釋問(wèn)題可以找她.如果有興趣翻譯幫助文件,也請(qǐng)聯(lián)系.

Dev-cpp有兩個(gè)常用版本,一是開(kāi)發(fā)中的5.0beta,最新一版是4.9.8.0
另一個(gè)是4.01,是4.0的修正版(其中集成Gcc 2.9.5),前者功能較多,而后者較穩(wěn)定.

圖形化環(huán)境我就不多說(shuō)了,和VC的用法類似,其實(shí)大家問(wèn)題多集中于Gcc本身.

GCC, GCC和gcc不同的東西.前者是Gnu的編譯環(huán)境,包括gcc, g++, gcj等多種語(yǔ)言的編譯器
和as(匯編), ar(庫(kù)), ld(聯(lián)接器)等一系統(tǒng)編譯工具.gcc是GCC中C語(yǔ)言的編譯器,g++是
C++語(yǔ)言的編譯器.

GCC被移植到多種操作系統(tǒng)中,在Win32上最著名是MinGW和Cygwin兩個(gè)版本,MinGW的全稱是
Minial GCC for Windows,如題,它是Win32上的一個(gè)小型GCC,只包括最少的GCC組件<10M
而Cygwin就是一個(gè)Unix On Windows的大系統(tǒng),全部下載有300多兆,Unix下的大多數(shù)軟件
在Cygwin中都有移植版,包括X-windows.還有一個(gè)for Dos-32 的GCC,名叫Djgpp,與Mingw的
目標(biāo)類似,不同的是它是一個(gè)以MZ為目標(biāo)程序的可以在非Win32環(huán)境下運(yùn)行(例如FreeDOS)
它們都移值了GCC官方發(fā)布的最新版GCC.

下面集中力氣講GCC 3.2以及Mingw移植版.

GCC3.2(G++)號(hào)稱是對(duì)C++標(biāo)準(zhǔn)支持最好C++編譯器,真否不確.(因?yàn)閂C7.0也說(shuō)它是)但是
有一點(diǎn)很明確,在沒(méi)做特殊配置的情況下,G++只支持標(biāo)準(zhǔn)C++語(yǔ)法,不再對(duì)早期的非標(biāo)準(zhǔn)
C++語(yǔ)法進(jìn)行支持.所以VC下的C++程序很多不能運(yùn)行.BC++3.1等(很多教科書(shū)的目標(biāo)平臺(tái))
的例程也不支持.所以,請(qǐng)?jiān)趩?wèn)為什么我的程序在XX編譯器中可以運(yùn)行,而到了Dev-cpp
中不能編譯之類問(wèn)題前,首先請(qǐng)查看你的程序是不是真正的沒(méi)錯(cuò).

Dev-cpp對(duì)以cpp,cxx為擴(kuò)展名的文件默認(rèn)使用G++編譯,所以如果你的C語(yǔ)言程序請(qǐng)以c為擴(kuò)展
名,不然很可能出錯(cuò),請(qǐng)記住C和C++是兩種不能的語(yǔ)言,它們并非完全兼容.
C++的標(biāo)準(zhǔn)是C++ 98,而語(yǔ)言的新標(biāo)準(zhǔn)是C99,但它們都要收費(fèi),推薦B.S.的C++ Programming
Language做為C++的標(biāo)準(zhǔn)參考書(shū).當(dāng)然如果以C++ 98標(biāo)準(zhǔn)為參考也不錯(cuò).

MinGW包括:gcc,g++,gdb和binary utils以及一個(gè)msys環(huán)境(單獨(dú)下載),前面幾項(xiàng)都是命令行
程序.MinGW除了標(biāo)準(zhǔn)c++庫(kù)和標(biāo)準(zhǔn)C庫(kù),還包括一個(gè)稱為w32api的Win32庫(kù)和openGL庫(kù).

目錄結(jié)構(gòu)如下
如果你下載的Devcpp,它們?cè)贒ev-cpp/mingw32目錄下
/bin      可執(zhí)行程序(殼)
/include  頭文件
/mingw
/usr/   (真實(shí)的)可執(zhí)行程序
/lib   庫(kù)

Dev-cpp的默認(rèn)安裝中,相關(guān)的路徑都已經(jīng)設(shè)好.如沒(méi)有設(shè)好,很難編譯.
設(shè)置方法是在選項(xiàng)/編譯環(huán)境菜單中設(shè)置.
注意新的C++頭文件在/include/g++/3.2/下

下面回答一些問(wèn)題:

1.多朋友問(wèn)到在devc++下面做圖形,抱歉,devC++沒(méi)有g(shù)raphics.h文件的,好像不能作圖(具體解決辦法,期待高手補(bǔ)充.....)
graphics.h是borland的Dos圖形庫(kù)的頭文件,win32下不支持,請(qǐng)使用win32的繪圖方法GDI或DirectDraw.

2. Dev C++ 是用dllwrap.exe來(lái)做DLL的(原話是這樣的,期待高手解釋.......
是的,dllwrap語(yǔ)法是:
dllwrap 選項(xiàng) 目標(biāo)文件(即*.o)
常用選項(xiàng)有:
  --def <filename> DEF文件名
  --dllname <名稱>  DLL的名稱
  --implib <導(dǎo)入lib名> 輸出DLL導(dǎo)入庫(kù)

3.關(guān)于庫(kù)的引用
GCC的庫(kù)名為libXXX.a其中XXX為庫(kù)名,編譯時(shí)只需要增加選項(xiàng)-lXXX即可。GCC的目標(biāo)文件與
VC使用的Coff以及Borland使用的OMF格式都不一樣,不能直接使用.需要重新編譯生成.a的庫(kù)。

GCC庫(kù)管理程序是ar,它的用法是:ar rcs 庫(kù)文見(jiàn)名.a 目標(biāo)文件.o  哦,有人說(shuō)過(guò)了


4.關(guān)于調(diào)試及目標(biāo)文件的大小.
Dev-cpp的調(diào)試一直不是很好用,原因是它不是直接調(diào)試,而是調(diào)用了GDB這個(gè)命令行程序,
所以有的地方打不到斷點(diǎn), 有時(shí)有的語(yǔ)句并不執(zhí)行,所以亂跳的感覺(jué),實(shí)際上,只要仔細(xì)
觀察一下,它不執(zhí)行和不能打斷點(diǎn)都是很有理由的,不像VC在空行上也可以打斷點(diǎn).
目標(biāo)文件很大是因?yàn)闃?biāo)準(zhǔn)IO庫(kù),新的標(biāo)準(zhǔn)IO庫(kù)是全用模板生成的,所以靜態(tài)庫(kù)相當(dāng)大.
而GCC一直沒(méi)有把它做成動(dòng)態(tài)庫(kù),所以每次程序都要聯(lián)接到幾百K.另外,GCC模板的生成也
很笨(或者說(shuō)為了附合標(biāo)準(zhǔn)),所以目標(biāo)程序很大.不過(guò)在mingw中有一個(gè)strip的程序.
可以為它減肥.
想要產(chǎn)生小的程序有幾個(gè)方法:
0.優(yōu)化程序!!!!
1.全部使用動(dòng)態(tài)庫(kù),包括C運(yùn)行庫(kù).
2.不要調(diào)試選項(xiàng).
3.使用面向程序大小的的優(yōu)化選項(xiàng).

至于環(huán)境,我覺(jué)得應(yīng)該是各有所好,并不一定非得要這樣那樣,同樣的文本編輯器就可以用好幾種的
MingW,NASM,Bochs,Binutils,Insight(GDB)的環(huán)境就足夠了

[ 本帖最后由 ss 于 2006-6-4 21:56 編輯 ]




six思想
net is everything, net is nothing.
2006-6-4 21:34 #4
 
 
 
 
 
ss
版主

讓我安靜的想一會(huì)兒


UID 4
精華 1
積分 210
帖子 432
威望 210
WM幣 435
閱讀權(quán)限 100
注冊(cè) 2006-5-18
狀態(tài) 離線
C++語(yǔ)言學(xué)習(xí)推薦書(shū)目

(一)語(yǔ)言入門:
《C++ Primer》
最新版本:第三版(第四版國(guó)外已上架,國(guó)內(nèi)一些網(wǎng)上書(shū)店也在預(yù)訂中)
適合有豐富C經(jīng)驗(yàn),缺乏C++經(jīng)驗(yàn)的。不過(guò)我個(gè)人一直認(rèn)為此書(shū)帶著過(guò)于強(qiáng)烈的C語(yǔ)言的痕跡,對(duì)于C++的學(xué)習(xí)未必是好事。

《The C++ Programming Language》/《C++程序設(shè)計(jì)語(yǔ)言》
最新版本:第三版特別版
簡(jiǎn)稱TC++PL,有其他語(yǔ)言的豐富經(jīng)驗(yàn)的。(也有人簡(jiǎn)稱之為“TCPL”,但需與另一本《The C Programmer Language》區(qū)分開(kāi)來(lái))

《Essential C++》
《Accelerated C++》
這兩本薄一些,都是不錯(cuò)的選擇?!禔ccelerated C++》本人沒(méi)有讀過(guò),從各方面的評(píng)價(jià)來(lái)看,完全值得推薦。

以上幾本書(shū)都有相應(yīng)的中文版,而且翻譯的質(zhì)量都不錯(cuò)。上面的書(shū)未必都需要讀一遍,但無(wú)論如何,TC++PL是應(yīng)該閱讀的。

(二)進(jìn)階A:
這個(gè)路線側(cè)重于語(yǔ)言本身

《Effective C++》
最新版本:第二版(第三版國(guó)外已上架,國(guó)內(nèi)一些網(wǎng)上書(shū)店也在預(yù)訂中)
簡(jiǎn)稱EC。C++程序員必讀!很多時(shí)候,我們說(shuō)C++圣經(jīng)不是指TC++PL,而是這一本。《The Pragmatic Programmer》一書(shū)中寫(xiě)到:“一旦你發(fā)現(xiàn)自己要參與C++項(xiàng)目的開(kāi)發(fā),趕快跑(不要走)到書(shū)店去購(gòu)買Scott Mayer的《Effective C++》,可能還要《More Effective C++》”。

《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》/《C++ 編程規(guī)范》
個(gè)人認(rèn)為此書(shū)應(yīng)為C++程序員必備的案頭書(shū)。幾乎Effective系列和Exceptional系列都在這里得到了總結(jié)。最新的模版、異常的業(yè)界經(jīng)驗(yàn)都在這里的到了體現(xiàn)。可能的唯一缺陷就是對(duì)一個(gè)新手而言,關(guān)于“為什么這么做”的問(wèn)題,解釋的不夠。
我的看法是:如果你不理解其中的條款,記憶,并且照做;如果你理解其中的條款,我猜你一定會(huì)同意書(shū)中的觀點(diǎn)。我認(rèn)為這本書(shū)中的內(nèi)容至少在2009年以前都不會(huì)過(guò)時(shí),人們將廣為傳誦它制定的101條戒律。
還不知道他的簡(jiǎn)稱,也許“101”會(huì)成為一個(gè)候選者?

提到《Effective C++》,那么另外三本書(shū)一一浮出水面:
《More Effective C++》
《Exceptional C++》
《More Exceptional C++》。
新書(shū)《Exceptional C++ Style》也是值得一看的好書(shū)。
上述幾本書(shū),一本也不應(yīng)該放過(guò)。
個(gè)人建議上述書(shū)籍按順序閱讀。并且,在將來(lái)反復(fù)閱讀這幾本書(shū)。

(三)進(jìn)階B:
這個(gè)路線側(cè)重于程序庫(kù)。

《The C++ Standard Library》/《C++標(biāo)準(zhǔn)程序庫(kù)—自修教程與參考手冊(cè)》
聽(tīng)說(shuō)過(guò)STL嗎?這本書(shū)會(huì)教你最基本的,也是最重要的STL的使用。這本書(shū),應(yīng)該是必讀的。

《Effective STL》
會(huì)使用STL還不夠,還必須知道什么時(shí)候選擇什么STL組件,這是STL使用的必讀書(shū)。

《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》/《泛型編程與STL》。
這本書(shū)理論性較強(qiáng),但是真的很嚴(yán)謹(jǐn),而且并不是非常難懂。理解其中對(duì)于Concept的解釋,將是非常重要的。

《C++ STL》
這不是講述使用程序庫(kù)的,而是講述程序庫(kù)實(shí)現(xiàn)原理的。腸胃不好的,需要慢慢吸收。

這個(gè)路線的書(shū),仍然是建議按順序閱讀。
進(jìn)階A、進(jìn)階B兩個(gè)路線應(yīng)該是可以并行的。

其他進(jìn)階參考書(shū)
提出這些參考書(shū),只是避免爭(zhēng)議,也為開(kāi)闊視野,筆者并不曾完全讀過(guò)所有的。

《Thinking in C++》/《C++編程思想》
這本書(shū)及其中文版?zhèn)餮院脡亩加?,沒(méi)有認(rèn)真看過(guò),不做評(píng)價(jià),如果確有興趣,不妨嘗試一下該書(shū)。

以下幾本書(shū)基本上涉及的都是語(yǔ)言本身,大體上可以按照以下的順序閱讀。

《C++必知必會(huì)》
如果早一年,這本書(shū)將是重量級(jí)的,然而它被101和《Exceptional C++ Style》蓋過(guò)一頭。

《C++ Gotchas: Avoiding Common Problems in Coding and Design》/《C++程序設(shè)計(jì)陷阱》
這又是一本我未曾讀過(guò),而且廣受好評(píng)的書(shū)。

《STL 源碼剖析》
這本書(shū)我剛到手,就被人"借"走,以至于到現(xiàn)在也沒(méi)有看過(guò)??催^(guò)這本書(shū)的朋友,可以給一個(gè)合適的評(píng)價(jià)。

高級(jí):
《The Design and Evolution of C++》/《C++語(yǔ)方的設(shè)計(jì)和演化》
簡(jiǎn)稱D&E,內(nèi)容并不艱深,Bjarne的書(shū),僅此,就值得一讀。
前段時(shí)間,互動(dòng)網(wǎng)曾8塊一本(人民幣)賤賣此書(shū),現(xiàn)在好像沒(méi)了。

《Inside The C++ Object Model》/《深度探索C++對(duì)象模型》
C程序員讀后一定會(huì)覺(jué)得C++原來(lái)并不神秘。

《C++ Template》
在閱讀STL、Boost或者Loki的源代碼之前,請(qǐng)仔細(xì)閱讀本書(shū),它可以減輕一些閱讀的煩惱。這本書(shū)是討論C++模版的權(quán)威。

《Modern C++ Design Generic Programming and Design Patterns Applied》/《C++設(shè)計(jì)新思維——泛型編程與設(shè)計(jì)模式之應(yīng)用》
簡(jiǎn)稱MCD。在閱讀MCD之前,建議先閱讀一下《C++ Template》。

《對(duì)象揭秘:Java、Eiffel和C++》
你對(duì)C++不滿嗎?這本書(shū)可以部分地幫你完成抱怨的目標(biāo)。也許它還可以讓你不迷信C++。

最后,一份C++標(biāo)準(zhǔn)文檔也是應(yīng)該加以咀嚼的。
還有一些書(shū)籍,并不能簡(jiǎn)單的歸于C++,也難以在純粹的書(shū)本學(xué)習(xí)中加以掌握?!禗esign Patterns》/《設(shè)計(jì)模式》一書(shū)就歸于此類。

所有上述的書(shū)籍,要么談?wù)揅++語(yǔ)言本身,要么談?wù)揝TL的,要么兼而有之(當(dāng)然嚴(yán)格講STL也是C++語(yǔ)言非常重要的一部分)。偶爾,某些書(shū)中條目也會(huì)涉及實(shí)際工程。這些書(shū)并不是C++軟件開(kāi)發(fā)的全部,但是他們很重要。閱讀這些書(shū),未必需要化費(fèi)太多的精力,有時(shí)候是會(huì)困難,但也有時(shí)候會(huì)很快速。
最后,編程語(yǔ)言并非計(jì)算機(jī)科學(xué)技術(shù)的全部,尤其對(duì)于在校的學(xué)生來(lái)說(shuō),打好基礎(chǔ)、開(kāi)闊視野都是非常重要的。

但是個(gè)人感覺(jué),其實(shí)java和c還是c++也就是那么回事,任何事情都有優(yōu)缺點(diǎn),至于功能不敢多談
下面是更深些的東西了

算法 + 數(shù)據(jù)結(jié)構(gòu) = 程序

  記得Pascal之父、結(jié)構(gòu)化程序設(shè)計(jì)的先驅(qū)Niklaus Wirth最著名的一本書(shū),書(shū)名叫作《算法 + 數(shù)據(jù)結(jié)構(gòu) = 程序》,算法與數(shù)據(jù)結(jié)構(gòu)之于程序設(shè)計(jì)的重要性不言自明。那么,什么是算法?什么是數(shù)據(jù)結(jié)構(gòu)?什么又是程序呢?
  我們先從闡明大家最為熟悉的"程序"的概念入手。程序是計(jì)算機(jī)指令的某種組合,控制計(jì)算機(jī)的工作流程,完成一定的邏輯功能,以實(shí)現(xiàn)某種任務(wù);再來(lái)看什么是算法,算法是程序的邏輯抽象,是解決某類客觀問(wèn)題的數(shù)學(xué)過(guò)程;最后我們來(lái)看一看數(shù)據(jù)結(jié)構(gòu)又是什么呢?在這里,數(shù)據(jù)結(jié)構(gòu)具有兩個(gè)層面上的涵義--邏輯結(jié)構(gòu)和物理結(jié)構(gòu):客觀事物自身所具有的結(jié)構(gòu)特點(diǎn),我們將其稱之為邏輯結(jié)構(gòu)。如家族譜系是一個(gè)天然的樹(shù)型邏輯結(jié)構(gòu)。而邏輯結(jié)構(gòu)在計(jì)算機(jī)中的具體實(shí)現(xiàn)則稱之為物理結(jié)構(gòu)。如樹(shù)型邏輯結(jié)構(gòu)是用指針表示還是使用數(shù)組實(shí)現(xiàn)。
  仔細(xì)體會(huì)一下,就會(huì)發(fā)現(xiàn)算法與數(shù)據(jù)結(jié)構(gòu)間的緊密性。用一個(gè)較為貼切的例子來(lái)形容,若把數(shù)據(jù)結(jié)構(gòu)喻為建筑工程中的建筑設(shè)計(jì)圖,那么算法就是工程中的施工流程圖。數(shù)據(jù)結(jié)構(gòu)與算法呈相互依托的關(guān)系,恰當(dāng)?shù)拇_立了問(wèn)題的結(jié)構(gòu),問(wèn)題的解決才能根據(jù)確立的層次結(jié)構(gòu)選擇合適的解決方法。因此任何講解數(shù)據(jù)結(jié)構(gòu)的書(shū)都不可能撇開(kāi)算法,單單介紹數(shù)據(jù)結(jié)構(gòu),反之亦然。下面,我們就來(lái)看看IEEE ‘97Booth教育獎(jiǎng)獲得者Sartaj Sahni是如何處理數(shù)據(jù)結(jié)構(gòu)、算法和程序他們?nèi)咧g的關(guān)系的吧!
  一般來(lái)說(shuō),計(jì)算機(jī)專業(yè)著作有兩種基本寫(xiě)作方式:一種是教材,一種是百科全書(shū)。本書(shū)是按照大學(xué)教材的結(jié)構(gòu)來(lái)寫(xiě)的,然而令人驚訝的是本書(shū)的內(nèi)容是如此的豐富,以至于同樣可以將它看作是一本關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法的大全。顯然,這本書(shū)并不適合初學(xué),將它作為數(shù)據(jù)結(jié)構(gòu)進(jìn)階學(xué)習(xí)的第二本書(shū)是恰當(dāng)?shù)?。這本書(shū)最為顯著的特點(diǎn)是特別注重應(yīng)用,我們很快就會(huì)看到這一點(diǎn)。
  數(shù)據(jù)結(jié)構(gòu)與算法方面的好書(shū)很多,我在這里沒(méi)有作一一介紹,而是著重推薦了一些經(jīng)典著作:
  《計(jì)算機(jī)編程藝術(shù)》The Art of Computer Programming(Volume I ~ III) (第1卷 基本算法、第2卷 半數(shù)值算法、第3卷 排序與查找) 國(guó)防工業(yè)出版社 數(shù)據(jù)結(jié)構(gòu)的開(kāi)拓者D.E.Knuth高德納編著的計(jì)算機(jī)科學(xué)發(fā)展史上的不朽之作。第1卷 基本算法 介紹計(jì)算機(jī)程序設(shè)計(jì)的基本算法,包括基本的編程概念和技術(shù)以及信息結(jié)構(gòu)--機(jī)內(nèi)信息的表示、數(shù)據(jù)元及其處理的結(jié)構(gòu)關(guān)系;第2卷 半數(shù)值算法 介紹隨機(jī)數(shù)和算術(shù),提供了計(jì)算機(jī)編程和數(shù)值分析之間的豐富接口;第3卷 排序與查找 介紹排序和查找的最權(quán)威的經(jīng)典技術(shù),擴(kuò)充了第1卷的數(shù)據(jù)結(jié)構(gòu),以處理大小型數(shù)據(jù)庫(kù)及內(nèi)外部存儲(chǔ)。本書(shū)偏重分析技術(shù),采用匯編語(yǔ)言描述算法,是一本本學(xué)科最經(jīng)典最權(quán)威的百科全書(shū),適合于從事數(shù)據(jù)結(jié)構(gòu)與算法研究的專家閱讀。
  《算法 + 數(shù)據(jù)結(jié)構(gòu) = 程序》科學(xué)出版社 Pascal之父Niklaus Wirth著 一本簡(jiǎn)潔、清晰具有深刻內(nèi)涵的小冊(cè)子。介紹了許多巧妙的程序設(shè)計(jì)技術(shù),書(shū)中還完成了一個(gè)簡(jiǎn)單的程序設(shè)計(jì)語(yǔ)言的實(shí)現(xiàn),真不愧為世界級(jí)的編譯器設(shè)計(jì)專家。這本書(shū)的難度也很大,將它作為數(shù)據(jù)結(jié)構(gòu)高級(jí)讀物更好一些。
  《數(shù)據(jù)結(jié)構(gòu)與算法》 [美]A.V.阿霍,[美]J.E.霍普克羅夫特著 看看作者名字就知道這本書(shū)的水平了,不過(guò)這本書(shū)現(xiàn)在很難找到了。
  《數(shù)據(jù)結(jié)構(gòu)與算法》蘇運(yùn)霖著 中南工業(yè)大學(xué)出版社 作為《計(jì)算機(jī)編程藝術(shù)》的中文譯者,蘇運(yùn)霖先生的這一本專著亦采用百科全書(shū)式寫(xiě)法,內(nèi)容相當(dāng)艱深,對(duì)數(shù)學(xué)功底要求特別高。
  《數(shù)據(jù)結(jié)構(gòu)與算法分析》(C++版、JAVA版) Shaffer著 電子工業(yè)出版社 講解清晰易懂、內(nèi)容豐富,適于自學(xué)。

[ 本帖最后由 ss 于 2006-6-4 21:59 編輯 ]




six思想
net is everything, net is nothing.
2006-6-4 21:35 #5
 
 
 
 
 
ss
版主

讓我安靜的想一會(huì)兒


UID 4
精華 1
積分 210
帖子 432
威望 210
WM幣 435
閱讀權(quán)限 100
注冊(cè) 2006-5-18
狀態(tài) 離線
STL之父訪談錄



 附件: 您所在的用戶組無(wú)法下載或查看附件



six思想
net is everything, net is nothing.
2006-6-4 21:48 #6
 
 
 
 
 
ss
版主

讓我安靜的想一會(huì)兒


UID 4
精華 1
積分 210
帖子 432
威望 210
WM幣 435
閱讀權(quán)限 100
注冊(cè) 2006-5-18
狀態(tài) 離線
[官方例程]C--的面向?qū)ο笾С帧?/span>

[官方例程]C--的面向?qū)ο笾С帧?br>
最新的版本終于加入了期待已久的功能
就是new和delete這兩個(gè)運(yùn)算子

在之前的版本,就已經(jīng)有部份對(duì)象導(dǎo)向的功能了
不過(guò)用起來(lái)總是覺(jué)得不順手
最大的問(wèn)題就是在于,沒(méi)有new和delete
所以對(duì)象的建構(gòu)和解構(gòu)都要自己來(lái)

現(xiàn)在作者終于將這個(gè)功能加入了compiler里
想當(dāng)然耳,new的功能就是宣告內(nèi)存,并且調(diào)用建構(gòu)子(如果有的話)
而delete就是解構(gòu)并釋放


#pragma option w32c
#include "winbase.h--"
#include "class.h--"
#include "msvcrt.h--"
struct info {
    info(dword str);
    ~info();
    char buf[80];
};

info::info(dword str)
{
    IF(this){
        strcpy(#buf,str);
        printf("%s%s\n","Create class in ",#buf);
    }
    return this;
}

info::~info()
{
    printf("%s%s\n","Destroy class in ",#buf);
}

info ss;

int CheckClass()
{
info s1;
dword w1;
    w1 = new info("allocate memory");
    s1.info("stack memory");
    ss.info("programm memory");
    delete ss;
    delete w1 info;
}

void main()
{
    CheckClass();
}




six思想
net is everything, net is nothing.
2006-6-6 21:47 #7
 
 
 
 
 
ss
版主

讓我安靜的想一會(huì)兒


UID 4
精華 1
積分 210
帖子 432
威望 210
WM幣 435
閱讀權(quán)限 100
注冊(cè) 2006-5-18
狀態(tài) 離線
GDB: The GNU Project Debugger

http://sources.redhat.com/gdb/current/onlinedocs/
================================================================
GDB: The GNU Project Debugger
[bugs] [committee] [contributing] [current cvs] [documentation] [download] [home] [links] [mailing lists] [news] [schedule] [song]
Documentation for GDB version 6.3.50.20050611
Also available: most recent branch | current | last release
Last updated: Sat Jun 11 01:59:12 UTC 2005
GDB‘s Obsolete Annotations
annotate.pdf.gz 128 KB
annotate.dvi.gz 21 KB
annotate.ps.gz 73 KB
annotate.html.tar.gz 18 KB


Debugging with GDB
gdb.pdf.gz 1217 KB
gdb.dvi.gz 419 KB
gdb.ps.gz 618 KB
gdb.html.tar.gz 363 KB


GDB Internals
gdbint.pdf.gz 472 KB
gdbint.dvi.gz 139 KB
gdbint.ps.gz 261 KB
gdbint.html.tar.gz 121 KB


refcard
refcard.dvi.gz 7 KB
refcard.ps.gz 28 KB


STABS
stabs.pdf.gz 293 KB
stabs.dvi.gz 78 KB
stabs.ps.gz 156 KB
stabs.html.tar.gz 66 KB

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Visual C++中調(diào)用匯編語(yǔ)言的研究與實(shí)現(xiàn)
Linux C 語(yǔ)言內(nèi)聯(lián)匯編
從高級(jí)語(yǔ)言到機(jī)器語(yǔ)言
AT&T匯編學(xué)習(xí)筆記
AT&T匯編語(yǔ)言(轉(zhuǎn))
c語(yǔ)言內(nèi)嵌匯編代碼之Clobbers的用途到底是什么
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服