从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 语言,是一种面向对象的程序设计语言 ,所以最初命 ...
随机推荐
- 最近公共祖先(lca)与树上叉分
lca的定义不在过多解释, 代码如下: inline void bfs() { queue<int>q; deep[s]=1;q.push(s); while(!q.empty()) { ...
- 第10课 OpenGL 3D世界
加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游.这一课使用第一课的代码,当然在课程说明中我只介绍改变了代码. 这一课是由Lionel Brits (βtelge ...
- Linux 文本三剑客之 grep
Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...
- shell 脚本静默安装oracle11g
以下脚本的手动安装连接: https://www.cnblogs.com/leihongnu/p/12698593.html [ #/bin/bash#安装日志touch /root/message ...
- RocketMQ Consumer 启动时都干了些啥?
可能我们对 RocketMQ 的消费者认知乍一想很简单,就是一个拿来消费消息的客户端而已,你只需要指定对应的 Topic 和 ConsumerGroup,剩下的就是只需要: 接收消息 处理消息 就完事 ...
- Cookie、Session、localStorage、sessionStorage区别和用法
Cookie 在学习一个新知识点前,我们应该明白自己的学习目标,要带着疑问去学习,该小节须要了解 Cookies 什么是cookie,cookie的作用 cookie的工作机制,即cookie是运作流 ...
- Java经典面试题-不古出品
@ 目录 一.Java 基础 1.JDK 和 JRE 有什么区别? 2.== 和 equals 的区别是什么? 3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? ...
- dart系列之:dart语言中的特殊操作符
dart系列之:dart语言中的特殊操作符 目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还 ...
- url,href,src 之间的区别
url 统一资源定位符 <style> #bg{ background-image:url("img/bg.png"); } </style> 区别: sr ...
- Linux基础五:网络配置与管理
五.网络配置与管理 1.网络知识 2.命令 ifconfig命令 <=> ip addr show 命令--查看本地所有网卡配置信息 ens32:本地以太网网卡,lo:本地回环网卡 ...