{"id":371754,"date":"2024-05-21T04:55:57","date_gmt":"2024-05-21T04:55:57","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=371754"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=371754","title":{"rendered":"<span>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430 \u0432\u0438\u043d\u0442\u0438\u043a\u0438 \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 TOY<\/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<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h4>\n<p>TOY &#8212; \u044d\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 (\u0445\u043e\u0442\u044f \u0431\u044b\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0435\u0433\u043e <a href=\"http:\/\/asic.ethz.ch\/1987\/Toy2.html\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u043f\u043b\u043e\u0449\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/a>). \u0415\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u043e\u0440 Phil Koopman \u0432 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"http:\/\/users.ece.cmu.edu\/~koopman\/misc\/byte87a.pdf\" rel=\"noopener noreferrer nofollow\">Microcoded Versus Hard-wired Control<\/a> \u0435\u0449\u0451 \u0432 1987 \u0433\u043e\u0434\u0443. TOY \u0438\u0437\u0443\u0447\u0430\u044e\u0442 \u043d\u0430 \u043f\u0430\u0440\u0430\u0445 \u043f\u043e Computer Science \u0432 \u041f\u0440\u0438\u043d\u0441\u0442\u043e\u043d\u0441\u043a\u043e\u043c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0435. <\/p>\n<p>\u042f \u0432\u0437\u044f\u043b <a href=\"https:\/\/www.cs.princeton.edu\/courses\/archive\/spr05\/cos126\/lectures\/12.pdf\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u0430\u0439\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043d\u0430 \u0437\u0430\u043d\u044f\u0442\u0438\u044f\u0445<\/a> \u0438 \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043b \u0432\u0441\u0451 \u043f\u043e \u043f\u043e\u043b\u043e\u0447\u043a\u0430\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a5a\/b40\/bad\/a5ab40bad31adfefca843ee6b45250f9.png\" alt=\"\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 TOY\" title=\"\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 TOY\" width=\"1665\" height=\"843\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a5a\/b40\/bad\/a5ab40bad31adfefca843ee6b45250f9.png\"\/><\/p>\n<div><figcaption>\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 TOY<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e-\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e<\/p>\n<\/li>\n<li>\n<p>16 16-\u0431\u0438\u0442\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>256 16-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>\u043e\u0434\u0438\u043d 8-\u0431\u0438\u0442\u043d\u044b\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434<\/p>\n<\/li>\n<li>\n<p>16 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435 \u0433\u0443\u0441\u0442\u043e. \u041a\u0430\u043a \u0433\u0434\u0435-\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u043b\u0438: &#171;\u041c\u0430\u0448\u0438\u043d\u0430 \u0422\u044c\u044e\u0440\u0438\u043d\u0433\u0430 \u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u043a\u0430\u0445&#187;. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043a\u0435\u043b\u0435\u0442 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0430 Python:<\/p>\n<pre><code class=\"python\">class Toy: def __init__(self):         self.registers = self.Registers()         self.memory = self.Memory()         self.alu = self.ALU()         self.pc = 0x10<\/code><\/pre>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<h4>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 \u043f\u0430\u043c\u044f\u0442\u044c<\/h4>\n<p>\u0412 TOY 16 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u043e 16 \u0431\u0438\u0442 \u0438 256 \u044f\u0447\u0435\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e 16 \u0431\u0438\u0442. \u041e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code class=\"python\">class Registers:     __REGISTERS_NUM = 16          def __init__(self):         self.image = [0 for i in range(self.__REGISTERS_NUM)]      def read(self, addr):         return self.image[addr]      def write(self, addr, data):         self.image[addr] = data  class Memory:     __MEMORY_SIZE = 255          def __init__(self):         self.image = [0 for i in range(self.__MEMORY_SIZE)]      def read(self, addr):         return self.image[addr]      def write(self, addr, data):         self.image[addr] = data<\/code><\/pre>\n<h4>\u0421\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434<\/h4>\n<p>\u0421\u0447\u0451\u0442\u0447\u0438\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Program_counter\" rel=\"noopener noreferrer nofollow\">program counter<\/a> &#8212; \u044d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432\u0434\u043e\u043b\u044c \u0432\u0441\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044f \u044d\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0412 TOY \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 16 (0x10):<\/p>\n<pre><code class=\"python\">class Toy: def __init__(self):         self.pc = 0x10<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0442\u0438\u043f\u0430 &#171;Jump&#187; \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u0432\u043f\u0435\u0440\u0451\u0434 \u0438\u043b\u0438 \u043d\u0430\u0437\u0430\u0434:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fc0\/176\/719\/fc0176719bd2fcfd10c185f88605deaf.png\" alt=\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438: \u043a \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 PC \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f 1\" title=\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438: \u043a \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 PC \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f 1\" width=\"638\" height=\"196\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc0\/176\/719\/fc0176719bd2fcfd10c185f88605deaf.png\"\/><\/p>\n<div><figcaption>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438: \u043a \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 PC \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f 1<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a66\/0da\/06b\/a660da06b82dd974bec82e002a74f942.png\" alt=\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 Jump\" title=\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 Jump\" width=\"649\" height=\"205\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a66\/0da\/06b\/a660da06b82dd974bec82e002a74f942.png\"\/><\/p>\n<div><figcaption>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 Jump<\/figcaption><\/div>\n<\/figure>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 (Instruction Set Architecture)<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e &#8212; \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 (opcode), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f TOY \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 16 \u0431\u0438\u0442 \u0432 \u0434\u0432\u0443\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"left\"><strong>\u0411\u0438\u0442\u044b \/ \u0424\u043e\u0440\u043c\u0430\u0442<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">[15:12]<\/p>\n<\/td>\n<td>\n<p align=\"left\">[11:8]<\/p>\n<\/td>\n<td>\n<p align=\"left\">[7:4]<\/p>\n<\/td>\n<td>\n<p align=\"left\">[3:0]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"left\"><strong>RR<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">opcode<\/p>\n<\/td>\n<td>\n<p align=\"left\">destination d<\/p>\n<\/td>\n<td>\n<p align=\"left\">source s<\/p>\n<\/td>\n<td>\n<p align=\"left\">source t<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"left\"><strong>A<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">opcode<\/p>\n<\/td>\n<td>\n<p align=\"left\">destination d<\/p>\n<\/td>\n<td colspan=\"2\">\n<p align=\"left\">address<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 (instruction fetch) \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u0442\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">def fetch(self):     instruction = self.memory.read(self.pc)     opcode = (instruction &amp; 0xF000) >> 12     d      = (instruction &amp; 0x0F00) >> 8     s      = (instruction &amp; 0x00F0) >> 4     t      = (instruction &amp; 0x000F)     addr   = (instruction &amp; 0x00FF)     self.pc = self.pc + 1     return opcode, d, s, t, addr<\/code><\/pre>\n<p>TOY \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u043e 16 \u043a\u043e\u043c\u0430\u043d\u0434 (\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\"><strong>\u041a\u043e\u0434 (HEX)<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\"><strong>\u041a\u043e\u043c\u0430\u043d\u0434\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0424\u043e\u0440\u043c\u0430\u0442<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041f\u0441\u0435\u0432\u0434\u043e-\u043a\u043e\u0434<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">0<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">halt<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\"> halt<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">1<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">add<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] + R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">substract<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] &#8212; R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">3<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">and<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] &amp; R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">4<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">xor<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] ^ R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">5<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">shift left<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] &lt;&lt; R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">6<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">shift right<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] >> R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">7<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">load address<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = addr<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">load<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = M[addr]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">9<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">store<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> M[addr] = R[d]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">A<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">load indirect<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = M[R[t]]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">B<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">store indirect<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> M[R[t]] = R[d]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">C<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">branch zero<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> if (R[d] == 0) PC = addr<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">D<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">branch positive <\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> if (R[d] > 0) PC = addr<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">E<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">jump register<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> PC = R[d]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">F<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">jump and link<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = PC + 1; PC = addr<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0427\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0430\u0445? \u0422\u0430\u043a \u043f\u0430\u0445\u043d\u0443\u0442 \u0431\u0435\u0441\u0441\u043e\u043d\u043d\u044b\u0435 \u043d\u043e\u0447\u0438, \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0433\u043b\u0430\u0437\u0430 \u0438 \u0435\u0433\u043e \u0432\u0435\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e&#8230; \u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440!<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435\u0433\u043e 16 \u043a\u043e\u043c\u0430\u043d\u0434. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0436\u0435 \u0432 50-\u043b\u0435\u0442\u043d\u0435\u043c Intel 4004 \u0438\u0445 \u0431\u044b\u043b\u043e 52, \u0430 \u0432 x86 \u0432\u043e\u043e\u0431\u0449\u0435 1502. \u041d\u043e \u0434\u0430\u0436\u0435 \u044d\u0442\u0438\u0445 16-\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u041b\u042e\u0411\u041e\u0413\u041e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. <\/p>\n<pre><code class=\"python\">def op_halt(self, d, s, t, addr):     print('HALT')     exit()  def op_add(self, d, s, t, addr): # R[d] = R[s] + R[t]     self.registers.write(d, self.registers.read(s) + self.registers.read(t))  def op_sub(self, d, s, t, addr): # R[d] = R[s] - R[t]     self.registers.write(d, self.registers.read(s) - self.registers.read(t))      def op_and(self, d, s, t, addr): # R[d] = R[s] &amp; R[t]     self.registers.write(d, self.registers.read(s) &amp; self.registers.read(t))      def op_xor(self, d, s, t, addr): # R[d] = R[s] ^ R[t]     self.registers.write(d, self.registers.read(s) ^ self.registers.read(t))      def op_shl(self, d, s, t, addr): # R[d] = R[s] &lt;&lt; R[t]     self.registers.write(d, self.registers.read(s) &lt;&lt; self.registers.read(t))      def op_shr(self, d, s, t, addr): # R[d] = R[s] >> R[t]     self.registers.write(d, self.registers.read(s) >> self.registers.read(t))      def op_loada(self, d, s, t, addr): # R[d] = addr     self.registers.write(d, addr)      def op_load(self, d, s, t, addr): # R[d] = M[addr]     self.registers.write(d, self.memory.read(addr))      def op_stor(self, d, s, t, addr): # M[addr] = R[d]     self.memory.write(addr, self.registers.read(d))      def op_loadi(self, d, s, t, addr): # R[d] = M[R[t]]     self.registers.write(d, self.registers.read(t))      def op_stori(self, d, s, t, addr): # M[R[t]] = R[d]     self.memory.write(self.registers.read(t), self.registers.read(d))      def op_bzero(self, d, s, t, addr): # if (R[d] == 0) PC = addr     if self.registers.read(d) == 0:         self.pc = addr      def op_bposi(self, d, s, t, addr): # if (R[d] > 0) PC = addr     if self.registers.read(d) > 0:         self.pc = addr      def op_jmpr(self, d, s, t, addr): # PC = R[d]     self.pc = self.registers.read(d)      def op_jmpl(self, d, s, t, addr): # R[d] = PC + 1; PC = addr     self.registers.write(d, self.pc)     self.pc = addr<\/code><\/pre>\n<p>\u0418 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043a\u043e\u0434\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<pre><code class=\"python\">execute = {     0x0: op_halt,     0x1: op_add,     0x2: op_sub,     0x3: op_and,     0x4: op_xor,     0x5: op_shl,     0x6: op_shr,     0x7: op_loada,     0x8: op_load,     0x9: op_stor,     0xA: op_loadi,     0xB: op_stori,     0xC: op_bzero,     0xD: op_bposi,     0xE: op_jmpr,     0xF: op_jmpl }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0431\u043e\u0442\u0430 TOY (\u043a\u0430\u043a \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430) \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def start(self):     while True:         op, d, s, t, addr = self.fetch()         self.execute[op](self, d, s, t, addr)<\/code><\/pre>\n<p>\u0422.\u0435. \u043f\u043e \u0441\u0443\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 (<strong>fetch<\/strong>) \u0438 \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (<strong>execute<\/strong>).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/faf\/c95\/953\/fafc95953c711ccc7ddbf549ad3997c4.png\" width=\"626\" height=\"289\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/faf\/c95\/953\/fafc95953c711ccc7ddbf549ad3997c4.png\"\/><\/figure>\n<h4>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/h4>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432:<\/p>\n<pre><code class=\"python\">def start(self):     while True:         op, d, s, t, addr = self.fetch()         execute[op](self, d, s, t, addr)                  # debug registers         print(\"Regs: \", self.registers.image)<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440:<\/p>\n<pre><code class=\"python\">computer = Toy() computer.memory.write(0x10, 0x7328) # R[3] = 40 computer.memory.write(0x11, 0x7464) # R[4] = 100 computer.memory.write(0x12, 0x1234) # R[2] = R[3] + R[4] computer.start()<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x10, \u0442.\u043a. \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c:<\/p>\n<pre><code class=\"python\"># python toy.py Regs:  [0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] Regs:  [0, 0, 0, 40, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] Regs:  [0, 0, 140, 40, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] HALT<\/code><\/pre>\n<p>\u041e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<h2>\u0423\u0433\u043b\u0443\u0431\u043b\u044f\u0435\u043c\u0441\u044f<\/h2>\n<p>\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u0435\u043c, \u0437\u0430\u0432\u0435\u043b\u043e\u0441\u044c! \u041d\u043e \u043a\u0430\u043a-\u0442\u043e \u0432\u0441\u0451 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c&#8230; \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u043a\u0430\u0440\u043a\u0430\u0441\u0435 \u0434\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0430\u043c\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0438\u0441\u0442\u043e\u0440\u043e\u0432. \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0410\u041b\u0423.<\/p>\n<h4>\u0410\u041b\u0423<\/h4>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u0438\u043b\u0430\u043c\u0438 Python, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0410\u041b\u0423. \u041e\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0442\u044c, \u043e\u0442\u043d\u0438\u043c\u0430\u0442\u044c, \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0431\u0438\u0442\u044b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c AND \u0438 XOR. &#171;\u042d\u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u0420\u0438\u043e-\u0434\u0435-\u0416\u0430\u043d\u0435\u0439\u0440\u043e&#187;, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u0430\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0437\u0430 \u043e\u0434\u043d\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d88\/8cc\/bf0\/d888ccbf0997d61a490665975721a4fa.png\" width=\"764\" height=\"570\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d88\/8cc\/bf0\/d888ccbf0997d61a490665975721a4fa.png\"\/><\/figure>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0447\u0438\u0441\u0435\u043b. \u041b\u044e\u0431\u0430\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/136\/bb6\/b51\/136bb6b51b934aff8652dede2ad518a8.png\" width=\"368\" height=\"364\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/136\/bb6\/b51\/136bb6b51b934aff8652dede2ad518a8.png\"\/><\/figure>\n<p>\u0414\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7c2\/044\/226\/7c204422623740c51eafc21b626d1482.png\" alt=\"Half adder\" title=\"Half adder\" width=\"472\" height=\"214\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7c2\/044\/226\/7c204422623740c51eafc21b626d1482.png\"\/><\/p>\n<div><figcaption>Half adder<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043b\u0438 \u0432\u044b\u0440\u0430\u0436\u0430\u044f\u0441\u044c \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\">half_adder = lambda a, b: (a ^ b, a &amp; b)<\/code><\/pre>\n<p>\u0418\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0443\u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D1%83%D0%BC%D0%BC%D0%B0%D1%82%D0%BE%D1%80\" rel=\"noopener noreferrer nofollow\">\u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/955\/f8e\/078\/955f8e078716b3c386648ae54f1cfebb.png\" alt=\"Full adder\" title=\"Full adder\" width=\"839\" height=\"397\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/955\/f8e\/078\/955f8e078716b3c386648ae54f1cfebb.png\"\/><\/p>\n<div><figcaption>Full adder<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043b\u0438:<\/p>\n<pre><code class=\"python\">def full_adder(self, a, b, carry_in):     half_adder = lambda a, b: (a ^ b, a &amp; b)     s1, c1 = half_adder(a, b)     sum, c2 = half_adder(carry_in, s1)     return sum, c1 | c2<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0445\u0435\u043c\u0443 \u0410\u041b\u0423, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/739\/023\/506\/739023506e64f9328e0d066a00ba693a.png\" width=\"1370\" height=\"368\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/739\/023\/506\/739023506e64f9328e0d066a00ba693a.png\"\/><\/figure>\n<p>\u041d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0432\u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <strong>substract<\/strong> \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440\u0430, \u0438 \u043e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440-<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%92%D1%8B%D1%87%D0%B8%D1%82%D0%B0%D1%82%D0%B5%D0%BB%D1%8C\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c<\/a>:<\/p>\n<pre><code class=\"python\">def adder_substractor(self, a, b, carry_in, substract): return self.full_adder(a, b ^ substract, carry_in)<\/code><\/pre>\n<p>\u0414\u043e\u0432\u0435\u0434\u0451\u043c \u0441\u0445\u0435\u043c\u0443 \u0434\u043e 16 \u0431\u0438\u0442:<\/p>\n<pre><code class=\"python\">def adder_substractor(self, input1, input2, substract):   result_byte = 0   carry = substract   bit_from_byte = lambda byte, position: (byte &amp; (1 &lt;&lt; position)) >> position   for position in range(self.DATA_RESOLUTION):       bit1 = bit_from_byte(input1, position)       bit2 = bit_from_byte(input2, position)       result_bit, carry = self.full_adder(bit1, bit2 ^ carry, carry)       result_byte |= (result_bit &lt;&lt; position)   return result_byte<\/code><\/pre>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u043d\u044f\u0442\u0435\u043d, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 \u0410\u041b\u0423<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class ALU:     __DATA_RESOLUTION = 16     __CTRL_ADD_SUB= 0b000     __CTRL_AND= 0b001     __CTRL_XOR= 0b010     __CTRL_SHIFT= 0b011     __CTRL_INPUT2= 0b100      __SUBSTRACT_RESET = 0b0     __SUBSTRACT_SET   = 0b1      __SHIFT_RIGHT = 0b0     __SHIFT_LEFT  = 0b1      def __full_adder(self, a, b, carry_in):         half_adder = lambda a, b: (a ^ b, a &amp; b)         s1, c1 = half_adder(a, b)         sum, c2 = half_adder(carry_in, s1)         return sum, c1 | c2      def __adder_substractor(self, a, b, cr, sub):         return self.__full_adder(a, b ^ sub, cr)          def __alu(self, input1, input2, substract, shift_dir, ctrl):         result_byte = 0         if ctrl == self.__CTRL_ADD_SUB:             carry = substract             bit_from_byte = lambda byte, position: (byte &amp; (1 &lt;&lt; position)) >> position             for position in range(self.__DATA_RESOLUTION):                 bit1 = bit_from_byte(input1, position)                 bit2 = bit_from_byte(input2, position)                 result_bit, carry = self.__adder_substractor(bit1, bit2, carry, substract)                 result_byte |= (result_bit &lt;&lt; position)         elif ctrl == self.__CTRL_AND:             result_byte = input1 &amp; input2         elif ctrl == self.__CTRL_XOR:             result_byte = input1 ^ input2         elif ctrl == self.__CTRL_SHIFT:             if shift_dir == self.__SHIFT_LEFT:                 result_byte = input1 &lt;&lt; (input2 &amp; 0b1111) # 16 steps max, only 4 bits in use             else:                 result_byte = input1 >> (input2 &amp; 0b1111) # 16 steps max, only 4 bits in use         elif ctrl == self.__CTRL_INPUT2:             result_byte = input2          return result_byte      def Add(self, input1, input2):         return self.__alu(input1, input2, self.__SUBSTRACT_RESET, self.__SHIFT_RIGHT, self.__CTRL_ADD_SUB)      def Sub(self, input1, input2):         return self.__alu(input1, input2, self.__SUBSTRACT_SET,   self.__SHIFT_RIGHT, self.__CTRL_ADD_SUB)      def And(self, input1, input2):         return self.__alu(input1, input2, self.__SUBSTRACT_RESET, self.__SHIFT_RIGHT, self.__CTRL_AND)      def Xor(self, input1, input2):         return self.__alu(input1, input2, self.__SUBSTRACT_RESET, self.__SHIFT_RIGHT, self.__CTRL_XOR)      def Shiftl(self, input1, input2):         return self.__alu(input1, input2, self.__SUBSTRACT_RESET, self.__SHIFT_LEFT,  self.__CTRL_SHIFT)      def Shiftr(self, input1, input2):         return self.__alu(input1, input2, self.__SUBSTRACT_RESET, self.__SHIFT_RIGHT, self.__CTRL_SHIFT)          def Input2(self, input1, input2):         return self.__alu(input1, input2, self.__SUBSTRACT_RESET, self.__SHIFT_RIGHT, self.__CTRL_INPUT2)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>\u0415\u0449\u0451 \u0440\u0430\u0437 \u043f\u0440\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b<\/h4>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8c6\/b90\/0f7\/8c6b900f722c8509acf55000a837790b.png\" width=\"981\" height=\"797\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8c6\/b90\/0f7\/8c6b900f722c8509acf55000a837790b.png\"\/><\/figure>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 &#8212; \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430, \u0442\u043e \u0437\u0430 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u0442\u0443\u0442 \u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<pre><code class=\"python\">computer.memory.write(0x10, 0x7328) # R[3] = 40 computer.memory.write(0x11, 0x7464) # R[4] = 100 computer.memory.write(0x12, 0x1234) # R[2] = R[3] + R[4]<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bdc\/5bd\/35b\/bdc5bd35bc7ba8dd8f2351952839d664.png\" alt=\"Fetch\" title=\"Fetch\" width=\"824\" height=\"655\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bdc\/5bd\/35b\/bdc5bd35bc7ba8dd8f2351952839d664.png\"\/><\/p>\n<div><figcaption>Fetch<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x12 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 3 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0x28, \u0430 \u0432 4 &#8212;  0x64. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 <strong>op<\/strong>, <strong>d<\/strong>, <strong>s<\/strong> \u0438 <strong>t<\/strong>. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/045\/886\/c57\/045886c57bf4121a21ae888ae16fefb6.png\" alt=\"Execute\" title=\"Execute\" width=\"902\" height=\"643\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/045\/886\/c57\/045886c57bf4121a21ae888ae16fefb6.png\"\/><\/p>\n<div><figcaption>Execute<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0448\u0438\u043d\u044b <strong>A Addr<\/strong> \u0438 <strong>B Addr<\/strong> \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 3 \u0438 4. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 3 \u0438 4 \u043e\u0442\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0410\u041b\u0423 \u043f\u043e \u0448\u0438\u043d\u0430\u043c <strong>A Data<\/strong> \u0438 <strong>B Data<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0448\u0438\u043d\u0443 <strong>W Data<\/strong> \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u043d\u0430 \u0448\u0438\u043d\u0435 <strong>W Addr<\/strong>. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0437\u0430 \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u0442!<\/p>\n<pre><code class=\"python\">def op_add(self, d, s, t, addr): # R[d] = R[s] + R[t]     a_data, b_data = self.registers.read(s, t)     w_data = self.alu.Add(a_data, b_data)     self.registers.write(w_data, d)  def op_sub(self, d, s, t, addr): # R[d] = R[s] - R[t]     a_data, b_data = self.registers.read(s, t)     w_data = self.alu.Sub(a_data, b_data)     self.registers.write(w_data, d)  ...<\/code><\/pre>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f. \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 (\u041e\u0417\u0423, \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0438\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a) \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 NAND \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0445 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430. \u042d\u0444\u0444\u0435\u043a\u0442 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e\u0441\u0442\u0438: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u0438\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/2db\/31d\/2f6\/2db31d2f672aff7ce04907f17b6f1885.jpg\" width=\"865\" height=\"839\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2db\/31d\/2f6\/2db31d2f672aff7ce04907f17b6f1885.jpg\" data-blurred=\"true\"\/><\/figure>\n<h3>\u041f\u0430\u043c\u044f\u0442\u044c \u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430<\/h3>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ba6\/34d\/4aa\/ba634d4aae941f8c040dc2a1b2cdc3b6.png\" alt=\"\u0421\u043f\u0440\u0430\u0432\u0430 \u0432\u043d\u0438\u0437\u0443 \u044f\u0447\u0435\u0439\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 FF\" title=\"\u0421\u043f\u0440\u0430\u0432\u0430 \u0432\u043d\u0438\u0437\u0443 \u044f\u0447\u0435\u0439\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 FF\" width=\"743\" height=\"577\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ba6\/34d\/4aa\/ba634d4aae941f8c040dc2a1b2cdc3b6.png\"\/><\/p>\n<div><figcaption>\u0421\u043f\u0440\u0430\u0432\u0430 \u0432\u043d\u0438\u0437\u0443 \u044f\u0447\u0435\u0439\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 FF<\/figcaption><\/div>\n<\/figure>\n<p>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 \u0437\u0430\u043c\u0430\u043f\u043b\u0435\u043d\u043e \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 255 (0xFF). \u041a\u0430\u043a \u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u041f\u041a, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0448\u0438\u043d\u0435 PCI Express, \u0432\u044b \u0442\u043e\u0436\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0435\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u043c \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f9d\/17a\/a19\/f9d17aa1909b30deb5b358dcbb8933ef.png\" alt=\"PCIe configuration space. QEMU wiki\" title=\"PCIe configuration space. QEMU wiki\" width=\"1309\" height=\"530\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f9d\/17a\/a19\/f9d17aa1909b30deb5b358dcbb8933ef.png\"\/><\/p>\n<div><figcaption>PCIe configuration space. <a href=\"https:\/\/wiki.qemu.org\/images\/f\/f6\/PCIvsPCIe.pdf\" rel=\"noopener noreferrer nofollow\">QEMU wiki<\/a><\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443, \u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u0442 \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D1%80%D1%82_%D0%B2%D0%B2%D0%BE%D0%B4%D0%B0-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0440\u0442 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430<\/a>:<\/p>\n<pre><code class=\"python\">class Memory:   __MEMORY_SIZE = 255   __IO_ADDRESS = 255    def __init__(self):       self.image = [0 for i in range(self.__MEMORY_SIZE)]    def read(self, addr):       if 0 &lt;= addr &lt; self.__MEMORY_SIZE:           return self.image[addr]       elif addr == self.__IO_ADDRESS:           return int(input(\"Enter a value > \"))      def write(self, addr, w_data):       if 0 &lt;= addr &lt; self.__MEMORY_SIZE:           self.image[addr] = w_data       elif addr == self.__IO_ADDRESS:           print(\"Output > \", w_data)<\/code><\/pre>\n<p>\u041d\u043e \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. \u0417\u0434\u0435\u0441\u044c 16-\u0431\u0438\u0442\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c, \u0438 \u0435\u0441\u043b\u0438 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0442\u043e \u0432\u0441\u0451 \u043f\u043e\u0439\u0434\u0451\u0442 \u043a\u0440\u0430\u0445\u043e\u043c. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/927\/593\/bc8\/927593bc85d437a441e760ab1f262eea.png\" alt=\"xkcd: Can't Sleep\" title=\"xkcd: Can't Sleep\" width=\"740\" height=\"244\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/927\/593\/bc8\/927593bc85d437a441e760ab1f262eea.png\"\/><\/p>\n<div><figcaption><a href=\"https:\/\/xkcd.com\/571\/\" rel=\"noopener noreferrer nofollow\">xkcd: Can&#8217;t Sleep<\/a><\/figcaption><\/div>\n<\/figure>\n<p>Python \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u044b\u0431\u043e\u0440, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u044b \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434<\/a>:<\/p>\n<pre><code class=\"python\">def read(self, addr):     if 0 &lt;= addr &lt; self.__MEMORY_SIZE:         return self.image[addr]     elif addr == self.__IO_ADDRESS:         r_data = int(input(\"Enter a value > \"))         if r_data &lt; 0:             r_data = 0x10000 + r_data# two's-complement         return r_data  def write(self, addr, w_data):     if 0 &lt;= addr &lt; self.__MEMORY_SIZE:         self.image[addr] = w_data     elif addr == self.__IO_ADDRESS:         if w_data > 0x7FFF:             w_data =  w_data - 0x10000# two's-complement         print(\"Output > \", w_data)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0445 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u043b\u0438\u0441\u044c \u0438\u0437 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430:<\/p>\n<pre><code class=\"python\">computer.memory.write(0x10, 0x83FF) # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432 R[3] computer.memory.write(0x11, 0x84FF) # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432 R[4] computer.memory.write(0x12, 0x1234) # \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c R[3] \u0438 R[4] \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 R[2] computer.memory.write(0x13, 0x92FF) # \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 R[2]<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c:<\/p>\n<pre><code class=\"python\"># python toy.py Enter a value > 123 Enter a value > -456 Output > -333 HALT<\/code><\/pre>\n<p>\u041e\u0433\u043e\u043d\u044c! \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<h4>\u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0440\u0451\u0445 \u0447\u0438\u0441\u0435\u043b \u0432 TOY<\/h4>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432 TOY. \u0412\u043e\u043e\u0431\u0449\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u0430\u0439\u0442<\/a> \u0432 TOY \u044d\u0442\u043e little-endian (LE), \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0442\u0438\u043f\u0430 LE. \u041d\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 BE \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438, \u0430 \u043f\u0440\u0438 \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c TOY \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0438 \u043c\u043b\u0430\u0434\u0448\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u043c\u0435\u0441\u0442\u0430\u043c\u0438:<\/p>\n<pre><code class=\"python\">def load_app(self, filename):     with open(filename, 'rb') as file:         file_contents = file.read()         file_length = len(file_contents) \/\/ 2         for addr in range(file_length):             self.memory.write(self.SOFT_START_ADDRESS + addr,                    # change BE to LE                   (int(file_contents[addr * 2]) &lt;&lt; 8) |                    int(file_contents[(addr * 2) + 1]))  ...  for a in sys.argv[1:]: self.load_app(a)<\/code><\/pre>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <strong>x * y * z<\/strong>. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u043a\u043e\u0434 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f. \u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"1c\">R[A] = input() # \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432 R[A] R[B] = input() # \u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 R[B] R[F] = PC; goto multiple # \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c R[A] \u043d\u0430 R[B] \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 R[C] \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 multiple R[A] = R[C] # \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0432 R[A] R[B] = input() # \u0441\u043d\u043e\u0432\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432 R[B] R[F] = PC; goto multiple # \u043e\u043f\u044f\u0442\u044c \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c print(R[C]) # \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u043c halt # \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"1c\">multiple: R[C] = 0 # \u0432 R[C] \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f, \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e R[1] = 1 # \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0442\u044c \u043d\u0430 1, \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e R[1]  check: if (R[A] == 0) goto end # \u0438\u043b\u0438 while (R[A] != 0) R[C] += R[B] # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 R[A]-- # \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u043c goto check # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c end: PC = R[F] # \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u044b\u0448\u0435<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0451\u043c \u0432\u0441\u0451 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 TOY:<\/p>\n<pre><code class=\"1c\">10: 8aff # R[A] = input() 11: 8bff # R[B] = input() 12: ff18 # R[F] = PC; goto multiple 13: 1ac0 # R[A] = R[C] 14: 8bff # R[B] = input() 15: ff18 # R[F] = PC; goto multiple 16: 9cff # print(R[C]) 17: 0000 # halt 18: 7c00 # multiple: R[C] = 0 19: 7101 # R[1] = 1 1A: ca1e # check: if (R[A] == 0) goto end 1B: 1ccb # R[C] += R[B] 1C: 2aa1 # R[A]-- 1D: c01a # goto check 1E: ef00 # end: PC = R[F]<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u0444\u0430\u0439\u043b mult.bin, \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c hex-\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb2\/53d\/718\/cb253d718b25e0b80573524eb573f09f.png\" alt=\"VSCode Hex-editor\" title=\"VSCode Hex-editor\" width=\"140\" height=\"417\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb2\/53d\/718\/cb253d718b25e0b80573524eb573f09f.png\"\/><\/p>\n<div><figcaption>VSCode Hex-editor<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u043c\u043d\u043e\u0436\u0438\u043c 12 \u043d\u0430 -34 \u043d\u0430 56:<\/p>\n<pre><code class=\"1c\"># python >>> 12 * (-34) * 56 -22848<\/code><\/pre>\n<p>\u041f\u043e\u0440\u0430 \u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 &#171;\u041f\u0443\u0441\u043a&#187;. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c TOY:<\/p>\n<pre><code class=\"1c\"># python toy.py mult.bin Enter a value > 12 Enter a value > -34 Enter a value > 56 Output > -22848 HALT<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/829\/4f2\/d46\/8294f2d460b2d1feafcebdb0194c67de.gif\" alt=\"You are the Hackerman now\" title=\"You are the Hackerman now\" width=\"500\" height=\"281\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/829\/4f2\/d46\/8294f2d460b2d1feafcebdb0194c67de.gif\"\/><\/p>\n<div><figcaption><a href=\"https:\/\/gif-central.blogspot.com\/2015\/09\/hackerman.html\" rel=\"noopener noreferrer nofollow\">You are the Hackerman now<\/a><\/figcaption><\/div>\n<\/figure>\n<hr\/>\n<p><strong>P.S.<\/strong> \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432\u0441\u0451 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b &#8212; \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u044f \u0446\u0438\u0432\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0438 \u043e\u043d\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438. \u041a\u043e\u043c\u0443 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0442\u0435\u043c\u0430, \u043c\u043e\u0436\u0435\u0442\u0435 \u043a\u043e\u043f\u043d\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u043d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0435\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u043d\u0430 Python, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Intel 4004 \u0438\u043b\u0438 Z80. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u043a\u043e.<\/p>\n<hr\/>\n<p><a href=\"https:\/\/github.com\/odobryabov\/pytoy2\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/a><\/p>\n<p>\u0424\u043e\u0442\u043e \u043d\u0430 \u043e\u0431\u043b\u043e\u0436\u043a\u0435:<br \/><a href=\"https:\/\/www.sacyr.com\/en\/-\/las-mujeres-que-cambiaron-la-historia-de-la-informatica\" rel=\"noopener noreferrer nofollow\">The women who changed the history of computing<\/a><\/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\/802733\/\"> https:\/\/habr.com\/ru\/articles\/802733\/<\/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<h4>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h4>\n<p>TOY &#8212; \u044d\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 (\u0445\u043e\u0442\u044f \u0431\u044b\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0435\u0433\u043e <a href=\"http:\/\/asic.ethz.ch\/1987\/Toy2.html\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u043f\u043b\u043e\u0449\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/a>). \u0415\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u043e\u0440 Phil Koopman \u0432 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"http:\/\/users.ece.cmu.edu\/~koopman\/misc\/byte87a.pdf\" rel=\"noopener noreferrer nofollow\">Microcoded Versus Hard-wired Control<\/a> \u0435\u0449\u0451 \u0432 1987 \u0433\u043e\u0434\u0443. TOY \u0438\u0437\u0443\u0447\u0430\u044e\u0442 \u043d\u0430 \u043f\u0430\u0440\u0430\u0445 \u043f\u043e Computer Science \u0432 \u041f\u0440\u0438\u043d\u0441\u0442\u043e\u043d\u0441\u043a\u043e\u043c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0435. <\/p>\n<p>\u042f \u0432\u0437\u044f\u043b <a href=\"https:\/\/www.cs.princeton.edu\/courses\/archive\/spr05\/cos126\/lectures\/12.pdf\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u0430\u0439\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043d\u0430 \u0437\u0430\u043d\u044f\u0442\u0438\u044f\u0445<\/a> \u0438 \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043b \u0432\u0441\u0451 \u043f\u043e \u043f\u043e\u043b\u043e\u0447\u043a\u0430\u043c.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 TOY<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e-\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e<\/p>\n<\/li>\n<li>\n<p>16 16-\u0431\u0438\u0442\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>256 16-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>\u043e\u0434\u0438\u043d 8-\u0431\u0438\u0442\u043d\u044b\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434<\/p>\n<\/li>\n<li>\n<p>16 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0435 \u0433\u0443\u0441\u0442\u043e. \u041a\u0430\u043a \u0433\u0434\u0435-\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u043b\u0438: &#171;\u041c\u0430\u0448\u0438\u043d\u0430 \u0422\u044c\u044e\u0440\u0438\u043d\u0433\u0430 \u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u043a\u0430\u0445&#187;. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043a\u0435\u043b\u0435\u0442 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0430 Python:<\/p>\n<pre><code class=\"python\">class Toy: def __init__(self):         self.registers = self.Registers()         self.memory = self.Memory()         self.alu = self.ALU()         self.pc = 0x10<\/code><\/pre>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<h4>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 \u043f\u0430\u043c\u044f\u0442\u044c<\/h4>\n<p>\u0412 TOY 16 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u043e 16 \u0431\u0438\u0442 \u0438 256 \u044f\u0447\u0435\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e 16 \u0431\u0438\u0442. \u041e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code class=\"python\">class Registers:     __REGISTERS_NUM = 16          def __init__(self):         self.image = [0 for i in range(self.__REGISTERS_NUM)]      def read(self, addr):         return self.image[addr]      def write(self, addr, data):         self.image[addr] = data  class Memory:     __MEMORY_SIZE = 255          def __init__(self):         self.image = [0 for i in range(self.__MEMORY_SIZE)]      def read(self, addr):         return self.image[addr]      def write(self, addr, data):         self.image[addr] = data<\/code><\/pre>\n<h4>\u0421\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434<\/h4>\n<p>\u0421\u0447\u0451\u0442\u0447\u0438\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Program_counter\" rel=\"noopener noreferrer nofollow\">program counter<\/a> &#8212; \u044d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432\u0434\u043e\u043b\u044c \u0432\u0441\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044f \u044d\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0412 TOY \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 16 (0x10):<\/p>\n<pre><code class=\"python\">class Toy: def __init__(self):         self.pc = 0x10<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0442\u0438\u043f\u0430 &#171;Jump&#187; \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u0432\u043f\u0435\u0440\u0451\u0434 \u0438\u043b\u0438 \u043d\u0430\u0437\u0430\u0434:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438: \u043a \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 PC \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f 1<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0430 Jump<\/figcaption><\/div>\n<\/figure>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 (Instruction Set Architecture)<\/h3>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e &#8212; \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 (opcode), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f TOY \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 16 \u0431\u0438\u0442 \u0432 \u0434\u0432\u0443\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"left\"><strong>\u0411\u0438\u0442\u044b \/ \u0424\u043e\u0440\u043c\u0430\u0442<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">[15:12]<\/p>\n<\/td>\n<td>\n<p align=\"left\">[11:8]<\/p>\n<\/td>\n<td>\n<p align=\"left\">[7:4]<\/p>\n<\/td>\n<td>\n<p align=\"left\">[3:0]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"left\"><strong>RR<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">opcode<\/p>\n<\/td>\n<td>\n<p align=\"left\">destination d<\/p>\n<\/td>\n<td>\n<p align=\"left\">source s<\/p>\n<\/td>\n<td>\n<p align=\"left\">source t<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"141\" width=\"141\">\n<p align=\"left\"><strong>A<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">opcode<\/p>\n<\/td>\n<td>\n<p align=\"left\">destination d<\/p>\n<\/td>\n<td colspan=\"2\">\n<p align=\"left\">address<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 (instruction fetch) \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u0442\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">def fetch(self):     instruction = self.memory.read(self.pc)     opcode = (instruction &amp; 0xF000) >> 12     d      = (instruction &amp; 0x0F00) >> 8     s      = (instruction &amp; 0x00F0) >> 4     t      = (instruction &amp; 0x000F)     addr   = (instruction &amp; 0x00FF)     self.pc = self.pc + 1     return opcode, d, s, t, addr<\/code><\/pre>\n<p>TOY \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u043e 16 \u043a\u043e\u043c\u0430\u043d\u0434 (\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\"><strong>\u041a\u043e\u0434 (HEX)<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\"><strong>\u041a\u043e\u043c\u0430\u043d\u0434\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0424\u043e\u0440\u043c\u0430\u0442<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041f\u0441\u0435\u0432\u0434\u043e-\u043a\u043e\u0434<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">0<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">halt<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\"> halt<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">1<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">add<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] + R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">2<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">substract<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] &#8212; R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">3<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">and<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] &amp; R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">4<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">xor<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] ^ R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">5<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">shift left<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] &lt;&lt; R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">6<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">shift right<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = R[s] >> R[t]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">7<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">load address<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = addr<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">8<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">load<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = M[addr]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">9<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">store<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> M[addr] = R[d]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">A<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">load indirect<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = M[R[t]]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">B<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">store indirect<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> M[R[t]] = R[d]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">C<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">branch zero<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> if (R[d] == 0) PC = addr<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">D<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">branch positive <\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> if (R[d] > 0) PC = addr<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">E<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">jump register<\/p>\n<\/td>\n<td>\n<p align=\"left\">RR<\/p>\n<\/td>\n<td>\n<p align=\"left\"> PC = R[d]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"94\" width=\"94\">\n<p align=\"left\">F<\/p>\n<\/td>\n<td data-colwidth=\"128\" width=\"128\">\n<p align=\"left\">jump and link<\/p>\n<\/td>\n<td>\n<p align=\"left\">A<\/p>\n<\/td>\n<td>\n<p align=\"left\"> R[d] = PC + 1; PC = addr<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0427\u0443\u0432\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0430\u0445? \u0422\u0430\u043a \u043f\u0430\u0445\u043d\u0443\u0442 \u0431\u0435\u0441\u0441\u043e\u043d\u043d\u044b\u0435 \u043d\u043e\u0447\u0438, \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0433\u043b\u0430\u0437\u0430 \u0438 \u0435\u0433\u043e \u0432\u0435\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e&#8230; \u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440!<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435\u0433\u043e 16 \u043a\u043e\u043c\u0430\u043d\u0434. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0436\u0435 \u0432 50-\u043b\u0435\u0442\u043d\u0435\u043c Intel 4004 \u0438\u0445 \u0431\u044b\u043b\u043e 52, \u0430 \u0432 x86 \u0432\u043e\u043e\u0431\u0449\u0435 1502. \u041d\u043e \u0434\u0430\u0436\u0435 \u044d\u0442\u0438\u0445 16-\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u041b\u042e\u0411\u041e\u0413\u041e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. <\/p>\n<pre><code class=\"python\">def op_halt(self, d, s, t, addr):     print('HALT')     exit()  def op_add(self, d, s, t, addr): # R[d] = R[s] + R[t]     self.registers.write(d, self.registers.read(s) + self.registers.read(t))  def op_sub(self, d, s, t, addr): # R[d] = R[s] - R[t]     self.registers.write(d, self.registers.read(s) - self.registers.read(t))      def op_and(self, d, s, t, addr): # R[d] = R[s] &amp; R[t]     self.registers.write(d, self.registers.read(s) &amp; self.registers.read(t))      def op_xor(self, d, s, t, addr): # R[d] = R[s] ^ R[t]     self.registers.write(d, self.registers.read(s) ^ self.registers.read(t))      def op_shl(self, d, s, t, addr): # R[d] = R[s] &lt;&lt; R[t]     self.registers.write(d, self.registers.read(s) &lt;&lt; self.registers.read(t))      def op_shr(self, d, s, t, addr): # R[d] = R[s] >> R[t]     self.registers.write(d, self.registers.read(s) >> self.registers.read(t))      def op_loada(self, d, s, t, addr): # R[d] = addr     self.registers.write(d, addr)      def op_load(self, d, s, t, addr): # R[d] = M[addr]     self.registers.write(d, self.memory.read(addr))      def op_stor(self, d, s, t, addr): # M[addr] = R[d]     self.memory.write(addr, self.registers.read(d))      def op_loadi(self, d, s, t, addr): # R[d] = M[R[t]]     self.registers.write(d, self.registers.read(t))      def op_stori(self, d, s, t, addr): # M[R[t]] = R[d]     self.memory.write(self.registers.read(t), self.registers.read(d))      def op_bzero(self, d, s, t, addr): # if (R[d] == 0) PC = addr     if self.registers.read(d) == 0:         self.pc = addr      def op_bposi(self, d, s, t, addr): # if (R[d] > 0) PC = addr     if self.registers.read(d) > 0:         self.pc = addr      def op_jmpr(self, d, s, t, addr): # PC = R[d]     self.pc = self.registers.read(d)      def op_jmpl(self, d, s, t, addr): # R[d] = PC + 1; PC = addr     self.registers.write(d, self.pc)     self.pc = addr<\/code><\/pre>\n<p>\u0418 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043a\u043e\u0434\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<pre><code class=\"python\">execute = {     0x0: op_halt,     0x1: op_add,     0x2: op_sub,     0x3: op_and,     0x4: op_xor,     0x5: op_shl,     0x6: op_shr,     0x7: op_loada,     0x8: op_load,     0x9: op_stor,     0xA: op_loadi,     0xB: op_stori,     0xC: op_bzero,     0xD: op_bposi,     0xE: op_jmpr,     0xF: op_jmpl }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0431\u043e\u0442\u0430 TOY (\u043a\u0430\u043a \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430) \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def start(self):     while True:         op, d, s, t, addr = self.fetch()         self.execute[op](self, d, s, t, addr)<\/code><\/pre>\n<p>\u0422.\u0435. \u043f\u043e \u0441\u0443\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 (<strong>fetch<\/strong>) \u0438 \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (<strong>execute<\/strong>).<\/p>\n<figure class=\"full-width\"><\/figure>\n<h4>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/h4>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432:<\/p>\n<pre><code class=\"python\">def start(self):     while True:         op, d, s, t, addr = self.fetch()         execute[op](self, d, s, t, addr)                  # debug registers         print(\"Regs: \", self.registers.image)<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440:<\/p>\n<pre><code class=\"python\">computer = Toy() computer.memory.write(0x10, 0x7328) # R[3] = 40 computer.memory.write(0x11, 0x7464) # R[4] = 100 computer.memory.write(0x12, 0x1234) # R[2] = R[3] + R[4] computer.start()<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x10, \u0442.\u043a. \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c:<\/p>\n<pre><code class=\"python\"># python toy.py Regs:  [0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] Regs:  [0, 0, 0, 40, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] Regs:  [0, 0, 140, 40, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] HALT<\/code><\/pre>\n<p>\u041e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<h2>\u0423\u0433\u043b\u0443\u0431\u043b\u044f\u0435\u043c\u0441\u044f<\/h2>\n<p>\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u0435\u043c, \u0437\u0430\u0432\u0435\u043b\u043e\u0441\u044c! \u041d\u043e \u043a\u0430\u043a-\u0442\u043e \u0432\u0441\u0451 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c&#8230; \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u043a\u0430\u0440\u043a\u0430\u0441\u0435 \u0434\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0430\u043c\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0438\u0441\u0442\u043e\u0440\u043e\u0432. \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0410\u041b\u0423.<\/p>\n<h4>\u0410\u041b\u0423<\/h4>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u0438\u043b\u0430\u043c\u0438 Python, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0410\u041b\u0423. \u041e\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0442\u044c, \u043e\u0442\u043d\u0438\u043c\u0430\u0442\u044c, \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0431\u0438\u0442\u044b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c AND \u0438 XOR. &#171;\u042d\u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u0420\u0438\u043e-\u0434\u0435-\u0416\u0430\u043d\u0435\u0439\u0440\u043e&#187;, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u0430\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0437\u0430 \u043e\u0434\u043d\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0447\u0438\u0441\u0435\u043b. \u041b\u044e\u0431\u0430\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0414\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440:<\/p>\n<figure class=\"\">\n<div><figcaption>Half adder<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043b\u0438 \u0432\u044b\u0440\u0430\u0436\u0430\u044f\u0441\u044c \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\">half_adder = lambda a, b: (a ^ b, a &amp; b)<\/code><\/pre>\n<p>\u0418\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0443\u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D1%83%D0%BC%D0%BC%D0%B0%D1%82%D0%BE%D1%80\" rel=\"noopener noreferrer nofollow\">\u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440<\/a>:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Full adder<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043b\u0438:<\/p>\n<pre><code class=\"python\">def full_adder(self, a, b, carry_in):     half_adder = lambda a, b: (a ^ b, a &amp; b)     s1, c1 = half_adder(a, b)     sum, c2 = half_adder(carry_in, s1)     return sum, c1 | c2<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0445\u0435\u043c\u0443 \u0410\u041b\u0423, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0432\u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <strong>substract<\/strong> \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440\u0430, \u0438 \u043e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u0441\u0443\u043c\u043c\u0430\u0442\u043e\u0440-<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%92%D1%8B%D1%87%D0%B8%D1%82%D0%B0%D1%82%D0%B5%D0%BB%D1%8C\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c<\/a>:<\/p>\n<pre><code class=\"python\">def adder_substractor(self, a, b, carry_in, substract): return self.full_adder(a, b ^ substract, carry_in)<\/code><\/pre>\n<p>\u0414\u043e\u0432\u0435\u0434\u0451\u043c \u0441\u0445\u0435\u043c\u0443 \u0434\u043e 16 \u0431\u0438\u0442:<\/p>\n<pre><code class=\"python\">def adder_substractor(self, input1, input2, substract):   result_byte = 0   carry = substract   bit_from_byte = lambda byte, position: (byte &amp; (1 &lt;&lt; position)) >> position   for position in range(self.DATA_RESOLUTION):       bit1 = bit_from_byte(input1, position)       bit2 = bit_from_byte(input2, position)       result_bit, carry = self.full_adder(bit1, bit2 ^ carry, carry)       result_byte |= (result_bit &lt;&lt; position)   return result_byte<\/code><\/pre>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u043d\u044f\u0442\u0435\u043d, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 \u0410\u041b\u0423<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class ALU:     __DATA_RESOLUTION = 16     __CTRL_ADD_SUB= 0b000     __CTRL_AND= 0b001     __CTRL_XOR= 0b010     __CTRL_SHIFT= 0b011     __CTRL_INPUT2= 0b100      __SUBSTRACT_RESET = 0b0     __SUBSTRACT_SET   = 0b1      __SHIFT_RIGHT = 0b0     __SHIFT_LEFT  = 0b1      def __full_adder(self, a, b, carry_in):         half_adder = lambda a, b: (a ^ b, a &amp; b)         s1, c1 = half_adder(a, b)         sum, c2 = half_adder(carry_in, s1)         return sum, c1 | c2      def __adder_substractor(self, a, b, cr, sub):         return self.__full_adder(a, b ^ sub, cr)          def __alu(self, input1, input2, substract, shift_dir, ctrl):         result_byte = 0         if ctrl == self.__CTRL_ADD_SUB:             carry = substract             bit_from_byte = lambda byte, position: (byte &amp; (1 &lt;&lt; position)) >> position             for position in range(self.__DATA_RESOLUTION):                 bit1 = bit_from_byte(input1, position)            <\/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-371754","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/371754","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=371754"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/371754\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=371754"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=371754"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=371754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}