① 如何编译ec文件
用ftp传到服务器上 用gcc
② 请用c语言编译
预编译,编译生成汇编,汇编生成目标文件,目标文件连接库文件生成可执行文件.
预编译 gcc -E
编译 gcc -S
汇编as
连接ld 这两个需要安装binutils rpm包
1,预编译
编写c源程序game.c
#include
int main()
{
printf("Hello World!\n");
}
gcc -E -o pregame game.c
file pregame
pregame: ASCII C program text
cat pregame
gcc -o game game.c 生成 可执行程序 game
gcc -o pregame pregame.c 生成可执行程序pregame
pregame最好用.c做为文件名
发现 game和pregame的运行结果一样,这也说明了预编译的作用.
总结一下预编译的作用:(这些是lorne大人总结的,与我无关)
1. 把"include"的文件拷贝到要编译的源文件中。
2. 用实际值替代"define"的文本。
3. 在调用宏的地方进行宏替换。
2.编译。
gcc -S -o aspregame pregame.c
file aspregame
aspregame: ASCII assembler program text
cat aspregame
.file "pregame.c
.section .rodata
.LC0:
.string "Hello World!"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $4, %esp
movl $.LC0, (%esp)
call puts
addl $4, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.0 20060304 (Red Hat 4.1.0-3)"
.section .note.GNU-stack,"",@progbits
3.生成目标文件.
as -o ldaspregame aspregame
会生成ldaspregame文件
file ldaspregame
ldaspregame: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
4.连接成为可执行文件
gcc -o exldaspregame ldaspregame
③ C语言编译成汇编的问题,一个while(i--)对应着18个汇编命令汇编几乎一点不懂,请神人们详细讲讲吧!
PIC 单片机 可以看看单片机数据手册的指令系统 会有所了解的
07E7 2FEC GOTO 0x7ec ; 无条件转移 -> 0x7ec
07EC 30FF MOVLW 0xff ; W寄存器 = 0xff
07ED 07F0 ADDWF 0x70, F ; W = W+(0x70) 0x70 为寄存器地址
07EE 1803 BTFSC 0x3, 0 ; 如果 (0x3.0)=0 则跳过下一条指令 0x3 的 0位
07EF 0AF1 INCF 0x71, F ; W = (0x71) = (0x71)+1
07F0 30FF MOVLW 0xff ; W寄存器 = 0xff
07F1 07F1 ADDWF 0x71, F ; W = W+(0x71)
07F2 30FF MOVLW 0xff ; W寄存器 = 0xff
07F3 0671 XORWF 0x71, W ; W = W 异或 (0x71)
07F4 1D03 BTFSS 0x3, 0x2 ; 如果 (0x3.2)=1 则跳过下一条指令
07F5 2FF8 GOTO 0x7f8 ; 转移 -> 0x7f8
07F6 30FF MOVLW 0xff ; W寄存器 = 0xff
07F7 0670 XORWF 0x70, W ; W = W 异或 (0x70)
07F8 1D03 BTFSS 0x3, 0x2 ; 如果 (0x3.2)=1 则跳过下一条指令
07F9 2FFB GOTO 0x7fb ; 转移 -> 0x7fb
07FA 2FFC GOTO 0x7fc ; 转移 -> 0x7fc
07FB 2FE8 GOTO 0x7e8 ; 转移 -> 0x7e8
07FC 2FFD GOTO 0x7fd ; 转移 -> 0x7fd
④ 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++软件开发的全部,但是他们很重要。阅读这些书,未必需要化费太多的精力,有时候是会困难,但也有时候会很快速。
最后,编程语言并非计算机科学技术的全部,尤其对于在校的学生来说,打好基础、开阔视野都是非常重要的。
⑤ C文件如何成为可执行文件(编译、链接、执行)——摘自《程序员的自我修养》
本文算是我阅读《程序员的自我修养》(俞甲子等着)相关章节的笔记,文中直接引用了原书中的叙述,强烈建议大家去看原书,本文只做概要介绍而用。——注:文中有很多引用图的地方,请大家自己去找原书看,支持正版!我遇到一个问题,Linux C编程中的问题:.. char *p; unsigned int i = 0xcccccccc; unsigned int j; p = (char *) &i; printf("%.2x %.2x %.2x %.2x\n", *p, p[1], p[2], p[3]); memcpy(&j, p, sizeof(unsigned int)); printf("%x\n", j); ... Output: ffffffcc ffffffcc ffffffcc ffffffcc 0xcccccccc My questions are: 1. Why it prints "ffffffcc ffffffcc ffffffcc ffffffcc"? (if p is unsigned char* then it will print correctly "cc cc cc cc") 2. Why pointer to char p copied to j correctly, why not every member in p overflow? since it is a signed char. 这是别人在邮件列表中提出的问题,在试图回答这个问题的过程中,突然发现,自己对连接器的工作并不熟悉,因此拿来好书《程序员的自我修养》来看,并做如下汇报,强烈推荐《程序员的自我修养》!!!写好的C语言文件,最终能够执行,大致要经过预处理、编译、汇编、链接、装载五个过程。预编译完成的工作: (1)将所有的"#define"删除,并展开所有的宏定义 (2)处理所有条件预编译指令 (3)处理#include预编译指令,将被包含的文件插入到预编译指令的位置,这个过程是递归进行的。 (4)删除所有的注释 (5)添加行号和文件名标识,以便调试 (6)保留所有的#pragma编译器命令,因为编译器需要使用它们。编译完成的工作: (1)词法分析 扫描源代码序列,并将其分割为一系列的记号(Token)。 (2)语法分析 用语法分析器生成语法树,确定运算符号的优先级和含义、报告语法错误。 (3)语义分析 静态语义分析包括生命和类型的匹配,类型的转换;动态语义分析一般是在运行期出现的与语义相关性的问题,如除0错。 (4)源代码生成 源代码级优化器在源代码级别进行优化:如将如(6+2)之类的表达式,直接优化为(8)等等。将语法书转换为中间代码,如三地址码、P-代码等。 (5)代码生成 将源代码转换为目标代码,依赖于目标机器。 (6)目标代码优化汇编完成的工作: 将汇编代码变成机器可以执行的指令链接完成的工作: 链接完成的工作主要是将各个模块之间相互引用的部分处理好,使得各个模块之间正确衔接。链接过程包括:地址和空间分配、符号决议和重定位。 首先讲静态链接,基本的静态链接如下: 我们可能在main函数中调用到定义在另一个文件中的函数foo(),但是由于每个模块式单独编译的,因此main并不知道foo的地址,所以它暂时把这些调用foo的指令的目标地址搁置,等到最后链接的时候让连接器去修正这些地址(重定位),这就是静态链接最基本的过程和作用;对于定义在其他文件中的变量,也存在相同的问题。具体过程如下: (1)空间和地址分配 1)空间与地址分配:扫描所有输入目标文件,获得各个段的属性、长度和位置,并且将目标文件中的符号表中所有的符号定义和符号引用收集起来,放到一个全局符号表中。 2)符号解析和重定位:使用第一步收集到的信息,读取输入文件中段的数据、重定位信息,并进行符号解析与重定位、调整代码中的地址等。 动态链接的过程更为复杂,但是完成的工作类似。 动态链接的初衷是为了解决空间浪费和更新困难的问题,把链接过程推迟到运行时进行 首先介绍一个重要的概念——地址无关代码。为了解决固定装载地址冲突的问题,我们希望对所有绝对地址的引用不作重定位,而把这一步推迟到装载的时候再完成,一旦模块装载地址确定,即目标地址确定,那么系统对程序中所有的绝对地址引用进行重定位。同时我们希望,模块中共享的指令部分在装载时不需要因为装载地址的改变而改变,所以把指令中那些需要被修改的部分分离出来,跟数据放在一起,这样指令部分就可以保持不变,而数据部分可以在每个进程中拥有一个副本,这种方案目前被称为地址无关代码(PIC,Position-independent Code)。 我们需要解决如下四种引用中的重定位问题: 1)模块内部调用或者跳转:这个可以用相对地址调用或者基于寄存器的相对调用,所以不需要重定位2)模块内部数据的访问:用相对寻址的方法,不过链接器实现得十分巧妙: call494 <__i686.get_pc_thunk.cx> add$0x188c, %ecx mov$0x1, 0x28(%ecx) //a=1 调用一个叫做__i686.get_pc_thunk.cx的函数,把call的下一条指令的地址放到ecx寄存器中,接着执行一条mov指令和一个add指令3)模块间数据的访问:在数据段里建立一个指向全局变量的指针数组,也成全局便宜表(GOT),当要引用全局变量时,可以通过GOT相对应的项间接引用: GOT是做到指令无关的重要的一环:在编译时可以确定GOT相对于当前指令的偏移,根据变量地址在GOT中的偏移就可以得到变量的地址,当然GOT中哪个每个地址对应于哪个变量是由编译器决定的。4)模块间的调用、跳转:采用上面类似的方法,不同的是GOT中相应的项存储的是目标函数的地址,当模块需要调用目标函数时,可以通过GOT中的项进行间接跳转。 地址无关代码小结: 现在,来看动态链接中的另一个重要问题——延迟绑定(PLT)。当函数第一次被用到时才进行绑定,否则不绑定。PLT为了实现延迟绑定,增加了一层间接跳转。调用函数并不是通过GOT跳转的,而是通过一个叫PLT项的结构进行跳转的,每个外部函数在PLT中都有对应的项,如函数bar,其在PLT对应的项的地址记为bar@plt,实现方式如下: bar@plt: jmp* (bar@GOT) pushn pushmoleID jump_dl_runtime_resolve 链接器的这个实现至为巧妙: 如果在连接器初始化阶段,已经正确的初始化了bar@GOT,那么这个跳转指令的结果正是我们所期望的,但是,为了实现PLT,一般在连接器初始化时,将"pushn"的地址放入到bar@GOT中,这样就直接跳转到第二条指令,相当于没有进行任何操作。第二条指令“pushn”,n是bar这个符号引用在重定位表“.rel.plt”中的下标。接着将模块的ID压栈,跳转到_dl_runtime_resolve完成符号解析和重定位工作,然后将bar的地址填入到bar@GOT中。下次再调用到bar时,则bar@GOT中存储的是一个正确的地址,这样就完成了整个过程。 在链接完成之后,就生成了你要的可执行文件了,如ELF文件,至于这个文件的详细的信息,可以参考相关的文档。 现在,你要运行你的可执行文件,这是如何做到的呢? 我们从操作系统的角度来看可执行文件的装载过程。操作系统主要做如下三件事情:(1)创建一个独立的虚拟地址空间,但由于采用了COW机制,这里只是复制了父进程的页目录和页表,甚至不设置映射关系(参考操作系统相关书籍)。(2)读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系。(3)将CPU的指令寄存器设置成可执行文件的入口地址,启动运行。我们来看一下执行过程中,进程虚拟空间的分布。 首先我们来区分Section和Segment,都可以翻译为“段”,那么有什么不同呢?从链接的角度来讲,elf文件是按照Section存储的,从装载的角度讲,elf文件是按照Segment存储的。”Segment”实际上是从装载的角度重新划分了ELF的各个段,将其中属性相似的Section合并为一个Segment,而系统是按照Segment来映射可执行文件的。
⑥ 编译esal/c程序的makefile文件如何写
你可以根据这样的方法来编写:
b074@gliethttp:~/work/gunzip$ cat Makefile
CC = gcc-4.1
LD = gcc-4.1
CFLAGS = -Wall -c -Dgliethttp -I.
LDFLAGS = -lpthread
SRCS = $(wildcard *.c)
OBJS = $(patsubst %c,%o,$(SRCS))
TARGET = gliethttp
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^
%o: %c
$(CC) $(CFLAGS) -o $@ $<
clean:
@rm -f *.o $(TARGET)
编译当前Makefile所在目录下的所有.c文件
执行
make
make clean
⑦ 易语言中可以把*.e的文件编译成*.ec格式的文件吗如果可以,要怎么做
通常来说不可以 , 但是有一个特例。当*.e的代码是模块的时候,用易语言打开,静态编译出来就是*.ec了。这是因为易语言无论是编写什么保存的源代码都是*.e,所以编写模块的时候保存的代码也是*.e,这样就能通过源代码编译出模块(*.ec)
⑧ 易语言ec模块的使用问题
.版本 2
.程序集 窗口程序集1
.子程序 _按钮1_被单击
删除文件 (“C:\AA.exe”)
删除文件用不到。ce模块
而且你理解有误
模块的内容经过编译后全部引用到程序中来的,并不是调用模块里的内容。