本来是想认真再写编译器,但是.....

电脑技术 电脑技术 1954 人阅读 | 5 人回复 | 2022-12-02

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
.....但是败在我不懂编程语言的词法分析、语法分析、语义分析的原理,也写不出啊。

我是设计了汇编程序的模板,模拟我的全新编译器所生成的源文件。这个全新编译器本来是想读取现有C#源文件(仅接受ConsoleApp项目),然后转换成汇编(FASM)源文件,以便进一步生成Windows可执行文件,但是我败在不懂词法分析、语法分析、语义分析,不知道如何诠释C#语言啊(或任何其他编程语言)。

虽然如此,还是发布我的汇编程序模板在这里。

  1. format PE console
  2. include 'WIN32A.INC'
  3. entry start

  4. MAX_LEN equ     80

  5. section '.code' code readable executable

  6. start:

  7. ;HANDLE WINAPI GetStdHandle(
  8. ;  _In_ DWORD nStdHandle
  9. ;);
  10.     invoke      GetStdHandle, -10
  11.     mov         dword [_stdin], eax
  12.     invoke      GetStdHandle, -11
  13.     mov         dword [_stdout], eax

  14. ;BOOL WINAPI ReadConsole(
  15. ;  _In_     HANDLE  hConsoleInput,
  16. ;  _Out_    LPVOID  lpBuffer,
  17. ;  _In_     DWORD   nNumberOfCharsToRead,
  18. ;  _Out_    LPDWORD lpNumberOfCharsRead,
  19. ;  _In_opt_ LPVOID  pInputControl
  20. ;);

  21.     invoke      ReadConsole, dword [_stdin], _msg, MAX_LEN, _dummy, 0

  22. ;BOOL WINAPI WriteConsole(
  23. ;  _In_             HANDLE  hConsoleOutput,
  24. ;  _In_       const VOID    *lpBuffer,
  25. ;  _In_             DWORD   nNumberOfCharsToWrite,
  26. ;  _Out_opt_        LPDWORD lpNumberOfCharsWritten,
  27. ;  _Reserved_       LPVOID  lpReserved
  28. ;);

  29.     invoke      WriteConsole, dword [_stdout], _msg, MAX_LEN, _dummy, 0
  30.     invoke      WriteConsole, dword [_stdout], _crlf, 2, _dummy, 0

  31. ;add
  32.     mov         eax, dword [_var_1]
  33.     mov         dword [_var_0], eax
  34.     mov         eax, dword [_var_2]
  35.     add         dword [_var_0], eax
  36.     call        wsprint

  37. ;subtract
  38.     mov         eax, dword [_var_1]
  39.     mov         dword [_var_0], eax
  40.     mov         eax, dword [_var_2]
  41.     sub         dword [_var_0], eax
  42.     call        wsprint

  43. ;multiply
  44.     cdq
  45.     mov         eax, dword [_var_1]
  46.     mov         ebx, dword [_var_2]
  47.     imul        ebx
  48.     mov         dword [_var_0], eax
  49.     call        wsprint

  50. ;divide
  51.     cdq
  52.     mov         eax, dword [_var_1]
  53.     mov         ebx, dword [_var_2]
  54.     idiv        ebx
  55.     mov         dword [_var_0], eax
  56.     call        wsprint

  57. ;void ExitProcess(
  58. ;  [in] UINT uExitCode
  59. ;);
  60.     invoke      ExitProcess, 0


  61. wsprint:
  62. ;int WINAPIV wsprintfA(
  63. ;  [out] LPSTR  unnamedParam1,
  64. ;  [in]  LPCSTR unnamedParam2,
  65. ;        ...
  66. ;);

  67.     cinvoke     wsprintfA, _buf, _fmt, dword [_var_0]
  68.     mov         dword [_len], eax
  69.     invoke      WriteConsole, dword [_stdout], _buf, dword [_len], _dummy, 0
  70.     invoke      WriteConsole, dword [_stdout], _crlf, 2, _dummy, 0
  71.     ret

  72. section '.data' data readable writeable

  73. _buf     rb      10  ;MAX =4294967295
  74. _fmt     db      '%d'
  75. _len     dd      ?
  76. _dummy   dd      ?
  77. _msg     rb      MAX_LEN
  78. _crlf    db      13,10,0
  79. _stdin   dd      ?
  80. _stdout  dd      ?
  81. _var_1   dd      1234
  82. _var_2   dd      2
  83. _var_0   dd      ?

  84. section '.idata' import data readable writeable
  85.     library kernel32, 'kernel32.dll',\
  86.             user32, 'user32.dll'

  87.     include 'API/KERNEL32.INC'
  88.     include 'API/USER32.INC'
复制代码

TEMPLATE.zip

1.49 KB, 下载次数: 0

回答|共 5 个

蓝莓糖 发表于 2022-12-2 20:26:57| 字数 117 | 显示全部楼层

不太精通的地方可以慢慢学,现在信息的来源很多,你已经很厉害了。
而且现在事物的变化都是日新月异,人们都是需要知识的更新换代,活到老学到老,很正常。
不必纠结,享受学习的过程就好了,即使是一些高手,也有知识的盲区,都是需要不断学习的,加油哦

孤星11 发表于 2022-12-2 21:07:30| 字数 236 | 显示全部楼层

蓝莓糖 发表于 2022-12-2 20:26
不太精通的地方可以慢慢学,现在信息的来源很多,你已经很厉害了。
而且现在事物的变化都是日新月异,人们 ...

谢谢蓝莓糖的鼓励,想不到回复的不是同行人,而是一位勤奋有爱心的女生。

我在本地论坛也发了大概同样的帖子,只得到一个同行人的冷冷回应,仅随意丢下一个链接而已,令我大失所望。

你的这番话弥补了我的缺憾。

即使是一些高手,也有知识的盲区,都是需要不断学习的

真希望是这样,那些高手给我的感觉总是什么都会,什么都精通,没有弱点。

再次谢谢蓝莓糖!

蓝莓糖 发表于 2022-12-2 21:15:33| 字数 76 | 显示全部楼层

孤星11 发表于 2022-12-2 21:07
谢谢蓝莓糖的鼓励,想不到回复的不是同行人,而是一位勤奋有爱心的女生。

我在本地论坛也发了大概同样的 ...

不客气的

legs+ 发表于 2022-12-2 22:30:27| 字数 28 | 显示全部楼层

本人对底层不是很熟悉,所以不好发表意见!
编译器好高深呀!

孤星11 发表于 2022-12-2 23:29:00| 字数 128 来自手机 | 显示全部楼层

legs+ 发表于 2022-12-2 22:30
本人对底层不是很熟悉,所以不好发表意见!
编译器好高深呀!

因为我总觉得自己很差劲,别人比我优越得多,所以才那样说话,特别是被本地论坛那位程序员气到,才在这里发表感想。谢谢legs+一直给我和大家带来新知,给我题材。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