From 35ae9820a947f6b9eb9d509be81c8dc1226b0a5a Mon Sep 17 00:00:00 2001 From: park671 Date: Tue, 26 Nov 2024 14:46:57 +0800 Subject: [PATCH] update: syscall read() tested --- README.md | 181 +------------------------------------- docs/micro_cc_syntax.md | 4 +- test/test_syscall_read.c | 14 +++ test/test_syscall_write.c | 3 +- 4 files changed, 19 insertions(+), 183 deletions(-) create mode 100644 test/test_syscall_read.c diff --git a/README.md b/README.md index 9edacaf..2d18400 100644 --- a/README.md +++ b/README.md @@ -26,188 +26,9 @@ macOS arm64 (not work due to code signature) ### compiler's syntax(语法): ``` -最新版本请参考代码中的docs目录下的md - -## 程序和方法序列 - -<程序> → <方法序列> -<方法序列> → <方法定义> <方法序列> | ε - -## 方法定义 -方法支持多种返回类型和参数列表。 - -<方法定义> → <类型> <标识符> ( <参数列表> ) <复合语句> -<参数列表> → <参数定义> <更多参数> | ε -<更多参数> → , <参数定义> <更多参数> | ε -<参数定义> → <类型> <标识符> -<类型> → int | char | void | float | double - -## 复合语句和语句序列 -复合语句支持多条语句。 - -<复合语句> → { <语句序列> } -<语句序列> → <语句> <语句序列> | ε - -## 语句 -支持多种类型的语句。 - -<语句> → | | | <复合语句> | <定义语句> | <赋值语句> | <方法调用> | -<定义语句> → <类型> <标识符> = <表达式> ; -<表达式语句> → <表达式> ; -<方法调用> → <标识符> ( <实参列表> ) ; -<实参列表> → <算术表达式> <更多实参> | ε -<更多实参> → , <算术表达式> <更多实参> | ε - → return <算术表达式> - -## 控制结构 - - → if ( <布尔表达式> ) <语句> | if ( <布尔表达式> ) <语句> else <语句> - → while ( <布尔表达式> ) <语句> - → 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. _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. diff --git a/docs/micro_cc_syntax.md b/docs/micro_cc_syntax.md index d6fe777..adadfd7 100644 --- a/docs/micro_cc_syntax.md +++ b/docs/micro_cc_syntax.md @@ -25,7 +25,6 @@ <语句> → | | | <复合语句> | <定义语句> | <赋值语句> | <方法调用> | <定义语句> → <类型> <标识符> = <表达式> ; <表达式语句> → <表达式> ; -<方法调用> → <标识符> ( <实参列表> ) ; <实参列表> → <算术表达式> <更多实参> | ε <更多实参> → , <算术表达式> <更多实参> | ε → return <算术表达式> @@ -53,9 +52,10 @@ <算术表达式'> → + <项> <算术表达式'> | - <项> <算术表达式'> | ε <项> → <因子> <项'> <项'> → * <因子> <项'> | / <因子> <项'> | % <因子> <项'> | ε -<因子> → <基本数据类型> | {<数组序列>} | <标识符> | * <标识符> | & <标识符> | ( <表达式> ) | <方法调用> +<因子> → <基本数据类型> | <方法调用> | {<数组序列>} | <标识符> | * <标识符> | & <标识符> | ( <表达式> ) <基本数据类型> → <无符号整数> | <无符号浮点> <数组序列> → <基本数据类型>, <数组序列> | ε +<方法调用> → <标识符> ( <实参列表> ) <关系运算> → < | > | <= | >= | == | != diff --git a/test/test_syscall_read.c b/test/test_syscall_read.c new file mode 100644 index 0000000..135edb8 --- /dev/null +++ b/test/test_syscall_read.c @@ -0,0 +1,14 @@ +#include + +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; +} diff --git a/test/test_syscall_write.c b/test/test_syscall_write.c index df86458..35c61af 100644 --- a/test/test_syscall_write.c +++ b/test/test_syscall_write.c @@ -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; }