{"id":443890,"date":"2025-01-02T15:04:27","date_gmt":"2025-01-02T15:04:27","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=443890"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2025-01-02T15:04:27","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=443890","title":{"rendered":"<span>\u0421\u0442\u0435\u043a\u043e\u0432\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u0421\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e51\/83e\/720\/e5183e7208b713f884d10869847372c4.png\" width=\"1352\" height=\"497\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e51\/83e\/720\/e5183e7208b713f884d10869847372c4.png\"\/><\/figure>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0437\u0430\u043d\u044f\u0442\u0438\u0435\u043c \u043d\u0430 \u0432\u0435\u0447\u0435\u0440, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u044f\u0437\u044b\u043a\u0443 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\u0445 \u041e\u0410\u0438\u041f (\u043e\u0441\u043d\u043e\u0432\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u0438 \u0410\u0410\u0421 (\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432). \u0426\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c <strong>\u044f\u0437\u044b\u043a\u043e\u043c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430<\/strong>, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0438 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432, \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0441\u0435\u043b, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0441\u0442\u0435\u043a. \u041c\u0430\u0448\u0438\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u043b\u0438\u0448\u044c <strong>10-\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438<\/strong>, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u0435\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b<\/h2>\n<p>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043d\u0443\u0436\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u043c\u044f\u0442\u044c. \u041f\u0430\u043c\u044f\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0434\u0432\u0443\u043c\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0421\u0442\u0435\u043a \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 <strong>32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b<\/strong>. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">#define CVM_KERNEL_SMEMORY (1 &lt;&lt; 10) \/\/ Stack = 1024 INT32 #define CVM_KERNEL_CMEMORY (4 &lt;&lt; 10) \/\/ Code  = 4096 BYTE<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0432 \u0442\u043e\u043c \u043b\u0438\u0448\u044c \u043f\u043b\u0430\u043d\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043a\u0430\u043a: add, sub, mul, div, shift, not, xor, or, and, je, jl, jge, jle \u0438 \u0442.\u0434. \u0412 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0435, <strong>\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0437\u043c<\/strong> &#8212; \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c: <\/p>\n<pre><code class=\"cpp\">enum { C_PUSH = 0x0A, \/\/ 5 bytes C_POP  = 0x0B, \/\/ 1 byte C_INC  = 0x0C, \/\/ 1 byte C_DEC  = 0x0D, \/\/ 1 byte C_JMP  = 0x0E, \/\/ 1 byte C_JG   = 0x0F, \/\/ 1 byte C_STOR = 0x1A, \/\/ 1 byte C_LOAD = 0x1B, \/\/ 1 byte C_CALL = 0x1C, \/\/ 1 byte C_HLT  = 0x1D, \/\/ 1 byte };<\/code><\/pre>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <strong>push<\/strong> \u0431\u0443\u0434\u0435\u0442 \u043a\u043b\u0430\u0441\u0442\u044c 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <strong>pop<\/strong> \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <strong>inc, dec<\/strong> &#8212; \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a\u0435. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <strong>jmp, jg<\/strong> &#8212; \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 (x&gt;y) \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b. <strong>stor, load<\/strong> &#8212; \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \/ \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \/ \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0442\u0435\u043a\u0430. <strong>call<\/strong> &#8212; \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0432 \u0441\u0442\u0435\u043a \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 jmp.<strong> hlt<\/strong> &#8212; \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439. \u0412\u0441\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c push \u0438 hlt, \u0431\u0435\u0440\u0443\u0442 \u0441\u0432\u043e\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f hlt \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043e\u0432\u0441\u0435, \u0430 \u0432\u043e\u0442 push &#8212; \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0435\u0439 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043a, \u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 \u0441\u0430\u043c\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0446\u0435\u043b\u044b\u0445 5 \u0431\u0430\u0439\u0442, \u0445\u043e\u0442\u044f \u0435\u0451 \u043e\u043f\u043a\u043e\u0434 \u043d\u0430 \u0434\u0435\u043b\u0435 \u0440\u0430\u0432\u0435\u043d \u0432\u0441\u0451 \u0442\u0430\u043a\u0436\u0435 \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443. <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043a\u0430\u043a\u043e\u0435-\u043b\u0438\u0431\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043e\u043f\u043a\u043e\u0434\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u0431\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u0445, \u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0438\u0445 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0431\u044b \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430. \u041d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u044f\u0434 \u043c\u0438\u043d\u0443\u0441\u043e\u0432: 1) \u0441\u043b\u043e\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0432\u0441\u0435 16-\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430 \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f, 2) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0431\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0430 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c, \u0447\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0431\u043e\u0440\u043e\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0438\u043d\u0443\u0441\u044b, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0432 \u0440\u043e\u043b\u0438 \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u043e\u0432, \u0442.\u0435. \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 `<strong>push 5, jmp<\/strong>` \u0432 0x0A 0x00 0x00 0x00 0x05, 0x0E. <\/p>\n<p>\u0412 \u0441\u043b\u043e\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0435\u0449\u0451 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u044e\u0441, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438 \u0431\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u0418\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u043b\u0435\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0438 \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0438 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432. \u041a \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c, \u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439.<\/p>\n<pre><code class=\"cpp\">enum {   C_CMNT = 0x11, \/\/ 0 bytes, comment   C_LABL = 0x22, \/\/ 0 bytes, label   C_UNDF = 0xAA, \/\/ 0 bytes, undefined mnemonic   C_VOID = 0xBB, \/\/ 0 bytes, void string }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u0434\u0432\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u043c \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435 \u043a\u043e\u0434\u0430 &#8212; \u043f\u0443\u0441\u0442\u0430\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435, \u0447\u0442\u043e \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a \u043d\u0435 \u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d. \u041f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f C_VOID \u0441\u0445\u043e\u0436\u0430 \u0441 C_CMNT, \u0442.\u043a. \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435\u044f\u0432\u043d\u0430\u044f \u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \/ \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u043f\u0443\u0441\u0442\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 (\u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432). C_UNDF \u0441\u043b\u0443\u0436\u0438\u0442 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0447\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u043d\u0435 \u0431\u044b\u043b \u0435\u044e \u043d\u0430\u0439\u0434\u0435\u043d. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 C_VOID, C_UNDF \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043c\u044b \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b:<\/p>\n<pre><code class=\"cpp\">#define CVM_KERNEL_ISIZE 14  static struct virtual_machine { int32_t cmused; uint8_t memory[CVM_KERNEL_CMEMORY]; struct { uint8_t bcode; char *mnem; } bclist[CVM_KERNEL_ISIZE]; } VM = { .cmused = 0, .bclist = {       { C_VOID, \"\\0\"   }, \/\/ 0 arg { C_UNDF, \"\\1\"   }, \/\/ 0 arg { C_CMNT, \";\"    }, \/\/ 0 arg { C_LABL, \"labl\" }, \/\/ 1 arg { C_PUSH, \"push\" }, \/\/ 1 arg, 0 stack { C_POP,  \"pop\"  }, \/\/ 0 arg, 1 stack { C_INC,  \"inc\"  }, \/\/ 0 arg, 1 stack { C_DEC,  \"dec\"  }, \/\/ 0 arg, 1 stack { C_JMP,  \"jmp\"  }, \/\/ 0 arg, 1 stack { C_JG,   \"jg\"   }, \/\/ 0 arg, 3 stack { C_STOR, \"stor\" }, \/\/ 0 arg, 2 stack { C_LOAD, \"load\" }, \/\/ 0 arg, 1 stack { C_CALL, \"call\" }, \/\/ 0 arg, 1 stack { C_HLT,  \"hlt\"  }, \/\/ 0 arg, 0 stack }, };<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0438 \u043f\u043e\u043b\u044f: <strong>cmused<\/strong> &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, memory &#8212; \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430, <strong>bclist<\/strong> &#8212; \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u043e\u0432 \u0438 \u043e\u043f\u043a\u043e\u0434\u043e\u0432. <\/p>\n<h2>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u043a\u043e\u0434 &#8212; \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0437 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0434\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u0438 \u0432 \u0438\u0434\u0435\u0430\u043b\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u0431\u044b\u0442\u044c \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u0430 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u043a\u043e\u0434\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430: 1) \u043f\u0440\u043e\u0445\u043e\u0434 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u043e\u043a \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, 2) \u043f\u0440\u043e\u0445\u043e\u0434 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u043e\u0432 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u044d\u0442\u0430\u043f\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0432\u043c\u0435\u0441\u0442\u0435, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0442\u043a\u0438 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u044b \u0432 \u043b\u044e\u0431\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430. <\/p>\n<p>\u0421\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u0434\u0430, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430.  <\/p>\n<pre><code class=\"cpp\">hashtab_t *hashtab; int32_t bindex; char buffer[BUFSIZ]; char *arg; uint8_t opcode;  hashtab = hashtab_new(512); bindex = 0;  \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 input while(fgets(buffer, BUFSIZ, input) != NULL) {     \/\/ \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e,      \/\/ \u0432 opcode \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0451 \u043d\u043e\u043c\u0435\u0440 (\u0438\u0437 enum),     \/\/ \u0432 arg \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438     arg = read_opcode(buffer, &amp;opcode);      \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 -&gt; \u0432\u044b\u0434\u0430\u0451\u043c \u043e\u0448\u0438\u0431\u043a\u0443     if (opcode == C_UNDF) {         hashtab_free(hashtab);         return 1;     }      \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f = \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430,     \/\/ \u0442\u043e\u0433\u0434\u0430 \u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e     if(opcode == C_CMNT || opcode == C_VOID) {         continue;     }      switch(opcode) {         \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f = \u043c\u0435\u0442\u043a\u0430, \u0442\u043e\u0433\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u043e\u0434\u0430         case C_LABL:             \/\/ \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439             if (strlen(arg) == 0 || str_is_number(arg)) { return 2; }             \/\/ agr = \u0438\u043c\u044f \u043c\u0435\u0442\u043a\u0438, bindex = \u0430\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0438             hashtab_set(hashtab, arg, &amp;bindex, sizeof(bindex));         break;         \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f = push, \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 +5 \u0431\u0430\u0439\u0442          case C_PUSH:             bindex += 5;         break;         \/\/ \u0441\u0434\u0432\u0438\u0433 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0440\u0430\u0432\u0435\u043d +1 \u0431\u0430\u0439\u0442         default:             bindex += 1;         break;     } }  ...<\/code><\/pre>\n<p> \u041a\u043e\u0434 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f &#8212; \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u043f\u043a\u043e\u0434\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0438\u043c\u0451\u043d \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">  ...    \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e   fseek(input, 0, SEEK_SET);    \/\/ \u0441\u043d\u043e\u0432\u0430 \u0447\u0438\u0442\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 input   while(fgets(buffer, BUFSIZ, input) != NULL) {       arg = read_opcode(buffer, &amp;opcode);       switch (opcode) {           \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439,            \/\/ \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0451           case C_VOID: case C_CMNT: case C_LABL:           break;           \/\/ \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f push, \u0442\u043e\u0433\u0434\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u0443\u0435\u043c \u0435\u0451           \/\/ \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u0437\u0430 \u0441\u0447\u0451\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430)           case C_PUSH:                \/\/ \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c               if (strlen(arg) == 0) {                   return 3;               }               compile_push(output, hashtab, arg);           break;           \/\/ \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e           \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0451 \u043e\u043f\u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b           default:               fprintf(output, \"%c\", opcode);           break;       }   }    \/\/ \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0443\u0441\u043f\u0435\u0445\u043e\u043c    hashtab_free(hashtab);   return 0;<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u043a, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0430\u0434\u0440\u0435\u0441, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e compile_push. \u042d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f push \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u0438\u043c\u0435\u043d\u0430 \u043c\u0435\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430. <\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0430\u0439\u043b hashtab.h<\/p>\n<pre><code class=\"cpp\">#ifndef EXTCLIB_TYPE_HASHTAB_H_ #define EXTCLIB_TYPE_HASHTAB_H_  typedef struct hashtab_t hashtab_t;  extern hashtab_t *hashtab_new(int size); extern void hashtab_free(hashtab_t *ht);  extern void *hashtab_get(hashtab_t *ht, char *key); extern int hashtab_set(hashtab_t *ht, char *key, void *elem, int size); extern int hashtab_del(hashtab_t *ht, char *key);  #endif \/* EXTCLIB_TYPE_HASHTAB_H_ *\/ <\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b hashtab.c<\/p>\n<pre><code class=\"cpp\">#include \"hashtab.h\" #include \"list.h\"  #include &lt;stdlib.h&gt; #include &lt;string.h&gt;  typedef struct hashtab_t { int size; list_t **table; } hashtab_t;  static unsigned int strhash(char *str, size_t size);  extern hashtab_t *hashtab_new(int size) { hashtab_t *ht = (hashtab_t*)malloc(sizeof(hashtab_t)); ht-&gt;size = size; ht-&gt;table = (list_t**)malloc(sizeof(list_t*)*size); for (int i = 0; i &lt; size; ++i) { ht-&gt;table[i] = list_new(); } return ht; }  extern void hashtab_free(hashtab_t *ht) { for (int i = 0; i &lt; ht-&gt;size; ++i) { list_free(ht-&gt;table[i]); } free(ht-&gt;table); free(ht); }  extern void *hashtab_get(hashtab_t *ht, char *key) { unsigned int hash = strhash(key, ht-&gt;size); size_t lenkey = strlen(key)+1; char *val; for (int i = 0; (val = list_get(ht-&gt;table[hash], i)) != NULL; ++i) { if (strcmp(val, key) == 0) { return (void*)val + lenkey; } } return NULL; }  extern int hashtab_set(hashtab_t *ht, char *key, void *elem, int size) { unsigned int hash = strhash(key, ht-&gt;size); size_t lenkey = strlen(key)+1; char *val; int rc, i; for (i = 0; (val = list_get(ht-&gt;table[hash], i)) != NULL; ++i) { if (strcmp(val, key) == 0) { break; } } val = (char*)malloc(size+lenkey); memcpy(val, key, lenkey); memcpy(val+lenkey, elem, size); rc = list_set(ht-&gt;table[hash], i, val, size+lenkey); free(val); return rc; }  extern int hashtab_del(hashtab_t *ht, char *key) { unsigned int hash = strhash(key, ht-&gt;size); char *val; for (int i = 0; (val = list_get(ht-&gt;table[hash], i)) != NULL; ++i) { if (strcmp(val, key) == 0) { return list_del(ht-&gt;table[hash], i); } } return -1; }  \/\/ K&amp;R 6.6 static unsigned int strhash(char *s, size_t size) {     unsigned hashval;     for (hashval = 0; *s != '\\0'; s++)         hashval = *s + 31 * hashval;     return hashval % size; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0430\u0439\u043b list.h<\/p>\n<pre><code class=\"cpp\">#ifndef EXTCLIB_TYPE_LIST_H_ #define EXTCLIB_TYPE_LIST_H_  typedef struct list_t list_t;  extern list_t *list_new(void); extern void list_free(list_t *ls); extern int list_size(list_t *ls);  extern int list_find(list_t *ls, void *elem, int size); extern void *list_get(list_t *ls, int index); extern int list_set(list_t *ls, int index, void *elem, int size); extern int list_del(list_t *ls, int index);  #endif \/* EXTCLIB_TYPE_LIST_H_ *\/ <\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b list.c<\/p>\n<pre><code class=\"cpp\">#include \"list.h\"  #include &lt;stdlib.h&gt; #include &lt;string.h&gt;  typedef struct list_t { int size; void *elem; struct list_t *next; } list_t;  extern list_t *list_new(void) { list_t *ls = (list_t*)malloc(sizeof(list_t)); ls-&gt;size = 0; ls-&gt;elem = NULL; ls-&gt;next = NULL; return ls; }  extern void list_free(list_t *ls) { list_t *next; while(ls != NULL) { next = ls-&gt;next; free(ls-&gt;elem); free(ls); ls = next; } }  extern int list_find(list_t *ls, void *elem, int size) { for (int i = 0; ls-&gt;next != NULL; ++i) { ls = ls-&gt;next; if (ls-&gt;size == size &amp;&amp; memcmp(ls-&gt;elem, elem, size) == 0) { return i; } } return -1; }  extern void *list_get(list_t *ls, int index) { for (int i = 0; ls-&gt;next != NULL &amp;&amp; i &lt; index; ++i) { ls = ls-&gt;next; } if (ls-&gt;next == NULL) { return NULL; } return ls-&gt;next-&gt;elem; }  extern int list_set(list_t *ls, int index, void *elem, int size) { list_t *root = ls; if (size &lt;= 0) { return 1; } for (int i = 0; ls != NULL &amp;&amp; i &lt; index; ++i) { ls = ls-&gt;next; } if (ls == NULL) { return 2; } if (ls-&gt;next == NULL) { ls-&gt;next = list_new(); ls-&gt;next-&gt;elem = (void*)malloc(size); root-&gt;size += 1; } else { ls-&gt;next-&gt;elem = (void*)realloc(ls-&gt;next-&gt;elem, size); } ls-&gt;next-&gt;size = size; memcpy(ls-&gt;next-&gt;elem, elem, size); return 0; }  extern int list_del(list_t *ls, int index) { list_t *temp; list_t *root = ls; for (int i = 0; ls-&gt;next != NULL &amp;&amp; i &lt; index; ++i) { ls = ls-&gt;next; } if (ls-&gt;next == NULL) { return 1; } temp = ls-&gt;next; ls-&gt;next = ls-&gt;next-&gt;next; free(temp); root-&gt;size -= 1; return 0; }  extern int list_size(list_t *ls) { return ls-&gt;size; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f compile_push \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0442.\u043a. \u0435\u0451 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 push \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f (\u043c\u0435\u0442\u043a\u0430 \u044d\u0442\u043e \u0438\u043b\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e) \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. <\/p>\n<pre><code class=\"cpp\">static void compile_push(FILE *output, hashtab_t *hashtab, char *arg) { uint8_t bytes[4]; int32_t *temp; int32_t num;      \/\/ \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0443 \u0430\u0434\u0440\u0435\u0441 \u043c\u0435\u0442\u043a\u0438 temp = hashtab_get(hashtab, arg);      \/\/ \u0435\u0441\u043b\u0438 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043c\u0435\u0442\u043a\u0438 \u043f\u043e \u0442\u0430\u043a\u043e\u043c\u0443 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e,     \/\/ \u0442\u043e\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u0430\u043a \u0447\u0438\u0441\u043b\u043e if (temp == NULL) { num = atoi(arg);     \/\/ \u0438\u043d\u0430\u0447\u0435, \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b     \/\/ \u043a\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043c\u0435\u0442\u043a\u0438 (\u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 - \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e) } else { num = *temp; }      \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 4 \u0431\u0430\u0439\u0442\u0430 (\u0442.\u0435. \u0432 \u0447\u0435\u0442\u044b\u0440\u0435 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430)     \/\/ \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c [\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e + 4 \u0431\u0430\u0439\u0442\u0430] \u0432 \u0444\u0430\u0439\u043b split_32bits_to_8bits((uint32_t)num, bytes); fprintf(output, \"%c%c%c%c%c\", C_PUSH, bytes[0], bytes[1], bytes[2], bytes[3]); }<\/code><\/pre>\n<p>\u0418 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438, \u0432\u044b\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c. <\/p>\n<pre><code class=\"cpp\">static char *read_opcode(char *line, uint8_t *opcode) { char *ptr;  \/\/ \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0443\u0441\u0442\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440,      \/\/ \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0439\u0434\u0451\u043c \u0434\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 line = str_trim_spaces(line);      \/\/ \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440,     \/\/ \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0439\u0434\u0451\u043c \u0434\u043e \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430.     \/\/ \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0430 '\\0' (\u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438) ptr = str_set_end(line);      \/\/ \u0432 `line` \u0442\u0435\u043f\u0435\u0440\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0438\u043c\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (\u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a)  \/\/ \u043f\u043e \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0435\u0433\u043e \u043e\u043f\u043a\u043e\u0434  *opcode = find_opcode(line); switch(*opcode) {         \/\/ \u0415\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f = push \u0438\u043b\u0438 labl,          \/\/ \u0442\u043e\u0433\u0434\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u0445 case C_PUSH: case C_LABL: break;         \/\/ \u0412 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f,         \/\/ \u0442.\u043a. \u0443 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 default: return NULL; }      \/\/ \u0432 `line` \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 line = str_trim_spaces(++ptr); str_set_end(line);      \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 return line; }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static uint8_t find_opcode(char *str) { uint8_t opcode;  opcode = C_UNDF;  for (int i = 0; i &lt; CVM_KERNEL_ISIZE; ++i) { if (strcmp(str_to_lower(str), VM.bclist[i].mnem) == 0) { opcode = VM.bclist[i].bcode; break; } }  return opcode; }  static int str_is_number(char *str) { int len = strlen(str); if (len == 0) { return 0; }  for (int i = 0; i &lt; len; ++i) { if (!isdigit(str[i])) { return 0; } }  return 1;  }  static char *str_to_lower(char *str) { int len = strlen(str);  for (int i = 0; i &lt; len; ++i) { str[i] = tolower(str[i]); }  return str; }  static char *str_trim_spaces(char *str) { while(isspace(*str)) { ++str; }  return str; }  static char *str_set_end(char *str) { char *ptr = str;  while(!isspace(*ptr)) { ++ptr; }  *ptr = '\\0'; return ptr; }  static void split_32bits_to_8bits(uint32_t num, uint8_t *bytes) { for (int i = 0; i &lt; 4; ++i) { bytes[i] = (uint8_t)(num &gt;&gt; (24 - i * 8)); } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h4>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0442.\u043a. \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u043d\u0435 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (\u0442.\u0435. \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0443 &#8212; push), \u0432\u0441\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (\u043c\u0435\u0442\u043a\u0443, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438 \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043b\u044e\u0431\u0443\u044e \u043e\u0434\u043d\u0443 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e (\u043f\u043e \u0442\u0438\u043f\u0443 inc).<\/p>\n<pre><code class=\"assembly\">; \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 push 1  ; \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b labl start push start   ; \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043b\u043e\u0433\u0438\u043a\u0430  push 10 inc <\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u0433\u0434\u0435 <code>0A 00 00 00 01 = push 1<\/code>, <code>0A 00 00 00 05 = push start<\/code> (\u0433\u0434\u0435 <strong>start = 5<\/strong>, \u0442.\u043a. \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 push = 5 \u0431\u0430\u0439\u0442), <code>0A 00 00 0A = push 10, 0C = inc<\/code>.<\/p>\n<pre><code class=\"bash\">$ hexdump --format '16\/1 \"%02X \" \"\\n\"' main.bcd &gt; 0A 00 00 00 01 0A 00 00 00 05 0A 00 00 00 0A 0C<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <a href=\"https:\/\/github.com\/number571\/cvm\" rel=\"noopener noreferrer nofollow\">cvm<\/a>, \u0441\u043a\u0430\u0447\u0430\u0432, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0432 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<pre><code class=\"bash\">$ git clone https:\/\/github.com\/number571\/cvm $ cd cvm &amp;&amp; make build $ .\/cvm build main.asm -o main.bcd<\/code><\/pre>\n<h2>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438<\/h2>\n<p>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u0438 \u043d\u0430 \u0434\u0435\u043b\u0435 &#8212; \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439. \u0412 \u043d\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u0445 \u043e\u043f\u043a\u043e\u0434\u043e\u0432 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0432\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0432\u0435\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, <strong>VM.memory<\/strong> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u0430 <strong>VM.cmused<\/strong> \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430. <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">stack_t *stack; uint8_t opcode; int32_t mi; int retcode;  stack = stack_new(CVM_KERNEL_SMEMORY, sizeof(int32_t)); mi = 0; \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435  while(mi &lt; VM.cmused) {     opcode = VM.memory[mi++];      switch(opcode) {         \/\/ jg, jmp, call \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430,          \/\/ \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f mi          case C_JG:              retcode = exec_jmpif(stack, &amp;mi);         break;         case C_JMP:              retcode = exec_jmp(stack, &amp;mi);         break;         case C_CALL:              retcode = exec_call(stack, &amp;mi);         break;         \/\/ push \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f mi \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e \u043d\u0430 +4         case C_PUSH:             retcode = exec_push(stack, &amp;mi);         break;         case C_POP:             retcode = exec_pop(stack);         break;         \/\/ inc, dec \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0438         \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u0438 exec_incdec \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c -&gt; +1 \u0438\u043b\u0438 -1,         \/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 opcode         case C_INC: case C_DEC:             retcode = exec_incdec(stack, opcode);         break;         case C_STOR:              retcode = exec_stor(stack);         break;         case C_LOAD:              retcode = exec_load(stack);         break;         case C_HLT:             mi = VM.cmused; \/\/ \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430             retcode = 0;    \/\/ \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 - \u0443\u0434\u0430\u0447\u043d\u043e         break;         \/\/ \u043e\u043f\u043a\u043e\u0434 \u043d\u0435 \u0431\u044b\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439         default:              retcode = wrap_return(C_UNDF, 1);         break;     }      \/\/ \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439     if (retcode != 0) {         stack_free(stack);         return retcode;     } }  ...<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0441\u0442\u0435\u043a\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0430\u0439\u043b stack.h<\/p>\n<pre><code class=\"cpp\">#ifndef EXTCLIB_TYPE_STACK_H_ #define EXTCLIB_TYPE_STACK_H_  typedef struct stack_t stack_t;  extern stack_t *stack_new(int size, int valsize); extern void stack_free(stack_t *st); extern int stack_size(stack_t *st);  extern int stack_push(stack_t *st, void *elem); extern void *stack_pop(stack_t *st); extern int stack_set(stack_t *st, int index, void *elem); extern void *stack_get(stack_t *st, int index);  #endif \/* EXTCLIB_TYPE_STACK_H_ *\/ <\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b stack.c<\/p>\n<pre><code class=\"cpp\">#include \"stack.h\"  #include &lt;stdlib.h&gt; #include &lt;string.h&gt;  typedef struct stack_t { int size; int valsize; int currpos; char *buffer; } stack_t;  extern stack_t *stack_new(int size, int valsize) { stack_t *st = (stack_t*)malloc(sizeof(stack_t)); st-&gt;size = size; st-&gt;valsize = valsize; st-&gt;currpos = 0; st-&gt;buffer = (char*)malloc(size*valsize); return st; }  extern void stack_free(stack_t *st) { free(st-&gt;buffer); free(st); }  extern int stack_size(stack_t *st) { return st-&gt;currpos; }  extern int stack_push(stack_t *st, void *elem) { if (st-&gt;currpos == st-&gt;size) { return 1; } memcpy(st-&gt;buffer + st-&gt;currpos * st-&gt;valsize, elem, st-&gt;valsize); st-&gt;currpos += 1; return 0; }  extern void *stack_pop(stack_t *st) { if (st-&gt;currpos == 0) { return NULL; } st-&gt;currpos -= 1; return (void*)st-&gt;buffer + st-&gt;currpos * st-&gt;valsize; }  extern int stack_set(stack_t *st, int index, void *elem) { if (index &lt; 0 || index &gt;= st-&gt;size) { return 1; } memcpy(st-&gt;buffer + index * st-&gt;valsize, elem, st-&gt;valsize); return 0; }  extern void *stack_get(stack_t *st, int index) { if (index &lt; 0 || index &gt;= st-&gt;size) { return NULL; } return (void*)st-&gt;buffer + index * st-&gt;valsize; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d \u0432 \u0441\u0442\u0435\u043a\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c.<\/p>\n<pre><code class=\"cpp\">... mi = stack_size(stack);  *output = (int32_t*)malloc(sizeof(int32_t)*(mi+1));  \/\/ \u043f\u0435\u0440\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 output - \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0441\u0442\u0435\u043a\u0435 (*output)[0] = mi;  \/\/ \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 - \u044d\u0442\u043e \u0441\u0430\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430  for (int i = 1; i &lt;= mi; ++i) {     (*output)[i] = *(int32_t*)stack_pop(stack); }  \/\/ \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 stack_free(stack); return 0;<\/code><\/pre>\n<p>\u0412\u0441\u0451 \u0447\u0442\u043e \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f &#8212; \u044d\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u043f\u043a\u043e\u0434\u0430. \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">extern int exec_jmp(stack_t *stack, int32_t *mi) { int32_t num;      \/\/ \u0441\u0442\u0435\u043a \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c if (stack_size(stack) == 0) { return wrap_return(C_JMP, 1); }      \/\/ \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 - \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f     \/\/ \u0430\u0434\u0440\u0435\u0441\u043e\u043c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 '\u0441\u0434\u0436\u0430\u043c\u043f\u0438\u0442\u044c\u0441\u044f' num = *(int32_t*)stack_pop(stack);      \/\/ \u0435\u0441\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043b\u0438 \u043e\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0430\u043c\u044f\u0442\u0438,     \/\/ \u0442\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f if (num &lt; 0 || num &gt;= VM.cmused) { return wrap_return(C_JMP, 3); }      \/\/ \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f *mi = num; return 0; }<\/code><\/pre>\n<p>\u041f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434, \u043d\u043e \u0441 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c.<\/p>\n<pre><code class=\"cpp\">static int exec_jmpif(stack_t *stack, int32_t *mi) { int32_t num, x, y;      \/\/ \u0441\u0442\u0435\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 if (stack_size(stack) &lt; 3) { return wrap_return(opcode, 1); }  num = *(int32_t*)stack_pop(stack); if (num &lt; 0 || num &gt;= VM.cmused) { return wrap_return(opcode, 3); }  x = *(int32_t*)stack_pop(stack); y = *(int32_t*)stack_pop(stack);     if (y &gt; x) {       *mi = num;     }  return 0; }<\/code><\/pre>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f call &#8212; \u044d\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 jmp, \u043d\u043e \u0441 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043e\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a.<\/p>\n<pre><code class=\"cpp\">static int exec_call(stack_t *stack, int32_t *mi) { int retcode; int32_t num;      \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e     \/\/ *\u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0432 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b jmp \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u044f\u043b\u0430     \/\/ \u0437\u0430\u043f\u0443\u0448\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 num = *mi;      \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c jmp retcode = exec_jmp(stack, mi); if (retcode != 0) {         \/\/ &amp; 0xFF - \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0438\u0437 C_JMP, \u043d\u043e \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f         \/\/ \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e C_JMP \u043e\u0448\u0438\u0431\u043a\u0430 (\u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 C_CALL) return wrap_return(C_CALL, retcode &amp; 0xFF); }      \/\/ \u043f\u0443\u0448\u0438\u043c \u0432 \u0441\u0442\u0435\u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f stack_push(stack, &amp;num); return 0; }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0443\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 push \u0438 pop.<\/p>\n<pre><code class=\"cpp\">static int exec_push(stack_t *stack, int32_t *mi) { int32_t num; uint8_t bytes[4];      \/\/ \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0435\u043a\u0430 = \u043e\u0448\u0438\u0431\u043a\u0430 if (stack_size(stack) == CVM_KERNEL_SMEMORY) { return wrap_return(C_PUSH, 1); }      \/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c 4 \u0431\u0430\u0439\u0442\u0430 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 memcpy(bytes, VM.memory + *mi, 4);      *mi += 4;      \/\/ \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0438\u0445 \u043a\u0430\u043a \u043e\u0434\u043d\u043e 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e      \/\/ \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432 \u0441\u0442\u0435\u043a num = (int32_t)join_8bits_to_32bits(bytes); stack_push(stack, &amp;num);  return 0; }  static int exec_pop(stack_t *stack) {     \/\/ \u043f\u0443\u0441\u0442\u043e\u0442\u0430 \u0441\u0442\u0435\u043a\u0430 = \u043e\u0448\u0438\u0431\u043a\u0430 if (stack_size(stack) == 0) { return wrap_return(C_POP, 1); }      \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 stack_pop(stack); return 0; }<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0438 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 &#8212; \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0442\u0438\u043f\u0443 inc \u0438 dec (\u0430 \u0442\u0430\u043a\u0436\u0435 add, sub, mul, div, mod \u0438 \u043f\u0440\u043e\u0447\u0438\u0435, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438). \u041e\u043d\u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u0442\u043b\u0438\u0447\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0438 \u0441\u0430\u043c\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f.<\/p>\n<pre><code class=\"cpp\">static int exec_incdec(stack_t *stack, uint8_t opcode) { int32_t x;      \/\/ \u043f\u0443\u0441\u0442\u043e\u0442\u0430 \u0441\u0442\u0435\u043a\u0430 = \u043e\u0448\u0438\u0431\u043a\u0430     if (stack_size(stack) == 0) { return wrap_return(opcode, 1); }      \/\/ \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 x = *(int32_t*)stack_pop(stack);      \/\/ \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e switch(opcode) { case C_INC: ++x; break; case C_DEC: --x; break; default: return wrap_return(opcode, 1); }      \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0441\u0442\u0435\u043a stack_push(stack, &amp;x); return 0; }<\/code><\/pre>\n<p>\u0421\u0430\u043c\u044b\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f stor \u0438 load. \u0412 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043c\u0435\u0440\u0435 \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0431\u0445\u043e\u0434\u044f\u0442 \u0441\u0440\u0435\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0438 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0410 \u043f\u043e\u0442\u043e\u043c\u0443 \u043c\u043e\u0433\u0443\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043d\u0435\u043c\u0443, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0438\u043b\u0438 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u044f \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"cpp\">static int exec_stor(stack_t *stack) { int32_t num1, num2;      \/\/ \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\u0435 if (stack_size(stack) &lt; 2) { return wrap_return(C_STOR, 1); }  num1 = *(int32_t*)stack_pop(stack); num2 = *(int32_t*)stack_pop(stack);      \/\/ \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c, \u0442.\u043a. \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f     \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432 \u0441\u0442\u0435\u043a\u0435     \/\/ *\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u043b\u044f     \/\/ *\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0442\u0435\u043a\u0430      \/\/ (\u0438\u0437\u0432\u0438\u043d\u044f\u044e\u0441\u044c \u0437\u0430 \u0442\u0430\u0432\u0442\u043e\u043b\u043e\u0433\u0438\u044e) if (num1 &lt; 0) {         \/\/ \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 num1 = stack_size(stack) + num1;         \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 = \u043e\u0448\u0438\u0431\u043a\u0430 if (num1 &lt; 0) { return wrap_return(C_STOR, 2); } } else {         \/\/ \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 = \u043e\u0448\u0438\u0431\u043a\u0430 if (num1 &gt;= stack_size(stack)) { return wrap_return(C_STOR, 3); } }      \/\/ \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441 \u0432\u0442\u043e\u0440\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c if (num2 &lt; 0) { num2 = stack_size(stack) + num2; if (num2 &lt; 0) { return wrap_return(C_STOR, 4); } } else { if (num2 &gt;= stack_size(stack)) { return wrap_return(C_STOR, 5); } }      \/\/ \u041f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a\u0435 num2 = *(int32_t*)stack_get(stack, num2);      \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 stack_set(stack, num1, &amp;num2);  return 0; }<\/code><\/pre>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f load \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043e stor, \u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, \u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0435\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430, \u0430 \u043d\u0435 \u0434\u0432\u0430.<\/p>\n<pre><code class=\"cpp\">static int exec_load(stack_t *stack) { int32_t num;      \/\/ \u0441\u0442\u0435\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u043c if (stack_size(stack) == 0) { return wrap_return(C_LOAD, 1); }      \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u0441\u0442\u0435\u043a\u0435 \u043f\u043e \u043b\u043e\u0433\u0438\u043a\u0435 exec_stor num = *(int32_t*)stack_pop(stack); if (num &lt; 0) { num = stack_size(stack) + num; if (num &lt; 0) { return wrap_return(C_LOAD, 2); } } else { if (num &gt;= stack_size(stack)) { return wrap_return(C_LOAD, 3); } }      \/\/ \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a\u0435 num = *(int32_t*)stack_get(stack, num);      \/\/ \u043f\u0443\u0448\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a (\u0442\u043e\u0431\u0438\u0448\u044c \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0435\u043a\u0430) stack_push(stack, &amp;num);  return 0; }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static uint32_t join_8bits_to_32bits(uint8_t *bytes) { uint32_t num;  for (uint8_t *ptr = bytes; ptr &lt; bytes + 4; ++ptr) { num = (num &lt;&lt; 8) | *ptr; }  return num; }  static uint16_t wrap_return(uint8_t x, uint8_t y) { return ((uint16_t)x &lt;&lt; 8) | y; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438<\/h4>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0432 \u0445\u043e\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. <\/p>\n<pre><code class=\"bash\">$ .\/cvm run main.bcd &gt; 11,5,1<\/code><\/pre>\n<p>\u0418\u0437 \u0441\u0442\u0435\u043a\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 (\u0442.\u043a. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f pop), \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 push \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439 \u0443 \u043d\u0430\u0441 \u0432\u044b\u0432\u0435\u043b\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435. \u0427\u0438\u0441\u043b\u043e \u043f\u044f\u0442\u044c &#8212; \u044d\u0442\u043e \u0430\u0434\u0440\u0435\u0441, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430 \u043c\u0435\u0442\u043a\u0430 start. \u0410 \u0447\u0438\u0441\u043b\u043e 11 &#8212; \u044d\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 inc \u043d\u0430 push 10. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u041d\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043c\u044b \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438, \u0442.\u043a. \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0411\u044b\u043b\u043e \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e \u0442\u0438\u043f\u0443 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u0430, \u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c &#8212; \u0442\u0430\u043a \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041d\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u043c\u0443\u0442\u043e\u0440\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0443 \u043d\u0430\u0441 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0432\u044b\u0431\u043e\u0440\u0430: 1) \u043b\u0438\u0431\u043e \u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f mul, 2) \u043b\u0438\u0431\u043e \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u044f\u0437\u044b\u043a \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0433 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e mul \u0438\u0437 inc. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0436\u0435 \u043e\u0431\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 cvm \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435\u043c CVM_KERNEL_IAPPEND. \u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/number571\/allang\" rel=\"noopener noreferrer nofollow\">allang<\/a> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f LISP-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 10 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 (\u0432 \u0445\u043e\u0434\u0435 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438) \u0438\u0437 \u044f\u0437\u044b\u043a\u0430 ALLang, \u0430 \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b \u043e\u0442 \u043f\u044f\u0442\u0438.<\/p>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u044f\u0437\u044b\u043a<\/h4>\n<blockquote>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u044f\u0437\u044b\u043a\u0435 ALLang \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435: <a href=\"https:\/\/habr.com\/ru\/articles\/703036\/\" rel=\"noopener noreferrer nofollow\">\u0411\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0443\u0436\u0430\u0441\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ALLang<\/a><\/p>\n<\/blockquote>\n<pre><code class=\"lisp\">(include assembly lib\/cvm\/init.asm)  (include source lib\/all\/lr.all lib\/all\/ret.all lib\/all\/dec.all lib\/all\/mul.all)  (define (main x) (fact x))  ; f(x) = 1, if x &lt; 1 ; f(x) = x * f(x-1) (define (fact x) (if (lr x 1)  (ret 1) (mul x (fact (dec x)))))<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433 (\u0431\u043e\u043b\u0435\u0435 700 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430)<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2a4\/47c\/cfd\/2a447ccfd5330a6aeae28b01493df125.gif\" alt=\"\u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0448\u044c \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0430 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0448\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0431\u0435\u0437 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043d\u0430 700 \u0441\u0442\u0440\u043e\u043a \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430\" title=\"\u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0448\u044c \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0430 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0448\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0431\u0435\u0437 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043d\u0430 700 \u0441\u0442\u0440\u043e\u043a \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430\" width=\"755\" height=\"784\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2a4\/47c\/cfd\/2a447ccfd5330a6aeae28b01493df125.gif\"\/><\/p>\n<div><figcaption>\u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0448\u044c \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0430 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0448\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0431\u0435\u0437 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043d\u0430 700 \u0441\u0442\u0440\u043e\u043a \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"assembly\">; cvm \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b; ; \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 allang \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 n-\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430  ; \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0441\u0432\u043e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e main  ; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0439 push \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b ; \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b push 5  labl _init push main call hlt labl _gr push -3 load push -3 load push _if_gr jg labl _else_gr push 0 push _end_gr jmp  labl _if_gr push 1 labl _end_gr push -1 push -4 stor pop jmp labl eq push -3 load push -3 load push -2 load push -2 load push _gr call pop push 0 push _if_0 jg push _else_0 jmp labl _if_0 push 0 push ret call push _end_0 jmp labl _else_0 push -1 load push -3 load push _gr call pop push 0 push _if_1 jg push _else_1 jmp labl _if_1 push 0 push ret call push _end_1 jmp labl _else_1 push 1 push ret call labl _end_1 labl _end_0 push -1 push -6 stor pop pop pop jmp labl _inc push -2 load inc push -1 push -3 stor pop jmp labl inc push -2 load push -1 load push _inc call push -1 push -4 stor pop pop jmp labl _dec push -2 load dec push -1 push -3 stor pop jmp labl dec push -2 load push -1 load push _dec call push -1 push -4 stor pop pop jmp labl ret push -2 load push -1 load push inc call push dec call push -1 push -4 stor pop pop jmp labl not push -2 load push -1 load push 0 push eq call pop push 0 push _if_2 jg push _else_2 jmp labl _if_2 push 1 push ret call push _end_2 jmp labl _else_2 push 0 push ret call labl _end_2 push -1 push -4 stor pop pop jmp labl gr push -3 load push -3 load push -2 load push -2 load push _gr call pop push -1 push -6 stor pop pop pop jmp labl neq push -3 load push -3 load push -2 load push -2 load push eq call pop push not call push -1 push -6 stor pop pop pop jmp labl or push -3 load push -3 load push -2 load push 0 push neq call pop push 0 push _if_3 jg push _else_3 jmp labl _if_3 push 1 push ret call push _end_3 jmp labl _else_3 push -1 load push 0 push neq call pop push 0 push _if_4 jg push _else_4 jmp labl _if_4 push 1 push ret call push _end_4 jmp labl _else_4 push 0 push ret call labl _end_4 labl _end_3 push -1 push -6 stor pop pop pop jmp labl ge push -3 load push -3 load push -2 load push -2 load push eq call pop push -3 load push -3 load push gr call pop push or call pop push -1 push -6 stor pop pop pop jmp labl lr push -3 load push -3 load push -2 load push -2 load push ge call pop push not call push -1 push -6 stor pop pop pop jmp labl add push -3 load push -3 load push -1 load push 0 push eq call pop push 0 push _if_5 jg push _else_5 jmp labl _if_5 push -2 load push ret call push _end_5 jmp labl _else_5 push -1 load push 0 push lr call pop push 0 push _if_6 jg push _else_6 jmp labl _if_6 push -2 load push -2 load push inc call push add call pop push dec call push _end_6 jmp labl _else_6 push -2 load push -2 load push dec call push add call pop push inc call labl _end_6 labl _end_5 push -1 push -6 stor pop pop pop jmp labl sub push -3 load push -3 load push -1 load push 0 push eq call pop push 0 push _if_7 jg push _else_7 jmp labl _if_7 push -2 load push ret call push _end_7 jmp labl _else_7 push -1 load push 0 push lr call pop push 0 push _if_8 jg push _else_8 jmp labl _if_8 push -2 load push -2 load push inc call push sub call pop push inc call push _end_8 jmp labl _else_8 push -2 load push -2 load push dec call push sub call pop push dec call labl _end_8 labl _end_7 push -1 push -6 stor pop pop pop jmp labl neg push -2 load push 0 push -2 load push sub call pop push -1 push -4 stor pop pop jmp labl abs push -2 load push -1 load push 0 push lr call pop push 0 push _if_9 jg push _else_9 jmp labl _if_9 push -1 load push neg call push _end_9 jmp labl _else_9 push -1 load push ret call labl _end_9 push -1 push -4 stor pop pop jmp labl and push -3 load push -3 load push -2 load push 0 push neq call pop push 0 push _if_10 jg push _else_10 jmp labl _if_10 push -1 load push 0 push neq call pop push 0 push _if_11 jg push _else_11 jmp labl _if_11 push 1 push ret call push _end_11 jmp labl _else_11 push 0 push ret call labl _end_11 push _end_10 jmp labl _else_10 push 0 push ret call labl _end_10 push -1 push -6 stor pop pop pop jmp labl xor push -3 load push -3 load push -2 load push not call push -2 load push and call pop push -3 load push -3 load push not call push and call pop push or call pop push -1 push -6 stor pop pop pop jmp labl mul push -3 load push -3 load push -2 load push 0 push lr call pop push -2 load push 0 push lr call pop push xor call pop push 0 push _if_12 jg push _else_12 jmp labl _if_12 push -2 load push abs call push -2 load push abs call push mul call pop push neg call push _end_12 jmp labl _else_12 push -1 load push 0 push eq call pop push 0 push _if_13 jg push _else_13 jmp labl _if_13 push 0 push ret call push _end_13 jmp labl _else_13 push -2 load push abs call push -3 load push abs call push -3 load push abs call push dec call push mul call pop push add call pop labl _end_13 labl _end_12 push -1 push -6 stor pop pop pop jmp labl main push -2 load push -1 load push fact call push -1 push -4 stor pop pop jmp labl fact push -2 load push -1 load push 1 push lr call pop push 0 push _if_14 jg push _else_14 jmp labl _if_14 push 1 push ret call push _end_14 jmp labl _else_14 push -1 load push -2 load push dec call push fact call push mul call pop labl _end_14 push -1 push -4 stor pop pop jmp <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<pre><code class=\"bash\">$ .\/cvm build main.asm -o main.bcd $ .\/cvm run main.bcd &gt; 120<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>hexdump main.bcd<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ hexdump --format '16\/1 \"%02X \" \"\\n\"' main.bcd 0A 00 00 00 05 0A 00 00 06 D1 1C 1D 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A 00 00 00 29 0F 0A 00 00 00 00 0A 00 00 00 2E 0E 0A 00 00 00 01 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FE 1B 0A FF FF FF FE 1B 0A 00 00 00 0C 1C 0B 0A 00 00 00 00 0A 00 00 00 6B 0F 0A 00 00 00 7C 0E 0A 00 00 00 00 0A 00 00 01 33 1C 0A 00 00 00 BC 0E 0A FF FF FF FF 1B 0A FF FF FF FD 1B 0A 00 00 00 0C 1C 0B 0A 00 00 00 00 0A 00 00 00 A0 0F 0A 00 00 00 B1 0E 0A 00 00 00 00 0A 00 00 01 33 1C 0A 00 00 00 BC 0E 0A 00 00 00 01 0A 00 00 01 33 1C 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FE 1B 0C 0A FF FF FF FF 0A FF FF FF FD 1A 0B 0E 0A FF FF FF FE 1B 0A FF FF FF FF 1B 0A 00 00 00 CB 1C 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0B 0E 0A FF FF FF FE 1B 0D 0A FF FF FF FF 0A FF FF FF FD 1A 0B 0E 0A FF FF FF FE 1B 0A FF FF FF FF 1B 0A 00 00 00 FF 1C 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0B 0E 0A FF FF FF FE 1B 0A FF FF FF FF 1B 0A 00 00 00 DF 1C 0A 00 00 01 13 1C 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0B 0E 0A FF FF FF FE 1B 0A FF FF FF FF 1B 0A 00 00 00 00 0A 00 00 00 3B 1C 0B 0A 00 00 00 00 0A 00 00 01 82 0F 0A 00 00 01 93 0E 0A 00 00 00 01 0A 00 00 01 33 1C 0A 00 00 01 9E 0E 0A 00 00 00 00 0A 00 00 01 33 1C 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FE 1B 0A FF FF FF FE 1B 0A 00 00 00 0C 1C 0B 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FE 1B 0A FF FF FF FE 1B 0A 00 00 00 3B 1C 0B 0A 00 00 01 59 1C 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FE 1B 0A 00 00 00 00 0A 00 00 01 DA 1C 0B 0A 00 00 00 00 0A 00 00 02 3D 0F 0A 00 00 02 4E 0E 0A 00 00 00 01 0A 00 00 01 33 1C 0A 00 00 02 8D 0E 0A FF FF FF FF 1B 0A 00 00 00 00 0A 00 00 01 DA 1C 0B 0A 00 00 00 00 0A 00 00 02 71 0F 0A 00 00 02 82 0E 0A 00 00 00 01 0A 00 00 01 33 1C 0A 00 00 02 8D 0E 0A 00 00 00 00 0A 00 00 01 33 1C 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FE 1B 0A FF FF FF FE 1B 0A 00 00 00 3B 1C 0B 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A 00 00 01 AC 1C 0B 0A 00 00 02 0E 1C 0B 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FE 1B 0A FF FF FF FE 1B 0A 00 00 02 9C 1C 0B 0A 00 00 01 59 1C 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FF 1B 0A 00 00 00 00 0A 00 00 00 3B 1C 0B 0A 00 00 00 00 0A 00 00 03 47 0F 0A 00 00 03 59 0E 0A FF FF FF FE 1B 0A 00 00 01 33 1C 0A 00 00 03 C0 0E 0A FF FF FF FF 1B 0A 00 00 00 00 0A 00 00 02 E4 1C 0B 0A 00 00 00 00 0A 00 00 03 7C 0F 0A 00 00 03 A1 0E 0A FF FF FF FE 1B 0A FF FF FF FE 1B 0A 00 00 00 DF 1C 0A 00 00 03 18 1C 0B 0A 00 00 01 13 1C 0A 00 00 03 C0 0E 0A FF FF FF FE 1B 0A FF FF FF FE 1B 0A 00 00 01 13 1C 0A 00 00 03 18 1C 0B 0A 00 00 00 DF 1C 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FF 1B 0A 00 00 00 00 0A 00 00 00 3B 1C 0B 0A 00 00 00 00 0A 00 00 03 FE 0F 0A 00 00 04 10 0E 0A FF FF FF FE 1B 0A 00 00 01 33 1C 0A 00 00 04 77 0E 0A FF FF FF FF 1B 0A 00 00 00 00 0A 00 00 02 E4 1C 0B 0A 00 00 00 00 0A 00 00 04 33 0F 0A 00 00 04 58 0E 0A FF FF FF FE 1B 0A FF FF FF FE 1B 0A 00 00 00 DF 1C 0A 00 00 03 CF 1C 0B 0A 00 00 00 DF 1C 0A 00 00 04 77 0E 0A FF FF FF FE 1B 0A FF FF FF FE 1B 0A 00 00 01 13 1C 0A 00 00 03 CF 1C 0B 0A 00 00 01 13 1C 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FE 1B 0A 00 00 00 00 0A FF FF FF FE 1B 0A 00 00 03 CF 1C 0B 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0B 0E 0A FF FF FF FE 1B 0A FF FF FF FF 1B 0A 00 00 00 00 0A 00 00 02 E4 1C 0B 0A 00 00 00 00 0A 00 00 04 D5 0F 0A 00 00 04 E7 0E 0A FF FF FF FF 1B 0A 00 00 04 86 1C 0A 00 00 04 F3 0E 0A FF FF FF FF 1B 0A 00 00 01 33 1C 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FE 1B 0A 00 00 00 00 0A 00 00 01 DA 1C 0B 0A 00 00 00 00 0A 00 00 05 30 0F 0A 00 00 05 75 0E 0A FF FF FF FF 1B 0A 00 00 00 00 0A 00 00 01 DA 1C 0B 0A 00 00 00 00 0A 00 00 05 53 0F 0A 00 00 05 64 0E 0A 00 00 00 01 0A 00 00 01 33 1C 0A 00 00 05 6F 0E 0A 00 00 00 00 0A 00 00 01 33 1C 0A 00 00 05 80 0E 0A 00 00 00 00 0A 00 00 01 33 1C 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FE 1B 0A 00 00 01 59 1C 0A FF FF FF FE 1B 0A 00 00 05 01 1C 0B 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A 00 00 01 59 1C 0A 00 00 05 01 1C 0B 0A 00 00 02 0E 1C 0B 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FD 1B 0A FF FF FF FD 1B 0A FF FF FF FE 1B 0A 00 00 00 00 0A 00 00 02 E4 1C 0B 0A FF FF FF FE 1B 0A 00 00 00 00 0A 00 00 02 E4 1C 0B 0A 00 00 05 8F 1C 0B 0A 00 00 00 00 0A 00 00 06 2B 0F 0A 00 00 06 56 0E 0A FF FF FF FE 1B 0A 00 00 04 AC 1C 0A FF FF FF FE 1B 0A 00 00 04 AC 1C 0A 00 00 05 E3 1C 0B 0A 00 00 04 86 1C 0A 00 00 06 C2 0E 0A FF FF FF FF 1B 0A 00 00 00 00 0A 00 00 00 3B 1C 0B 0A 00 00 00 00 0A 00 00 06 79 0F 0A 00 00 06 8A 0E 0A 00 00 00 00 0A 00 00 01 33 1C 0A 00 00 06 C2 0E 0A FF FF FF FE 1B 0A 00 00 04 AC 1C 0A FF FF FF FD 1B 0A 00 00 04 AC 1C 0A FF FF FF FD 1B 0A 00 00 04 AC 1C 0A 00 00 01 13 1C 0A 00 00 05 E3 1C 0B 0A 00 00 03 18 1C 0B 0A FF FF FF FF 0A FF FF FF FA 1A 0B 0B 0B 0E 0A FF FF FF FE 1B 0A FF FF FF FF 1B 0A 00 00 06 F1 1C 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0B 0E 0A FF FF FF FE 1B 0A FF FF FF FF 1B 0A 00 00 00 01 0A 00 00 02 E4 1C 0B 0A 00 00 00 00 0A 00 00 07 1A 0F 0A 00 00 07 2B 0E 0A 00 00 00 01 0A 00 00 01 33 1C 0A 00 00 07 4A 0E 0A FF FF FF FF 1B 0A FF FF FF FE 1B 0A 00 00 01 13 1C 0A 00 00 06 F1 1C 0A 00 00 05 E3 1C 0B 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0B 0E<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439.<\/p>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/h4>\n<pre><code class=\"assembly\">labl start     ; A &lt;- 5     push 5     push fact     call     hlt ; A &lt;- fact(A) labl fact     ; B &lt;- A     push -2     load labl _fact_for     ; IF 2 &gt; B     push 2     push -2     load     push _fact_end     jg     ; ELSE     ; B &lt;- B - 1     push -1     load     dec     push -1     push -2     stor     pop     ; A &lt;- A * B     push -3     load     push -2     load     mul     push -1     push -4     stor     pop     push _fact_for     jmp labl _fact_end     ; return     pop     jmp <\/code><\/pre>\n<pre><code class=\"bash\">$ .\/cvm build main.asm -o main.bcd $ .\/cvm run main.bcd &gt; 120<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u0441\u0451 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0432\u0435\u0440\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>hexdump main.bcd<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">$ hexdump --format '16\/1 \"%02X \" \"\\n\"' main.bcd 0A 00 00 00 05 0A 00 00 00 0C 1C 1D 0A FF FF FF FE 1B 0A 00 00 00 02 0A FF FF FF FE 1B 0A 00 00 00 55 0F 0A FF FF FF FF 1B 0D 0A FF FF FF FF 0A FF FF FF FE 1A 0B 0A FF FF FF FD 1B 0A FF FF FF FE 1B C0 0A FF FF FF FF 0A FF FF FF FC 1A 0B 0A 00 00 00 12 0E 0B 0E<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u0438 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044f\u0437\u044b\u043a\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430, \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u0435\u0435 \u0443\u0436\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043f\u043e \u0442\u0438\u043f\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 ALLang). \u0412\u0435\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 <a href=\"https:\/\/github.com\/number571\/cvm\/blob\/master\/cvmkernel.c\" rel=\"noopener noreferrer nofollow\">cvmkernel.c<\/a> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f cvm.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/870938\/\"> https:\/\/habr.com\/ru\/articles\/870938\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0437\u0430\u043d\u044f\u0442\u0438\u0435\u043c \u043d\u0430 \u0432\u0435\u0447\u0435\u0440, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u044f\u0437\u044b\u043a\u0443 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\u0445 \u041e\u0410\u0438\u041f (\u043e\u0441\u043d\u043e\u0432\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u0438 \u0410\u0410\u0421 (\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432). \u0426\u0435\u043b\u044c\u044e \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c <strong>\u044f\u0437\u044b\u043a\u043e\u043c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430<\/strong>, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0438 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432, \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0441\u0435\u043b, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0441\u0442\u0435\u043a. \u041c\u0430\u0448\u0438\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u043b\u0438\u0448\u044c <strong>10-\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438<\/strong>, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u0435\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b<\/h2>\n<p>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043d\u0443\u0436\u043d\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u043c\u044f\u0442\u044c. \u041f\u0430\u043c\u044f\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0434\u0432\u0443\u043c\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0421\u0442\u0435\u043a \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 <strong>32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b<\/strong>. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">#define CVM_KERNEL_SMEMORY (1 &lt;&lt; 10) \/\/ Stack = 1024 INT32 #define CVM_KERNEL_CMEMORY (4 &lt;&lt; 10) \/\/ Code  = 4096 BYTE<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0432 \u0442\u043e\u043c \u043b\u0438\u0448\u044c \u043f\u043b\u0430\u043d\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043a\u0430\u043a: add, sub, mul, div, shift, not, xor, or, and, je, jl, jge, jle \u0438 \u0442.\u0434. \u0412 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0435, <strong>\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0437\u043c<\/strong> &#8212; \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c: <\/p>\n<pre><code class=\"cpp\">enum { C_PUSH = 0x0A, \/\/ 5 bytes C_POP  = 0x0B, \/\/ 1 byte C_INC  = 0x0C, \/\/ 1 byte C_DEC  = 0x0D, \/\/ 1 byte C_JMP  = 0x0E, \/\/ 1 byte C_JG   = 0x0F, \/\/ 1 byte C_STOR = 0x1A, \/\/ 1 byte C_LOAD = 0x1B, \/\/ 1 byte C_CALL = 0x1C, \/\/ 1 byte C_HLT  = 0x1D, \/\/ 1 byte };<\/code><\/pre>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <strong>push<\/strong> \u0431\u0443\u0434\u0435\u0442 \u043a\u043b\u0430\u0441\u0442\u044c 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <strong>pop<\/strong> \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <strong>inc, dec<\/strong> &#8212; \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a\u0435. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <strong>jmp, jg<\/strong> &#8212; \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 (x&gt;y) \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b. <strong>stor, load<\/strong> &#8212; \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \/ \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \/ \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0442\u0435\u043a\u0430. <strong>call<\/strong> &#8212; \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0432 \u0441\u0442\u0435\u043a \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 jmp.<strong> hlt<\/strong> &#8212; \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439. \u0412\u0441\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c push \u0438 hlt, \u0431\u0435\u0440\u0443\u0442 \u0441\u0432\u043e\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f hlt \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043e\u0432\u0441\u0435, \u0430 \u0432\u043e\u0442 push &#8212; \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0435\u0439 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043a, \u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 \u0441\u0430\u043c\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0446\u0435\u043b\u044b\u0445 5 \u0431\u0430\u0439\u0442, \u0445\u043e\u0442\u044f \u0435\u0451 \u043e\u043f\u043a\u043e\u0434 \u043d\u0430 \u0434\u0435\u043b\u0435 \u0440\u0430\u0432\u0435\u043d \u0432\u0441\u0451 \u0442\u0430\u043a\u0436\u0435 \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443. <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u043a\u0430\u043a\u043e\u0435-\u043b\u0438\u0431\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043e\u043f\u043a\u043e\u0434\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u0431\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u0445, \u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0438\u0445 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0431\u044b \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430. \u041d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u044f\u0434 \u043c\u0438\u043d\u0443\u0441\u043e\u0432: 1) \u0441\u043b\u043e\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0432\u0441\u0435 16-\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430 \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f, 2) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0431\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0430 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c, \u0447\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0431\u043e\u0440\u043e\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0438\u043d\u0443\u0441\u044b, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0432 \u0440\u043e\u043b\u0438 \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u043e\u0432, \u0442.\u0435. \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 `<strong>push 5, jmp<\/strong>` \u0432 0x0A 0x00 0x00 0x00 0x05, 0x0E. <\/p>\n<p>\u0412 \u0441\u043b\u043e\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0435\u0449\u0451 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u044e\u0441, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438 \u0431\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u0418\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u043b\u0435\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0438 \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0438 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432. \u041a \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c, \u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439.<\/p>\n<pre><code class=\"cpp\">enum {   C_CMNT = 0x11, \/\/ 0 bytes, comment   C_LABL = 0x22, \/\/ 0 bytes, label   C_UNDF = 0xAA, \/\/ 0 bytes, undefined mnemonic   C_VOID = 0xBB, \/\/ 0 bytes, void string }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u0434\u0432\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u043c \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435 \u043a\u043e\u0434\u0430 &#8212; \u043f\u0443\u0441\u0442\u0430\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435, \u0447\u0442\u043e \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a \u043d\u0435 \u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d. \u041f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f C_VOID \u0441\u0445\u043e\u0436\u0430 \u0441 C_CMNT, \u0442.\u043a. \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435\u044f\u0432\u043d\u0430\u044f \u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \/ \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u043f\u0443\u0441\u0442\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 (\u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432). C_UNDF \u0441\u043b\u0443\u0436\u0438\u0442 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0447\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u043d\u0435 \u0431\u044b\u043b \u0435\u044e \u043d\u0430\u0439\u0434\u0435\u043d. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 C_VOID, C_UNDF \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043c\u044b \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b:<\/p>\n<pre><code class=\"cpp\">#define CVM_KERNEL_ISIZE 14  static struct virtual_machine { int32_t cmused; uint8_t memory[CVM_KERNEL_CMEMORY]; struct { uint8_t bcode; char *mnem; } bclist[CVM_KERNEL_ISIZE]; } VM = { .cmused = 0, .bclist = {       { C_VOID, \"\\0\"   }, \/\/ 0 arg { C_UNDF, \"\\1\"   }, \/\/ 0 arg { C_CMNT, \";\"    }, \/\/ 0 arg { C_LABL, \"labl\" }, \/\/ 1 arg { C_PUSH, \"push\" }, \/\/ 1 arg, 0 stack { C_POP,  \"pop\"  }, \/\/ 0 arg, 1 stack { C_INC,  \"inc\"  }, \/\/ 0 arg, 1 stack { C_DEC,  \"dec\"  }, \/\/ 0 arg, 1 stack { C_JMP,  \"jmp\"  }, \/\/ 0 arg, 1 stack { C_JG,   \"jg\"   }, \/\/ 0 arg, 3 stack { C_STOR, \"stor\" }, \/\/ 0 arg, 2 stack { C_LOAD, \"load\" }, \/\/ 0 arg, 1 stack { C_CALL, \"call\" }, \/\/ 0 arg, 1 stack { C_HLT,  \"hlt\"  }, \/\/ 0 arg, 0 stack }, };<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0438 \u043f\u043e\u043b\u044f: <strong>cmused<\/strong> &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, memory &#8212; \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430, <strong>bclist<\/strong> &#8212; \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u043e\u0432 \u0438 \u043e\u043f\u043a\u043e\u0434\u043e\u0432. <\/p>\n<h2>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u043a\u043e\u0434 &#8212; \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0437 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0434\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u0438 \u0432 \u0438\u0434\u0435\u0430\u043b\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u0431\u044b\u0442\u044c \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u0430 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u043a\u043e\u0434\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. <\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430: 1) \u043f\u0440\u043e\u0445\u043e\u0434 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u043e\u043a \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, 2) \u043f\u0440\u043e\u0445\u043e\u0434 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u043e\u0432 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u044d\u0442\u0430\u043f\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0432\u043c\u0435\u0441\u0442\u0435, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0442\u043a\u0438 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u044b \u0432 \u043b\u044e\u0431\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430. <\/p>\n<p>\u0421\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u0434\u0430, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430.  <\/p>\n<pre><code class=\"cpp\">hashtab_t *hashtab; int32_t bindex; char buffer[BUFSIZ]; char *arg; uint8_t opcode;  hashtab = hashtab_new(512); bindex = 0;  \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 input while(fgets(buffer, BUFSIZ, input) != NULL) {     \/\/ \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e,      \/\/ \u0432 opcode \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0451 \u043d\u043e\u043c\u0435\u0440 (\u0438\u0437 enum),     \/\/ \u0432 arg \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438     arg = read_opcode(buffer, &amp;opcode);      \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 -&gt; \u0432\u044b\u0434\u0430\u0451\u043c \u043e\u0448\u0438\u0431\u043a\u0443     if (opcode == C_UNDF) {         hashtab_free(hashtab);         return 1;     }      \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f = \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430,     \/\/ \u0442\u043e\u0433\u0434\u0430 \u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e     if(opcode == C_CMNT || opcode == C_VOID) {         continue;     }      switch(opcode) {         \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f = \u043c\u0435\u0442\u043a\u0430, \u0442\u043e\u0433\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u043e\u0434\u0430         case C_LABL:             \/\/ \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439             if (strlen(arg) == 0 || str_is_number(arg)) { return 2; }             \/\/ agr = \u0438\u043c\u044f \u043c\u0435\u0442\u043a\u0438, bindex = \u0430\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0438             hashtab_set(hashtab, arg, &amp;bindex, sizeof(bindex));         break;         \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f = push, \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 +5 \u0431\u0430\u0439\u0442          case C_PUSH:             bindex += 5;         break;         \/\/ \u0441\u0434\u0432\u0438\u0433 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0440\u0430\u0432\u0435\u043d +1 \u0431\u0430\u0439\u0442         default:             bindex += 1;         break;     } }  ...<\/code><\/pre>\n<p> \u041a\u043e\u0434 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f &#8212; \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u043f\u043a\u043e\u0434\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0438\u043c\u0451\u043d \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">  ...    \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e   fseek(input, 0, SEEK_SET);    \/\/ \u0441\u043d\u043e\u0432\u0430 \u0447\u0438\u0442\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 input   while(fgets(buffer, BUFSIZ, input) != NULL) {       arg = read_opcode(buffer, &amp;opcode);       switch (opcode) {           \/\/ \u0435\u0441\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439,            \/\/ \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0451           case C_VOID: case C_CMNT: case C_LABL:           break;           \/\/ \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f push, \u0442\u043e\u0433\u0434\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u0443\u0435\u043c \u0435\u0451           \/\/ \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (\u0437\u0430 \u0441\u0447\u0451\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430)           case C_PUSH:                \/\/ \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c               if (strlen(arg) == 0) {                   return 3;               }               compile_push(output, hashtab, arg);           break;           \/\/ \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e           \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0451 \u043e\u043f\u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b           default:               fprintf(output, \"%c\", opcode);           break;       }   }    \/\/ \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0443\u0441\u043f\u0435\u0445\u043e\u043c    hashtab_free(hashtab);   return 0;<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u043a, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0430\u0434\u0440\u0435\u0441, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e compile_push. \u042d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f push \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438 \u0438\u043c\u0435\u043d\u0430 \u043c\u0435\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430. <\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0430\u0439\u043b hashtab.h<\/p>\n<pre><code class=\"cpp\">#ifndef EXTCLIB_TYPE_HASHTAB_H_ #define EXTCLIB_TYPE_HASHTAB_H_  typedef struct hashtab_t hashtab_t;  extern hashtab_t *hashtab_new(int size); extern void hashtab_free(hashtab_t *ht);  extern void *hashtab_get(hashtab_t *ht, char *key); extern int hashtab_set(hashtab_t *ht, char *key, void *elem, int size); extern int hashtab_del(hashtab_t *ht, char *key);  #endif \/* EXTCLIB_TYPE_HASHTAB_H_ *\/ <\/code><\/pre>\n<p>\u0424\u0430\u0439\u043b hashtab.c<\/p>\n<pre><code class=\"cpp\">#include \"hashtab.h\" #include \"list.h\"  #include &lt;stdlib.h&gt; #include &lt;string.h&gt;  typedef <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-443890","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/443890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=443890"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/443890\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=443890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=443890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=443890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}