您的位置:首页 > 其它

C指针原理(14)-C指针基础

2013-11-14 15:09 260 查看
tcc源码分析


本博客所有内容是原创,如果转载请注明来源


http://blog.csdn.net/myhaspl/

tcctok.h定义了C语言的词法分析的基本元素,主要定义了关键字。

/* keywords */

     DEF(TOK_INT, "int")

     DEF(TOK_VOID, "void")

     DEF(TOK_CHAR, "char")

     DEF(TOK_IF, "if")

     DEF(TOK_ELSE, "else")

     DEF(TOK_WHILE, "while")

     DEF(TOK_BREAK, "break")

     DEF(TOK_RETURN, "return")

     DEF(TOK_FOR, "for")

     DEF(TOK_EXTERN, "extern")

     DEF(TOK_STATIC, "static")

     DEF(TOK_UNSIGNED, "unsigned")

     DEF(TOK_GOTO, "goto")

     DEF(TOK_DO, "do")

     DEF(TOK_CONTINUE, "continue")

     DEF(TOK_SWITCH, "switch")

     DEF(TOK_CASE, "case")

..............................

..............................

..............................

同时定义了条件编译的相关内容

/*********************************************************************/

/* the following are not keywords. They are included to ease parsing */

/* preprocessor only */

     DEF(TOK_DEFINE, "define")

     DEF(TOK_INCLUDE, "include")

     DEF(TOK_INCLUDE_NEXT, "include_next")

     DEF(TOK_IFDEF, "ifdef")

     DEF(TOK_IFNDEF, "ifndef")

     DEF(TOK_ELIF, "elif")

     DEF(TOK_ENDIF, "endif")

     DEF(TOK_DEFINED, "defined")

在i386-tok.h中定义了汇编的相关关键词

/* ------------------------------------------------------------------ */

/* WARNING: relative order of tokens is important. */

/* register */

 DEF_ASM(al)

 DEF_ASM(cl)

 DEF_ASM(dl)

 DEF_ASM(bl)

 DEF_ASM(ah)

 DEF_ASM(ch)

 DEF_ASM(dh)

 DEF_ASM(bh)

 DEF_ASM(ax)

 DEF_ASM(cx)

 DEF_ASM(dx)

 DEF_ASM(bx)

 DEF_ASM(sp)

 DEF_ASM(bp)

 DEF_ASM(si)

 DEF_ASM(di)

 DEF_ASM(eax)

 DEF_ASM(ecx)

 DEF_ASM(edx)

 DEF_ASM(ebx)

 DEF_ASM(esp)

 DEF_ASM(ebp)

 DEF_ASM(esi)

 DEF_ASM(edi)

#ifdef TCC_TARGET_X86_64

 DEF_ASM(rax)

 DEF_ASM(rcx)

 DEF_ASM(rdx)

...........................

............................

在x86_64-asm.h中定义了64位汇编相关关键字

     DEF_ASM_OP0(clc, 0xf8) /* must be first OP0 */

     DEF_ASM_OP0(cld, 0xfc)

     DEF_ASM_OP0(cli, 0xfa)

     DEF_ASM_OP0(clts, 0x0f06)

     DEF_ASM_OP0(cmc, 0xf5)

     DEF_ASM_OP0(lahf, 0x9f)

     DEF_ASM_OP0(sahf, 0x9e)

     DEF_ASM_OP0(pushfl, 0x9c)

     DEF_ASM_OP0(popfl, 0x9d)

     DEF_ASM_OP0(pushf, 0x9c)

     DEF_ASM_OP0(popf, 0x9d)

     DEF_ASM_OP0(stc, 0xf9)

     DEF_ASM_OP0(std, 0xfd)

     DEF_ASM_OP0(sti, 0xfb)

     DEF_ASM_OP0(aaa, 0x37)

先从几个重要文件入手。

libtcc.c

/*

 *  TCC - Tiny C Compiler

 * 

 *  Copyright (c) 2001-2004 Fabrice Bellard

 *

 * This library is free software; you can redistribute it and/or

 * modify it under the terms of the GNU Lesser General Public

 * License as published by the Free Software Foundation; either

 * version 2 of the License, or (at your option) any later version.

 *

 * This library is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

 * Lesser General Public License for more details.

 *

 * You should have received a copy of the GNU Lesser General Public

 * License along with this library; if not, write to the Free Software

 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 */

#include "tcc.h"

/********************************************************/

/* global variables */

使用GCC扩展还是TCC扩展

/* use GNU C extensions */

ST_DATA int gnu_ext = 1;

/* use TinyCC extensions */

ST_DATA int tcc_ext = 1;

ST_DATA 结构标注TCC状态。

/* XXX: get rid of this ASAP */

ST_DATA struct TCCState *tcc_state;

/********************************************************/

根据标志包含一些相应TCC文件。

#ifdef ONE_SOURCE

#include "tccpp.c"

#include "tccgen.c"

#include "tccelf.c"

#include "tccrun.c"

#ifdef TCC_TARGET_I386

#include "i386-gen.c"

#endif

#ifdef TCC_TARGET_ARM

#include "arm-gen.c"

#endif

#ifdef TCC_TARGET_C67

#include "c67-gen.c"

#endif

#ifdef TCC_TARGET_X86_64

#include "x86_64-gen.c"

#endif

#ifdef CONFIG_TCC_ASM

#include "tccasm.c"

#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64

#include "i386-asm.c"

#endif

#endif

#ifdef TCC_TARGET_COFF

#include "tcccoff.c"

#endif

#ifdef TCC_TARGET_PE

#include "tccpe.c"

#endif

#endif /* ONE_SOURCE */

CONFIG_TCC_ASM打开内联汇编的开关

/********************************************************/

#ifndef CONFIG_TCC_ASM

ST_FUNC void asm_instr(void)

{

    tcc_error("inline asm() not supported");

}

ST_FUNC void asm_global_instr(void)

{

    tcc_error("inline asm() not supported");

}

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: