分享

汇编语言与C语言的混合使用

 skywood 2006-12-02
在C语言中如何使用汇编语言呢?这个问题在不同的编译器中,具体实现方法是不同的。不过在实现大方上也不过就是有两种,而且各种编译器的实现方法也是大同小异。一种是在C语言中嵌入汇编语言代码,另一种是让C语言从外部调用汇编。下面我们就以Borland格式为例来说一说具体用法。但是,GCC与Microsoft的实现方法的与Borland只在格式上有点区别。当然,GCC的嵌入汇编是AT&T格式的。还好,不管什么格式,只是表达形式的不同而已,其内在含义是一模一样的。还是那句话各种编译器的实现方法是大同小异的,并没有本质的区别。另外在最后还附带了一篇介绍在GCC中使用内嵌汇编的文章。

一、两种实现方式

首先,我们看一看在C语言中如何嵌入汇编语言代码。在C语言中嵌入汇编语言代码,也有两种格式,一种是单句的,一种是模块的。

我们来看看一些简单的例子。

例子1:

单句格式的:

main()


asm     mov ah,2;
asm     mov bh,0;
asm     mov dl, 20;
asm     mov dh,10;
asm     int 10h; /*调用BIOS中断设置光标位置*/



模块格式的:

main(){

asm{

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

      }
}
在这个小程序里面并没有突出“嵌入”二字。不过从这个程序中可以看出其基本格式。嵌入的各行代码前面加上asm关键字或者把汇编语句放入asm代码块中,每行以分号或换行符结束,而注释必须是C语言格式的。

下面我们来看一个让C语言和汇编协作的例子:

例子2:

main()

{

char const *MESSAGE=”OutPut from asm..\n$”;

asm{

  mov ah, 9
            mov dx, MESSAGE
            int 21h

}

}

上面这个例子十分的简单,它的纯C语言版本是:

#include <stdio.h>

main()

{

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

接下来我们看一看如何让C语言调用汇编例程。我们还是看一个简单的小程序:

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

通过上面这个程序,你会看到调用汇编语言的关键就是如何传递参数。事实上,是通过堆栈来传递的但是具体规则是什么呢?下面我就来看看。

二、调用规则

       实际上,在C语言中使用汇编语言最困难的就是如何安全有效的传递参数。否则在调用汇编子程序时就会从堆栈中取出错误的参数。更可恶的是这种错误在编译的时候是不会发现错误提示的。

       下面是C与MASM汇编语言混合是用的时候采用的规则:

1、  参数传递的次序与它们出现的次序是相反的。例如上例中的cursor (x,y)中,首先传递的是y,然后才是x。这与我们的一般想法是不一样的,所以在这儿容易出现错误。

2、  传递完参数后,C程序还将保存(CS,IP)。如果C程序是SMALL或COMPACT存储模式下编译的(或者过程是NEAR型的),那么只保存IP,而在MEDIUM、LARGE或HUGE模式下编译的(或者过程是FAR型的),那么CS和IP都会被压入堆栈,其顺序是CS在前,IP在后。不过这个过程是C语言自动进行的而不需要我们干预。这也就是我们在例子2中为什么用MOV  DH,[BP+4]而不是MOV  DH,[BP]。因为前面是CS和IP而不是参数,真正的参数从[BP+4]开始。

3、  还有BP也必须保存在堆栈中,然后我们才可以通过BP和偏移地址来访问参数。

4、  最后一条指令应当是后面不带数字的RET,因为把堆栈到原始位置的工作将由C程序重新获得控制权以后才会执行。

5、  任何于C程序共享的名称都必须在前面加下划线,而且C语言只识别前8个字符。

6、  对于普通的参数C语言传递的是参数值,而对于数组,传递的是指针(也就是数据的地址)。

7、  如果C程序是在MEDIUM、LARGE或HUGE模式下编译的,那么汇编语言过程应该设为FAR型,C程序是SMALL或COMPACT存储模式下编译的,那么汇编语言过程应该设为NEAR型。

不过在MASM5.1或TASM1.0以及更高的版本的时候就不必担心偏移地址、在共享名称前加下划线以及保存BP这些琐事了,因为它们可以由编译器自动完成了。很显然例子2是旧格式的。

三、把参数返回C程序

       当C程序需要从汇编过程获得某个参数时,这个参数应该通过寄存器来传递。具体使用哪些寄存器取决于参数的大小,请看下表:

寄存器                                        大小(字节)                                 C数据类型

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


四、把汇编语言程序与C语言程序链接到一起

1、  确保汇编语言中的过程被定义为PUBLIC,过程名以下划线开始。例如,在C语言中叫做“sum”到汇编语言中就应该是“_sum”.

2、  在C语言程序中过程定义为外部类型,例如在例子2中的extern cursor (int,int)。

3、  用汇编器对汇编语言程序汇编,得到XXX.obj文件。

4、  用C语言编译器编译C语言程序,得到YYY.obj文件。

5、  用链接器将它们链接到一起生成可执行文件:

link XXX.obj + YYY.obj

       以上就是混合使用C语言和汇编语言应该注意的几点问题。关于在GCC中使用汇编语言大体上是和上面一样的,只是实现细节上有一点区别而已。下面的这篇文章对于在GCC中使用内嵌汇编进行详细的解释。


GCC使用的内嵌汇编语法格式小教程   

本文对内嵌汇编语法,从基本语法、内嵌汇编的格式介绍、和扩展的内嵌汇编格式进行了详细说明,需要说明的是GCC采用的是AT&T的汇编格式.

一、 基本语法

语法上主要有以下几个不同.

★ 寄存器命名原则

AT&T: %eax Intel: eax

★源/目的操作数顺序

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

★常数/立即数的格式

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

把_value的地址放入eax寄存器

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

★ 操作数长度标识

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

★寻址方式

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

Intel: [basepointer indexpointer*indexscale imm32]

Linux工作于保护模式下,用的是32位线性地址,所以在计算地址时不用考虑egmentffset的问题.上式中的地址应为:

imm32 basepointer indexpointer*indexscale

下面是一些例子:

★直接寻址

AT&T: _booga ;

_booga是一个全局的c变量注意加上$是表示地址引用,不加是表示值引用.

注:对于局部变量,可以通过堆栈指针引用.

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]  

