一个小型的汇编编译器

train汇编器

本程序包含4个源文件与6个头文件,源文件约2200行代码,头文件共约500行,可识别并编译27项指令。

支持vs2013及更高版本

支持gcc 6.3.0及更高版本,gcc编译过程如图:


代码详见github,网址如下:

https://github.com/lindorx/train

可编译的指令如下:

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格式的软盘文件,是一个非常小的操作系统,在模拟机上引导进入系统后,会在屏幕上显示“helloworld”字样,汇编代码摘自川合秀实的书《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        ;si1

cmp        al,0

 

je        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        0

 

RESB    0x1fe-$

 

DB    0x55,0xaa

 

DB    0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00

RESB  4600

DB    0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00

RESB  1469432

VM上的设置如下,os.img为生成的文件:

运行效果如图:


猜你喜欢

转载自blog.csdn.net/lindorx/article/details/80084111