рдХрд┐рд▓реЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯ рдорд╢реАрди (рдФрд░ рди рдХреЗрд╡рд▓) рдореВрд▓ рдЕрдореЗрд░рд┐рдХреА рдореЗрдВ (рднрд╛рдЧ 2)

рдЫрд╡рд┐

рдЪрд▓реЛ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдпрд╣ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдмрд╛рдЗрдЯ-рдорд╢реАрди рдкрд░ рд▓реЗрдЦ рдХреА рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╣реИ ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдПрдХ рдХрд┐рд▓реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ, рдФрд░ рддреАрд╕рд░реЗ рдореЗрдВ рдЗрд╕ рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдХрд┐рд▓реЗ рд╕рдВрдХрд▓рдХред рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЬреЛ рдорд╛рддреНрд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рдереА, рд╡рд╣ рдмрд╣реБрдд рдмрдбрд╝реА рдереАред рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ (рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рд╕реЗрдЯ) рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВ: рдЪрд░, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддрд╛рд░, рддрд╛рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛, рд╢рдмреНрджрдХреЛрд╢реЛрдВ, рд╢рдмреНрджрдХреЛрд╢ рдЦреЛрдЬрдирд╛ ... рдЦреИрд░, рдХрдо рд╕реЗ рдХрдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирддреАрдЬрддрди, рдореИрдВрдиреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдкрд░ рд▓реЗрдЦ рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдХрд░реНрдиреЗрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпреЛрдЬрдирд╛ рд╣реИ: рддреАрд╕рд░рд╛ рднрд╛рдЧ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реИ, рдЪреМрдерд╛ рднрд╛рдЧ рд╕рдВрдХрд▓рдХ рд╣реИред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдгред рд╡реЗ 4 рдпрд╛ 5 рд╡реЗрдВ рд▓реЗрдЦ рдореЗрдВ рд╣реЛрдВрдЧреЗред рдпреЗ рд▓реЗрдЦ рдирдП рд╕рд╛рд▓ рдХреЗ рдмрд╛рдж рд╣реЛрдЧрд╛ред

рдФрд░ рдЬреЛ рдЕрднреА рддрдХ рднрдпрд╛рдирдХ рдЕрд╕реЗрдореНрдмрд▓рд░ рдФрд░ рдмрд╛рдИрдЯреЗрдХреЛрдб рд╕реЗ рдирд╣реАрдВ рдбрд░рддрд╛ рд╣реИ - рдХрдЯ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! :)

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдВред рдЪрд▓реЛ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди .s рд╕реЗрдЯ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ GAS рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ (рдзрдиреНрдпрд╡рд╛рдж рдорд┐рд╕реНрдЯрд░рдЧреНрд░реАрдо )ред рдлрд┐рд░, int 0x80 рдХреЛ syscall рд╕реЗ рдмрджрд▓реЗрдВ рдФрд░ 64-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдзрдиреНрдпрд╡рд╛рдж qw1 )ред рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рдХреЙрд▓ рд╡рд┐рд╡рд░рдг рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛ рдФрд░ рдХреЗрд╡рд▓ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕рд╣реА рдХрд┐рдпрд╛ ... рдФрд░ рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рджреЛрд╖ рдорд┐рд▓рд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдирдВрдмрд░ рд╕рд╣рд┐рдд syscall рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред syscall рдХреЗ рд▓рд┐рдП sys_write рдирдВрдмрд░ 1 рд╣реИ, рдФрд░ sys_exit 60 рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЦрд░рд╛рдм, рдкреНрд░рдХрд╛рд░, рдФрд░ рдЕрд▓рд╡рд┐рджрд╛ рдЖрджреЗрд╢реЛрдВ рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓рд┐рдпрд╛:

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_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 

