Skip to content

Jiangshan00001/asm_8051

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

A 8051 asm to hex assembly compiler.

The key feature is writing as less code as possible, using the csv table to generate code automaticly.

it should work with https://github.com/Jiangshan00001/llvm-mcs51-backend project in the future.

current status:

it works for many files.
I added 100+ test files in test folder and the compiler could passes all the test.
If you find a bug, tell me.

download:

we could download the bin file:
win:    https://github.com/Jiangshan00001/asm_8051/tree/bin-win/bin/asm8051.exe
ubuntu: https://github.com/Jiangshan00001/asm_8051/blob/bin-ubuntu/bin/asm8051
or download the src https://github.com/Jiangshan00001/asm_8051
and build using cmake.

how to use:

asm->hex:
asm8051 -asm -nd asm_file_input.a51 hex_file_output.hex
hex->asm:
asm8051 -dis -nd hex_file_input.hex asm_file_output.a51 

arch:

three csv table is used for code generate.
asm_table/asm_list.csv ->used for asm to hex.
asm_table/dis_list.csv ->used for hex to asm.
asm_table/operand_list.csv ->used for both.

===================================================

如何添加新的指令 USING 0
1 scanner.ll中添加
"USING" {TOKEN_DEFAULT_AC( token::TK_MACRO,1,0);}
"SHL"   { TOKEN_DEFAULT_AC( token::TK_SHL,1,0);}
"MOD"   { TOKEN_DEFAULT_AC( token::TK_MOD,1,0);}
2 parser.yy中添加 TK_SHL  TK_MOD

3 parser.yy中添加解析规则
TK_SHL 和 TK_MOD 都放在 not_expr中即可
| expr_elem TK_MOD expr_elem {
		$$.type=TOKEN_PARENT;
		$$.child_type=TOKEN_OPR;
		$$.val_str= $1.val_str +" MOD " + $3.val_str;
		$1.type=TOKEN_OPR;
		$$.m_childs.push_back($1);
		$$.m_childs.push_back($2);
		$$.m_childs.push_back($3);
		$$.m_resolved=0;
	}

4 
T_ASM_CONTEXT::eval_token 函数中,添加  SHL MOD 两个算符的实现
USING 在宏定义中实现 m_line_macro_ptr
DB 在指令中实现 m_line_key_word_ptr

===================================================

Features:

测试自动化  -ctest
$的运算 sjmp $+4

TODO:


add tools for flex/yacc

汇编器中加入链接功能:
    支持多个汇编文件输入,生成hex
        .global FUNC1 VAR1 VAR2 VAR3

        FUNC1: label1
        VAR1 xdata 20H
        VAR2 data 20H
        VAR3 idata 20H


        .extern TEST1


        .code
        ORG 100H
        sjmp $



    支持通过#line 获取位置信息,用于出错时的显示----XXX
    对于大小写的支持。标号大小写不转换为全大写,而是大小写敏感



不支持的语法:

3 PUSH/POP AR5 AR4 AR7
1 c语言的多行注释: /**/


历史记录:

2021.12.15

添加cmake编译


2020.7.15
disassmble中m3.csv的错误修正:
MOV data addr data addr. 应该是 机器码:mov src dst。 人工汇编代码:mov dst, src


2020.7.9
添加编译完成后,对于resolved=0的参数的检查。




2020.7.6
添加范围检查
每个参数的范围
问题:SJMP中负数范围如何检查。当前使用(0xff &val)!=val 来判断。只能判断正数,不能判断负数????


2020.7.1
stc_hc595.a51 文件编译不通过。
需要添加的指令:
USING   0
DB
SHL
MOD



2020.6.4
bug:stc8a_test5.a51编译不通过,错误是因为 NOT指令 # not 40H


2020.6.3
代码:
ORG 0000H
UART_ISR:
	JNB	TI,CHKRI
	
CHKRI:
	CLR	TI

编译不通过,原因是TI, CHKRI两个变量没有替换?????


2020.6.3
MOV的汇编,mov dest, src 还是mov src, dst???
keil中注释,机器码为:mov src, dst
8051-inst-doc0509中,机器码为mov dst src
怀疑是keil文档写错了
查询stc15.pdf文档,发现是 mov src dst
怀疑是atmel文档写错。
keil中生成的机器码也为: mov src dst
所以改为和keil一致



2020.6.2

暂时无法解析指令:
MOV     R3, #HIGH (Fosc_KHZ / 13)
其中: Fosc_KHZ    EQU 11059


无法解析指令:
Fosc_KHZ    EQU 11059   ;11059KHZ
TIMER0_RELOAD   EQU     (65536 - FOSC_KHZ)  EQU need exactly 3 tokens. not5.

无法解析指令:
LED8            DATA    30H     ;   显示缓冲 30H ~ 37H
MOV     LED8+1, B



无法解析指令:
DB  0BFH,086H,0DBH,0CFH,0E6H,0EDH,0FDH,087H,0FFH,0EFH,046H

无法解析指令:
USING   0       ;选择第0组R0~R7

TODO:
1 需要一个词法分析工具。
  输入字符串,输出token.
2 词法分析工具出来的表达式,要先求值,再计算






2020.6.2
针对
LOOP:JMP LOOP
语句,添加 JMP的新语法,使用复制sjmp loop
语句,添加CALL的新语法, 使用复制acall loop

ANL     A,#NOT 40H 语句的支持 #中添加not算符的支持
对二进制数字#10000010B 的支持 ->82 不时8A


2020.6.1
JMP LOOP 编译错误
MOV	DPTR,#BGV 编译错误。 BGV	EQU	0FDF7H

2020.6.1

原始文档:
8051-inst-doc0509.pdf
8051-inst-doc0509.docx

m1.csv 指令名称列表 44个
m2.csv 指令名称和对应的操作符注释
m2_add_calc.csv 将m2.csv通过手工添加的计算公式,用于生成机器码



2020.5.31
使用stc的汇编例程代码。
1 将反汇编改为正常显示
2 将汇编通过预处理的方式,改为正常编译
3 将反汇编,添加定义的方式,替换内部的寄存器名字




2020.5.13
MOV的汇编,mov dest, src 还是mov src, dst???
keil中注释,机器码为:mov src, dst
8051-inst-doc0509中,机器码为mov dst src
怀疑是keil文档写错了

2020.5.13
BUGFIX
对于部分指令,dis不对的问题

2020.4.7

label系统完成
所有指令翻译对照完成
FIXME: label是keyword,所以跳转只能用label,不能使用数字地址
TODO: cc500


2020.4.5
1 添加代码自动生成--根据m2添加公式后。
1 试用pdcurses(textadept补丁可加?) 生成编辑器???
1 解码if()后面的数字,改为TOKEN_等定义字符串
2 添加人工解码函数,人工代码和自动生成的类型检查代码分离
3 c语言移植 c88??


=====================

编译流程:

源程序-->预处理(去除注释,拆分单词,组合指令)-(dbg1)-> 第一遍处理(处理宏定义,生成指令,生成标签列表)-(dbg2)->标签添加(各地址指令里,标签替换)-(dbg3)->第二遍处理(重新生成地址相关指令)-(dbg4)->hex文件