毕业设计汇编器设计与实现.docx
- 文档编号:2461835
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:41
- 大小:35.94KB
毕业设计汇编器设计与实现.docx
《毕业设计汇编器设计与实现.docx》由会员分享,可在线阅读,更多相关《毕业设计汇编器设计与实现.docx(41页珍藏版)》请在冰豆网上搜索。
毕业设计汇编器设计与实现
湖南安全技术职业学院
论文题目汇编器的设计与实现
学生姓名刘昊
专业班级信息安全0601
指导老师匡芳君
系主任刘坚
评阅人
2009年5月
摘要
本项目通过研究X86CPU指令集结构,基于C语言快速构建了一个微型汇编器,而多种编程方式不仅锻炼了实际编码能力,还使得程序易于扩充,为最终实现多指令集的目标打下了坚定基础。
关键字:
指令集;汇编器;编译原理
ABSTRACT
Whyanotherassembler?
Thereisalotofx86assemblerlikenasm,gas,theyalsofreetoopensource.TheonlyreasonisIneedafreestyleassembler.That'sit!
KeyWords:
Instruction;Assembler;Compiler
汇编器设计与实现
1.引言
目前主流的汇编器如hasm和gas对X86指令集的解析已经相当完美,但是在不同汇编器之间进行切换仍需要修改大量代码,本项目的初衷是为了创建一个能适应多种编程风格的汇编器,同时也能进一步了解CPU指令结构并实践多种编译方式。
2.设计原理
Hasm汇编器采用了二次遍历模式,其工作流程如下:
初始化,将关键字插入符号表。
第一次遍历,将文本读入缓冲区,
交由词法扫描程序进行分析,
将标识符写入符号表,
对指令长度进行计算,
计算表达式,
初步分析语法错误。
第二次遍历,将文本读入缓冲区,
在符号表中查询标识符,
填充指令结构,
查询指令Opcode。
输出,按照相关规则组合指令。
3.程序架构
Hasm程序架构如下:
|-----init.C(符号表初始化)-----symbol.C(符号表操作)
|-----fileop.C(文件相关操作)
|-----parser.C(语法分析)-----lexer.C(词法分析)
-----getsth.C(获取词素)
hasm.C|-----expr.C(计算表达式)
|-----output.C(汇编输出)-----assemble.C(查询指令码)
-----x86.C(指令集设定)
|-----error.C(错误捕获)
4.词法扫描
4.1.1.lexan()
Lexan词法扫描程序接收字符缓冲,返回带有词素、属性、数值的TOKEN结构。
此处采用了状态转换图原理,当进入接收状态时获取对应词素,否则进入下一个初始状态。
初始状态-->空白符与分隔符<--(表示接收状态,下同)
初始状态-->'/'-->'*'-->'*'-->'/'<--(C风格注释)
初始状态-->';'-->'\n'<--(分号注释)
初始状态-->字母-->字母或数字-->其它字符<--(标识符)
-->':
'<--(标号)
初始状态-->'.'-->字母-->其它字符<--(声明)
初始状态-->数字-->'h'<--(十六进制数)
-->非数字<--(十进制数)
初始状态-->双引号-->非双引号-->双引号<--(字符串)
对于标识词素,程序会在符号表内查询是否已存在,如存在则返回其TOKEN,否则将其插入符号表。
4.2expr()
表达式计算程序接收字符串,输出计算后的数值。
在计算时程序采用了双缓冲结构,首先将中缀表达式转换成后缀表达式,压入栈中,然后逐个输出计算。
此程序还只能计算简单的四则运算,但可以迅速进行扩充。
源代码见附录A。
5.
语法分析
语法分析程序接收字符串,返回错误状态。
Hasm允许的指令语法如下:
(标号:
)(前缀)助记符(修饰符)(操作数一,操作数二)
其中前缀和修饰符可以改变操作数大小,当前指令地址和下一指令地址将根据操作数大小进行计算。
程序将填充指令结构,其定义如下:
#defineMAXOP5
structinstruction{
intopcode;//助记符
intoperands;//操作数个数
uint32_topv[MAXOP];//操作数属性
uint32_topt[MAXOP];//操作数类型标记
uint32_tflags;//一些标记
};
其中flags元素将由源程序中的声明部分决定。
而opt中的内容则有TOKEN属性扩充而来,其类型定义如下:
/*enum常量*/
enumtoken_type{
TOKEN_INVALID=-1,
TOKEN_ID=256,/*标识符*/
TOKEN_EXP,/*表达式*/
TOKEN_NUM,/*十进制数*/
TOKEN_HEX,/*十六进制数*/
TOKEN_STR,/*字符串*/
TOKEN_LAB,/*标号*/
TOKEN_ERR,/*错误*/
TOKEN_DEC,/*声明*/
TOKEN_INSN,/*指令码*/
TOKEN_REG,/*寄存器*/
TOKEN_IMME,/*立即数*/
TOKEN_MEMORY,/*内存指针*/
TOKEN_SPECIAL,/*SHORTNEARFAR等等*/
TOKEN_PREFIX,/*times等前缀*/
};
当程序遇到不合理的TOKEN时,将设置错误标志并返回。
6.汇编输出
参考X86指令格式如下:
指令前缀
操作码
修饰符
位移
数据元素
Instruction
Prefixes
Opcode
ModR/M
SIB
Displacement
Immediate
可选
必须
可选
可选
可选
可选
最多4字节
最多3字节
1字节
1字节
1、2或4字节
1、2或4字节
765320765320
Mod
Reg/Opcode
R/M
Scale
Index
Base
比例
索引
基址
在输出时,分别按照前缀(暂未处理),操作码,修饰符,位移,数据元素的顺序进行处理。
6.1.1.assemble()
Assmeble程序接收指令结构,返回相应的操作码,在操作时,依次对结构元素与X86.c文件中定义的指令集进行对比,为了简化处理,此处仅定义了5条指令。
/*
*\000无特殊属性
*\001ModR/M
*\002+r指令码附加寄存器值(用于省略modr/m)
*/
staticconststructiformatI_CALL[]={
{CALL,1,{IMMEDIATE,0,0,0,0},0xE8,000,IF_8086},
FORMAT_END
};
staticconststructiformatI_INT[]={
{INT,1,{IMMEDIATE,0,0,0,0},0xCD,000,IF_8086},
FORMAT_END
};
staticconststructiformatI_JMP[]={
{JMP,1,{IMMEDIATE|SHORT,0,0,0,0},0xEB,000,IF_8086},
FORMAT_END
};
staticconststructiformatI_MOV[]={
{MOV,2,{REG16,REG16,0,0,0},0x89,001,IF_8086},
{MOV,2,{REG16,REG_SREG,0,0,0},0x8C,001,IF_8086},
{MOV,2,{REG_SREG,REG16,0,0,0},0x8E,001,IF_8086},
{MOV,2,{REG8,IMMEDIATE,0,0,0},0xB0,002,IF_8086},
{MOV,2,{REG16,IMMEDIATE,0,0,0},0xB8,002,IF_8086},
FORMAT_END
};
staticconststructiformatI_RET[]={
{RET,0,{0,0,0,0,0},0xC3,000,IF_8086},
FORMAT_END
};
在获得了匹配的Opcode之后,程序还要对相应的指令属性进行分析,设定全局标志或修改Opcode。
ModR/M部分根据相应标志进行设置,具体内容可参考intel手册中的相关定义。
SIB部分暂未处理。
位移部分通过设定的偏移减去下一指令地址获得,而数据元素(即立即数)无需进行处理。
然后根据intelCPU的大尾数设定对位移和立即数进行倒序输出。
最终按字节写入的目标文件即为可执行的CPU指令码。
7.
示例
汇编源代码如下:
.base->07c00h
.cpu->286
movax,cs
movds,ax
moves,ax
callDispStr;调用显示字符串例程
jmp$;无限循环
DispStr:
movax,BootMessage
movbp,ax;ES:
BP=串地址
movcx,16;CX=串长度
movax,1301h;AH=13,AL=01h
movbx,000ch;页号为0(BH=0)黑底红字(BL=0Ch,高亮)
movdl,0
int10h;10h号中断
ret
BootMessage:
db"Hello,OSworld!
"
times510-$db0
dw0xaa55;结束标志
获得的目标BIN文件:
00000000h:
8CC88ED88EC0E80200EBFEB81E7C89C5;屓庁幚?
.膻?
|壟
00000010h:
B91000B80113BB0C00B200CD10C34865;?
.?
.?
.?
?
肏e
00000020h:
6C6C6F2C204F5320776F726C64210000;llo,OSworld!
..
00000030h:
00000000000000000000000000000000;................
00000040h:
00000000000000000000000000000000;................
00000050h:
00000000000000000000000000000000;................
00000060h:
00000000000000000000000000000000;................
0000007
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 汇编 设计 实现