рдФрд░ рдПрдХ рдмрд╛рддред рдХрд╛рдлреА рд╣рдж рддрдХ, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдмреЗрд░реЗрдЬ рдФрд░ рдлрдкреБрдХ рдиреЗ рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдпрджрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд╛рдИрдЯрдХреЛрдб рдордВрдЪ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛!" рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдХрд╛ рдкрддрд╛ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ bytecode рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (lit64 рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде)ред рдмреЗрд╢рдХ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдмрд╛рдЗрдЯ рдорд╢реАрди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдерд╛ред рдореИрдВ рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдиреНрдп рдорд╛рдзреНрдпрдореЛрдВ рд╕реЗ рдЪрд░ рдХреЗ рдкрддреЗ рдорд┐рд▓реЗрдВрдЧреЗ: рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, var рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде (рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред

рд╡рд╛рд░реНрдо рдЕрдк рдХрд░реЗрдВ


рдФрд░ рдЕрдм, рд╡рд╛рд░реНрдо-рдЕрдк рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╕рднреА рдореВрд▓ рдкреВрд░реНрдгрд╛рдВрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди (+, -, *, /, mod, / mod, abs) рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХреЛрдб рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╕реНрдкреЙрдЗрд▓рд░ рдореЗрдВ рдмрд┐рдирд╛ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд╛рддрд╛ рд╣реВрдВред

рдЕрдВрдХрдЧрдгрд┐рдд
 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 

рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдХрд┐рд▓реЗ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рдЕрдВрдХрдЧрдгрд┐рдд рдФрд░ рд╕реНрдЯреИрдХ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рджреЛрд╣рд░реЗ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рд╕рдВрдЪрд╛рд▓рди рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж рдЖрдорддреМрд░ рдкрд░ "2" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ: 2DUP, 2SWAP, рдЖрджрд┐ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рдирдХ рдЕрдВрдХрдЧрдгрд┐рдд рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 64 рдмрд┐рдЯреНрд╕ рд╣реИрдВ, рдФрд░ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдЬ 128 рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ :)

рдЕрдЧрд▓рд╛, рд╣рдо рдореВрд▓ рд╕реНрдЯреИрдХ рдСрдкрд░реЗрд╢рди (рдбреНрд░реЙрдк, рд╕реНрд╡реИрдк, рд░реВрдЯ -root, рдУрд╡рд░, рдкрд┐рдХ, рд░реЛрд▓) рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдвреЗрд░ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди
 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_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 

рд╣рдореЗрдВ рдЕрднреА рднреА рддреБрд▓рдирд╛ рдЯреАрдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рднреА рдХрд░реЗрдВрдЧреЗред

рддреБрд▓рдирд╛ рдЖрджреЗрд╢
 # 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 

рд╣рдо рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рдХреЛрдбрд╛рдВрддрд░рдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдбреАрдмрдЧрд┐рдВрдЧ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реЛрдЧреАред

рддреБрд░рдВрдд рд╢рдмреНрдж рдЧрд╣рд░рд╛рдИ (рд╕реНрдЯреИрдХ рдЧрд╣рд░рд╛рдИ) рдмрдирд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░, рдбреЗрдЯрд╛ рд╕реНрдЯреИрдХ рдФрд░ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреИрдХ рдХреЗ рд╢реБрд░реБрдЖрддреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬреЗрдВред рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╕рдордп рдпреЗ рдорд╛рди рдЕрднреА рднреА рдХрд╛рдо рдореЗрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВред

 init_stack: .quad 0 init_rstack: .quad 0 _start: mov rbp, rsp sub rbp, stack_size lea r8, start mov init_stack, rsp mov init_rstack, rbp jmp _next b_depth = 0x38 bcmd_depth: mov rax, init_stack sub rax, rsp shr rax, 3 push rax jmp _next 

рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрд╛рджрди


рдЦреИрд░, рд╡рд╛рд░реНрдо-рдЕрдк рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рдкрд╕реАрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕рд┐рдЦрд╛рдПрдВред рд╢рдмреНрдж "ред" рдХрд┐рд▓реЗ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдбреЙрдЯ)ред рдЖрдЗрдП рдЗрд╕реЗ рдРрд╕реЗ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдорд╛рдирдХ рдлреЛрд░реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП <#, рдкрдХрдбрд╝, #, #, #, #>, рдЖрдзрд╛рд░ред рдЗрди рд╕рднреА рд╢рдмреНрджреЛрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рд╣реИред рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдлрд░ рдФрд░ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпреЗ рд╢рдмреНрдж рд╣реЛрд▓реНрдбрдмреНрдпреВ рдФрд░ рд╣реЛрд▓реНрдбрдкреЙрдЗрдВрдЯ рд╣реЛрдВрдЧреЗред