二、 基本的内嵌汇编

基本的内嵌汇编很简单,一般是按照下面的格式

asm(statements);

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

asm 和 __asm__是完全一样的.

yjtammmm(游客)发表评论于2006-3-25 19:43:26 个人主页 | 引用 | 返回 | 删除


行间嵌入汇编,怎么样运行呀,最好是步骤,本人笨呀

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
查看资料  Blog  发短消息  QQ  顶部
 
ss
版主
Rank: 7Rank: 7Rank: 7
让我安静的想一会儿


UID 4
精华 1
积分 210
帖子 432
威望 210
WM币 435
阅读权限 100
注册 2006-5-18
状态 离线
让C和汇编一起工作

这里用的平台分别是DEV-CPP(mingw)和NASM汇编器。注意不是通常使用的MASM。我个人比较喜欢NASM,而MASM和TASM用得不是太多。下面分成两部分说明。需要查阅的参考文献是NASM的用户手册。关于C语言调用约定方面的一些事项也可以在NASM的官方文档中得到。

1、在汇编中调用C代码
说明:mingw编译系统在所有C符号前加了一个下划线前导符。所以在汇编代码中要用extern指令进行特殊处理。还是用实例来说明比较直观。假设我们分别建了两个文件,一个是Calc.c,另一个是CallCalc.asm。两个文件中各有一个函数。
Calc.c中内容为:
/* 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中的内容为:
;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()函数接受两个整型参数,相加后返回给调用者,返回值按照C语言调用约定存放在EAX寄存器中;在汇编代码中要先要用extern关键字将_add声明为外部符号,然后才能在程序中使用。这里我们只需要知道C的符号规则是要加一个前导下划线就可以了。在调用的地方用的也是call _add

2、在C中调用汇编代码
同样,我们假设有两个文件,一个是SimpleRet.asm,一个是CallAsm.c
SimpleRet.asm中的内容是:
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;do nothing,just return a integer value
;;;;;;;;;;;;;;;;;;;;;;;;;;;
[section .text]
[bits 32]
global _RetInt
_RetInt:
  mov ax,1
  ret

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

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

运行结果将会打印1

总结:所有的要点就是C调用约定和global关键字以及extern关键字的使用
global将符号导出给链接器
extern声明外部的符号




six思想
net is everything, net is nothing.
2006-6-4 21:08 #2
查看资料  Blog  发短消息  QQ  顶部
 
ss
版主
Rank: 7Rank: 7Rank: 7
让我安静的想一会儿


UID 4
精华 1
积分 210
帖子 432
威望 210
WM币 435
阅读权限 100
注册 2006-5-18
状态 离线
Dev-cpp 小型指南,原载于CSDN论坛

Dev-cpp是一个GCC在win32下的IDE程序,用Dephi 5编写,只有2M
具有以下功能:

   1.集成编译环境,支持工程模板.
   2.支持语法加高,自动注释,对中文的支持也不错.
   3.支持CVS集成
   4.支持源码分析,可以形成类树图.
   5.支持扩展包.

Dev-cpp官方发布有集成MinGW32 gcc编译套件,最新支持GCC 3.3(2003-7-15)
也可以支持MinGW其它版本和Cygwin gcc的各个版本.不过需要手动设置.

Dev-cpp支持多语言环境,中文版界面由我的好友nyra(nyra@sohu.com)维护,如果
大家发现中文版有翻释问题可以找她.如果有兴趣翻译帮助文件,也请联系.

Dev-cpp有两个常用版本,一是开发中的5.0beta,最新一版是4.9.8.0
另一个是4.01,是4.0的修正版(其中集成Gcc 2.9.5),前者功能较多,而后者较稳定.

图形化环境我就不多说了,和VC的用法类似,其实大家问题多集中于Gcc本身.

GCC, GCC和gcc不同的东西.前者是Gnu的编译环境,包括gcc, g++, gcj等多种语言的编译器
和as(汇编), ar(库), ld(联接器)等一系统编译工具.gcc是GCC中C语言的编译器,g++是
C++语言的编译器.

GCC被移植到多种操作系统中,在Win32上最著名是MinGW和Cygwin两个版本,MinGW的全称是
Minial GCC for Windows,如题,它是Win32上的一个小型GCC,只包括最少的GCC组件<10M
而Cygwin就是一个Unix On Windows的大系统,全部下载有300多兆,Unix下的大多数软件
在Cygwin中都有移植版,包括X-windows.还有一个for Dos-32 的GCC,名叫Djgpp,与Mingw的
目标类似,不同的是它是一个以MZ为目标程序的可以在非Win32环境下运行(例如FreeDOS)
它们都移值了GCC官方发布的最新版GCC.

下面集中力气讲GCC 3.2以及Mingw移植版.

GCC3.2(G++)号称是对C++标准支持最好C++编译器,真否不确.(因为VC7.0也说它是)但是
有一点很明确,在没做特殊配置的情况下,G++只支持标准C++语法,不再对早期的非标准
C++语法进行支持.所以VC下的C++程序很多不能运行.BC++3.1等(很多教科书的目标平台)
的例程也不支持.所以,请在问为什么我的程序在XX编译器中可以运行,而到了Dev-cpp
中不能编译之类问题前,首先请查看你的程序是不是真正的没错.

Dev-cpp对以cpp,cxx为扩展名的文件默认使用G++编译,所以如果你的C语言程序请以c为扩展
名,不然很可能出错,请记住C和C++是两种不能的语言,它们并非完全兼容.
C++的标准是C++ 98,而语言的新标准是C99,但它们都要收费,推荐B.S.的C++ Programming
Language做为C++的标准参考书.当然如果以C++ 98标准为参考也不错.

MinGW包括:gcc,g++,gdb和binary utils以及一个msys环境(单独下载),前面几项都是命令行
程序.MinGW除了标准c++库和标准C库,还包括一个称为w32api的Win32库和openGL库.

目录结构如下如果你下载的Devcpp,它们在Dev-cpp/mingw32目录下
/bin      可执行程序(壳)
/include  头文件
/mingw
/usr/   (真实的)可执行程序
/lib   库

Dev-cpp的默认安装中,相关的路径都已经设好.如没有设好,很难编译.
设置方法是在选项/编译环境菜单中设置.
注意新的C++头文件在/include/g++/3.2/下

下面回答一些问题:

1.多朋友问到在devc++下面做图形,抱歉,devC++没有graphics.h文件的,好像不能作图(具体解决办法,期待高手补充.....)
graphics.h是borland的Dos图形库的头文件,win32下不支持,请使用win32的绘图方法GDI或DirectDraw.

2. Dev C++ 是用dllwrap.exe来做DLL的(原话是这样的,期待高手解释.......
是的,dllwrap语法是:
dllwrap 选项 目标文件(即*.o)
常用选项有:
  --def <filename> DEF文件名
  --dllname <名称>  DLL的名称
  --implib <导入lib名> 输出DLL导入库

3.关于库的引用
GCC的库名为libXXX.a其中XXX为库名,编译时只需要增加选项-lXXX即可。GCC的目标文件与
VC使用的Coff以及Borland使用的OMF格式都不一样,不能直接使用.需要重新编译生成.a的库。

GCC库管理程序是ar,它的用法是:ar rcs 库文见名.a 目标文件.o  哦,有人说过了

4.关于调试及目标文件的大小.
Dev-cpp的调试一直不是很好用,原因是它不是直接调试,而是调用了GDB这个命令行程序,
所以有的地方打不到断点, 有时有的语句并不执行,所以乱跳的感觉,实际上,只要仔细
观察一下,它不执行和不能打断点都是很有理由的,不像VC在空行上也可以打断点.
目标文件很大是因为标准IO库,新的标准IO库是全用模板生成的,所以静态库相当大.
而GCC一直没有把它做成动态库,所以每次程序都要联接到几百K.另外,GCC模板的生成也
很笨(或者说为了附合标准),所以目标程序很大.不过在mingw中有一个strip的程序.
可以为它减肥.
想要产生小的程序有几个方法:
0.优化程序!!!!
1.全部使用动态库,包括C运行库.
2.不要调试选项.
3.使用面向程序大小的的优化选项.

至于环境,我觉得应该是各有所好,并不一定非得要这样那样,同样的文本编辑器就可以用好几种的
MingW,NASM,Bochs,Binutils,Insight(GDB)的环境就足够了

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




six思想
net is everything, net is nothing.
2006-6-4 21:34 #4
查看资料  Blog  发短消息  QQ  顶部
 
ss
版主
Rank: 7Rank: 7Rank: 7
让我安静的想一会儿


UID 4
精华 1
积分 210
帖子 432
威望 210
WM币 435
阅读权限 100
注册 2006-5-18
状态 离线
C++语言学习推荐书目

(一)语言入门:
《C++ Primer》
最新版本:第三版(第四版国外已上架,国内一些网上书店也在预订中)
适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是好事。

《The C++ Programming Language》/《C++程序设计语言》
最新版本:第三版特别版
简称TC++PL,有其他语言的丰富经验的。(也有人简称之为“TCPL”,但需与另一本《The C Programmer Language》区分开来)

《Essential C++》
《Accelerated C++》
这两本薄一些,都是不错的选择。《Accelerated C++》本人没有读过,从各方面的评价来看,完全值得推荐。

以上几本书都有相应的中文版,而且翻译的质量都不错。上面的书未必都需要读一遍,但无论如何,TC++PL是应该阅读的。

(二)进阶A:
这个路线侧重于语言本身

《Effective C++》
最新版本:第二版(第三版国外已上架,国内一些网上书店也在预订中)
简称EC。C++程序员必读!很多时候,我们说C++圣经不是指TC++PL,而是这一本。《The Pragmatic Programmer》一书中写到:“一旦你发现自己要参与C++项目的开发,赶快跑(不要走)到书店去购买Scott Mayer的《Effective C++》,可能还要《More Effective C++》”。

《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》/《C++ 编程规范》
个人认为此书应为C++程序员必备的案头书。几乎Effective系列和Exceptional系列都在这里得到了总结。最新的模版、异常的业界经验都在这里的到了体现。可能的唯一缺陷就是对一个新手而言,关于“为什么这么做”的问题,解释的不够。
我的看法是:如果你不理解其中的条款,记忆,并且照做;如果你理解其中的条款,我猜你一定会同意书中的观点。我认为这本书中的内容至少在2009年以前都不会过时,人们将广为传诵它制定的101条戒律。
还不知道他的简称,也许“101”会成为一个候选者?

提到《Effective C++》,那么另外三本书一一浮出水面:
《More Effective C++》
《Exceptional C++》
《More Exceptional C++》。
新书《Exceptional C++ Style》也是值得一看的好书。
上述几本书,一本也不应该放过。
个人建议上述书籍按顺序阅读。并且,在将来反复阅读这几本书。

(三)进阶B:
这个路线侧重于程序库。

《The C++ Standard Library》/《C++标准程序库—自修教程与参考手册》
听说过STL吗?这本书会教你最基本的,也是最重要的STL的使用。这本书,应该是必读的。

《Effective STL》
会使用STL还不够,还必须知道什么时候选择什么STL组件,这是STL使用的必读书。

《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》/《泛型编程与STL》。
这本书理论性较强,但是真的很严谨,而且并不是非常难懂。理解其中对于Concept的解释,将是非常重要的。

《C++ STL》
这不是讲述使用程序库的,而是讲述程序库实现原理的。肠胃不好的,需要慢慢吸收。

这个路线的书,仍然是建议按顺序阅读。
进阶A、进阶B两个路线应该是可以并行的。

其他进阶参考书
提出这些参考书,只是避免争议,也为开阔视野,笔者并不曾完全读过所有的。

《Thinking in C++》/《C++编程思想》
这本书及其中文版传言好坏都有,没有认真看过,不做评价,如果确有兴趣,不妨尝试一下该书。

以下几本书基本上涉及的都是语言本身,大体上可以按照以下的顺序阅读。

《C++必知必会》
如果早一年,这本书将是重量级的,然而它被101和《Exceptional C++ Style》盖过一头。

《C++ Gotchas: Avoiding Common Problems in Coding and Design》/《C++程序设计陷阱》
这又是一本我未曾读过,而且广受好评的书。

《STL 源码剖析》
这本书我刚到手,就被人"借"走,以至于到现在也没有看过。看过这本书的朋友,可以给一个合适的评价。

高级:
《The Design and Evolution of C++》/《C++语方的设计和演化》
简称D&E,内容并不艰深,Bjarne的书,仅此,就值得一读。
前段时间,互动网曾8块一本(人民币)贱卖此书,现在好像没了。

《Inside The C++ Object Model》/《深度探索C++对象模型》
C程序员读后一定会觉得C++原来并不神秘。

《C++ Template》
在阅读STL、Boost或者Loki的源代码之前,请仔细阅读本书,它可以减轻一些阅读的烦恼。这本书是讨论C++模版的权威。

《Modern C++ Design Generic Programming and Design Patterns Applied》/《C++设计新思维——泛型编程与设计模式之应用》
简称MCD。在阅读MCD之前,建议先阅读一下《C++ Template》。

《对象揭秘:Java、Eiffel和C++》
你对C++不满吗?这本书可以部分地帮你完成抱怨的目标。也许它还可以让你不迷信C++。

最后,一份C++标准文档也是应该加以咀嚼的。
还有一些书籍,并不能简单的归于C++,也难以在纯粹的书本学习中加以掌握。《Design Patterns》/《设计模式》一书就归于此类。

所有上述的书籍,要么谈论C++语言本身,要么谈论STL的,要么兼而有之(当然严格讲STL也是C++语言非常重要的一部分)。偶尔,某些书中条目也会涉及实际工程。这些书并不是C++软件开发的全部,但是他们很重要。阅读这些书,未必需要化费太多的精力,有时候是会困难,但也有时候会很快速。
最后,编程语言并非计算机科学技术的全部,尤其对于在校的学生来说,打好基础、开阔视野都是非常重要的。

但是个人感觉,其实java和c还是c++也就是那么回事,任何事情都有优缺点,至于功能不敢多谈
下面是更深些的东西了

算法 + 数据结构 = 程序

  记得Pascal之父、结构化程序设计的先驱Niklaus Wirth最著名的一本书,书名叫作《算法 + 数据结构 = 程序》,算法与数据结构之于程序设计的重要性不言自明。那么,什么是算法?什么是数据结构?什么又是程序呢?
  我们先从阐明大家最为熟悉的"程序"的概念入手。程序是计算机指令的某种组合,控制计算机的工作流程,完成一定的逻辑功能,以实现某种任务;再来看什么是算法,算法是程序的逻辑抽象,是解决某类客观问题的数学过程;最后我们来看一看数据结构又是什么呢?在这里,数据结构具有两个层面上的涵义--逻辑结构和物理结构:客观事物自身所具有的结构特点,我们将其称之为逻辑结构。如家族谱系是一个天然的树型逻辑结构。而逻辑结构在计算机中的具体实现则称之为物理结构。如树型逻辑结构是用指针表示还是使用数组实现。
  仔细体会一下,就会发现算法与数据结构间的紧密性。用一个较为贴切的例子来形容,若把数据结构喻为建筑工程中的建筑设计图,那么算法就是工程中的施工流程图。数据结构与算法呈相互依托的关系,恰当的确立了问题的结构,问题的解决才能根据确立的层次结构选择合适的解决方法。因此任何讲解数据结构的书都不可能撇开算法,单单介绍数据结构,反之亦然。下面,我们就来看看IEEE ‘97Booth教育奖获得者Sartaj Sahni是如何处理数据结构、算法和程序他们三者之间的关系的吧!
  一般来说,计算机专业著作有两种基本写作方式:一种是教材,一种是百科全书。本书是按照大学教材的结构来写的,然而令人惊讶的是本书的内容是如此的丰富,以至于同样可以将它看作是一本关于数据结构与算法的大全。显然,这本书并不适合初学,将它作为数据结构进阶学习的第二本书是恰当的。这本书最为显著的特点是特别注重应用,我们很快就会看到这一点。
  数据结构与算法方面的好书很多,我在这里没有作一一介绍,而是着重推荐了一些经典著作:
  《计算机编程艺术》The Art of Computer Programming(Volume I ~ III) (第1卷 基本算法、第2卷 半数值算法、第3卷 排序与查找) 国防工业出版社 数据结构的开拓者D.E.Knuth高德纳编著的计算机科学发展史上的不朽之作。第1卷 基本算法 介绍计算机程序设计的基本算法,包括基本的编程概念和技术以及信息结构--机内信息的表示、数据元及其处理的结构关系;第2卷 半数值算法 介绍随机数和算术,提供了计算机编程和数值分析之间的丰富接口;第3卷 排序与查找 介绍排序和查找的最权威的经典技术,扩充了第1卷的数据结构,以处理大小型数据库及内外部存储。本书偏重分析技术,采用汇编语言描述算法,是一本本学科最经典最权威的百科全书,适合于从事数据结构与算法研究的专家阅读。
  《算法 + 数据结构 = 程序》科学出版社 Pascal之父Niklaus Wirth著 一本简洁、清晰具有深刻内涵的小册子。介绍了许多巧妙的程序设计技术,书中还完成了一个简单的程序设计语言的实现,真不愧为世界级的编译器设计专家。这本书的难度也很大,将它作为数据结构高级读物更好一些。
  《数据结构与算法》 [美]A.V.阿霍,[美]J.E.霍普克罗夫特著 看看作者名字就知道这本书的水平了,不过这本书现在很难找到了。
  《数据结构与算法》苏运霖著 中南工业大学出版社 作为《计算机编程艺术》的中文译者,苏运霖先生的这一本专著亦采用百科全书式写法,内容相当艰深,对数学功底要求特别高。
  《数据结构与算法分析》(C++版、JAVA版) Shaffer著 电子工业出版社 讲解清晰易懂、内容丰富,适于自学。

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




six思想
net is everything, net is nothing.
2006-6-4 21:35 #5
查看资料  Blog  发短消息  QQ  顶部
 
ss
版主
Rank: 7Rank: 7Rank: 7
让我安静的想一会儿


UID 4
精华 1
积分 210
帖子 432
威望 210
WM币 435
阅读权限 100
注册 2006-5-18
状态 离线
STL之父访谈录



 附件: 您所在的用户组无法下载或查看附件



six思想
net is everything, net is nothing.
2006-6-4 21:48 #6
查看资料  Blog  发短消息  QQ  顶部
 
ss
版主
Rank: 7Rank: 7Rank: 7
让我安静的想一会儿


UID 4
精华 1
积分 210
帖子 432
威望 210
WM币 435
阅读权限 100
注册 2006-5-18
状态 离线
[官方例程]C--的面向对象支持。

[官方例程]C--的面向对象支持。

最新的版本终于加入了期待已久的功能
就是new和delete这两个运算子

在之前的版本,就已经有部份对象导向的功能了
不过用起来总是觉得不顺手
最大的问题就是在于,没有new和delete
所以对象的建构和解构都要自己来

现在作者终于将这个功能加入了compiler里
想当然耳,new的功能就是宣告内存,并且调用建构子(如果有的话)
而delete就是解构并释放


#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
查看资料  Blog  发短消息  QQ  顶部
 
ss
版主
Rank: 7Rank: 7Rank: 7
让我安静的想一会儿


UID 4
精华 1
积分 210
帖子 432
威望 210
WM币 435
阅读权限 100
注册 2006-5-18
状态 离线
GDB: The GNU Project Debugger

http://sources./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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多