Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jiangshan00001/asm_8051

compile mcs51/8051 asm code to hex
https://github.com/jiangshan00001/asm_8051

Last synced: about 16 hours ago
JSON representation

compile mcs51/8051 asm code to hex

Awesome Lists containing this project

README

        

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文件