рддреЛ, рд╣рдореЗрдВ рдЗрди рд╢рдмреНрджреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рд╣реЛрд▓реНрдбрдмреБрдл - рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд░, рдЧрдарди рдЕрдВрдд рд╕реЗ рд╣реЛрддрд╛ рд╣реИ
  • рд╣реЛрд▓реНрдбрдкреЙрдЗрдВрдЯ - рдЕрдВрддрд┐рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдЪрд░рд┐рддреНрд░ рдХрд╛ рдкрддрд╛ (рд╣реЛрд▓реНрдбрдмреБрдлрд╝ рдореЗрдВ)
  • <# - рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЧрдарди рдХреА рд╢реБрд░реБрдЖрдд; рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ рд╣реЛрд▓реНрдбрдмреБрдл рдХреЗ рдмрд╛рдж, рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╣реЛрд▓реНрдб рдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ
  • рд╣реЛрд▓реНрдб - рд╣реЛрд▓реНрдбрдкреЙрдЗрдВрдЯ рдХреЛ 1 рд╕реЗ рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдкрддреЗ рдкрд░ рд╡рд░реНрдг рдХреЛ рд╕реНрдЯреИрдХ рд╕реЗ рдмрдлрд░ рддрдХ рдмрдЪрд╛рддрд╛ рд╣реИ
  • # - рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╢рдмреНрдж рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рдХреЛ рдПрдХ рд╡рд░реНрдг рдореЗрдВ рддрдмреНрджреАрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрдХрдбрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдлрд░ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ
  • #s - рдкреВрд░реЗ рд╢рдмреНрдж рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ; рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ # рд╢рдмреНрдж рдХреЛ рд▓реВрдк рдореЗрдВ рддрдм рддрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ 0 рдирд╣реАрдВ рдмрдЪрд╛ рд╣реЛ
  • #> - рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ; рд╕реНрдЯреИрдХ рдкрд░ рдЧрдард┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ

рд╣рдо рд╕рднреА рд╢рдмреНрдж рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЪрд░ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рдЪрд░


рдФрд░ рдпрд╣рд╛рдВ рдереЛрдбрд╝рд╛ рдлреЛрд░реНрдЯрд┐рдпрди рдЬрд╛рджреВ рд╣реЛрдЧрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдХрд┐рд▓реЗ рдореЗрдВ рдПрдХ рдЪрд░ рдПрдХ рд╢рдмреНрдж рд╣реИред рдЬрдм рдЗрд╕ рд╢рдмреНрдж рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЪрд░ рдХреЗ рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдореЛрд░реА рд╕реЗрд▓ рдХрд╛ рдкрддрд╛ рд╕реНрдЯреИрдХ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рдкрддреЗ рдкрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрд░рд┐рдПрдмрд▓ A рдореЗрдВ рдорд╛рди 12345 рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдбреНрд╕ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: "12345"! "ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, 12345 рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЪрд░ A рдЕрдкрдиреЗ рдкрддреЗ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╢рдмреНрдж "!" рд╕реНрдЯреИрдХ рд╕реЗ рджреЛ рдорд╛рди рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ 12345 рдХреЛ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдкрддреЗ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИред рдХрд┐рд▓реЗ рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ (рдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛрдб рдХреЗ рд╕рд╛рде), рд╡реИрд░рд┐рдПрдмрд▓ рдПрдХ рдорд╛рдЗрдХреНрд░реЛ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдХрдорд╛рдВрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдбреНрд░реЗрд╕ _next рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдорд╛рди рдХреЛ рд╕рдВрдЪрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рди рдЖрд░рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдРрд╕реЗ рд╢рдмреНрдж рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░ _next рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ (RSP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд▓реЗ рдореЗрдВ, рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдвреЗрд░ рдЕрдВрдХрдЧрдгрд┐рдд рд╣реИ, рдФрд░ рд╣рдо рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рд▓реМрдЯреЗред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдЪрд░ рдХрд╛ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЯреАрдо рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм! рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

  call _next #   _next,      ,   12345 .quad 12345 

рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╛рдИрдЯреЗрдХреЛрдб рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдореИрдВрдиреЗ рддреБрд░рдВрдд рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдмрд╛рдпрдЯреЗрдХреЛрдб рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рддрдВрддреНрд░ рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рдЖрдк рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕рдорд╛рди рдЪреАрдЬ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдмрд╕ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрдорд╛рдВрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рдпрдЯреЗрдХреЛрдб, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдПрдХ рдмрд╛рдпрдЯреЗрдХреЛрдб рдкрд░ рдПрдХ "рд╕рдмрд░реВрдЯреАрди" рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди рд╣реИ:

  • рдпрд╣ рдПрдХ рдмрд╛рдЗрдЯ рдХреЛрдб рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рддреБрд░рдВрдд рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рд╡рд╛рдкрд╕реА рдХреЗ рдмрд╛рдж, рдкрддрд╛ рдЬрд╣рд╛рдВ рдЪрд░ рдХрд╛ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдвреЗрд░ рдореЗрдВ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдХреНрдЬрд┐рдЯ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╣реИред рдЖрдЗрдП рдмрд╛рдпрдЯреЗрдХреЛрдб рдкрд░ рдПрдХ рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рдирд┐рдХрд╛рд╕ рдХрдорд╛рдВрдб рд╣реИред рдлрд┐рд░ рдпрд╣ рдХрдорд╛рдВрдб рдЗрд╕рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рдпрд╣ рдПрдХ рд╣реА рдХрдорд╛рдВрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХ рдкрд░ рдЕрдЧрд▓реЗ рдмрд╛рдЗрдЯ рдХреЗ рдкрддреЗ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддреА рд╣реИ (рд░рдЬрд┐рд╕реНрдЯрд░ рдЖрд░ 8)ред рд╣рдо рдЗрд╕реЗ рд╕рдВрдХреНрд░рдордг рдкрд░ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗ:

 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] 

рдЕрдм рдмреЗрд╕ рд╡реИрд░рд┐рдПрдмрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 base: .byte b_var0 .quad 10 

рд╡реИрд╕реЗ, рдмрд┐рд▓реНрдХреБрд▓ var0, рдФрд░ рд╕рд┐рд░реНрдл var рд╣реА рдХреНрдпреЛрдВ? рдЗрд╕ рддрдереНрдп рдХрд╛ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╢рдмреНрджреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдХрдорд╛рдВрдб рд╣реЛрдВрдЧреЗ рдЬрд┐рдирдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред

рдЕрдм рд╣рдо рд╕рдВрдЦреНрдпрд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ!

рд╢рдмреНрдж рдЖрдзрд╛рд░, рд╣реЛрд▓реНрдбрдмреБрдл, рд╣реЛрд▓реНрдбрдкреЙрдЗрдВрдЯ


рдЪрд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рддрдп рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╢рдмреНрдж рдЖрдзрд╛рд░, рд╣реЛрд▓реНрдбрдмреНрдпреВ, рд╣реЛрд▓реНрдбрдкреЙрдЗрдВрдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:

 base: .byte b_var0 .quad 10 holdbuf_len = 70 holdbuf: .byte b_var0 .space holdbuf_len holdpoint: .byte b_var0 .quad 0 

рд╣реЛрд▓реНрдбрдмреБрдл рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ 70 рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ 64 рд╣реИ (рдпрд╣ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ рдмрд╛рдЗрдирд░реА рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ)ред рдХрдИ рдкрд╛рддреНрд░реЛрдВ рдХрд╛ рдПрдХ рдФрд░ рд░рд┐рдЬрд░реНрд╡ рдЬрдЧрд╣ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдерд╛рдиред рд╣рдо рдмрдлрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдмрдлрд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдг рдирд╣реАрдВ рдбрд╛рд▓реЗрдВрдЧреЗред рдлрд┐рд░ рдПрдХ рдФрд░ рдирд┐рджрд╛рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

рдкрдХрдбрд╝


