继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

holdtom
关注TA
已关注
手记 1703
粉丝 240
获赞 991


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

©著作权归作者所有:来自51CTO博客作者myhaspl的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP