摘要: cl的位置:开始 –> 所有程序 -> Microsoft Visual Studio ->Visual Studio Tools -> Developer Command Prompt编译器产生通用对象文件格式 (COFF) 对象 (.obj) 文件。链接器产生可执行文件 (.exe) 或动态链接库文件 (DLL)。注意,所有编译器选项都区分大小写。若要编译但不链接,请使用/c。语法:CL [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...]选项optio 阅读全文
posted @ 2012-05-02 21:16 KingsLanding 阅读(8152) 评论(0) 推荐(0) 编辑
摘要: PE: Portable ExecutableCOFF: Common Object File Format跟ELF一样,PE中也允许程序员将变量后函数放到自定义段。在GCC中使用“__attribute__((section)("name"))”,在VISUAL C++中可以使用 “#pragma”编译器指示。#pragma data_seg("FOO")int global = 1;#pragma data_seg(".data")使用cl 编译器:开始 –> 所有程序 -> Microsoft Visual Stud 阅读全文
posted @ 2012-05-02 21:04 KingsLanding 阅读(1023) 评论(0) 推荐(0) 编辑
摘要: 对于多个输入目标文件,链接器如何将它们的各个段合并到输出文件? 或者说,输出文件中的空间如何分配给输入文件?/*假设有a.c*/extern int sharedint main(){int a = 100;swap(&a,&shared);}/*b.c*/int shared = 1;void swap(int *a, int *b){*a ^= *b ^= *a ^= *b;}“链接器为目标文件分配地址和空间”中的“地址和空间”其实有两个含义:第一个是在输出的可执行文件中的空间;第二个是在装载后的虚拟地址中的虚拟地址空间。这个链接过程分两步:第一步 : 空间与地址分配扫描所 阅读全文
posted @ 2012-05-02 20:50 KingsLanding 阅读(1841) 评论(0) 推荐(0) 编辑
摘要: GAS中每个操作都是有一个字符的后缀,表明操作数的大小。C声明GAS后缀大小(字节)charb1shortw2(unsigned) int / long / char*l4floats4doublel8long doublet10/12注意:GAL使用后缀“l”同时表示4字节整数和8字节双精度浮点数,这不会产生歧义因为浮点数使用的是完全不同的指令和寄存器。操作数格式:格式操作数值名称样例(GAS = C语言)$ImmImm立即数寻址$1 = 1EaR[Ea]寄存器寻址%eax = eaxImmM[Imm]绝对寻址0x104 = *0x104(Ea)M[R[Ea]]间接寻址(%eax)= *ea 阅读全文
posted @ 2012-05-01 19:37 KingsLanding 阅读(4221) 评论(0) 推荐(0) 编辑
摘要: 最近在看“程序员的自我修养”,看到了gcc内嵌汇编,静态链接那章的示例程序比较有趣,于是准备学习一下AT&T语法的gcc内嵌汇编。以前学微机原理的时候学习过汇编,现在基本上还给了老师,还是复习一下吧。像大家一样先来介绍一下AT&T语法与Intel asm语法的不同(顺便也学学基本知识):在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:AT&T 格式Intel 格式pushl %eaxpush eax在 AT&T 汇编格式中,用 '$' 前缀表示一个立即操 阅读全文
posted @ 2012-05-01 19:27 KingsLanding 阅读(12184) 评论(0) 推荐(6) 编辑
摘要: 之前上嵌入式的课程,罗老师强调了函数可重入的重要性,而且还举例某某著名通信公司开发过程中函数不可重入导致的问题,于是对函数可不可重入比较注意,在看书的时候又遇到了这个问题,于是准备认真学习一下。一、可重入函数1)什么是可重入性?可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。2)可重入函数:不为. 阅读全文
posted @ 2012-05-01 18:13 KingsLanding 阅读(754) 评论(0) 推荐(0) 编辑
摘要: 一、什么是条件变量与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。条件的检测是在互斥锁的保护下进行的。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件 阅读全文
posted @ 2012-04-29 20:23 KingsLanding 阅读(528) 评论(0) 推荐(0) 编辑
摘要: 四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。2、互斥量:为协调共同对一个共享资源的单独访问而设计的。3、信号量:为控制一个具有有限数量用户资源而设计。4、事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。临界区(Critical Section)临界区: 不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件 阅读全文
posted @ 2012-04-29 20:07 KingsLanding 阅读(714) 评论(1) 推荐(1) 编辑
摘要: 可执行文件格式主要是:Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format)他们都是COFF(Common file format)格式的变种。目标文件就是源代码编译后但未进行链接的那些中间文件。动态链接库(windows的.dll和Linux的.so)及静态链接库(Windows的.lib和Linux的.a)文件都按照可执行文件格式存储。在Linux下可以使用file命令来查看相应的文件格式:$ file first.shfirst.sh: POSIX shell script, ASCII text ex 阅读全文
posted @ 2012-04-28 22:47 KingsLanding 阅读(1908) 评论(0) 推荐(0) 编辑
摘要: 从源文件到可以行文件的过程:预处理——编译——汇编——链接第一步预编译:$gcc -E hello.c -o hello.i或者$cpp hello.c > hello.i注:‘-E’选项表示只进行预编译;cpp是预编译器预编译主要处理一‘#’开头的预编译指令:将所有的"#define"删除,并且展开所有的宏定义处理所有条件预编译指令处理"#include",将包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行删除所有注释添加行号和文件名标识,以便于调试和编译产生的错误和警告保留所有"#pragma"指令,编译器需要使 阅读全文
posted @ 2012-04-28 22:24 KingsLanding 阅读(807) 评论(0) 推荐(0) 编辑