рдЕрдм рдЖрдк рд╢рдмреНрдж рдХреЛ рдкрдХрдбрд╝ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд▓реЗ рдкрд░, рдЗрд╕рдХрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 : hold holdpoint @ 1- dup holdbuf > if drop drop else dup holdpoint ! c! then ; 

рдЬреЛ рд▓реЛрдЧ рдкрд╣рд▓реА рдмрд╛рд░ рдХрд┐рд▓рд╛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрдВрдЧрд╛ред рдЕрдЧрд▓реЗ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред

рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирдП рд╢рдмреНрджреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрдж рд╣реИ рдФрд░ рдПрдХ рдирдП рд╢рдмреНрдж рдХрд╛ рдПрдХ рдирд╛рдо рд╣реИ: ": рдкрдХрдбрд╝"ред рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЛрдб рдЖрддрд╛ рд╣реИ рдЬреЛ рд╢рдмреНрдж ";" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рд╢рдмреНрдж рдХреЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред рдореИрдВ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрдорд╛рдВрдб рдФрд░ рд╕реНрдЯреИрдХ рдХреА рд╕реНрдерд┐рддрд┐ рджреЗ рджреВрдВрдЧрд╛ред рд╢рдмреНрдж рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╡рд░реНрдг рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрдлрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (<рдЪрд░рд┐рддреНрд░> рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛:

 holdpoint <> <  holdpoint> @ <> <  holdpoint> 1- <> <  holdpoint  1> dup <> <  holdpoint  1> <  holdpoint  1> holdbuf <> <  holdpoint  1> <  holdpoint  1> <  holdbuf> > <> <  holdpoint  1> <,    holdpoint  1    holdbuf> 

рдЙрд╕рдХреЗ рдмрд╛рдж рдпрджрд┐ рдХреЛрдИ рдХрдорд╛рдВрдб рд╣реИ, рдЬреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдФрд░ рдХреЗ рдмреАрдЪ рдХрдорд╛рдВрдб рдХреЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ рд╕реНрдЯреИрдХ рд╕реЗ рддреБрд▓рдирд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдХрд╛рд▓рддреА рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдЭреВрда рд╣реЛрдиреЗ рдкрд░ рд╕рдВрдХреНрд░рдордг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреА рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╕рдВрдХреНрд░рдордг рдирд╣реАрдВ рдерд╛, рдЕрдЧрд░ рдФрд░ рдХрд┐рд╕реА рдХреЗ рдмреАрдЪ рдХреА рд╢рд╛рдЦрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдбреНрд░реЙрдк рдХрдорд╛рдВрдб рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЪрд░рд┐рддреНрд░ рдФрд░ рдкрддреЗ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд╣реИред рд╢рдмреНрдж "!" рд╣реЛрд▓реНрдбрдкреЙрдЗрдВрдЯ рдореЗрдВ рдирдпрд╛ рдорд╛рди рдмрдЪрд╛рддрд╛ рд╣реИ (рдкрддрд╛ рдФрд░ рдорд╛рди рд╕реНрдЯреИрдХ рд╕реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдФрд░ рд╢рдмреНрдж "рд╕реА!" рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рдмрдлрд╝рд░ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реЗрдЯ 8 рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рд╣реИ (рдЪрд░рд┐рддреНрд░ рдХрд╛ рдкрддрд╛ рдФрд░ рдореВрд▓реНрдп рд╕реНрдЯреИрдХ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

 dup <> <  holdpoint  1> <  holdpoint  1> holdpoint <> <  holdpoint  1> <  holdpoint  1> <  holdpoint> ! <> <  holdpoint  1> c! ,  ,   ! :) 

рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ рдХрд┐ рдХрдорд╛рдВрдбреЛрдВ рдХреЗ рдЗрд╕ рдЫреЛрдЯреЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдХрд┐рддрдиреА рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ! рд╣рд╛рдВ, рдХрд┐рд▓рд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИред рдФрд░ рдЕрдм рд╣рдо рд╕рд┐рд░ рдореЗрдВ рдореИрдиреБрдЕрд▓ "рд╕рдВрдХрд▓рдХ" рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ :) рдФрд░ рд╣рдо рдпрд╣ рд╕рдм рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 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 # ; 

рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рд╕реНрдерд╛рдиреАрдп рд▓реЗрдмрд▓ (0 рдФрд░ 1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрди рд▓реЗрдмрд▓ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдирд╛рдореЛрдВ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдмрд▓ 0 рдХреЛ 0f рдпрд╛ 0b рдирд╛рдореЛрдВ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдирд┐рдХрдЯрддрдо рд▓реЗрдмрд▓ 0 (рдЖрдЧреЗ рдпрд╛ рдкреАрдЫреЗ) рдХрд╛ рд▓рд┐рдВрдХ рд╣реИред рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдмрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╢рдмреНрдж #


рдЪрд▓реЛ # рд╢рдмреНрдж рдмрдирд╛рддреЗ рд╣реИрдВред рдХрд┐рд▓реЗ рдкрд░, рдЗрд╕рдХрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 : # base /mod swap dup 10 < if cтА│ 0 + else 10 - cтА│ A + then hold ; 

рдпрд╣рд╛рдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝рд╛ рджрд╕ рд╕реЗ рдХрдо рд╣реИ? рдпрджрд┐ рдХрдо рд╣реИ, рддреЛ рдЕрдВрдХ 0тАУ9 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛, "рдП" рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЕрдиреБрдХреНрд░рдо c sequence 0 рд╕реНрдЯреИрдХ рдкрд░ рд╡рд░реНрдг рдХреЛрдб 0 рдХреЛ рдзрдХреЗрд▓рддрд╛ рд╣реИред рд╣рдо "рд╕рдВрдХрд▓рдХ" рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ:

 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 'A' # cтА│ A .byte b_add # + 1: .byte b_call16 .word hold - . - 2 # hold .byte b_exit # ; 

рд╢рдмреНрдж <#


<# рдмрд╣реБрдд рд╕рд░рд▓ рд╢рдмреНрдж рд╣реИ:

 : <# holdbuf 70 + holdpoint ! ; 

рдмрд╛рдЗрдЯ рдХреЛрдб:

 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 

рд╢рдмреНрдж #>


рд░реВрдкрд╛рдВрддрд░рдг рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж # рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 : #> holdpoint @ holdbuf 70 + over - ; 

рдмрд╛рдЗрдЯ рдХреЛрдб:

 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 

рд╢рдмреНрдж #s


рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╢рдмреНрдж #s:

 : #s do # dup 0= until ; 

рдмрд╛рдЗрдЯ рдХреЛрдб:

 conv_s: .byte b_call8 .byte conv - . - 1 .byte b_dup .byte b_qbranch8 .byte conv_s - . .byte b_exit 

рдЬреЛ рдХреЛрдИ рднреА рд╕рд╛рд╡рдзрд╛рди рд╣реИ рдЙрд╕реЗ рдмрд╛рдпрдЯреЗрдХреЛрдб рдФрд░ рдХрд┐рд▓рд╛ рдХреЛрдб рдХреЗ рдмреАрдЪ рдереЛрдбрд╝реА рд╡рд┐рд╕рдВрдЧрддрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА :)

рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ


рдЕрдм, рдХреБрдЫ рднреА рдЖрдкрдХреЛ рд╢рдмреНрдж рдмрдирд╛рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХреЗрдЧрд╛ "ред", рдЬреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

 : . <# #s drop #> type ; 

рдмрд╛рдЗрдЯ рдХреЛрдб:

 dot: .byte b_call8 .byte conv_start - . - 1 .byte b_call8 .byte conv_s - . - 1 .byte b_drop .byte b_call8 .byte conv_end - . - 1 .byte b_type .byte b_exit 

рдЖрдЗрдП рдПрдХ рдЯреЗрд╕реНрдЯ рдмрд╛рдпрдЯреЗрдХреЛрдб рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рдмрд╛рдд рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ:

 start: .byte b_lit16 .word 1234 .byte b_call16 .word dot - . - 2 .byte b_bye 

рдмреЗрд╢рдХ, рдЗрд╕рдиреЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди, рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ:

 $ as forth.asm -o forth.o -g -ahlsm>list.txt $ ld forth.o -o forth $ ./forth 1234bye! 

рдЬрд╛рдо рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рдж, рдХрд┐рд▓реЗ рдХреЛ рдПрдХ рд╕реНрдерд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред Conv_start (<#) рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж 32 рд╣реЛрд▓реНрдб рдХрдорд╛рдВрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВред

рд╣рдо рд╕рдВрдХреЗрдд рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рднреА рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдбреБрдм рдПрдмреНрд╕ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ, рдмрд╛рдИрдВ рдХреЙрдкреА рдХреЗ рдЪрд┐рдиреНрд╣ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдпрджрд┐ рдЛрдгрд╛рддреНрдордХ рд╣реИ рддреЛ рдорд╛рдЗрдирд╕ рдбрд╛рд▓реЗрдВ (0 <рдЕрдЧрд░ c hold - рд╣реЛрд▓реНрдб рддреЛ)ред рдирддреАрдЬрддрди, рд╢рдмреНрдж "ред" рдЗрд╕ рдлреЙрд░реНрдо рдХреЛ рд▓реЗрддрд╛ рд╣реИ:

 : . dup abs <# 32 hold #s drop #> 0< if cтА│ - hold then type ; 

рдмрд╛рдЗрдЯ рдХреЛрдб:

 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 

рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдХреЗ рд╢реБрд░реБрдЖрддреА рдХреНрд░рдо рдореЗрдВ, рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдбрд╛рд▓реЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ:

 $ as forth.asm -o forth.o -g -ahlsm>list.txt $ ld forth.o -o forth $ ./forth -1234 bye! 

рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИ!

рдкреВрд░реНрдг рд╕реНрд░реЛрдд
 .intel_syntax noprefix stack_size = 1024 .section .data init_stack: .quad 0 init_rstack: .quad 0 msg_bad_byte: .ascii "Bad byte code!\n" msg_bad_byte_len = . - msg_bad_byte #  len    msg_bye: .ascii "bye!\n" msg_bye_len = . - msg_bye bcmd: .quad bcmd_bad, bcmd_bye, bcmd_num0, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 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_bad, 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_bad, bcmd_bad, 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_bad, 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_bad, bcmd_bad, 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_bad, bcmd_bad, bcmd_bad, 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_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad, bcmd_bad # 0x80 .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_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 start: .byte b_lit16 .word -1234 .byte b_call16 .word dot - . - 2 .byte b_bye base: .byte b_var0 .quad 10 holdbuf_len = 70 holdbuf: .byte b_var0 .space holdbuf_len holdpoint: .byte b_var0 .quad 0 # : hold holdpoint @ 1- dup holdbuf > if drop drop else dup holdpoint ! c! then ; 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 ; 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 ! ; 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 ; conv_s: .byte b_call8 .byte conv - . - 1 .byte b_dup .byte b_qbranch8 .byte conv_s - . .byte b_exit # : #> holdpoint @ holdbuf 70 + over - ; 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 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 .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_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_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 shr rax, 3 push 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 # 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_branch8 = 0x10 bcmd_branch8: movsx rax, byte ptr [r8] add r8, rax jmp _next 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_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 

рдкрд░рд┐рдгрд╛рдо


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЪреНрдЫрд╛ рдХреЛрд░ рд╣реИ: рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдЕрдВрдХрдЧрдгрд┐рддреАрдп, рд╕реНрдЯреИрдХ рдСрдкрд░реЗрд╢рди, рддреБрд▓рдирд╛ рд╕рдВрдЪрд╛рд▓рди, рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдЪрд░ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд░реЗрдВрдЧреЗ!

рд╕рднреА рдХреЛ рдирдпрд╛ рд╕рд╛рд▓ рдореБрдмрд╛рд░рдХ рд╣реЛ!

рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! :)

рдирд┐рд░рдВрддрд░рддрд╛: рдХрд┐рд▓реЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯ рдорд╢реАрди (рдФрд░ рди рдХреЗрд╡рд▓) рдореВрд▓ рдЕрдореЗрд░рд┐рдХреА рдореЗрдВ (рднрд╛рдЧ 3)

Source: https://habr.com/ru/post/hi433836/


All Articles