⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asm.c

📁 早期freebsd实现
💻 C
字号:
/* * Copyright (c) 1983 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char sccsid[] = "@(#)asm.c	5.4 (Berkeley) 6/1/90";#endif /* not lint *//* * Assembly language dependent symbol routines. */#include "defs.h"#include "symbols.h"#include "asm.h"#include "languages.h"#include "tree.h"#include "eval.h"#include "operators.h"#include "mappings.h"#include "process.h"#include "runtime.h"#include "machine.h"#define isdouble(range) ( \    range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \)/* * Initialize assembly language information. */public asm_init(){    Language lang;    lang = language_define("assembler", ".s");    language_setop(lang, L_PRINTDECL, asm_printdecl);    language_setop(lang, L_PRINTVAL, asm_printval);    language_setop(lang, L_TYPEMATCH, asm_typematch);    language_setop(lang, L_BUILDAREF, asm_buildaref);    language_setop(lang, L_EVALAREF, asm_evalaref);    language_setop(lang, L_MODINIT, asm_modinit);    language_setop(lang, L_HASMODULES, asm_hasmodules);    language_setop(lang, L_PASSADDR, asm_passaddr);}/* * Test if two types are compatible. */public Boolean asm_typematch(type1, type2)Symbol type1, type2;{    Boolean b;    b = false;    return b;}public asm_printdecl(s)Symbol s;{    switch (s->class) {	case CONST:	    printf("%s = %d", symname(s), s->symvalue.constval->value.lcon);	    break;	case VAR:	case REF:	    printf("&%s = 0x%x", symname(s), s->symvalue.offset);	    break;	case PROC:	case FUNC:	    printf("%s (0x%x):", symname(s), codeloc(s));	    break;	case TYPE:	    printf("%s", symname(s));	    break;	case ARRAY:	    printf("$string");	    break;	default:	    printf("[%s]", classname(s));	    break;    }    putchar('\n');}/* * Print out the value on the top of the expression stack * in the format for the type of the given symbol. */public asm_printval(s)register Symbol s;{    register Symbol t;    register Integer len;    switch (s->class) {	case ARRAY:	    t = rtype(s->type);	    if (t->class == RANGE and istypename(t->type, "$char")) {		len = size(s);		sp -= len;		printf("\"%.*s\"", len, sp);	    } else {		printarray(s);	    }	    break;	default:	    printf("0x%x", pop(Integer));	    break;    }}/* * Treat subscripting as indirection through pointer to integer. */public Node asm_buildaref(a, slist)Node a, slist;{    Symbol t, eltype;    Node p, r;    t = rtype(a->nodetype);    eltype = t->type;    p = slist->value.arg[0];    r = build(O_MUL, p, build(O_LCON, (long) size(eltype)));    r = build(O_ADD, build(O_RVAL, a), r);    r->nodetype = eltype;    return r;}/* * Evaluate a subscript index.  Assumes dimension is [0..n]. */public asm_evalaref(s, base, i)Symbol s;Address base;long i;{    Symbol t;    t = rtype(s);    push(long, base + i * size(t->type));}public asm_modinit (typetable)Symbol typetable[];{    /* nothing for right now */}public boolean asm_hasmodules (){    return false;}public boolean asm_passaddr (param, exprtype)Symbol param, exprtype;{    return false;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -