国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

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

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

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

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

我們來看看一些簡(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è)小程序里面并沒有突出“嵌入”二字。不過從這個(gè)程序中可以看出其基本格式。嵌入的各行代碼前面加上asm關(guān)鍵字或者把匯編語句放入asm代碼塊中,每行以分號(hào)或換行符結(jié)束,而注釋必須是C語言格式的。

下面我們來看一個(gè)讓C語言和匯編協(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語言版本是:

#include <stdio.h>

main()

{

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

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

C語言部分如下:

extern cursor (int,int),

main()

{

        cursor(15,12);
        }

匯編語言部分如下:

.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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

link XXX.obj + YYY.obj

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


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

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

一、 基本語法

語法上主要有以下幾個(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的問題.上式中的地址應(yīng)為:

imm32 basepointer indexpointer*indexscale

下面是一些例子:

★直接尋址

AT&T: _booga ;

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

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

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用得不是太多。下面分成兩部分說明。需要查閱的參考文獻(xiàn)是NASM的用戶手冊(cè)。關(guān)于C語言調(diào)用約定方面的一些事項(xiàng)也可以在NASM的官方文檔中得到。

1、在匯編中調(diào)用C代碼
說明:mingw編譯系統(tǒng)在所有C符號(hào)前加了一個(gè)下劃線前導(dǎo)符。所以在匯編代碼中要用extern指令進(jìn)行特殊處理。還是用實(shí)例來說明比較直觀。假設(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語言調(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編寫,只有2M
具有以下功能:

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

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

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

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

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

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

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也說它是)但是
有一點(diǎn)很明確,在沒做特殊配置的情況下,G++只支持標(biāo)準(zhǔn)C++語法,不再對(duì)早期的非標(biāo)準(zhǔn)
C++語法進(jìn)行支持.所以VC下的C++程序很多不能運(yùn)行.BC++3.1等(很多教科書的目標(biāo)平臺(tái))
的例程也不支持.所以,請(qǐng)?jiān)趩枮槭裁次业某绦蛟赬X編譯器中可以運(yùn)行,而到了Dev-cpp
中不能編譯之類問題前,首先請(qǐng)查看你的程序是不是真正的沒錯(cuò).

Dev-cpp對(duì)以cpp,cxx為擴(kuò)展名的文件默認(rèn)使用G++編譯,所以如果你的C語言程序請(qǐng)以c為擴(kuò)展
名,不然很可能出錯(cuò),請(qǐng)記住C和C++是兩種不能的語言,它們并非完全兼容.
C++的標(biāo)準(zhǔn)是C++ 98,而語言的新標(biāo)準(zhǔn)是C99,但它們都要收費(fèi),推薦B.S.的C++ Programming
Language做為C++的標(biāo)準(zhǔn)參考書.當(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è)好.如沒有設(shè)好,很難編譯.
設(shè)置方法是在選項(xiàng)/編譯環(huán)境菜單中設(shè)置.
注意新的C++頭文件在/include/g++/3.2/下

下面回答一些問題:

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

2. Dev C++ 是用dllwrap.exe來做DLL的(原話是這樣的,期待高手解釋.......
是的,dllwrap語法是:
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ù)文見名.a 目標(biāo)文件.o  哦,有人說過了


4.關(guān)于調(diào)試及目標(biāo)文件的大小.
Dev-cpp的調(diào)試一直不是很好用,原因是它不是直接調(diào)試,而是調(diào)用了GDB這個(gè)命令行程序,
所以有的地方打不到斷點(diǎn), 有時(shí)有的語句并不執(zhí)行,所以亂跳的感覺,實(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一直沒有把它做成動(dòng)態(tài)庫(kù),所以每次程序都要聯(lián)接到幾百K.另外,GCC模板的生成也
很笨(或者說為了附合標(biāo)準(zhǔn)),所以目標(biāo)程序很大.不過在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)境,我覺得應(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++語言學(xué)習(xí)推薦書目

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

《C++ Template》
在閱讀STL、Boost或者Loki的源代碼之前,請(qǐng)仔細(xì)閱讀本書,它可以減輕一些閱讀的煩惱。這本書是討論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++不滿嗎?這本書可以部分地幫你完成抱怨的目標(biāo)。也許它還可以讓你不迷信C++。

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

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

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

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

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



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



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)向的功能了
不過用起來總是覺得不順手
最大的問題就是在于,沒有new和delete
所以對(duì)象的建構(gòu)和解構(gòu)都要自己來

現(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)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Visual C++中調(diào)用匯編語言的研究與實(shí)現(xiàn)
Linux C 語言內(nèi)聯(lián)匯編
從高級(jí)語言到機(jī)器語言
AT&T匯編學(xué)習(xí)筆記
AT&T匯編語言(轉(zhuǎn))
c語言內(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)系客服