Skip to content

Commit

Permalink
update: syscall read() tested
Browse files Browse the repository at this point in the history
  • Loading branch information
park671 committed Nov 26, 2024
1 parent 9841216 commit 35ae982
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 183 deletions.
181 changes: 1 addition & 180 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,188 +26,9 @@ macOS arm64 (not work due to code signature)

### compiler's syntax(语法):
```
最新版本请参考代码中的docs目录下的md
## 程序和方法序列
<程序> → <方法序列>
<方法序列> → <方法定义> <方法序列> | ε
## 方法定义
方法支持多种返回类型和参数列表。
<方法定义> → <类型> <标识符> ( <参数列表> ) <复合语句>
<参数列表> → <参数定义> <更多参数> | ε
<更多参数> → , <参数定义> <更多参数> | ε
<参数定义> → <类型> <标识符>
<类型> → int | char | void | float | double
## 复合语句和语句序列
复合语句支持多条语句。
<复合语句> → { <语句序列> }
<语句序列> → <语句> <语句序列> | ε
## 语句
支持多种类型的语句。
<语句> → <if语句> | <while语句> | <for语句> | <复合语句> | <定义语句> | <赋值语句> | <方法调用> | <return语句>
<定义语句> → <类型> <标识符> = <表达式> ;
<表达式语句> → <表达式> ;
<方法调用> → <标识符> ( <实参列表> ) ;
<实参列表> → <算术表达式> <更多实参> | ε
<更多实参> → , <算术表达式> <更多实参> | ε
<return语句> → return <算术表达式>
## 控制结构
<if语句> → if ( <布尔表达式> ) <语句> | if ( <布尔表达式> ) <语句> else <语句>
<while语句> → while ( <布尔表达式> ) <语句>
<for语句> → for ( <算术表达式> ; <布尔表达式> ; <算术表达式> ) <语句>
## 表达式和运算
表达式处理算术和布尔逻辑。
<布尔表达式> → <布尔项> <布尔表达式'>
<布尔表达式'> → || <布尔项> <布尔表达式'> | ε
<布尔项> → <布尔因子> <布尔项'>
<布尔项'> → && <布尔因子> <布尔项'> | ε
<布尔因子> → ! <布尔因子> | <算术表达式> <关系运算> <算术表达式>
<表达式> → <赋值表达式> | <算术表达式>
<赋值表达式> → <标识符> = <表达式>
<算术表达式> → <项> <算术表达式'>
<算术表达式'> → + <项> <算术表达式'> | - <项> <算术表达式'> | ε
<项> → <因子> <项'>
<项'> → * <因子> <项'> | / <因子> <项'> | % <因子> <项'> | ε
<因子> → <标识符> | <无符号整数> | ( <表达式> ) | <方法调用>
<关系运算> → < | > | <= | >= | == | !=
## 标识符和基础类型
<标识符> → <字母> <标识符'>
<标识符'> → <字母> <标识符'> | <数字> <标识符'> | ε
<无符号整数> → <数字> <无符号整数'>
<无符号整数'> → <数字> <无符号整数'> | ε
<字母> → a | b | … | z | A | B | … | Z
<数字> → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
```


here are some test code:

```
int add(int abc, int cd33) {
int c = abc + cd33;
return c;
}
int main() {
int index = 0;
int test = 0;
for(index = 0; index<10;index=index+1) {
test = add(test, 1);
}
return test;
}
go to "docs" dir
```

here are compiler's MIR result:
```angular2html
2024-10-09 21:02:29.199 - optimization: ---method:add---
2024-10-09 21:02:29.199 - mir: type 6: _tv_0 = abc + cd33
2024-10-09 21:02:29.199 - mir: INST_RET: _tv_0
2024-10-09 21:02:29.199 - optimization: ---method:main---
2024-10-09 21:02:29.199 - mir: type 4: index = 0
2024-10-09 21:02:29.199 - mir: type 4: test = 0
2024-10-09 21:02:29.199 - mir: type 4: index = 0
2024-10-09 21:02:29.199 - mir: .opt flag:2
2024-10-09 21:02:29.199 - mir: label:_lb_2
2024-10-09 21:02:29.199 - mir: INST_CMP: index < 10 ? _lb_0 : _lb_1
2024-10-09 21:02:29.199 - mir: label:_lb_0
2024-10-09 21:02:29.199 - mir: call: add(
2024-10-09 21:02:29.199 - mir: test
2024-10-09 21:02:29.199 - mir: 1
2024-10-09 21:02:29.199 - mir: )
2024-10-09 21:02:29.199 - mir: type 6: test = [last INST_RET]
2024-10-09 21:02:29.199 - mir: type 4: _tv_16 = index + 1
2024-10-09 21:02:29.199 - mir: type 4: index = _tv_16
2024-10-09 21:02:29.199 - mir: jmp:_lb_2
2024-10-09 21:02:29.199 - mir: label:_lb_1
2024-10-09 21:02:29.199 - mir: .opt flag:3
2024-10-09 21:02:29.199 - mir: INST_RET: test
```

