孤星11 发表于 2022-12-2 16:56:05

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

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

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

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

format PE console
include 'WIN32A.INC'
entry start

MAX_LEN equ   80

section '.code' code readable executable

start:

;HANDLE WINAPI GetStdHandle(
;_In_ DWORD nStdHandle
;);
    invoke      GetStdHandle, -10
    mov         dword , eax
    invoke      GetStdHandle, -11
    mov         dword , eax

;BOOL WINAPI ReadConsole(
;_In_   HANDLEhConsoleInput,
;_Out_    LPVOIDlpBuffer,
;_In_   DWORD   nNumberOfCharsToRead,
;_Out_    LPDWORD lpNumberOfCharsRead,
;_In_opt_ LPVOIDpInputControl
;);

    invoke      ReadConsole, dword , _msg, MAX_LEN, _dummy, 0

;BOOL WINAPI WriteConsole(
;_In_             HANDLEhConsoleOutput,
;_In_       const VOID    *lpBuffer,
;_In_             DWORD   nNumberOfCharsToWrite,
;_Out_opt_      LPDWORD lpNumberOfCharsWritten,
;_Reserved_       LPVOIDlpReserved
;);

    invoke      WriteConsole, dword , _msg, MAX_LEN, _dummy, 0
    invoke      WriteConsole, dword , _crlf, 2, _dummy, 0

;add
    mov         eax, dword
    mov         dword , eax
    mov         eax, dword
    add         dword , eax
    call      wsprint

;subtract
    mov         eax, dword
    mov         dword , eax
    mov         eax, dword
    sub         dword , eax
    call      wsprint

;multiply
    cdq
    mov         eax, dword
    mov         ebx, dword
    imul      ebx
    mov         dword , eax
    call      wsprint

;divide
    cdq
    mov         eax, dword
    mov         ebx, dword
    idiv      ebx
    mov         dword , eax
    call      wsprint

;void ExitProcess(
; UINT uExitCode
;);
    invoke      ExitProcess, 0


wsprint:
;int WINAPIV wsprintfA(
; LPSTRunnamedParam1,
;LPCSTR unnamedParam2,
;      ...
;);

    cinvoke   wsprintfA, _buf, _fmt, dword
    mov         dword , eax
    invoke      WriteConsole, dword , _buf, dword , _dummy, 0
    invoke      WriteConsole, dword , _crlf, 2, _dummy, 0
    ret

section '.data' data readable writeable

_buf   rb      10;MAX =4294967295
_fmt   db      '%d'
_len   dd      ?
_dummy   dd      ?
_msg   rb      MAX_LEN
_crlf    db      13,10,0
_stdin   dd      ?
_stdoutdd      ?
_var_1   dd      1234
_var_2   dd      2
_var_0   dd      ?

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

    include 'API/KERNEL32.INC'
    include 'API/USER32.INC'

蓝莓糖 发表于 2022-12-2 20:26:57

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

孤星11 发表于 2022-12-2 21:07:30

蓝莓糖 发表于 2022-12-2 20:26
不太精通的地方可以慢慢学,现在信息的来源很多,你已经很厉害了。
而且现在事物的变化都是日新月异,人们 ...
谢谢蓝莓糖的鼓励,想不到回复的不是同行人,而是一位勤奋有爱心的女生。

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

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

即使是一些高手,也有知识的盲区,都是需要不断学习的
真希望是这样,那些高手给我的感觉总是什么都会,什么都精通,没有弱点。

再次谢谢蓝莓糖!

蓝莓糖 发表于 2022-12-2 21:15:33

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

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

不客气的

legs+ 发表于 2022-12-2 22:30:27

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

孤星11 发表于 2022-12-2 23:29:00

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

因为我总觉得自己很差劲,别人比我优越得多,所以才那样说话,特别是被本地论坛那位程序员气到,才在这里发表感想。谢谢legs+一直给我和大家带来新知,给我题材。
页: [1]
查看完整版本: 本来是想认真再写编译器,但是.....