
рд╕рд╛рд▓ 2019 рдЖ рдЧрдпрд╛ рд╣реИред рдирдП рд╕рд╛рд▓ рдХреА рдЫреБрдЯреНрдЯрд┐рдпрд╛рдВ рдЦрддреНрдо рд╣реЛ рд░рд╣реА рд╣реИрдВред рдпрд╣ рдмрд╛рдЗрдЯреНрд╕, рдХрдорд╛рдВрдбреНрд╕, рд╡реИрд░рд┐рдПрдмрд▓, рд▓реВрдкреНрд╕ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ ...
рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдореИрдВ рдЗрди рдЫреБрдЯреНрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреВрд▓ рдЪреБрдХрд╛ рд╣реВрдБред рдПрдХ рд╕рд╛рде рдпрд╛рдж рд░рдЦрдирд╛ рд╣реИ!
рдЖрдЬ рд╣рдо рдЕрдкрдиреА рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рддреАрд╕рд░рд╛ рд▓реЗрдЦ рд╣реИ, рдкрд╣рд▓реЗ рднрд╛рдЧ рдпрд╣рд╛рдВ рд╣реИрдВ:
рднрд╛рдЧ 1 ,
рднрд╛рдЧ 2 ред
рд╕рднреА рдХреЛ рдирд╡ рд╡рд░реНрд╖ рдХреА рд╢реБрднрдХрд╛рдордирд╛рдПрдВ, рдФрд░ рдХрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ
рдлрдХрдк рд╕реЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм
рджреВрдВрдЧрд╛ ред рдпреЗ рд╕рд╡рд╛рд▓ рдмрд┐рд▓рдХреБрд▓ рд╕рд╣реА рд╣реИрдВред рдЕрдм рдЗрд╕ рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдРрд╕реА рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрддреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдмрд╛рдпреЛрдЯреЗрдХ рдореЗрдВ рдпреЗ рдкрддреЗ рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рдмрдирддреЗ рд╣реИрдВред рд╕рд┐рд╕реНрдЯрдо рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдХреЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХреЛрдб рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪрд░ рдпрд╛ рд╕рд░рдгреА рдХрд╛ рдкрддрд╛ var0 рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрдорд╛рдВрдб рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред рдлрд┐рд░ рдЖрдк рдЗрд╕ рдкрддреЗ рдкрд░ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА,
рдлрдХреБрдХ рд╕рд╣реА рд╣реИред рдкрддреЗ рдХреЛ рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдЗрдВрдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкрддреЗ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рд╡реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдкрддреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдЪрд░ рдХреЗ рдореВрд▓реНрдп, рд╕рдВрджрд░реНрдн рдФрд░ рдЕрдиреНрдпред
рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрддреЗ рдХреЛ рдЖрднрд╛рд╕реА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред X86 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдкрддрд╛ рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдорд╛рдВрдб рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдореИрдВ рд╡рд░реНрддрдорд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдирд┐рд░рдкреЗрдХреНрд╖ рдкрддреЗ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред рдФрд░ рдлрд┐рд░, рдЬрдм рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВ, рддреЛ рдкрддреЗ рдХреЛ рдЖрднрд╛рд╕реА рд▓реЛрдЧреЛрдВ рдореЗрдВ рд░реАрдореЗрдХ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
рд╡рд╛рд░реНрдо рдЕрдк рдХрд░реЗрдВ
рдФрд░ рдЕрдм рдереЛрдбрд╝реА рдХрд╕рд░рддред рдЪрд▓реЛ рдЫреЛрдЯреА рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рдФрд░ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдпреЗ рдХрдорд╛рдВрдб рд╣реЛрдВрдЧреЗ nip, emit, 1+, +! -; -!, Count рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗ рд╢рдмреНрдж>>, r, r @, a string рд╢рд╛рдмреНрджрд┐рдХ ("), рдФрд░ рдирд┐рд░рдВрддрд░ рд╢рдмреНрдж 1, 2, 3, 4, 8. рдЙрдиреНрд╣реЗрдВ рдЖрджреЗрд╢реЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред
рдпрд╣рд╛рдБ рдЗрди рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИb_nip = 0x39 bcmd_nip: pop rax mov [rsp], rax jmp _next b_emit = 0x81 bcmd_emit: pop rax mov rsi, offset emit_buf # mov [rsi], al mov rax, 1 # тДЦ 1 - sys_write mov rdi, 1 # тДЦ 1 - stdout mov rdx, 1 # push r8 syscall # pop r8 jmp _next b_wp = 0x18 bcmd_wp: incq [rsp] jmp _next b_setp = 0x48 bcmd_setp: pop rcx pop rax add [rcx], rax jmp _next b_setm = 0x49 bcmd_setm: pop rcx pop rax sub [rcx], rax jmp _next b_2r = 0x60 bcmd_2r: pop rax sub rbp, 8 mov [rbp], rax jmp _next b_r2 = 0x61 bcmd_r2: push [rbp] add rbp, 8 jmp _next b_rget = 0x62 bcmd_rget: push [rbp] jmp _next b_str = 0x82 bcmd_str: movzx rax, byte ptr [r8] lea r8, [r8 + rax + 1] jmp _next b_count = 0x84 bcmd_count: pop rcx movzx rax, byte ptr [rcx] inc rcx push rcx push rax jmp _next b_num1 = 0x03 bcmd_num1: push 1 jmp _next b_num2 = 0x04 bcmd_num2: push 2 jmp _next b_num3 = 0x05 bcmd_num3: push 3 jmp _next b_num4 = 0x06 bcmd_num4: push 4 jmp _next b_num8 = 0x07 bcmd_num8: push 8 jmp _next
рдирд┐рдк рдХрдорд╛рдВрдб рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдХреЗ рдиреАрдЪреЗ рд╢рдмреНрдж рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрд╡реИрдк рдХрдорд╛рдВрдб рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣ рдХрднреА-рдХрднреА рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
Emit рдХрдорд╛рдВрдб рд╕реНрдЯреИрдХ рд╕реЗ рдПрдХ рд╡рд░реНрдг рдХреЛ рдзрдХреЗрд▓рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╣реА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЪрд░рд┐рддреНрд░ 1 рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдмрдлрд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред
рдЧрд┐рдирддреА рдХрдорд╛рдВрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХрд╛ рдкрддрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЛ рдорд╛рдиреЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ - рдХрд╛рдЙрдВрдЯрд░ рдФрд░ рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЗрди рдХрд╛ рдкрддрд╛ред
B_2r, b_r2, b_rget рдХрдорд╛рдВрдб рдлреЛрд░реНрдЯ рд╢рдмреНрдж r>,> r, r @ рд╣реИрдВред рдкрд╣рд▓реЗ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рд╕реЗ рд╢рдмреНрдж рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдВрдХрдЧрдгрд┐рдд рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рд╡рд┐рдкрд░реАрдд рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИред рддреАрд╕рд░рд╛ рд░рд┐рдЯрд░реНрди рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рд╕реЗ рд╢рдмреНрдж рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЕрдВрдХрдЧрдгрд┐рдд рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
B_setp рдФрд░ b_setm рдХрдорд╛рдВрдб рд╢рдмреНрдж + рд╣реИрдВ! рдФрд░ -! .. рд╡реЗ рд╕реНрдЯреИрдХ рд╕реЗ рдорд╛рди рдФрд░ рдкрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдЯреИрдХ рд╕реЗ рдорд╛рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рд╢рдмреНрдж рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
B_str рдХрдорд╛рдВрдб рдореЗрдВ рдПрдХ рдордирдорд╛рдирд╛ рд▓рдВрдмрд╛рдИ рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ - рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ред рдпрд╣ рд▓рд╛рдЗрди рдХрдорд╛рдВрдб рдмрд╛рдЗрдЯ рдХреЗ рдмрд╛рдж рдмрд╛рдИрдЯреЗрдХреЛрдб рдореЗрдВ рд╣реИ, рдФрд░ рдХрдорд╛рдВрдб рдХреЗрд╡рд▓ рдЗрд╕ рд▓рд╛рдЗрди рдХрд╛ рдкрддрд╛ рд╕реНрдЯреИрдХ рдкрд░ рд▓рдЧрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рд╣реИред
рдмрд╛рдХреА рдЯреАрдо, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
рд╣рдо рдПрдХ рдирд┐рд░рдВрддрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ (ред ") рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рднреА рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ:
b_strp = 0x83 bcmd_strp: movsx rax, byte ptr [r8] inc r8 push rax push r8 add r8, rax b_type = 0x80 bcmd_type: mov rax, 1 # тДЦ 1 - sys_write mov rdi, 1 # тДЦ 1 - stdout pop rdx # pop rsi # push r8 syscall # pop r8 jmp _next
рдпрд╣ рдЖрджреЗрд╢ b_str рдХреЗ рд╕рдорд╛рди рд╕рдВрд░рдЪрд┐рдд рд╣реИред рдХреЗрд╡рд▓ рд╡рд╣ рд╕реНрдЯреИрдХ рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдбрд╛рд▓рддреА рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдХрдорд╛рдВрдб рдХреЗ рдкреАрдЫреЗ рд╕реНрдерд┐рдд рд▓рд╛рдЗрди рдХреЛ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд╛рд░реНрдо-рдЕрдк рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдФрд░ рдЧрдВрднреАрд░ рд╣реЛред рдЖрдЗрдП рд╢рдмреНрдж-рдЬрдирд░реЗрдЯрд░ рдФрд░ рдЕрдиреНрдп var рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВред
рдЬрдирдХ рд╢рдмреНрдж
рдЪрд░реЛрдВ рдХреЛ рдпрд╛рдж рдХрд░реЛред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдмрд╛рдпрдЯреЗрдХреЛрдб рд╕реНрддрд░ (var0 рдХрдорд╛рдВрдб) рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдирдпрд╛ рдЪрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд▓рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
variable < >
рдЗрд╕ рдХреНрд░рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдирдпрд╛ рд╢рдмреНрдж <рдЪрд░ рдирд╛рдо> рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдирдП рд╢рдмреНрдж рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЪрд░ рдХреЗ рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрддреЗ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓рддрд╛ рд╣реИред рдХрд┐рд▓реЗ рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рднреА рд╣реИрдВ, рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ:
<> constant < >
рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╢рдмреНрдж рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди <рд╕реНрдерд┐рд░ рдирд╛рдо> рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд╛рди <рдореВрд▓реНрдп>ред
рддреЛ, рд╢рдмреНрдж рдЪрд░ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рджреЛрдиреЛрдВ рд╢рдмреНрдж рдЬрдирд░реЗрдЯрд░ рд╢рдмреНрдж рд╣реИрдВред рд╡реЗ рдирдП рд╢рдмреНрдж рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдПрдХ рдХрд┐рд▓реЗ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢рдмреНрджреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг ... рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪрд░ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
: variable create 0 , does> ; : constant create , does> @ ;
рдЗрд╕ рд╕рдмрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
рд╢рдмреНрдж рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░, рдЙрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╢рдмреНрдж рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рд╢рдмреНрдж рдХреЗ рдХреНрд░рдо рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ>ред рд▓реЗрдХрд┐рди рдЗрд╕ рд╢рдмреНрдж рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдордп, рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ> рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдбреЗрдЯрд╛ рдкрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдЯреИрдХ рдкрд░ рд╣реЛрдЧрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд┐рд▓реЗ рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВ, "рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб")ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдЪрд░ рдмрдирд╛рддреЗ рд╕рдордп, рдЕрдиреБрдХреНрд░рдо "0" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ - рдпрд╣ рд╢реВрдиреНрдп рднрд░рдиреЗ рдХреЗ рд╕рд╛рде рдорд╢реАрди рд╢рдмреНрдж рдХрд╛ рдЖрд░рдХреНрд╖рдг рд╣реИред рдФрд░ рдЬрдм рдмрдирд╛рдП рдЧрдП рд╢рдмреНрдж рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ> рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ)ред рд╕реНрдореГрддрд┐ рдкрддрд╛ рдЬрд╣рд╛рдБ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдмрд╕ рд╕реНрдЯреИрдХ рдкрд░ рд░рд╣рддрд╛ рд╣реИред
рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ, рд╕реНрдЯреИрдХ рдкрд░ рдорд╛рди рднрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╢рдмреНрдж рдЖрд░рдХреНрд╖рд┐рдд рд╣реИред рдЬрдм рдмрдирд╛рдП рдЧрдП рд╢рдмреНрдж рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ "@" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдореВрд▓реНрдп рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЬреЛ рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдЯреИрдХ рдкрд░ рдбреЗрдЯрд╛ рдкрддреЗ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ (рдЬреИрд╕реЗ var0), рдФрд░ рдлрд┐рд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ, рдмрд╛рдпрдЯреЗрдХреЛрдб рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред Var0 рдХрдорд╛рдВрдб рддреБрд░рдВрдд рд▓реМрдЯрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╡рд╛рдкрд╕реА рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╕рдВрдХреНрд░рдордг рд╣реИред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдореИрдВ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рд╕реНрдЯреИрдХ рдкрд░ рдбреЗрдЯрд╛ рдкрддрд╛ рдбрд╛рд▓реЗрдВ
- > рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдХреВрджреЛ
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдЕрдиреНрдп рдмрд╛рдпреЛрдЯреЗрдХ рдкрддреЗ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рдкрд░ рдЕрдЧрд▓реЗ рдмрд╛рдЗрдЯ (рдЖрд░ 8) рдХрд╛ рдкрддрд╛ рдбрд╛рд▓реЗрдВред
рдпрд╣ рд▓рдЧрднрдЧ рдПрдХ рд╢рд╛рдЦрд╛ рдХрдорд╛рдВрдб рд╣реИ! рдФрд░ рдпрд╣рд╛рдБ рд╡рд╣ рдЕрдХреЗрд▓реА рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢рд╛рдЦрд╛ 8 рдФрд░ рд╢рд╛рдЦрд╛ 16 рд╣реИрдВред рд╣рдо рдирдП var8 рдФрд░ var16 рдХрдорд╛рдВрдб рдХреЛ рдирд╛рдо рджреЗрдВрдЧреЗ, рдФрд░ рдЗрдиреНрд╣реЗрдВ рд╢рд╛рдЦрд╛ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рд╣реЛрдиреЗ рджреЗрдВред рд╣рдо рд╕рдВрдХреНрд░рдордг рдЯреАрдо рдХреЛ рд╕рдВрдХреНрд░рдордг рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВ :) рддреЛ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
b_var8 = 0x29 bcmd_var8: push r8 b_branch8 = 0x10 bcmd_branch8: movsx rax, byte ptr [r8] add r8, rax jmp _next b_var16 = 0x30 bcmd_var16: push r8 b_branch16 = 0x11 bcmd_branch16: movsx rax, word ptr [r8] add r8, rax jmp _next
рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, var32 рдХрдорд╛рдВрдб рдЕрднреА рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ var64 рднреАред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдВрдХреНрд░рдордг рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдХреНрд░рдордг рдЗрддрдиреЗ рд▓рдВрдмреЗ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди var рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдорд╛рдорд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдпреЗ рдХрдорд╛рдВрдб рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдмрд╛рдж рдореЗрдВ рдХрд░реЗрдВрдЧреЗ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред
рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде-рдЬрдирд░реЗрдЯрд░ рдЫрд╛рдВрдЯреЗ рдЧрдПред рд╢рдмреНрджрдХреЛрд╢ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд░рдиреЗ рдХреА рдмрд╛рд░реА рдереАред
рд╢рдмреНрджрдХреЛрд╢
рдЖрдорддреМрд░ рдкрд░, рдЬрдм рд╡реЗ рдХрд┐рд▓реЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд░рд▓рддрд╛ рд╕реЗ рдмреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд▓реЗ рдХрдИ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ рдПрдХ рдкреЗрдбрд╝ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдХреА рдЦреЛрдЬ рдПрдХ "рдкрддреНрд░рдХ" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ - рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЕрдВрддрд┐рдо рд╢рдмреНрдж рд╣реИред рд╡рд░реНрддрдорд╛рди рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╕рдВрджрд░реНрдн рдЪрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рд╢рдмреНрдж рдХрд╛ рдкрддрд╛ рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрдж рдореЗрдВ рд╣реИред рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдирдП рд╢рдмреНрдж рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдирдП рд╢рдмреНрджреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ред
рд╣рдорд╛рд░реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреБрдЫ рднреА рд╕рд░рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╛рдЗрдЯ рдХреЛрдб, рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдХреНрдпрд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬреЛ рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЖрдк рдмрд╕ рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЦреИрд░, рдЬреЛ рд╡рд┐рд╡рд░рдг рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ - рдЖрдЧреЗ рдмрдврд╝реЛ!
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдПрдХ рдореВрд▓ рд╢рдмреНрджрдХреЛрд╖ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЖрдЧреЗ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╢рдмреНрдж рд╣реИ - рдЖрдЧреЗред рдЗрд╕ рд╢рдмреНрдж рдХреЛ "рд╢рдмреНрджрдХреЛрд╢" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреБрдЫ рднреНрд░рдо рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдпрд╣ рдПрдХ рд╢рдмреНрдж рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╢рдмреНрджрдХреЛрд╖ рдХрд╣реВрдВрдЧрд╛ред
рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдП рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ:
vocabulary < >
рдпрд╣ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдмреНрдж рдмрдирд╛рддрд╛ рд╣реИ <рдмрдирд╛рдпрд╛ рд╢рдмреНрджрдХреЛрд╢ рдирд╛рдо>ред рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░, рдпрд╣ рд╢рдмреНрдж рдмрдирд╛рдП рдЧрдП рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рд╢рдмреНрджрдХреЛрд╖ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбрд┐рдХреНрд╢рдирд░реА рд╢рдмреНрдж рдореЗрдВ рдЗрд╕ рдбрд┐рдХреНрд╢рдирд░реА рдХреЗ рдЖрдЦрд┐рд░реА рд▓реЗрдЦ рдХрд╛ рд▓рд┐рдВрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЦреЛрдЬ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп, рдпрд╣ рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрдж рд╕рдВрджрд░реНрдн рдЪрд░ рдореЗрдВ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд▓рд┐рдЦрддрд╛ рд╣реИред
рдмрд╛рдж рдореЗрдВ рд╢рдмреНрдж рд╢рдмреНрджрд╛рд╡рд▓реА рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐рд▓реЗ рдкрд░, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХрд╛рдлреА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ:
: vocabulary create context @ , does> context ! ;
рддреЛ, рдЖрдЧреЗ рд╢рдмреНрдж рдмрдирд╛рдПрдБред рд╣рдо var8 рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдмрд╛рдЗрдЯрдХреЛрдб "рд╕рдВрджрд░реНрдн!" рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рдареАрдХ рдмрд╛рдж рд░рдЦреЗрдВ:
forth: .byte b_var8 .byte does_voc - . - 1 .quad 0 # <-- . , - . does_voc: .byte b_call8 .byte context - . - 1 .byte b_set .byte b_exit
рдЕрдм рд╡рд╛рдкрд╕ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдХрд┐рд▓реЗ рдореЗрдВ, рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдХрд╛ рд╡рд░реНрдгрди "рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдПрдХ рд▓реЗрдЦ рдХрд╛ рд╢реАрд░реНрд╖рдХ рдФрд░ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдХрд┐рд▓реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ; рд╡рд╣рд╛рдВ рдЗрд╕реЗ "рдирд╛рдо рдлрд╝реАрд▓реНрдб", "рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░", "рдХреЛрдб рдлрд╝реАрд▓реНрдб" рдФрд░ "рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдпрд╣ рд╕рдм рдХреНрдпрд╛ рд╣реИред
рдирд╛рдо рдлрд╝реАрд▓реНрдб рд╢рдмреНрдж рдХрд╛ рдирд╛рдо рд╣реИ, "рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдиред" рдпрд╣ рдкреБрд░рд╛рдиреЗ рдкрд╛рд╕реНрдХрд▓ рдХреА рддрд░рд╣ рд╣реИ - рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рдВрдмрд╛рдИ рдХреА рдмрд╛рдЗрдЯ, рдлрд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧред рд▓рд┐рдВрдХ рдлрд╝реАрд▓реНрдб рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХрд╛ рд▓рд┐рдВрдХ рд╣реИред рдкрд╣рд▓реЗ, рдХреЗрд╡рд▓ рдПрдХ рдкрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдПрдХ рдСрдлрд╕реЗрдЯ рд╣реЛрдЧрд╛ред рдХреЛрдб рдлрд╝реАрд▓реНрдб, рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рд▓реЗ рдореЗрдВ, рдорд╢реАрди рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ (рдЬрдм рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рдкрд░ рд╣реЛрддрд╛ рд╣реИ), рдХрд░реНрдиреЗрд▓ рдХреЗ рдмрд╛рд╣рд░ рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП _call рдерд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╕ рдПрдХ рдмрд╛рдИрдЯреЗрдХреЛрдб рд╣реЛрдЧрд╛ред рдФрд░ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдбреЗрдЯрд╛ рдпреБрдХреНрдд рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд░ рдпрд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдПред рд╡реИрд╕реЗ, рд╢рдмреНрдж рд╢рдмреНрджрдХреЛрд╢ рднреА рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрднреА рднреА рдЭрдВрдбреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд▓реЗ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдзреНрд╡рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рддрддреНрдХрд╛рд▓, рдФрд░ рдЗрд╕реЗ рдПрдХ рд▓рдВрдмреА рдмрд╛рдЗрдЯ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХрднреА-рдХрднреА рдПрдХ рдФрд░ - рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реЛрддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реАрдзреЗ рд╕рд┐рд▓рдирд╛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд╣рд╛рдВ рдХреЛрдб рдлрд╝реАрд▓реНрдб рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрдж рд╣реИрдВ - рдмрд╛рдЗрдЯрдХреЛрдб рдФрд░ рдорд╢реАрди рдХреЛрдб, рдФрд░ рдХрдо рд╕реЗ рдХрдо рджреЛ, рдпрд╛ рддреАрди рднреА, рдЭрдВрдбреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВ 16 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╢рдмреНрдж рдХреА рдПрдХ рдХрдбрд╝реА рд╣реИ, рдФрд░ рдпрд╣ рд╢рдмреНрдж рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 64 рдХреЗрдмреА рд╕реЗ рдХрдо рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рдЗрд╕ рд╢рдмреНрдж рдореЗрдВ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХрд╛ рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдИ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд▓рд┐рдВрдХ рдХрдИ рд╢рдмреНрджреЛрдВ рд╕реЗ рдЧреБрдЬрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, 8 рдмрд┐рдЯреНрд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди 16 рдФрд░ 32 рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ 64 рдмрд┐рдЯреНрд╕ рднреА, рдЕрдЧрд░ 4 рдЬреАрдмреА рд╕реЗ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╣реИред рдЦреИрд░, рдЪрд▓реЛ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдХреМрди рд╕рд╛ рд╡рд┐рдХрд▓реНрдк рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЭрдВрдбреЗ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред рдпрд╣ рдХрдо рд╕реЗ рдХрдо 4 рдЭрдВрдбреЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ: рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛, рдХреЛрд░ рд╢рдмреНрдж рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ 2 рдмрд┐рдЯ рдкреНрд░рддрд┐ рд╕рдВрд╕реНрдХрд░рдгред рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдмрд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВред
рд╣рдо рдЭрдВрдбреЗ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
f_code = 0x80 f_immediate = 0x60
F_code рдзреНрд╡рдЬ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд░реНрдиреЗрд▓ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛, f_immediate рдзреНрд╡рдЬ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВред рдФрд░ рджреЛ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ (1, 2, 4 рдпрд╛ 8 рдмрд╛рдЗрдЯреНрд╕) рдХреА рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
рддреЛ, рд▓реЗрдЦ рдХрд╛ рд╢реАрд░реНрд╖рдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
- рдЭрдВрдбреЗ (1 рдмрд╛рдЗрдЯ)
- рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ (1-8 рдмрд╛рдЗрдЯреНрд╕)
- рдирд╛рдо рд▓рдВрдмрд╛рдИ рдмрд╛рдЗрдЯ
- рдирд╛рдо (1-255 рдмрд╛рдЗрдЯреНрд╕)
рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ, рдореИрдВрдиреЗ "рдореИрдХреНрд░реЛ" рдХреЛрдбрд╛рдВрддрд░рдХ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдФрд░ рдЕрдм рд╣рдореЗрдВ рдЙрдирдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореБрдЭреЗ рд╢рдмреНрдж рдХрд╛ рд╢реАрд░реНрд╖рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХ рдореИрдХреНрд░реЛ рдорд┐рд▓рд╛:
.macro item name, flags = 0 link = . - p_item 9: .if link >= -256/2 && link < 256/2 .byte \flags .byte link .elseif link >= -256*256/2 && link < 256*256/2 .byte \flags | 1 .word . - p_item .elseif link >= -256*256*256*256/2 && link < 256*256*256*256/2 .byte \flags | 2 .int . - p_item .elseif link >= -256*256*256*256*256*256*256*256/2 && link < 256*256*256*256*256*256*256*256/2 .byte \flags | 3 .quad . - p_item .endif p_item = 9b .byte 9f - . - 1 .ascii "\name" 9: .endm
рдпрд╣ рдореИрдХреНрд░реЛ p_item рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдкрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ рдпрд╣ рдорд╛рди рднрд╡рд┐рд╖реНрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: p_item = 9bред рдпрд╣рд╛рдВ 9 рдмреА рдПрдХ рд▓реЗрдмрд▓ рд╣реИ, рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ :) рдореИрдХреНрд░реЛ рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ - рд╢рдмреНрдж рдФрд░ рдЭрдВрдбреЗ рдХрд╛ рдирд╛рдо (рд╡реИрдХрд▓реНрдкрд┐рдХ)ред рдореИрдХреНрд░реЛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдкрд┐рдЫрд▓реЗ рд╢рдмреНрдж рдХреА рдСрдлрд╕реЗрдЯ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдлрд┐рд░, рдСрдлрд╕реЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЭрдВрдбреЗ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдирд╛рдо рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рдирд╛рдо рдХрд╛ рдмрд╛рдЗрдЯред
рдкрд╣рд▓реЗ рд╢рдмреНрдж p_item рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
p_item = .
рдмрд┐рдВрджреБ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рдВрдХрд▓рди рдкрддрд╛ рд╣реИред рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкрд╣рд▓рд╛ рд╢рдмреНрдж рдЦреБрдж рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ (рд╕рдВрдЪрд╛рд░ рдХреНрд╖реЗрддреНрд░ 0 рд╣реЛрдЧрд╛)ред рдпрд╣ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рдЕрдВрдд рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИред
рд╡реИрд╕реЗ, рдХрд░реНрдиреЗрд▓ рд╢рдмреНрджреЛрдВ рдХреЗ рдХреЛрдб рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХрдо рд╕реЗ рдХрдо, рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдХреЛрдб рдХрд╣реАрдВ рдмрдЪрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдХрд░реНрдиреЗрд▓ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдЗрдЯрдХреЛрдб рднреА рд╣реЛрдЧрд╛ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╣реЛрдЧреА, рдЙрд╕рдХреЗ рдмрд╛рдж b_exit рд╣реЛрдЧреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, f_code рдзреНрд╡рдЬ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЖрдкрдХреЛ рдмрд╕ рд╕рднреА рдХреЗ рд▓рд┐рдП рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдПрдХ рдФрд░ рдлрд╛рдпрджрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕реАрдзреЗ рд╕реАрд╡рди рдХреЛрдб рдХреЗ рд╕рд╛рде рдлреЛрд░реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЬрд▓рд╛рдпрд╛ рдХрдорд╛рдВрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рд╡рд╣рд╛рдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 0 рдХреЛ рдЬрд▓рд╛рдпрд╛, рдФрд░ рдпрд╣ рдХреНрд░рдо рдмрд╕ рд╕реНрдЯреИрдХ рдкрд░ 0 рдбрд╛рд▓ рджреЗрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!
.byte branch8 .byte 0f - . 0: .byte b_exit
рдРрд╕реА рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╡реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЭрдВрдбреЗ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдЧрд╛, рдФрд░ рд╕рд╣реА рдФрд░ рддреЗрдЬ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред
рдкрд╣рд▓рд╛ рд╢рдмреНрдж, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, "рдЖрдЧреЗ" рд╢рдмреНрдж рд╣реЛрдЧрд╛ - рдореВрд▓ рд╢рдмреНрджрд╛рд╡рд▓реА рдЬреЛ рд╣рдо рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣рд╛рдБ, рдХреЛрдб рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╡рд░реНрдЬрди рдХрдорд╛рдВрдб рдореЗрдВ рдЖрддрд╛ рд╣реИ>ред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рдХреЛрдб рдХреЛ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЙрджреНрдзреГрдд рдХрд░ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛, рд╢реАрд░реНрд╖рдХ рдХреЗ рд╕рд╛рде:
p_item = . item forth .byte b_var8 .byte does_voc - . - 1 .quad 0 does_voc: .byte b_call8 .byte context - . - 1 .byte b_set .byte b_exit
рдФрд░ рд╣рдо рддреБрд░рдВрдд рд╕рдВрджрд░реНрдн рдЪрд░ рдмрдирд╛ рд▓реЗрдВрдЧреЗ рдФрд░, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╢рдмреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
item .byte b_var0 .quad 0 item context context: .byte b_var0 .quad 0
рдФрд░ рдЕрдм, рдЖрдкрдХреЛ рдзреИрд░реНрдп рд░рдЦрдиреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реАрд░реНрд╖рдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рд╣рдордиреЗ рдХреЛрдб рдореЗрдВ f_code рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдерд╛:
item 0, f_code .byte b_num0 .byte b_exit item 1, f_code .byte b_num1 .byte b_exit ... item 1-, f_code .byte b_wm .byte b_exit item 1+, f_code .byte b_wp .byte b_exit item +, f_code .byte b_add .byte b_exit item -, f_code .byte b_sub .byte b_exit item *, f_code .byte b_mul .byte b_exit
рдФрд░ рдЗрд╕реА рддрд░рд╣тАж
рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рдмреНрдж рдХреА рддрд░рд╣, рдмрд╛рдпрдЯреЗрдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ рд╕рд┐рд░реНрдл рдПрдХ рд╢реАрд░реНрд╖рдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
item hold hold: .byte b_call8 .byte holdpoint - . - 1 # holdpoint ...
рдорд╛рдкрджрдВрдбреЛрдВ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдПрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рдЗрдЯ рдХрдорд╛рдВрдбреНрд╕ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкрд╛рдИ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рджреЗрдВ, рдЕрдЧрд░ рдХреЛрдИ рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдмреБрд▓рд╛рддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рдПрдХ рдИрд╕реНрдЯрд░ рд╣реЛрдЧрд╛ :)
item lit8, f_code .byte b_lit8 .byte 31 .byte b_exit item lit16, f_code .byte b_lit16 .word 31415 .byte b_exit item lit32, f_code .byte b_lit32 .int 31415926 .byte b_exit item lit64, f_code .byte b_lit64 .quad 31415926535 .byte b_exit
рд╕реВрдЪреА рдореЗрдВ рдЕрдВрддрд┐рдо рд╢рдмреНрдж рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╢рдмреНрдж рдХреЛ рдЕрд▓рд╡рд┐рджрд╛ рдХрд░ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЗрд╕ рд╢рдмреНрдж рдХреЗ рдкрддреЗ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рд╢рдмреНрдж рдХрд╛ рдкрддрд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, var0 рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
last_item: .byte b_var0 item bye, f_code .byte b_bye
рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ, рдЕрдЧрд░ рд╣рдо bytecode рдореЗрдВ рдПрдбреНрд░реЗрд╕ рдХреЛ last_item рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдмрд╛рдп рд╢рдмреНрдж рдХрд╛ рдкрддрд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рд╢рдмреНрдж рдХреЗ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЧреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдкрддрд╛ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд┐рд╕реНрдЯрдо рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
forth last_item context @ !
рдФрд░ рдЕрдм рд╕реАрдзреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЗрдирдкреБрдЯ рдмрдлрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рд╕реЗ рд╢рдмреНрдж рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдХрд┐рд▓реЗ рдореЗрдВ рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╡рд╣ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЗрдирдкреБрдЯ рдмрдлрд░ рд╕реЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╢рдмреНрдж рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИред
рдЗрдирдкреБрдЯ рдмрдлрд░ рдФрд░ рд╢рдмреНрдж рдирд┐рд╖реНрдХрд░реНрд╖рдг
рд╕рдЪ рдХрд╣реВрдВ рддреЛ, рдореИрдВ рдХрд┐рд▓реЗ рдХреЗ рдорд╛рдирдХреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдореИрдВ рдЗрд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реНрдореГрддрд┐ рд╕реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд░реАрдм рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдпрджрд┐ рдХрд┐рд▓реЗ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдпрд╣рд╛рдВ рдПрдХ рдордЬрдмреВрдд рд╡рд┐рд╕рдВрдЧрддрд┐ рджреЗрдЦреЗрдВрдЧреЗ - рд▓рд┐рдЦреЗрдВрдЧреЗ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛ред
рдХрд┐рд▓реЗ рдореЗрдВ рдмрдлрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдЪрд░ рд╣реИрдВ: tib, #tib рдФрд░> inред рдЯрд┐рдм рдЪрд░ рд╕реНрдЯреИрдХ рдкрд░ рдЗрдирдкреБрдЯ рдмрдлрд░ рдХреЗ рдкрддреЗ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИред рдЪрд░ #tib рдЙрди рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рдмрдлрд░ рдореЗрдВ рд╣реИрдВред рдФрд░ рдЪрд░> рдЗрдирдкреБрдЯ рдмрдлрд░ рдореЗрдВ рдСрдлрд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдЧреЗ рдХрдЪреНрдЪрд╛ рдкрд╛рда рд╕реНрдерд┐рдд рд╣реИред рдЗрди рдЪрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреАрдЬрд┐рдПред
item tib .byte b_var0 v_tib: .quad 0 item #tib .byte b_var0 v_ntib: .quad 0 item >in .byte b_var0 v_in: .quad 0
рдЖрдЧреЗ рд╣рдо рд╢рдмреНрдж рдХреЛ рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╢рдмреНрдж, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЕрдЧрд▓рд╛ рд╢рдмреНрдж рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рд╡рд░реНрдг рдПрдХ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕реЗ рдХрдо рдХреЛрдб рдХреЗ рд╕рд╛рдеред рдпрд╣ рд╢рдмреНрдж рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд╣реЛрдЧрд╛ред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдирд┐рдХрд▓рд╛:
b_blword = 0xF0 bcmd_blword: mov rsi, v_tib # mov rdx, rsi # RDX mov rax, v_in # mov rcx, v_ntib # add rsi, rax # RSI - sub rcx, rax # jz 3f word2: lodsb # AL RSI cmp al, ' ' ja 1f # ( ) dec rcx jnz word2 # 3: sub rsi, rdx mov v_in, rsi push rcx jmp _next 1: lea rdi, [rsi - 1] # RDI = RSI - 1 ( ) dec rcx word3: lodsb cmp al, ' ' jbe 2f dec rcx jnz word3 2: mov rax, rsi sub rsi, rdx # ( ) mov v_in, rsi sub rax, rdi dec rax jz word1 push rdi # word1: push rax # jmp _next
рдпрд╣ рд╢рдмреНрдж рдорд╛рдирдХ рд╢рдмреНрдж рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рднреА рд╕реАрдорд╛рдВрдХрдХ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рд╢рдмреНрдж рдХреЛ рдмрдлрд░ рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдЯреИрдХ рдкрд░ рдХреЗрд╡рд▓ рджреЛ рдорд╛рди рджреЗрддрд╛ рд╣реИ - рдкрддрд╛ рдФрд░ рд▓рдВрдмрд╛рдИред рдпрджрд┐ рд╢рдмреНрдж рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд░рд┐рдЯрд░реНрди 0. рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
рд╢рдмреНрдж рдЦреЛрдЬ рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╢рдмреНрдж рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдВред рдпрд╣ рд╢рдмреНрдж рдмреНрд▓рдлрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдлрд░ рд╕реЗ рдПрдХ рдирдпрд╛ рд╢рдмреНрдж рдЪреБрдирддрд╛ рд╣реИ, рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЗрд╕реЗ рдЦреЛрдЬрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрдм рддрдХ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдмрдлрд░ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рд╢рдмреНрдж рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реНрдЯрдм рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рдмреНрдж рдХреЛ рдмрдлрд░ рд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╣рдореЗрдВ рдмреНрд▓рд░рд╡рд░реНрд▓реНрдб рдХреЛ рдЬрд╛рдБрдЪрдиреЗ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрдЧрд╛:
# : interpret begin blword dup while type repeat drop ; item interpret 1: .byte b_blword .byte b_dup .byte b_qnbranch8 .byte 0f - . .byte b_type .byte b_branch8 .byte 1b - . 0: .byte b_drop .byte b_exit
рдЕрдм рдкрдж рдЫреЛрдбрд╝ рджреЛред рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рдХрд┐рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ: рд╡реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЛрдб рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдж рдЫреЛрдбрд╝рдиреЗ рдпрд╛ рдЧрд░реНрднрдкрд╛рдд рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╢рдмреНрдж рдлреНрд▓рд╢ рд╕реНрдЯреИрдХ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрдлрд░ рдЗрдирдкреБрдЯ рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд╛ рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд╕рд╛рде рдпрд╣ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдХреЙрд▓ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрдВрдЧреЗред рдкрд╣рд▓рд╛ рднрд╛рдЧ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд╣реЛрдЧрд╛, рджреВрд╕рд░рд╛ рднрд╛рдЧ рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рд╣реЛрдЧрд╛ред рдкрд╣рд▓рд╛ рднрд╛рдЧ:
b_quit = 0xF1 bcmd_quit: lea r8, quit mov sp, init_stack mov bp, init_rstack jmp _next
рджреВрд╕рд░рд╛ рднрд╛рдЧ:
quit: .byte b_call16 .word interpret - . - 2 .byte b_bye
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб .text рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдмрд╛рдЗрдЯ рдХреЛрдб .data рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╣реИред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╢реБрд░реБрдЖрддреА рдмрд╛рдпреЛрдЯреЗрдХ рдХреЛ рдмрджрд▓ рджреЗрдВред рдХреЗрд╡рд▓ рдбрд┐рдХреНрд╢рдирд░реА рдХрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╣реЛрдЧрд╛, рд╕реНрдЯрд╛рд░реНрдЯ рд▓рд╛рдЗрди рдкрд░ рдмрдлрд╝рд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдФрд░ рдХреЙрд▓рд┐рдВрдЧ рдЫреЛрдбрд╝рдирд╛ред
# forth last_item context @ ! start_code tib ! < > #tib ! quit start: .byte b_call16 .word forth - . - 2 .byte b_call16 .word last_item - . - 2 .byte b_call16 .word context - . - 2 .byte b_get .byte b_set .byte b_call8 .byte start_code - . - 1 .byte b_call16 .word tib - . - 2 .byte b_set .byte b_lit16 .world 1f - 0f .byte b_call16 .word ntib - . - 2 .byte b_set .byte b_quit start_code: .byte b_var0 0: .ascii "word1 word2 word3" 1:
рд╕рдВрдХрд▓рди, рд▓рд┐рдВрдХ, рднрд╛рдЧреЛ!
$ as forth.s -o forth.o -g -ahlsm >list.txt $ ld forth.o -o forth $ ./forth word1word2wordBye!
рдпрд╣ рджрд▓рд┐рдпрд╛ рдХреА рддрд░рд╣ рдПрдХ рд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдмрд┐рдирд╛ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдЦрд░реАрджрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЗрди рдлреАрдб рд▓рдЧрд╛рдПрдВ, рдЗрд╕рд╕реЗ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдмреЗрд╢рдХ, рдореБрдЭреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рдерд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдЧрдП "рд╡рд┐рднрд╛рдЬрди рджреЛрд╖ (рдХреЛрд░ рдбрдВрдк)" рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрднреА-рдХрднреА рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣:
$ ./forth word1word2word3forth)%60Acurrent(context(%600lit8lit16zlit32v%5E%DF%80lit64v%5E%DF%80call8call16call32branch8branch16qbranch8qbranch16exit1-+!-%22*#/$mod%25/mod&abs'dup0drop1swap2rot3-rot4over5pick6roll7depth8@@!Ac@Bc!Cw@Dw!Ei@Fi!G0=P0%3CQ0%3ER=S%3CT%3EU%3C=V%3E=Wvar8)var160base(holdbuf(Qholdpoint(hold@0U110ACp@&20T0!?!%3CgF!A0@RF!5%220'%DE%A61Q-%DD%80:tib(%7F%60(%3Ein(%20%20%20%20%20%20%20interpret01('byeSegmentation%20fault%20(core%20dumped)
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рдВрдкреВрд░реНрдг рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╢рдмреНрджрдХреЛрд╢ рдбреЗрд▓рд┐рдорд┐рдЯрд░ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХрдЯ рдХреЗ рд╕рд╛рде рд╣реИ :) рдпрд╣ рддрдм рд╣реБрдЖ рдЬрдм рдореИрдВ b_blword рдХрдорд╛рдВрдб рдореЗрдВ word3 рд╕реЗ рдкрд╣рд▓реЗ "dec rx" рднреВрд▓ рдЧрдпрд╛ред
рд╣рдо рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╢рдмреНрдж рдЪреБрдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдЦреЛрдЬ рдФрд░ рд▓реЙрдиреНрдЪ рд╢рдмреНрдж рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж рдЦреЛрдЬрдиреЗ, cfa рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╢рдмреНрдж рдЦреЛрдЬ рд╢рдмреНрдж рдХрд╛ рдкрддрд╛ рдФрд░ рдЙрд╕рдХреА рд▓рдВрдмрд╛рдИ рд╕реНрдЯреИрдХ рд╕реЗ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╢рдмреНрдж рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдкрддреЗ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдЕрдЧрд░ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
рд▓реЗрдЦ рдХреЗ рдкрддреЗ рдкрд░ cfa рд╢рдмреНрдж рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред
рдФрд░ рд╢рдмреНрдж execute bytecode рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред
рдЖрдЗрдП рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рдЦреЛрдЬреЗрдВред рдХрд┐рд▓реЗ рдХреЗ рдорд╛рдирдХреЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рдкрддрд╛ - рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд▓реЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрдлрд░ рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдорд╛рдирдХреЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ред рд╢рдмреНрдж рдХрд╛ рдкрддрд╛ рд╕реНрдЯреИрдХ рдкрд░ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗ рдЬрд╛рдПрдЧрд╛ - рдкрддрд╛ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреЛ рд╢рдмреНрдж рд╡рд░реНрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ)ред рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕ рд╢рдмреНрдж рдиреЗ рдирд┐рдореНрди рд░реВрдк рд▓рд┐рдпрд╛:
b_find = 0xF2 bcmd_find: pop rbx # pop r9 # mov rdx, v_context mov rdx, [rdx] # # find0: mov al, [rdx] # and al, 3 # - , , or al, al jz find_l8 cmp al, 1 jz find_l16 cmp al, 2 jz find_l32 mov r10, [rdx + 1] # 64 lea rsi, [rdx + 9] # jmp find1 find_l32: movsx r10, dword ptr [rdx + 1] # 32 lea rsi, [rdx + 5] # jmp find1 find_l16: movsx r10, word ptr [rdx + 1] # 16 lea rsi, [rdx + 3] # jmp find1 find_l8: movsx r10, byte ptr [rdx + 1] # 8 lea rsi, [rdx + 2] # find1: movzx rax, byte ptr [rsi] # cmp rax, rbx jz find2 # find3: or r10, r10 jz find_notfound # , add rdx, r10 # jmp find0 # , find2: inc rsi mov rdi, r9 mov rcx, rax repz cmpsb jnz find3 # push rdx jmp _next find_notfound: push r10 jmp _next
рд╢рд╛рдпрдж рдЖрдЬ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рдХрдард┐рди рд╢рдмреНрдж рд╣реИред рдЕрдм рд╣рдо рд╢рдмреНрдж рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, "рдЦреЛрдЬ" рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдХрд░реЗрдВред # : interpret begin blword dup while find . repeat drop ; item interpret interpret: .byte b_blword .byte b_dup .byte b_qnbranch8 .byte 0f - . .byte b_find .byte b_call16 .word dot - . - 2 .byte b_branch8 .byte interpret - . 0: .byte b_drop .byte b_exit
рдкрд░реАрдХреНрд╖рдг рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрди рд╢рдмреНрджреЛрдВ рдХреЛ рд╢рдмреНрджрдХреЛрд╖ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "0 1- рджреБрдкрд╣рд┐рдпрд╛ +"редрд╕рдм рдХреБрдЫ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ! $ ld forth.o -o forth $ ./forth 6297733 6297898 6298375 Bye!
рдмрдврд╝рд┐рдпрд╛, рдЦреЛрдЬ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдкрддреЗ (рджрд╢рдорд▓рд╡ рдореЗрдВ) рд╣реИрдВред рдЕрдм cfa рд╢рдмреНрджред рдЗрд╕реЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рднреА рд░рд╣рдиреЗ рджреЗрдВ, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдорд╛рди рд╣реИ: b_cfa = 0xF3 bcmd_cfa: pop rdx # mov al, [rdx] # and al, 3 # - , , or al, al jz cfa_l8 cmp al, 1 jz cfa_l16 cmp al, 2 jz cfa_l32 lea rsi, [rdx + 9] # (64 ) jmp cfa1 find_l32: lea rsi, [rdx + 5] # (32 ) jmp cfa1 find_l16: lea rsi, [rdx + 3] # (16 ) jmp cfa1 find_l8: lea rsi, [rdx + 2] # (8 ) xor rax, rax lodsb add rsi, rax push rsi jmp _next
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╢рдмреНрдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд, рдпрд╣ рдФрд░ рднреА рд╕рд░рд▓ рд╣реИ: b_execute = 0xF4 bcmd_execute: sub rbp, 8 mov [rbp], r8 # pop r8 # - jmp _next
рд╢рдмреНрдж рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ! # : interpret begin blword dup while find cfa execute repeat drop ; item interpret interpret: .byte b_blword .byte b_dup .byte b_qnbranch8 .byte 0f - . .byte b_find .byte b_cfa .byte b_execute .byte b_branch8 .byte interpret - . 0: .byte b_drop .byte b_exit
рдЪрд▓ рд░рд╣рд╛ рд╣реИ: $ as forth.s -o forth.o -g -ahlsm >list.txt $ ld forth.o -o forth $ ./forth -2 Bye!
рдЙрд░реНрд░рд╛, рдЕрд░реНрдЬрд┐рдд! (рд╕реА) рдХреИрдЯ рдореИрдЯреНрд░реЛрд╕рдХрд┐рдирд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк 0 рд╕реЗ 1 рдШрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ -2 рд╣реЛрдЧрд╛ :)рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдХреАрдмреЛрд░реНрдб рд╕реЗ рдХрдорд╛рдВрдб рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдФрд░, рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ - рд╣рдорд╛рд░рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛ 0, 1, 2, 3, 4 рдФрд░ 8 (рдЬреЛ рдХрд┐ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЛ рд╕рдордЭрддрд╛ рд╣реИред рд╡рд╣ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╕реАрдЦреЗрдЧрд╛, рдЖрдкрдХреЛ рд╢рдмреНрдж "рд╕рдВрдЦреНрдпрд╛" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╢рдмреНрдж рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рддрд░рд╣, рдореИрдВ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рд╢рдмреНрдж "рд╕рдВрдЦреНрдпрд╛?" рд╕реНрдЯреИрдХ рдкрд░ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдВрдЧреЗ - рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рд▓рдВрдмрд╛рдИ рдХрд╛ рдкрддрд╛ред рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░, рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдзреНрд╡рдЬ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред 1. рдпрджрд┐ рд░реВрдкрд╛рдВрддрд░рдг рдЕрд╕рдлрд▓ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреА: 0.рдХреЛрдб рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рд╕рд░рд▓ рдФрд░ рд░реИрдЦрд┐рдХ: b_number = 0xF5 bcmd_number: pop rcx # pop rsi # xor rax, rax # xor rbx, rbx # mov r9, v_base # xor r10, r10 # or rcx, rcx jz num_false mov bl, [rsi] cmp bl, '+' jnz 1f inc rsi dec rcx jz num_false jmp num0 1: cmp bl, '-' jnz num0 mov r10, 1 inc rsi dec rcx jz num_false num0: mov bl, [rsi] cmp bl, '0' ja num_false cmp bl, '9' jae num_09 cmp bl, 'A' ja num_false cmp bl, 'Z' jae num_AZ cmp bl, 'a' ja num_false sub bl, 'a' - 10 jmp num_check num_AZ: sub bl, 'A' - 10 jmp num_check num_09: sub bl, '0' num_check: cmp rbx, r9 jge num_false add rax, rbx mul r9 inc rsi dec rcx jnz num0 or r10, r10 push rax push 1 jmp _next num_false: xor rcx, rcx push rcx jmp _next
interpret. , :
# : interpret # begin # blword dup # while # over over find dup # if -rot drop drop cfa execute else number? drop then # repeat # drop ; item interpret interpret: .byte b_blword .byte b_dup .byte b_qnbranch8 .byte 0f - . .byte b_over .byte b_over .byte b_find .byte b_dup .byte b_qnbranch8 .byte 1f - . .byte b_mrot .byte b_drop .byte b_drop .byte b_cfa .byte b_execute .byte b_branch8 .byte 2f - . 1: .byte b_numberq .byte b_drop 2: .byte b_branch8 .byte interpret - . 0: .byte b_drop .byte b_exit last_item: .byte b_var0 item bye, f_code .byte b_bye
! - , -, ┬л┬╗ -тАж , тАж GDB, тАж тАФ ! , .
!
тАж , :)
, : тАФ ┬лs.┬╗. , interpret. , ,
. :
# : .s depth dup . c": emit do dup while dup pick . 1- again drop ; item .s # 11 22 33 prstack: .byte b_depth # 11 22 33 3 .byte b_dup # 11 22 33 3 3 .byte b_lit8 .byte '(' .byte b_emit .byte b_call16 # 11 22 33 3 .word dot - . - 2 .byte b_strp # 11 22 33 3 .byte 3 .ascii "): " 1: .byte b_dup # 11 22 33 3 3 .byte b_qnbranch8 # 11 22 33 3 .byte 2f - . .byte b_dup # 11 22 33 3 3 .byte b_pick # 11 22 33 3 11 .byte b_call16 # 11 22 33 3 .word dot - . - 2 .byte b_wm # 11 22 33 2 .byte b_branch8 .byte 1b - . 2: .byte b_drop # 11 22 33 .byte b_exit
рджрд╛рдИрдВ рдУрд░, рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж, рд╕реНрдЯреИрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ред рдмреЗрд╢рдХ, рдПрдХ рдЪрдХреНрд░ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдкрд╛рд╕ рд╣реИред рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ, рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдореВрд▓реНрдпред рдЗрд╕ рддрд░рд╣ рдХреЗ "рдЯреНрд░реЗрд╕" рдХреЗ рдмрд╛рдж рдЯреАрдо рдиреЗ рддреБрд░рдВрдд рдЕрд░реНрдЬрд┐рдд рдХрд┐рдпрд╛!рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрди рдореИрдХреНрд░реЛрдЬрд╝ рдмрдирд╛рдП: .macro prs new_line = 1 .byte b_call16 .word prstack - . - 2 .if \new_line > 0 .byte b_lit8, '\n' .byte b_emit .endif .endm
рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдбрд╛рд▓рдиреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: item interpret interpret: .byte b_blword prs .byte b_dup prs .byte b_qnbranch8 .byte 0f - . .byte b_over .byte b_over ......
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдиреЗ рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛: $ ./forth (2 ): 6297664 1 (3 ): 6297664 1 1 (3 ): 2 6297666 1 (4 ): 2 6297666 1 1 (4 ): 2 3 6297668 1 (5 ): 2 3 6297668 1 1 (3 ): 6 6297670 2 (4 ): 6 6297670 2 2 (4 ): 6 6297670 6297673 1 (5 ): 6 6297670 6297673 1 1 6297670 (2 ): 6 0 (3 ): 6 0 0 Bye!
рд╕реНрдЯреИрдХ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдЖрдВрджреЛрд▓рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ :)рдореИрдВ рдПрдХ рдФрд░ рдбреАрдмрдЧ рдореИрдХреНрд░реЛ рдмрдирд╛рдХрд░ рдЖрдЧреЗ рдмрдврд╝ рдЧрдпрд╛: .macro pr string .byte b_strp .byte 9f - 8f 8: .ascii "\n\string" 9: .endm
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛: item interpret interpret: .byte b_blword pr blworld prs .byte b_dup .byte b_qnbranch8 .byte 0f - . .byte b_over .byte b_over prs .byte b_find pr find prs .byte b_dup .byte b_qnbranch8 .byte 1f - . .byte b_mrot .byte b_drop .byte b_drop .byte b_cfa pr execute prs .byte b_execute .byte b_branch8 .byte 2f - . 1: .byte b_numberq pr numberq prs .byte b_drop 2: .byte b_branch8 .byte interpret - . 0: .byte b_drop .byte b_exit
рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: $ ./forth blworld(2 ): 6297664 2 (4 ): 6297664 2 6297664 2 find(3 ): 6297664 2 0 numberq(2 ): 6297664 0 blworld(3 ): 6297664 6297667 2 (5 ): 6297664 6297667 2 6297667 2 find(4 ): 6297664 6297667 2 0 numberq(3 ): 6297664 6297667 0 blworld(4 ): 6297664 6297667 6297670 1 (6 ): 6297664 6297667 6297670 1 6297670 1 find(5 ): 6297664 6297667 6297670 1 6297958 execute(3 ): 6297664 6297667 6297962 blworld(3 ): 39660590749888 6297672 1 (5 ): 39660590749888 6297672 1 6297672 1 find(4 ): 39660590749888 6297672 1 6298496 execute(2 ): 39660590749888 6298500 39660590749888 blworld(1 ): 0 Bye!
рдпрд╣ "20 30 *" рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рдпрд╛рд╕ рдерд╛редрдФрд░ рдЖрдк рд╕реНрд░реЛрдд рд▓рд╛рдЗрди рд╕рдВрдЦреНрдпрд╛рдПрдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ... рдареАрдХ рд╣реИ, рд╢рд╛рдпрдж рддрдм ...рдмреЗрд╢рдХ, рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд▓реЙрдЧрд┐рдВрдЧ рддрдХрдиреАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рддреБрд░рдВрдд рдпрд╛рдж рдирд╣реАрдВ рд╣реИредрд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЭреЗ рдПрдХ рд╕реНрдЯреИрдХ рдорд┐рд▓рд╛ рдЬреЛ рд╡рд┐рджреЗрд╢ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рдУрд╡рд░рдлреНрд▓реЛ рдХрд╛ рд╡рд┐рдкрд░реАрдд рд╣реИ рдЬрдм рд╡реЗ рдЬрд┐рддрдирд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг ".s" рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛редрдирдП рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдорджрдж рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рддреЗрдЬ рдереАред рд╡реИрд╕реЗ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐ рдПрдХ рдмрд╛рдпреЛрдЯреЗрдХ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрдкрдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХрдИ рдмрд╛рдЗрдЯреНрд╕ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдВредрдЖрдЗрдП рджреЛ рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╢рдмреНрдж рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ: рдпрд╣ рдХрд┐ рд╢рдмреНрдж рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ рдФрд░ рд╡рд┐рджреЗрд╢ рдореЗрдВ рдвреЗрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: item interpret interpret: .byte b_blword .byte b_dup .byte b_qnbranch8 .byte 0f - . .byte b_over .byte b_over .byte b_find .byte b_dup .byte b_qnbranch8 .byte 1f - . .byte b_mrot .byte b_drop .byte b_drop .byte b_cfa .byte b_execute .byte b_branch8 .byte 2f - . 1: .byte b_drop .byte b_over, b_over .byte b_numberq # , .byte b_qbranch8, 3f - . # 0, , 3 .byte b_type # .byte b_strp # .byte 19 # .ascii " : word not found!\n" .byte b_quit # 3: .byte b_nip, b_nip # , ( b_over, b_over) 2: # .byte b_depth # .byte b_zlt # , 0 ( 0<) .byte b_qnbranch8, interpret_ok - . # , , .byte b_strp # .byte 14 .ascii "\nstack fault!\n" .byte b_quit # interpret_ok: .byte b_branch8 .byte interpret - . 0: .byte b_drop .byte b_exit
рд╡реИрд╕реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдм рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдХрдорд╛рдВрдб рд╕реНрдЯреИрдХ рдХреЛ рдлреНрд▓рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрдлрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЬрд╛рд░реА рд╣реИ, рд▓реЗрдХрд┐рди "рддрд╛рдЬрд╛" рдвреЗрд░ рдХреЗ рд╕рд╛рдеред рд╣рдо рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗредрдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдмрдЪреА рд╣реИредрдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ
рдХрд┐рд▓реЗ рдореЗрдВ рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рд╕рд░рд▓ рд╣реИред рд╢рдмреНрдж рдХреА рдЙрдореНрдореАрдж рд╣реИ, рдпрд╣ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ - рдмрдлрд░ рдХрд╛ рдкрддрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ред рдпрд╣ рд╢рдмреНрдж рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдХрд░рддрд╛ рд╣реИред рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╡рд░реНрдгреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрдкреИрди рдЪрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЪрд▓рд┐рдП рдпреЗ рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рдорд╛рдирдХ рдЗрдирдкреБрдЯ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВрдЧреЗред .data item span span: .byte b_var0 v_span: .quad 0 .text b_expect = 0x88 bcmd_expect: mov rax, 0 # тДЦ 1 - sys_read mov rdi, 0 # тДЦ 1 - stdout pop rdx # pop rsi # push r8 syscall # pop r8 mov rbx, rax or rax, rax jge 1f xor rbx, rbx 1: mov v_span, rbx jmp _next
рдЕрдм рд╣рдореЗрдВ рдПрдХ рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдмрдлрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ 256 рд╡рд░реНрдг рд▓рдВрдмрд╛ рд╣реЛрдиреЗ рджреЗрдВредрдЪрд▓реЛ рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд╛рдЗрди рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдмрдирд╛рддреЗ рд╣реИрдВред inbuf_size = 256 inbuf: .byte b_var0 .space inbuf_size
рдФрд░ рд╣рдо рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╢реБрд░реБрдЖрддреА рдмрд╛рдпреЛрдЯреЗрдХред рдЯрд┐рдм рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ thebuf рдЗрдирдкреБрдЯ рдмрдлрд░ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ, рдХреЙрд▓ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВ, рдлрд┐рд░ рдорд╛рди рдХреЛ #tib рд╕реЗ рдлреИрд▓рд╛рдПрдВред рдЪрд░ рдореЗрдВ nullified рд╣реИ; рд╣рдо рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред Baubles рд╣реИрдВ - рдПрдХ рдЗрдирдкреБрдЯ рдкреНрд░реЙрдореНрдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╕реНрдЯреИрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдХрдорд╛рдВрдб рд╣реИ!)ред рдХрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдорд┐рд▓рд╛ (рдХрдорд╛рдВрдб рд╢реБрд░реВ рдФрд░ рдЫреЛрдбрд╝реЗрдВ): # forth last_item context @ ! quit start: .byte b_call16 .word forth - . - 2 .byte b_call16 .word last_item - . - 2 .byte b_call16 .word context - . - 2 .byte b_get .byte b_set .byte b_quit inbuf: .byte b_var0 .space inbuf_size # begin inbuf dup tib ! inbuf_size expect span @ #tib ! 0 >in ! interpret again quit: .byte b_strp, 1 .ascii "\n" .byte b_call16 .word prstack - . - 2 .byte b_strp .byte 2 .ascii "> " .byte b_call16 .word inbuf - . - 2 .byte b_dup .byte b_call16 .word tib - . - 2 .byte b_set .byte b_lit16 .word inbuf_size .byte b_expect .byte b_call16 .word span - . - 2 .byte b_get .byte b_call16 .word ntib - . - 2 .byte b_set .byte b_num0 .byte b_call16 .word bin - . - 2 .byte b_set .byte b_call16 .word interpret - . - 2 .byte b_branch8, quit - .
рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ: $ ./forth ( 0 ): > 60 ( 1 ): 60 > 60 24 ( 3 ): 60 60 24 > rot ( 3 ): 60 24 60 > -rot ( 3 ): 60 60 24 > swap ( 3 ): 60 24 60 > * * . 86400 ( 0 ): > 200 30 /mod ( 2 ): 20 6 > bye Bye! $
">" рдкреНрд░рддреАрдХ рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ рдореЗрд░рд╛ рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рд╣реИред рдмрд╛рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд╛ рдЬрд╡рд╛рдм рд╣реИред рдореИрдВрдиреЗ рдХреАрдмреЛрд░реНрдб рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реБрдП рдХрдорд╛рдВрдбреНрд╕ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓рд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдИ рд╕реНрдЯреИрдХ рдСрдкрд░реЗрд╢рди рдХрд┐рдП, рджрд┐рдиреЛрдВ рдореЗрдВ рд╕реЗрдХрдВрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреАредрдкрд░рд┐рдгрд╛рдо
рджреБрднрд╛рд╖рд┐рдпрд╛ рдкреВрд░реНрдг рдФрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдФрд░ рд╡рд┐рдирдореНрд░рддрд╛ рд╕реЗ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣рддреЗ рд╣реИрдВ - рдЙрд╕реЗ "рдЕрд▓рд╡рд┐рджрд╛" рдФрд░ рд╡рд╣ "рдЕрд▓рд╡рд┐рджрд╛" :)рдПрдХ рдирд┐рдордВрддреНрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ - рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдвреЗрд░ рдХреА рд╕рд╛рдордЧреНрд░реАред рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рдкрд╣рд▓реА рд╕рдВрдЦреНрдпрд╛ рд╕реНрдЯреИрдХ рдХрд╛ рдЖрдХрд╛рд░, рдлрд┐рд░ рд╕рд╛рдордЧреНрд░реА, рдФрд░ ">" рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╣реИред рдЖрдк рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ 76 рдЖрджреЗрд╢реЛрдВ рдХреЛ рдЧрд┐рдирд╛ рд╣реИ)ред рд╕рдЪ рд╣реИ, рдХрдИ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рд╛рдмреНрджрд┐рдХ, рд╕рдВрдХреНрд░рдордг, рдордВрдЧрд▓рд╛рдЪрд░рдг рдХрдорд╛рдВрдбредрдкреВрд░реНрдг рд╕реНрд░реЛрдд (рд▓рдЧрднрдЧ 1300 рд▓рд╛рдЗрдиреЗрдВ) .intel_syntax noprefix stack_size = 1024 f_code = 0x80 f_immediate = 0x60 .macro item name, flags = 0 link = p_item - . 9: .if link >= -256/2 && link < 256/2 .byte \flags .byte link .elseif link >= -256*256/2 && link < 256*256/2 .byte \flags | 1 .word link .elseif link >= -256*256*256*256/2 && link < 256*256*256*256/2 .byte \flags | 2 .int link .elseif link >= -256*256*256*256*256*256*256*256/2 && link < 256*256*256*256*256*256*256*256/2 .byte \flags | 3 .quad link .endif p_item = 9b .byte 9f - . - 1 .ascii "\name" 9: .endm .section .data init_stack: .quad 0 init_rstack: .quad 0 emit_buf: .byte 0 inbuf_size = 256 msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte # len msg_bye: .ascii "\nBye!\n" msg_bye_len = . - msg_bye bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_num1, bcmd_num2, bcmd_num3, bcmd_num4, bcmd_num8 # 0x00 .quad bcmd_lit8, bcmd_lit16, bcmd_lit32, bcmd_lit64, bcmd_call8, bcmd_call16, bcmd_call32, bcmd_bad .quad bcmd_branch8, bcmd_branch16, bcmd_qbranch8, bcmd_qbranch16, bcmd_qnbranch8, bcmd_qnbranch16,bcmd_bad, bcmd_exit # 0x10 .quad bcmd_wp, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_wm, bcmd_add, bcmd_sub, bcmd_mul, bcmd_div, bcmd_mod, bcmd_divmod, bcmd_abs # 0x20 .quad bcmd_var0, bcmd_var8, bcmd_var16, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_dup, bcmd_drop, bcmd_swap, bcmd_rot, bcmd_mrot, bcmd_over, bcmd_pick, bcmd_roll # 0x30 .quad bcmd_depth, bcmd_nip, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_get, bcmd_set, bcmd_get8, bcmd_set8, bcmd_get16, bcmd_set16, bcmd_get32, bcmd_set32 # 0x40 .quad bcmd_setp, bcmd_setm, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_zeq, bcmd_zlt, bcmd_zgt, bcmd_eq, bcmd_lt, bcmd_gt, bcmd_lteq, bcmd_gteq # 0x50 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_2r, bcmd_r2, bcmd_rget, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x60 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_type, bcmd_emit, bcmd_str, bcmd_strp, bcmd_count, bcmd_bad, bcmd_bad, bcmd_bad # 0x80 .quad bcmd_expect, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x90 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad .quad bcmd_blword, bcmd_quit, bcmd_find, bcmd_cfa, bcmd_execute, bcmd_numberq, bcmd_bad, bcmd_bad # 0xF0 .quad bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # forth last_item context @ ! quit start: .byte b_call16 .word forth - . - 2 .byte b_call16 .word last_item - . - 2 .byte b_call16 .word context - . - 2 .byte b_get .byte b_set .byte b_quit inbuf: .byte b_var0 .space inbuf_size # begin inbuf dup tib ! inbuf_size expect span @ #tib ! 0 >in ! interpret again quit: .byte b_strp, 1 .ascii "\n" .byte b_call16 .word prstack - . - 2 .byte b_strp .byte 2 .ascii "> " .byte b_call16 .word inbuf - . - 2 .byte b_dup .byte b_call16 .word tib - . - 2 .byte b_set .byte b_lit16 .word inbuf_size .byte b_expect .byte b_call16 .word span - . - 2 .byte b_get .byte b_call16 .word ntib - . - 2 .byte b_set .byte b_num0 .byte b_call16 .word bin - . - 2 .byte b_set .byte b_call16 .word interpret - . - 2 .byte b_branch8, quit - . p_item = . item forth forth: .byte b_var8 .byte does_voc - . .quad 0 does_voc: .byte b_call8 .byte context - . - 1 .byte b_set .byte b_exit item current .byte b_var0 .quad 0 item context context: .byte b_var0 v_context: .quad 0 item 0, f_code .byte b_num0 .byte b_exit item 1, f_code .byte b_num1 .byte b_exit item 2, f_code .byte b_num2 .byte b_exit item 3, f_code .byte b_num3 .byte b_exit item 4, f_code .byte b_num4 .byte b_exit item 8, f_code .byte b_num8 .byte b_exit item lit8, f_code .byte b_lit8 .byte 31 .byte b_exit item lit16, f_code .byte b_lit16 .word 31415 .byte b_exit item lit32, f_code .byte b_lit32 .int 31415926 .byte b_exit item lit64, f_code .byte b_lit64 .quad 31415926 .byte b_exit item call8, f_code .byte b_call8 .byte 0f - . - 1 0: .byte b_exit item call16, f_code .byte b_call16 .word 0f - . - 2 0: .byte b_exit item call32, f_code .byte b_call32 .int 0f - . - 4 0: .byte b_exit item branch8, f_code .byte b_branch8 .byte 0f - . 0: .byte b_exit item branch16, f_code .byte b_branch16 .word 0f - . 0: .byte b_exit item qbranch8, f_code .byte b_qbranch8 .byte 0f - . 0: .byte b_exit item qbranch16, f_code .byte b_qbranch16 .word 0f - . 0: .byte b_exit item exit, f_code .byte b_exit item 1-, f_code .byte b_wm .byte b_exit item 1+, f_code .byte b_wp .byte b_exit item +, f_code .byte b_add .byte b_exit item -, f_code .byte b_sub .byte b_exit item *, f_code .byte b_mul .byte b_exit item /, f_code .byte b_div .byte b_exit item mod, f_code .byte b_mod .byte b_exit item /mod, f_code .byte b_divmod .byte b_exit item abs, f_code .byte b_abs .byte b_exit item dup, f_code .byte b_dup .byte b_exit item drop, f_code .byte b_drop .byte b_exit item swap, f_code .byte b_swap .byte b_exit item rot, f_code .byte b_rot .byte b_exit item -rot, f_code .byte b_mrot .byte b_exit item over, f_code .byte b_over .byte b_exit item pick, f_code .byte b_pick .byte b_exit item roll, f_code .byte b_roll .byte b_exit item depth, f_code .byte b_depth .byte b_exit item @, f_code .byte b_get .byte b_exit item !, f_code .byte b_set .byte b_exit item c@, f_code .byte b_get8 .byte b_exit item c!, f_code .byte b_set8 .byte b_exit item w@, f_code .byte b_get16 .byte b_exit item w!, f_code .byte b_set16 .byte b_exit item i@, f_code .byte b_get32 .byte b_exit item i!, f_code .byte b_set32 .byte b_exit item +!, f_code .byte b_setp .byte b_exit item -!, f_code .byte b_setm .byte b_exit item >r, f_code .byte b_2r .byte b_exit item r>, f_code .byte b_r2 .byte b_exit item r@, f_code .byte b_rget .byte b_exit item "0=", f_code .byte b_zeq .byte b_exit item 0<, f_code .byte b_zlt .byte b_exit item 0>, f_code .byte b_zgt .byte b_exit item "=", f_code .byte b_eq .byte b_exit item <, f_code .byte b_lt .byte b_exit item >, f_code .byte b_gt .byte b_exit item "<=", f_code .byte b_lteq .byte b_exit item ">=", f_code .byte b_gteq .byte b_exit item type, f_code .byte b_type .byte b_exit item expect, f_code .byte b_expect .byte b_exit item emit, f_code .byte b_emit .byte b_exit item count, f_code .byte b_count .byte b_exit item "(\")", f_code .byte b_str .byte b_exit item "(.\")", f_code .byte b_strp .byte b_exit item var8, f_code .byte b_var8 .byte 0f - . 0: .byte b_exit item var16, f_code .byte b_var16 .word 0f - . 0: .byte b_exit item base base: .byte b_var0 v_base: .quad 10 holdbuf_len = 70 item holdbuf holdbuf: .byte b_var0 .space holdbuf_len item holdpoint holdpoint: .byte b_var0 .quad 0 item span span: .byte b_var0 v_span: .quad 0 # : hold holdpoint @ 1- dup holdbuf > if drop drop else dup holdpoint ! c! then ; item hold hold: .byte b_call8 .byte holdpoint - . - 1 # holdpoint .byte b_get # @ .byte b_wm # 1- .byte b_dup # dup .byte b_call8 .byte holdbuf - . - 1 # holdbuf .byte b_gt # > .byte b_qbranch8 # if .byte 0f - . .byte b_drop # drop .byte b_drop # drop .byte b_branch8 # ( then) .byte 1f - . 0: .byte b_dup # dup .byte b_call8 .byte holdpoint - . - 1 # holdpoint .byte b_set # ! .byte b_set8 # c! 1: .byte b_exit # ; # : # base /mod swap dup 10 < if c" 0 + else 10 - c" A + then hold ; item # conv: .byte b_call16 .word base - . - 2 # base .byte b_get # @ .byte b_divmod # /mod .byte b_swap # swap .byte b_dup # dup .byte b_lit8 .byte 10 # 10 .byte b_lt # < .byte b_qnbranch8 # if .byte 0f - . .byte b_lit8 .byte '0' # c" 0 .byte b_add # + .byte b_branch8 # else .byte 1f - . 0: .byte b_lit8 .byte '?' # c" A .byte b_add # + 1: .byte b_call16 .word hold - . - 2 # hold .byte b_exit # ; # : <# holdbuf 70 + holdpoint ! ; item <# conv_start: .byte b_call16 .word holdbuf - . - 2 .byte b_lit8 .byte holdbuf_len .byte b_add .byte b_call16 .word holdpoint - . - 2 .byte b_set .byte b_exit # : #s do # dup 0=until ; item #s conv_s: .byte b_call8 .byte conv - . - 1 .byte b_dup .byte b_qbranch8 .byte conv_s - . .byte b_exit # : #> holdpoint @ holdbuf 70 + over - ; item #> conv_end: .byte b_call16 .word holdpoint - . - 2 .byte b_get .byte b_call16 .word holdbuf - . - 2 .byte b_lit8 .byte holdbuf_len .byte b_add .byte b_over .byte b_sub .byte b_exit item . dot: .byte b_dup .byte b_abs .byte b_call8 .byte conv_start - . - 1 .byte b_lit8 .byte ' ' .byte b_call16 .word hold - . - 2 .byte b_call8 .byte conv_s - . - 1 .byte b_drop .byte b_zlt .byte b_qnbranch8 .byte 1f - . .byte b_lit8 .byte '-' .byte b_call16 .word hold - . - 2 1: .byte b_call8 .byte conv_end - . - 1 .byte b_type .byte b_exit item tib tib: .byte b_var0 v_tib: .quad 0 item #tib ntib: .byte b_var0 v_ntib: .quad 0 item >in bin: .byte b_var0 v_in: .quad 0 # : .s depth dup . c": emit do dup while dup pick . 1- again drop ; item .s # 11 22 33 prstack: .byte b_depth # 11 22 33 3 .byte b_dup # 11 22 33 3 3 .byte b_strp .byte 2 .ascii "( " .byte b_call16 # 11 22 33 3 .word dot - . - 2 .byte b_strp # 11 22 33 3 .byte 3 .ascii "): " .byte b_dup, b_zlt .byte b_qnbranch8, 1f - . .byte b_strp .byte 14 .ascii "\nStack fault!\n" .byte b_quit 1: .byte b_dup # 11 22 33 3 3 .byte b_qnbranch8 # 11 22 33 3 .byte 2f - . .byte b_dup # 11 22 33 3 3 .byte b_pick # 11 22 33 3 11 .byte b_call16 # 11 22 33 3 .word dot - . - 2 .byte b_wm # 11 22 33 2 .byte b_branch8 .byte 1b - . 2: .byte b_drop # 11 22 33 .byte b_exit .macro prs new_line = 1 .byte b_call16 .word prstack - . - 2 .if \new_line > 0 .byte b_lit8, '\n' .byte b_emit .endif .endm .macro pr string .byte b_strp .byte 9f - 8f 8: .ascii "\n\string" 9: .endm item interpret interpret: .byte b_blword .byte b_dup .byte b_qnbranch8 .byte 0f - . .byte b_over .byte b_over .byte b_find .byte b_dup .byte b_qnbranch8 .byte 1f - . .byte b_mrot .byte b_drop .byte b_drop .byte b_cfa .byte b_execute .byte b_branch8 .byte 2f - . 1: .byte b_drop .byte b_over, b_over .byte b_numberq # , .byte b_qbranch8, 3f - . # 0, , 3 .byte b_type # .byte b_strp # .byte 19 # .ascii " : word not found!\n" .byte b_quit # 3: .byte b_nip, b_nip # , ( b_over, b_over) 2: # .byte b_depth # .byte b_zlt # , 0 ( 0<) .byte b_qnbranch8, interpret_ok - . # , , .byte b_strp # .byte 14 .ascii "\nstack fault!\n" .byte b_quit # interpret_ok: .byte b_branch8 .byte interpret - . 0: .byte b_drop .byte b_exit last_item: .byte b_var0 item bye, f_code .byte b_bye .section .text .global _start # _start: mov rbp, rsp sub rbp, stack_size lea r8, start mov init_stack, rsp mov init_rstack, rbp jmp _next b_var0 = 0x28 bcmd_var0: push r8 b_exit = 0x17 bcmd_exit: mov r8, [rbp] add rbp, 8 _next: movzx rcx, byte ptr [r8] inc r8 jmp [bcmd + rcx*8] b_num0 = 0x02 bcmd_num0: push 0 jmp _next b_num1 = 0x03 bcmd_num1: push 1 jmp _next b_num2 = 0x04 bcmd_num2: push 2 jmp _next b_num3 = 0x05 bcmd_num3: push 3 jmp _next b_num4 = 0x06 bcmd_num4: push 4 jmp _next b_num8 = 0x07 bcmd_num8: push 8 jmp _next b_lit8 = 0x08 bcmd_lit8: movsx rax, byte ptr [r8] inc r8 push rax jmp _next b_lit16 = 0x09 bcmd_lit16: movsx rax, word ptr [r8] add r8, 2 push rax jmp _next b_call8 = 0x0C bcmd_call8: movsx rax, byte ptr [r8] sub rbp, 8 inc r8 mov [rbp], r8 add r8, rax jmp _next b_call16 = 0x0D bcmd_call16: movsx rax, word ptr [r8] sub rbp, 8 add r8, 2 mov [rbp], r8 add r8, rax jmp _next b_call32 = 0x0E bcmd_call32: movsx rax, dword ptr [r8] sub rbp, 8 add r8, 4 mov [rbp], r8 add r8, rax jmp _next b_lit32 = 0x0A bcmd_lit32: movsx rax, dword ptr [r8] add r8, 4 push rax jmp _next b_lit64 = 0x0B bcmd_lit64: mov rax, [r8] add r8, 8 push rax jmp _next b_dup = 0x30 bcmd_dup: push [rsp] jmp _next b_wm = 0x20 bcmd_wm: decq [rsp] jmp _next b_wp = 0x18 bcmd_wp: incq [rsp] jmp _next b_add = 0x21 bcmd_add: pop rax add [rsp], rax jmp _next b_sub = 0x22 bcmd_sub: pop rax sub [rsp], rax jmp _next b_mul = 0x23 bcmd_mul: pop rax pop rbx imul rbx push rax jmp _next b_div = 0x24 bcmd_div: pop rbx pop rax cqo idiv rbx push rax jmp _next b_mod = 0x25 bcmd_mod: pop rbx pop rax cqo idiv rbx push rdx jmp _next b_divmod = 0x26 bcmd_divmod: pop rbx pop rax cqo idiv rbx push rdx push rax jmp _next b_abs = 0x27 bcmd_abs: mov rax, [rsp] or rax, rax jge _next neg rax mov [rsp], rax jmp _next b_drop = 0x31 bcmd_drop: add rsp, 8 jmp _next b_swap = 0x32 bcmd_swap: pop rax pop rbx push rax push rbx jmp _next b_rot = 0x33 bcmd_rot: pop rax pop rbx pop rcx push rbx push rax push rcx jmp _next b_mrot = 0x34 bcmd_mrot: pop rcx pop rbx pop rax push rcx push rax push rbx jmp _next b_over = 0x35 bcmd_over: push [rsp + 8] jmp _next b_pick = 0x36 bcmd_pick: pop rcx push [rsp + 8*rcx] jmp _next b_roll = 0x37 bcmd_roll: pop rcx mov rbx, [rsp + 8*rcx] roll1: mov rax, [rsp + 8*rcx - 8] mov [rsp + 8*rcx], rax dec rcx jnz roll1 push rbx jmp _next b_depth = 0x38 bcmd_depth: mov rax, init_stack sub rax, rsp sar rax, 3 push rax jmp _next b_nip = 0x39 bcmd_nip: pop rax mov [rsp], rax jmp _next b_get = 0x40 bcmd_get: pop rcx push [rcx] jmp _next b_set = 0x41 bcmd_set: pop rcx pop rax mov [rcx], rax jmp _next b_get8 = 0x42 bcmd_get8: pop rcx movsx rax, byte ptr [rcx] push rax jmp _next b_set8 = 0x43 bcmd_set8: pop rcx pop rax mov [rcx], al jmp _next b_get16 = 0x44 bcmd_get16: pop rcx movsx rax, word ptr [rcx] push rax jmp _next b_set16 = 0x45 bcmd_set16: pop rcx pop rax mov [rcx], ax jmp _next b_get32 = 0x46 bcmd_get32: pop rcx movsx rax, dword ptr [rcx] push rax jmp _next b_set32 = 0x47 bcmd_set32: pop rcx pop rax mov [rcx], eax jmp _next b_setp = 0x48 bcmd_setp: pop rcx pop rax add [rcx], rax jmp _next b_setm = 0x49 bcmd_setm: pop rcx pop rax sub [rcx], rax jmp _next b_2r = 0x60 bcmd_2r: pop rax sub rbp, 8 mov [rbp], rax jmp _next b_r2 = 0x61 bcmd_r2: push [rbp] add rbp, 8 jmp _next b_rget = 0x62 bcmd_rget: push [rbp] jmp _next # 0= b_zeq = 0x50 bcmd_zeq: pop rax or rax, rax jnz rfalse rtrue: push -1 jmp _next rfalse: push 0 jmp _next # 0< b_zlt = 0x51 bcmd_zlt: pop rax or rax, rax jl rtrue push 0 jmp _next # 0> b_zgt = 0x52 bcmd_zgt: pop rax or rax, rax jg rtrue push 0 jmp _next # = b_eq = 0x53 bcmd_eq: pop rbx pop rax cmp rax, rbx jz rtrue push 0 jmp _next # < b_lt = 0x54 bcmd_lt: pop rbx pop rax cmp rax, rbx jl rtrue push 0 jmp _next # > b_gt = 0x55 bcmd_gt: pop rbx pop rax cmp rax, rbx jg rtrue push 0 jmp _next # <= b_lteq = 0x56 bcmd_lteq: pop rbx pop rax cmp rax, rbx jle rtrue push 0 jmp _next # >= b_gteq = 0x57 bcmd_gteq: pop rbx pop rax cmp rax, rbx jge rtrue push 0 jmp _next b_var8 = 0x29 bcmd_var8: push r8 b_branch8 = 0x10 bcmd_branch8: movsx rax, byte ptr [r8] add r8, rax jmp _next b_var16 = 0x30 bcmd_var16: push r8 b_branch16 = 0x11 bcmd_branch16: movsx rax, word ptr [r8] add r8, rax jmp _next b_qbranch8 = 0x12 bcmd_qbranch8: pop rax or rax, rax jnz bcmd_branch8 inc r8 jmp _next b_qbranch16 = 0x13 bcmd_qbranch16: pop rax or rax, rax jnz bcmd_branch16 add r8, 2 jmp _next b_qnbranch8 = 0x14 bcmd_qnbranch8: pop rax or rax, rax jz bcmd_branch8 inc r8 jmp _next b_qnbranch16 = 0x15 bcmd_qnbranch16:pop rax or rax, rax jz bcmd_branch16 add r8, 2 jmp _next b_bad = 0x00 bcmd_bad: mov rax, 1 # 1 - sys_write mov rdi, 1 # 1 stdout mov rsi, offset msg_bad_byte # mov rdx, msg_bad_byte_len # syscall # mov rax, 60 # 1 - sys_exit mov rbx, 1 # 1 syscall # b_bye = 0x01 bcmd_bye: mov rax, 1 # 1 - sys_write mov rdi, 1 # 1 stdout mov rsi, offset msg_bye # mov rdx, msg_bye_len # syscall # mov rax, 60 # 60 - sys_exit mov rdi, 0 # 0 syscall # b_strp = 0x83 bcmd_strp: movsx rax, byte ptr [r8] inc r8 push r8 add r8, rax push rax b_type = 0x80 bcmd_type: mov rax, 1 # 1 - sys_write mov rdi, 1 # 1 - stdout pop rdx # pop rsi # push r8 syscall # pop r8 jmp _next b_expect = 0x88 bcmd_expect: mov rax, 0 # 1 - sys_read mov rdi, 0 # 1 - stdout pop rdx # pop rsi # push r8 syscall # pop r8 mov rbx, rax or rax, rax jge 1f xor rbx, rbx 1: mov v_span, rbx jmp _next b_str = 0x82 bcmd_str: movzx rax, byte ptr [r8] lea r8, [r8 + rax + 1] jmp _next b_count = 0x84 bcmd_count: pop rcx movzx rax, byte ptr [rcx] inc rcx push rcx push rax jmp _next b_emit = 0x81 bcmd_emit: pop rax mov rsi, offset emit_buf # mov [rsi], al mov rax, 1 # 1 - sys_write mov rdi, 1 # 1 - stdout mov rdx, 1 # push r8 syscall # pop r8 jmp _next b_blword = 0xF0 bcmd_blword: mov rsi, v_tib # mov rdx, rsi # RDX mov rax, v_in # mov rcx, v_ntib # mov rbx, rcx add rsi, rax # RSI - sub rcx, rax # jz 3f word2: lodsb # AL RSI cmp al, ' ' ja 1f # ( ) dec rcx jnz word2 # 3: sub rsi, rdx mov v_in, rsi push rcx jmp _next 1: lea rdi, [rsi - 1] # RDI = RSI - 1 ( ) dec rcx jz word9 word3: lodsb cmp al, ' ' jbe 2f dec rcx jnz word3 word9: inc rsi 2: mov rax, rsi sub rsi, rdx # ( ) cmp rsi, rbx jle 4f mov rsi, rbx 4: mov v_in, rsi sub rax, rdi dec rax jz word1 push rdi # word1: push rax # jmp _next b_quit = 0xF1 bcmd_quit: lea r8, quit mov rsp, init_stack mov rbp, init_rstack jmp _next b_find = 0xF2 bcmd_find: pop rbx # pop r9 # mov rdx, v_context mov rdx, [rdx] # # find0: mov al, [rdx] # and al, 3 # - , , or al, al jz find_l8 cmp al, 1 jz find_l16 cmp al, 2 jz find_l32 mov r10, [rdx + 1] # 64 lea rsi, [rdx + 9] # jmp find1 find_l32: movsx r10, dword ptr [rdx + 1] # 32 lea rsi, [rdx + 5] # jmp find1 find_l16: movsx r10, word ptr [rdx + 1] # 16 lea rsi, [rdx + 3] # jmp find1 find_l8: movsx r10, byte ptr [rdx + 1] # 8 lea rsi, [rdx + 2] # find1: movzx rax, byte ptr [rsi] # cmp rax, rbx jz find2 # find3: or r10, r10 jz find_notfound # , add rdx, r10 # jmp find0 # , find2: inc rsi mov rdi, r9 mov rcx, rax repz cmpsb jnz find3 # push rdx jmp _next find_notfound: push r10 jmp _next b_cfa = 0xF3 bcmd_cfa: pop rdx # mov al, [rdx] # and al, 3 # - , , or al, al jz cfa_l8 cmp al, 1 jz cfa_l16 cmp al, 2 jz cfa_l32 lea rsi, [rdx + 9] # (64 ) jmp cfa1 cfa_l32: lea rsi, [rdx + 5] # (32 ) jmp cfa1 cfa_l16: lea rsi, [rdx + 3] # (16 ) jmp cfa1 cfa_l8: lea rsi, [rdx + 2] # (8 ) cfa1: xor rax, rax lodsb add rsi, rax push rsi jmp _next b_execute = 0xF4 bcmd_execute: sub rbp, 8 mov [rbp], r8 # pop r8 # - jmp _next b_numberq = 0xF5 bcmd_numberq: pop rcx # pop rsi # xor rax, rax # xor rbx, rbx # mov r9, v_base # xor r10, r10 # or rcx, rcx jz num_false mov bl, [rsi] cmp bl, '+' jnz 1f inc rsi dec rcx jz num_false jmp num0 1: cmp bl, '-' jnz num0 mov r10, 1 inc rsi dec rcx jz num_false num0: mov bl, [rsi] cmp bl, '0' jb num_false cmp bl, '9' jbe num_09 cmp bl, 'A' jb num_false cmp bl, 'Z' jbe num_AZ cmp bl, 'a' jb num_false cmp bl, 'z' ja num_false sub bl, 'a' - 10 jmp num_check num_AZ: sub bl, 'A' - 10 jmp num_check num_09: sub bl, '0' num_check: cmp rbx, r9 jge num_false mul r9 add rax, rbx inc rsi dec rcx jnz num0 or r10, r10 push rax push 1 jmp _next num_false: xor rcx, rcx push rcx jmp _next
рд╕реНрд░реЛрдд рдХреЛрдб рдмрдбрд╝рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдпрд╣рд╛рдВ рд▓рд╛ рд░рд╣рд╛ рд╣реВрдВредрдЕрдм рдЙрд╕рдХрд╛ рдирд┐рд╡рд╛рд╕ рд╕реНрдерд╛рди рдЧрд┐рдердм рдкрд░ рд╣реЛрдЧрд╛: https://github.com/hal9000cc/forth64рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░, рдмрд┐рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЖрдк рд▓рд┐рдирдХреНрд╕ x64 рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд▓рд┐рдирдХреНрд╕ рд╣реИ, рдЖрдк рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВредрдФрд░ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛрдЬ рд╣реИ - рдЖрдк WSL (рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ рд╕рдмрд╕рд┐рд╕реНрдЯрдо) рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЫреБрдЯреНрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдФрд░ рдмрд╕ рдпрд╣реА рдХрд┐рдпрд╛ред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдирд┐рдХрд▓рд╛, рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ 5 рдорд┐рдирдЯ рдХрд╛ рд╕рдордп рдерд╛ред рдХреЗрд╡рд▓ рдПрдХ рдкрд▓ рдерд╛, рдпрд╣ рдЕрднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛, рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкреЙрд╡рд░рд╢реЗрд▓ рдХрдорд╛рдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдЪрд╛рд▓реВ" рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛, рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛редрд▓реЗрдХрд┐рди рдЕрд╕рд▓реА рднрд╛рд░рддреАрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдЪрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рднреА рд╣реИ :) рдпрд╣ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВредрд╡рд╣ рд╕рдм рд╣реИ! рдЕрдЧрд▓реА рдмрд╛рд░, рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЪрд▓рд╛рдПрдВрдЧреЗредрдирдП рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛, рд╡рд╣рд╛рдБ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ, рдЪрдХреНрд░ рд╣реЛрдВрдЧреЗред рджрд░рдЕрд╕рд▓, рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдорд╛рдирдХ рдХрд┐рд▓реЗ рдкрд░ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рдмрд╛рдЗрдЯ рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдЦреИрд░, рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВредрдирд┐рд░рдВрддрд░рддрд╛: рдореВрд▓ рдЕрдореЗрд░рд┐рдХреА рдореЗрдВ рдХрд┐рд▓реЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯ рдорд╢реАрди (рдФрд░ рди рдХреЗрд╡рд▓) (рднрд╛рдЧ 4)