从for循环到机器码
def p(*x): print(x)
p(type(range), dir(range))
r = range(2); i = iter(r)
try: p(next(i)); p(next(i)); p(next(i))
except Exception as e: p(e)
def fn():
n = 0
for i in range(3): n = n + i
fn()
import dis
dis.dis(fn)
(<class 'type'>, ['__bool__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index', 'start', 'step', 'stop'])
(0,)
(1,)
(StopIteration(),)
7 0 LOAD_CONST 1 (0)
2 STORE_FAST 0 (n)
8 4 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 2 (3)
8 CALL_FUNCTION 1
10 GET_ITER
>> 12 FOR_ITER 12 (to 26)
14 STORE_FAST 1 (i)
16 LOAD_FAST 0 (n)
18 LOAD_FAST 1 (i)
20 BINARY_ADD
22 STORE_FAST 0 (n)
24 JUMP_ABSOLUTE 12
# -*- coding: utf-8 -*-
import re
mem = [x for x in re.split('[\r|\n]', '''
store a 1
store b 2
add a 1
add b -1
jlz 2
jmp -3
jmp 0
'''.lower()) if x != '']
# register file: 装register的柜子。register: 登记簿 pc: program counter
reg_file = { 'pc': 0 }
msb = 0 # most significat bit, 符号位
while True:
instruction = mem[reg_file['pc']] # fetch instruction 取指
print('"' + instruction + '"', end='\t')
instruction = instruction.split() # 译码
op_code = instruction[0] # op: operation
if op_code == 'store':
(reg_name, immd) = instruction[1:]
reg_file[reg_name] = int(immd)
reg_file['pc'] += 1
elif op_code == 'add':
(reg_name, immd) = instruction[1:]
reg_file[reg_name] += int(immd)
if reg_file[reg_name] < 0: msb = 1
reg_file['pc'] += 1
elif op_code == 'jlz': # jump if less than 0
immd = int(instruction[1])
if msb: reg_file['pc'] += immd
else: reg_file['pc'] += 1
elif op_code == 'jmp':
immd = int(instruction[1])
if immd == 0: break
reg_file['pc'] += immd
print('\t', reg_file, ' msb=', msb, sep='')
input('Press the Enter key')
from functools import reduce
def bits(n, b = 0): return list(map(lambda x:b,list(range(n))))
class ROM:
def __init__(m):
m.bytes = (
( 0, 0, 0, 0, 0, 0, 0, 1 ), # store a 1
( 0, 0, 1, 0, 0, 0, 1, 0 ), # store b 2
( 0, 1, 0, 0, 0, 0, 0, 1 ), # add a 1
( 0, 1, 1, 1, 1, 1, 1, 1 ), # add b -1
( 1, 0, 0, 0, 0, 0, 1, 0 ), # jlz 2
( 1, 1, 0, 1, 1, 1, 0, 1 ), # jmp -3
( 1, 1, 0, 0, 0, 0, 0, 0 ), # jmp 0
)
m.a = m.d = bits(8) # They will have different id() after being assigned
def read(m): m.d = m.bytes[reduce(lambda hi, low: hi * 2 + low, m.a, 0)]
从for循环到机器码的更多相关文章
- loop 循环和检测点 9.3
loop 指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址.对 IP 的修改范围都为:-128~127. 指令格式:loop 标号 操作: (cx)=(cx)- ...
- Python之路1-变量、数据类型、循环语法
1.python语言介绍 编程语言主要从以下几个角度进行分类,编译型和解释型,静态语言和动态语言,强类型定义语言和弱类型定义语言. 编译和解释区别 编译器是把源程序的每一条语句都编译成机器语言,并保存 ...
- 第1章 Python基础-Python介绍&循环语句 练习题&作业
1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型? 高级语言分为编译型与解释型两种,分别从执行速度.开发效率.跨平台性三个方面说它们的区别. 编译型语言因为执行的 ...
- 新的开始——LED灯汇编机器码的点亮方式
在几个月前看2440视频的时候,发现太多知识欠缺,购买开发板期间补习makefile,linux,arm汇编和arm构架之后,现在重新开始学习. 先看板子LED硬件连接图: 可以看到LED 1,2,4 ...
- 为什么java代码中要避免多层深度for循环嵌套
在开发中,一直强调代码的整洁和可读性.之前对于使用多层嵌套for循环,一直以为只是对代码可读性和逻辑梳理有影响.可能对性能也有影响,但是一直不知道对性能影响在哪.最近在看虚拟机方面的书,感觉有一个点应 ...
- Python基础-week01 Python安装/变量/输入/及循环语句使用
一.Python介绍 (1).目前Python主要应用领域: 云计算: 云计算最火的语言, 典型应用OpenStack WEB开发: 众多优秀的WEB框架,众多大型网站均为Python开发,You ...
- Python基础之(判断,循环,列表,字典)
一.python介绍 Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在 ...
- python初识-环境搭建,变量,条件,循环语句
1.python环境搭建: (1)安装Anaconda ,可选择非C盘安装: 注意:都勾选: (2)安装Pycharm 默认安装即可,安装过程同样都勾选: (3)破解Pycharm https://w ...
- c++ 第一天 变量、判断、循环
C++介绍 语言的产生 C++ 由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的,由于C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言 ,所以最初命 ...
随机推荐
- 如何使用python 新建文件夹以及递归创建文件夹
转载:如何使用python 新建文件夹以及递归创建文件夹 | 酷python (coolpython.net) 1. os.mkdir 使用python创建文件夹,通常使用os.mkdir方法,在使用 ...
- 链表中倒数第K个结点 牛客网 剑指Offer
链表中倒数第K个结点 牛客网 剑指Offer 题目描述 输入一个链表,输出该链表中倒数第k个结点. # class ListNode: # def __init__(self, x): # self. ...
- JAVA笔记15__TCP服务端、客户端程序 / ECHO程序 /
/** * TCP:传输控制协议,采用三方握手的方式,保证准确的连接操作. * UDP:数据报协议,发送数据报,例如:手机短信或者是QQ消息. */ /** * TCP服务器端程序 */ public ...
- PHP笔记1__基础知识
客户端: 美妙的网页组成(都是由浏览器解释): 1.HTML 2.CSS--给HTML化妆 3.客户端脚本编程语言(JavaScript等)--特效 服务器端: 1.Web服务器Apache/Ngi ...
- poj 2960 S-Nim (SG)
题意: K个数,s1...sk. m个状态,对于某一个状态,有L堆石子,每人每次取的石子个数只能是s1...sk的一个,且只能在一堆中取. 输出m个状态是先手胜还是先手败,先手胜输出W,否则输出L. ...
- Serverless 工程实践|自建 Apache OpenWhisk 平台
作者 | 刘宇(江昱) 前言:OpenWhisk 是一个开源.无服务器的云平台,可以在运行时容器中通过执行扩展的代码响应各种事件,而无须用户关心相关的基础设施架构. OpenWhisk 简介 Open ...
- Go语言核心36讲(Go语言进阶技术十二)--学习笔记
18 | if语句.for语句和switch语句 现在,让我们暂时走下神坛,回归民间.我今天要讲的if语句.for语句和switch语句都属于 Go 语言的基本流程控制语句.它们的语法看起来很朴素,但 ...
- lamp 架构的理解
1,lamp架构下的求情过程如下: 2,httpd服务器连接php服务器的三种方式 3,php和mysql的连接
- 测试平台系列(71) Python定时任务方案
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 定时任务 定时任务,顾名思义: ...
- 关于JDBC中查询方法的抽取
萌新的JAVA学习笔记[1] 先来张伊蕾娜镇场~~ 简单描述 起初我们的查询方法时分为单个查询和全部查询,过于局限与繁琐,如此一来我们能不能想一个办法将所有类型的查询抽取出来并整合成为一个单独的工具方 ...