#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "y86asm.h"
line_t *y86bin_listhead = NULL; /* the head of y86 binary code line list*/
line_t *y86bin_listtail = NULL; /* the tail of y86 binary code line list*/
int y86asm_lineno = 0; /* the current line number of y86 assemble code */
#define err_print(_s, _a ...) do { \
if (y86asm_lineno < 0) \
fprintf(stderr, "[--]: "_s"\n", ## _a); \
else \
fprintf(stderr, "[L%d]: "_s"\n", y86asm_lineno, ## _a); \
} while (0);
int vmaddr = 0; /* vm addr */
int length=0;/*we can use it to save the address before relocation.but it seems no use.*/
#define MAXPOS 15;/*make it longer if more align/pos*/
/* register table */
reg_t reg_table[REG_CNT] = {
{"%eax", REG_EAX},
{"%ecx", REG_ECX},
{"%edx", REG_EDX},
{"%ebx", REG_EBX},
{"%esp", REG_ESP},
{"%ebp", REG_EBP},
{"%esi", REG_ESI},
{"%edi", REG_EDI},
};
regid_t find_register(char *name)
{
int i;
for (i = 0; i < REG_CNT; i++)
if (!strncmp(name, reg_table[i].name, 4))
return reg_table[i].id;
return REG_ERR;
}
/* instruction set */
instr_t instr_set[] = {
{"nop", 3, HPACK(I_NOP, F_NONE), 1 },
{"halt", 4, HPACK(I_HALT, F_NONE), 1 },
{"rrmovl", 6,HPACK(I_RRMOVL, F_NONE), 2 },
{"cmovle", 6,HPACK(I_RRMOVL, C_LE), 2 },
{"cmovl", 5, HPACK(I_RRMOVL, C_L), 2 },
{"cmove", 5, HPACK(I_RRMOVL, C_E), 2 },
{"cmovne", 6,HPACK(I_RRMOVL, C_NE), 2 },
{"cmovge", 6,HPACK(I_RRMOVL, C_GE), 2 },
{"cmovg", 5, HPACK(I_RRMOVL, C_G), 2 },
{"irmovl", 6,HPACK(I_IRMOVL, F_NONE), 6 },
{"rmmovl", 6,HPACK(I_RMMOVL, F_NONE), 6 },
{"mrmovl", 6,HPACK(I_MRMOVL, F_NONE), 6 },
{"addl", 4, HPACK(I_ALU, A_ADD), 2 },
{"subl", 4, HPACK(I_ALU, A_SUB), 2 },
{"andl", 4, HPACK(I_ALU, A_AND), 2 },
{"xorl", 4, HPACK(I_ALU, A_XOR), 2 },
{"jmp", 3, HPACK(I_JMP, C_YES), 5 },
{"jle", 3, HPACK(I_JMP, C_LE), 5 },
{"jl", 2, HPACK(I_JMP, C_L), 5 },
{"je", 2, HPACK(I_JMP, C_E), 5 },
{"jne", 3, HPACK(I_JMP, C_NE), 5 },
{"jge", 3, HPACK(I_JMP, C_GE), 5 },
{"jg", 2, HPACK(I_JMP, C_G), 5 },
{"call", 4, HPACK(I_CALL, F_NONE), 5 },
{"ret", 3, HPACK(I_RET, F_NONE), 1 },
{"pushl", 5, HPACK(I_PUSHL, F_NONE), 2 },
{"popl", 4, HPACK(I_POPL, F_NONE), 2 },
{".byte", 5, HPACK(I_DIRECTIVE, D_DATA), 1 },
{".word", 5, HPACK(I_DIRECTIVE, D_DATA), 2 },
{".long", 5, HPACK(I_DIRECTIVE, D_DATA), 4 },
{".pos", 4, HPACK(I_DIRECTIVE, D_POS), 0 },
{".align", 6,HPACK(I_DIRECTIVE, D_ALIGN), 0 },
{NULL, 1, 0 , 0 } //end
};
instr_t *find_instr(char *name)
{
int i;
for (i = 0; instr_set[i].name; i++)
if (strncmp(instr_set[i].name, name, instr_set[i].len) == 0)
return &instr_set[i];
return NULL;
}
/* symbol table (don't forget to init and finit it) */
symbol_t *symtab = NULL;
/*
* find_symbol: scan table to find the symbol
* args
* name: the name of symbol
*
* return
* symbol_t: the 'name' symbol
* NULL: not exist
*/
symbol_t *find_symbol(char *name)
{
symbol_t *cur_symbol=symtab->next;
while(cur_symbol)
{
if (!strcmp(cur_symbol->name,name))
return cur_symbol;
else cur_symbol=cur_symbol->next;
}
return NULL;
}
/*
* add_symbol: add a new symbol to the symbol table
* args
* name: the name of symbol
*
* return
* 0: success
* -1: error, the symbol has exist
*/
int add_symbol(char *name)
{
if (find_symbol(name)!=NULL) return -1;
symbol_t *new_symbol=(symbol_t*) malloc (sizeof(symbol_t));
new_symbol->name=name;
new_symbol->addr=vmaddr;
new_symbol->next=symtab->next;
symtab->next=new_symbol;
return 0;
}
/* relocation table (don't forget to init and finit it) */
reloc_t *reltab = NULL;
/*
* add_reloc: add a new relocation to the relocation table
* args
* name: the name of symbol
*
* return
* 0: success
* -1: error, the symbol has exist
*/
void add_reloc(char *name, bin_t *bin)
{
reloc_t *new_reloc=(reloc_t *)malloc(sizeof(reloc_t));
new_reloc->name=name;
new_reloc->y86bin=bin;
new_reloc->next=reltab->next;
reltab->next=new_reloc;
}
/* macro for parsing y86 assembly code */
#define IS_DIGIT(s) ((*(s)>='0' && *(s)<='9') || *(s)=='-' || *(s)=='+')
#define IS_LETTER(s) ((*(s)>='a' && *(s)<='z') || (*(s)>='A' && *(s)<='Z'))
#define IS_COMMENT(s) (*(s)=='#')
#define IS_REG(s) (*(s)=='%')
#define IS_IMM(s) (*(s)=='$')
#define IS_BLANK(s) (*(s)==' ' || *(s)=='\t')
#define IS_END(s) (*(s)=='\0')
#define SKIP_BLANK(s) do { \
while(!IS_END(s) && IS_BLANK(s)) \
(s)++; \
} while(0);
/* return value from different parse_xxx function */
typedef enum { PARSE_ERR=-1, PARSE_REG, PARSE_DIGIT, PARSE_SYMBOL,
PARSE_MEM, PARSE_DELIM, PARSE_INSTR, PARSE_LABEL} parse_t;
/*
* parse_instr: parse an expected data token (e.g., 'rrmovl')
* args
* ptr: point to the start of string
* inst: point to the inst_t within instr_set
*
* return
* PARSE_INSTR: success, move 'ptr' to the first char after token,
* and store the pointer of the instruction to 'inst'
* PARSE_ERR: error, the value of 'ptr' and 'inst' are undefined
*/
parse_t parse_instr(char **ptr, instr_t **inst)
{
char *cur = *ptr;
instr_t *tmp;
/* skip the blank */
SKIP_BLANK(cur);
if (IS_END(cur))
return PARSE_ERR;
/* find_instr and check end */
tmp = find_instr(cur);
if (tmp == NULL)
return PARSE_ERR;
cur += tmp->len;
if (!IS_END(cur) && !IS_BLANK(cur))
return PARSE_ERR;
/* set 'ptr' and 'inst' */
*inst = tmp;
*ptr = cur;
return PARSE_INSTR;
}
/*
* parse_delim: parse an expected delimiter token (e.g., ',')
* args
* ptr: point to the start of string
*
* return
* PARSE_DELIM: success, move 'ptr' to the first char after token
* PARSE_ERR: error, the value of 'ptr' and 'delim' are undefined
*/
parse_t parse_delim(char **ptr, char delim)
{
/* skip the blank and check */
char *cur=*ptr;
SKIP_BLANK(cur);
if (IS_END(cur)) return PARSE_ERR;
/* set 'ptr' */
if (*cur==delim){
cur++;
*ptr=cur;
return PARSE_DELIM;
}
else
return PARSE_ERR;
}
/*
* parse_reg: parse an expected register token (e.g., '%eax')
* args
* ptr: point to the start of string
* regid: point to the regid of register
*
* return
* PARSE_REG: success, move 'ptr' to the first char after token,
* and store the regid to 'regid'
* PARSE_ERR: error, the value of 'ptr' and 'regid' are undefined
*/
parse_t parse_reg(char **ptr, regid_t *regid)
{
char *cur=*ptr;
regid_t reg;
/* skip the blank and check */
SKIP_BLANK(cur);
if (IS_END(cur)||!IS_REG(cur)) return PARSE_ERR;
/* find register */
reg=find_register(cur);
if (reg==REG_ERR) return PARSE_ERR;
cur+=SIZEOF_REG;
/* set 'ptr' and 'regid' */
*regid=reg;
*ptr=cur;
return PARSE_REG;
}
/*
* parse_symbol: parse an expected symbol token (e.g., 'Main')
* args
* ptr: point to the start of string
* name: point to the name of symbol (should be allocated in this function)
*
* return
* PARSE_SYMBOL: success, move 'ptr' to the first char after token,
* and allocate and store name to 'name'
* PARSE_ERR: error, the value of 'ptr' and 'name' are undefined
*/
parse_t parse_symbol(char **ptr, char **name)
{
char *cur=*ptr;
int len=0;
/* skip the blank and check */
SKIP_BLANK(cur);
SKIP_BLANK(*ptr);
if (IS_END(cur)||!IS_LETTER(cur)) return PARSE_ERR;
/* allocate name and copy to it */
while (IS_LETTER(cur)||IS_DIGIT(cur)){
len++;
cur++;
}
/* set 'ptr' and 'name' */
char *new_name=malloc (len+1);
memset(new_name,'\0',len+1);
memcpy(new_na
没有合适的资源?快使用搜索试试~ 我知道了~
ics lab4&lab5
共893个文件
svn-base:529个
ys:216个
bin:104个
5星 · 超过95%的资源 需积分: 16 281 下载量 150 浏览量
2014-07-12
16:12:53
上传
评论 4
收藏 273KB RAR 举报
温馨提示
ics lab4&lab5 实现了y86simulator&y86assembler。不是CMU csapp8个lab中的。上交软院大一下ics课的同学应该会用得到。
资源详情
资源评论
资源推荐
收起资源包目录
ics lab4&lab5 (893个子文件)
y86asm-base.1 15KB
._Makefile 174B
._Makefile 174B
._Makefile 174B
._Makefile 174B
._y86-app-bin 174B
._y86-base 174B
._y86-ins-bin 174B
._y86asm-base 174B
._y86sim-base 174B
._yat 174B
._long.bin 174B
._jge.bin 174B
._jl.bin 174B
._xorl.bin 174B
._irmovl.bin 174B
._nop.bin 174B
._cmovl.bin 174B
._pushl.bin 174B
._jmp.bin 174B
._cmovle.bin 174B
._ret.bin 174B
._halt.bin 174B
._je.bin 174B
._jg.bin 174B
._byte.bin 174B
._cmovge.bin 174B
._rmmovl.bin 174B
._addl.bin 174B
._call.bin 174B
._cmovne.bin 174B
._rrmovl.bin 174B
._word.bin 174B
._subl.bin 174B
._align.bin 174B
._cmovg.bin 174B
._jle.bin 174B
._popl.bin 174B
._cmove.bin 174B
._mrmovl.bin 174B
._andl.bin 174B
._prog4.bin 174B
._prog8.bin 174B
._prog2.bin 174B
._jne.bin 174B
._prog1.bin 174B
._abs-asum-jmp.bin 174B
._prog6.bin 174B
._asum.bin 174B
._poptest.bin 174B
._prog10.bin 174B
._prog3.bin 174B
._prog5.bin 174B
._pushtest.bin 174B
._j-cc.bin 174B
._asumr.bin 174B
._abs-asum-cmov.bin 174B
._pos.bin 174B
._ret-hazard.bin 174B
._pushquestion.bin 174B
._prog7.bin 174B
._cjr.bin 174B
._prog9.bin 174B
asumr.bin 136B
abs-asum-jmp.bin 134B
abs-asum-cmov.bin 129B
asum.bin 125B
ret-hazard.bin 84B
j-cc.bin 45B
cjr.bin 43B
prog7.bin 35B
prog5.bin 33B
prog8.bin 27B
prog10.bin 24B
mrmovl.bin 19B
rmmovl.bin 19B
prog1.bin 18B
poptest.bin 17B
prog2.bin 17B
prog3.bin 16B
prog9.bin 15B
pushtest.bin 15B
prog4.bin 15B
prog6.bin 15B
long.bin 13B
irmovl.bin 13B
pushquestion.bin 11B
word.bin 7B
jmp.bin 6B
jne.bin 6B
je.bin 6B
jl.bin 6B
jge.bin 6B
jg.bin 6B
jle.bin 6B
call.bin 6B
rrmovl.bin 5B
byte.bin 4B
cmovg.bin 3B
addl.bin 3B
共 893 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9
S-tone-R
- 粉丝: 23
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python大作业:音乐播放软件(爬虫+可视化+数据分析+数据库)
- 课程设计-python爬虫-爬取日报,爬取日报文章后存储到本地,附带源代码+课程设计报告
- 软件和信息技术服务行业投资与前景预测.pptx
- 课程设计-基于SpringBoot + Mybatis+python爬虫NBA球员数据爬取可视化+源代码+文档+sql+效果图
- 软件品质管理系列二项目策划规范.doc
- 基于TensorFlow+PyQt+GUI的酒店评论情感分析,支持分析本地数据文件和网络爬取数据分析+源代码+文档说明+安装教程
- 软件定义无线电中的模拟电路测试技术.pptx
- 软件开发协议(作为技术开发合同附件).doc
- 软件开发和咨询行业技术趋势分析.pptx
- 软件测试题详解及答案.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论6