here are compiler's arm64 assembly code result:
```
_start:
mov x29, #0
mov x30, #0
bl main
mov x8, #93
svc #0
add:
sub sp, sp, #48
stp x29, x30, [sp, #32]
add x29, sp, #32
str x0, [sp, #28]
str x1, [sp, #24]
ldr x0, [sp, #28]
ldr x1, [sp, #24]
add x0, x0, x1
str x0, [sp, #20]
add x0, x0, #1
str x0, [sp, #20]
mov x0, x0
ldp x29, x30, [sp, #32]
add sp, sp, #48
ret
main:
sub sp, sp, #48
stp x29, x30, [sp, #32]
add x29, sp, #32
mov x0, #0
str x0, [sp, #28]
mov x1, #0
str x1, [sp, #24]
mov x0, #0
str x0, [sp, #28]
_lb_2:
ldr x0, [sp, #28]
cmp x0, #11
b.<lt> _lb_0
b _lb_1
_lb_0:
ldr x1, [sp, #24]
mov x0, x1
mov x1, #1
bl add
mov x0, x0
str x0, [sp, #24]
ldr x1, [sp, #28]
add x1, x1, #1
str x1, [sp, #20]
mov x2, x1
str x2, [sp, #28]
b _lb_2
_lb_1:
ldr x0, [sp, #24]
add x0, x0, #1
str x0, [sp, #16]
mov x0, x0
ldp x29, x30, [sp, #32]
add sp, sp, #48
ret
```

![E01cFLKrZm](https://github.com/user-attachments/assets/c253231b-b8bc-47bb-97fd-57ef2576743a)
2024-10-18已支持aarch64指令集linux elf封装

2024-11-21已支持aarch64指令集windows pe封装

### how to build

this is a very simple cmake project, you should know how to build.
Expand Down
4 changes: 2 additions & 2 deletions docs/micro_cc_syntax.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
<语句> → <if语句> | <while语句> | <for语句> | <复合语句> | <定义语句> | <赋值语句> | <方法调用> | <return语句>
<定义语句> → <类型> <标识符> = <表达式> ;
<表达式语句> → <表达式> ;
<方法调用> → <标识符> ( <实参列表> ) ;
<实参列表> → <算术表达式> <更多实参> | ε
<更多实参> → , <算术表达式> <更多实参> | ε
<return语句> → return <算术表达式>
Expand Down Expand Up @@ -53,9 +52,10 @@
<算术表达式'> → + <项> <算术表达式'> | - <项> <算术表达式'> | ε
<项> → <因子> <项'>
<项'> → * <因子> <项'> | / <因子> <项'> | % <因子> <项'> | ε
<因子> → <基本数据类型> | {<数组序列>} | <标识符> | * <标识符> | & <标识符> | ( <表达式> ) | <方法调用>
<因子> → <基本数据类型> | <方法调用> | {<数组序列>} | <标识符> | * <标识符> | & <标识符> | ( <表达式> )
<基本数据类型> → <无符号整数> | <无符号浮点>
<数组序列> → <基本数据类型>, <数组序列> | ε
<方法调用> → <标识符> ( <实参列表> )

<关系运算> → < | > | <= | >= | == | !=

Expand Down
14 changes: 14 additions & 0 deletions test/test_syscall_read.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#include <linux_aarch64_syscall.h>

int add(int a, int b) {
return a + b;
}

int main() {
char *read = "123456\n";
int result = 0;
result = read(0, read, 4);
result = write(1, read, 7);
result = add(result, 1);
return result;
}
3 changes: 2 additions & 1 deletion test/test_syscall_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ int main() {
char *text = "park hello world\n";
int result = 0;
result = write(1, text, 18);
return 11;
result = add(result, 1);
return result;
}

0 comments on commit 35ae982

Please sign in to comment.