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

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

原文地址:http://blog.51cto.com/13959448/2324503

时间: 2024-08-30 15:37:08

C指针原理(12)-C指针基础的相关文章

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

简单C指针 指向整数的指针,以及指针的指针 [email protected]:~?%?vim?test1.c #include?<stdio.h> int?main(void){ ????????int?x; ????????x=128; ????????int?*myp=&x; ????????int?**mypp=&myp; ????????printf("x:%d\n",x); ????????printf("myp:%u\n",

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

2.指向数组的指针 #include?<stdio.h> int?main(void){ ????????int?i; ????????char?x[20]="0123456789ABCDEFGHIJ"; ????????for?(i=0;i<20;i++){ ????????printf("x[%d]:%c\n",i,x[i]); ????????} ????????char?*p_x; ????????for?(p_x=&x[0];p_

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

取自netbsd中的源码,检查运算溢出,用C语言实现,方法很精妙 /* ? hide bintime for _STANDALONE because this header is used for hpcboot.exe,? which is built with compilers which don't recognize LL suffix.?* http://mail-index.NetBSD.org/tech-userlevel/2008/02/27/msg000181.html ?*

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

指针本身也是一种变量,支持常用的运算.比如加.减 #include?<stdio.h> int?main(void){ ????????int?i; ????????char?x[20]="0123456789ABCDEFGHIJ"; ????????for?(i=0;i<20;i++){ ????????printf("x[%d]:%c\n",i,x[i]); ????????} ????????char?*p_x; ????????for?(p

006 this指针原理

/* 目录: 一 this指针原理 */ 一 this指针原理 class CTest { public: CTest(int nNum) { this->nNum = nNum; } ~CTest() { } void Print() { cout << nNum << endl; } private: int nNum; }; int main(int argc, char *argv[], char **envp) { CTest c(0x11); c.Print();

智能指针原理与简单实现(转)

以下实现没有考虑线程安全的问题. 智能指针:它的一种通用实现方法是采用引用计数的方法.智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针. 每次创建类的新对象时,初始化指针并将引用计数置为1: 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数: 对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数:这是因此左侧的指针指向了右侧指针所指向的对象,因此右指针所

快慢指针原理--快速找到未知长度单链表的中间节点

package com.java.dataStruct; //节点类 public class Node<E> { E item; Node next; public Node(){ } public Node(E element){ this.item = element; } public Node(E element, Node next){ this.item = element; this.next = next; } } Node p1,r1; Node L1 = new Node

Objective-C中,ARC下的 strong和weak指针原理解释

Objective-C中,ARC下的 strong和weak指针原理解释 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是"本地变量" 一.简介 ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因为编译器为你处理了一切 注意:ARC 是编译器特性,而不是 iOS 运行时特性(除

C 语言实现多态的原理:函数指针

C语言实现多态的原理:函数指针 何为函数指针?答案:C Programming Language. 可以查阅下,从原理上来讲,就是一个内存地址,跳过去执行对应的代码段. 既然如此,在运行时决定跳到哪个地方去执行特定的代码即可. 一个简单的版本: 以音频解码器作为例子:AAC 解码器,Mpeg解码器,以及其他类型的解码器. 那手动的多态可能会这样实现: U32 audioHandle = AudioDecOpen(int type) { if(type == aac) return aac_ope