一个小型的汇编编译器
train汇编器
本程序包含4个源文件与6个头文件,源文件约2200行代码,头文件共约500行,可识别并编译27项指令。
支持vs2013及更高版本
支持gcc 6.3.0及更高版本,gcc编译过程如图:(2019.7.26更新,直接在终端输入make来编译,编译文件时可以输入"./train.exe 源文件1.asm 源文件2.asm 源文件3.asm ·······",编译后的文件后缀名默认为bin,名称为源文件的名字,下图为第一版的展示图)
代码详见github,网址如下:
GitHub - lindorx/train: A small assembly compiler
可编译的指令如下:
mov,in,out,
jbe,jb,jz,je,jmp
shr,shl,cmp,
add,sub,mul,
push,pop,
db,dw,dd,resb,
org,int,hlt,
and,or,xor,not,
基于nask和nasm语法
编译效果,测试:
例子:;以下汇编代码用来生成一个fat12格式的软盘文件,是一个非常小的操作系统,在模拟机上引导进入系统后,会在屏幕上显示“hello,world”字样,汇编代码摘自川合秀实的书《30天自制操作系统》。
;hello-os
;TAB=4
org0x7c00;指明程序装载地址
;描述用于标准FAT12格式的软盘
jmp entry
db 0x90
DB "HELLOIPL"
DW 512
DB 1
DW 1
DB 2
DW 224
DW 2880
DB 0xf0
DW 9
DW 18
DW 2
DD 0
DD 2880
DB 0,0,0x29
DD 0xffffffff
DB "HELLO-OS "
DB "FAT12 "
RESB 18
;程序核心
entry:
mov ax,0 ;初始化寄存器
mov ss,ax
mov sp,0x7c00
mov ds,ax
mov es,ax
mov si,msg
putloop:
mov al,[si]
add si,1 ;给si加1
cmp al,0je fin
mov ah,0x0e ;要显示的一个字符
mov bx,15 ;指定字符颜色
int 0x10 ;调用14号中断,调用显卡bios
jmp putloop
fin:
hlt ;让cpu停止工作,等待指令
jmp fin ;无限循环
msg:
db 0x0a,0x0a ;换行两次
db "hello,world" ;要显示的字符串
db 0x0a ;换行
db 0RESB 0x1fe-$DB 0x55,0xaaDB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00
RESB 4600
DB 0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00
RESB 1469432
在VM上的设置如下,os.img为生成的文件:
运行效果如图:
一个小型的汇编编译器相关推荐
- c++ 模板类实现堆栈实验报告_编译原理——小型类C编译器的设计和实现(生成8086汇编代码)之1:问题定义以及总体功能...
前面花了两篇文章来介绍词法分析和语法分析,接下来才是比较有意思的部分--一个小型类C编译器的设计和实现(其实是编译原理的课程设计啦!~)我用的是python2.7.13+PyQt来做的...事实上,正 ...
- 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建
V1.1 于2022年7月15日第二次修改:添加了比较多的解释图,解读了各类库的CMakelist.txt文件 目录 第一部分 基础篇(Basics) 1.0 本部分主要学什么(Intro) 1.1 ...
- 分析一个简单的汇编代码
分析一个简单的汇编代码 部分常见的寄存器 寄存器 16位 32位 64位 累加寄存器 AX EAX RAX 基址寄存器 BX EBX RBX 计数寄存器 CX ECX RCX 数据寄存器 DX EDX ...
- c语言转汇编编译器,【转】C语言内嵌汇编(asm)
TIPS:在编译过程汇中,汇编代码块是原封不动地送到汇编语言编译阶段的. 一.为什么会用到汇编? 1.为了提高速度和效率.不过这种情况很少了,现在C/C++编译器的优化很厉害了. 2.为了实现某些C语 ...
- 计算机系统要素--第六章,01-HACK汇编编译器模块介绍
从零开始构建现代计算机--第六章,01-HACK汇编编译器模块介绍 语法分析器(Parser) 编码(Code) 无符号程序的汇编编译器 符号表(Symbol Table) 有符号程序的汇编编译器 H ...
- debug和汇编编译器masm对指令不同的处理
debug和汇编编译器masm对指令不同的处理 1.在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用[...]来表示内存单元.如果 在[ ]里用一个常量idata直接给出内存单元的偏移地 ...
- 《计算机系统要素》 第六章 汇编编译器
6.1 背景知识 符号化的语言称为汇编,翻译程序称为汇编编译器,汇编编译器对每个汇编命令的所有部分进行解析,将每个部分翻译成它对应的二进制码,并将生成的二进制码汇编成真正能被硬件执行的二进制指令. 编 ...
- 用AntlR4实现简单的汇编编译器
最近在学习<计算机系统要素--从零构建现代计算机>这本书,花了两天时间用antlr4把书中第6章的汇编编译器实现了. 输出的机器指令和参考答案完全一致. 下面把antlr4的代码贴出来,供 ...
- 计算机系统要素--第六章,02-HACK汇编编译器实现
从零开始构建现代计算机--第六章,02-HACK汇编编译器实现 要点 A-指令 C-指令 符号表 python实现 要点 关心三点: A指令,C指令,符号表 A-指令 A指令:将@num的num转为1 ...
- gcc的ar工具及as汇编编译器入门练习及curses库
gcc的ar工具及as汇编编译器入门练习及curses库 目标 参考资料 一.ar工具使用 1.编写三个函数main.c/sub1.c/sub2.c 2.将x2x.x2y目标文件用 ar工具生成1个 ...
最新文章
- 神经网络预测模型算法_MATLAB Elman神经网络的数据预测—电力负荷预测模型研究...
- linux导出并追加到文件,linux – 如何将awk结果输出到文件
- 瑞士的迷人风光(转)
- c语言可以将负数强制转换成正数吗_C语言笔记(一、概述)
- IO流 (三) ----- 字符流和字符缓冲流
- 软件开发者优质资源网站
- 《人性的弱点》简明总结
- python编写一个汽车类_编写类-汽车类
- PHP变量说法不正常是,关于PHP变量的说法中正确的是(? ?)。
- 小程序实现正计时和倒计时
- linux 'pthread_create'未定义的引用,如何解决`_imp__pthread_create'的未定义引用
- 一知半解学CubeMX——GPIO:LED
- 运营好社群——打造你专属的新媒体流量入口! | 黎想
- 我国非按劳分配收入初探
- 可视化 Echarts
- 微信如何自动唤起外部浏览器打开APP下载文件或指定链接
- MySql左连接无法显示左表全部数据
- 高中生必须学习python吗_想少走弯路的看过来 高中生如何学习编程详解
- pyspark进行词频统计并返回topN
- oracle论坛 南派三叔,关于南派三叔微访谈的不吐不快,想知道路人,书粉,剧粉,都是什么感受...