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循环到机器码的更多相关文章

  1. loop 循环和检测点 9.3

    loop 指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址.对 IP 的修改范围都为:-128~127. 指令格式:loop 标号 操作: (cx)=(cx)- ...

  2. Python之路1-变量、数据类型、循环语法

    1.python语言介绍 编程语言主要从以下几个角度进行分类,编译型和解释型,静态语言和动态语言,强类型定义语言和弱类型定义语言. 编译和解释区别 编译器是把源程序的每一条语句都编译成机器语言,并保存 ...

  3. 第1章 Python基础-Python介绍&循环语句 练习题&作业

    1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型? 高级语言分为编译型与解释型两种,分别从执行速度.开发效率.跨平台性三个方面说它们的区别. 编译型语言因为执行的 ...

  4. 新的开始——LED灯汇编机器码的点亮方式

    在几个月前看2440视频的时候,发现太多知识欠缺,购买开发板期间补习makefile,linux,arm汇编和arm构架之后,现在重新开始学习. 先看板子LED硬件连接图: 可以看到LED 1,2,4 ...

  5. 为什么java代码中要避免多层深度for循环嵌套

    在开发中,一直强调代码的整洁和可读性.之前对于使用多层嵌套for循环,一直以为只是对代码可读性和逻辑梳理有影响.可能对性能也有影响,但是一直不知道对性能影响在哪.最近在看虚拟机方面的书,感觉有一个点应 ...

  6. Python基础-week01 Python安装/变量/输入/及循环语句使用

      一.Python介绍 (1).目前Python主要应用领域: 云计算: 云计算最火的语言, 典型应用OpenStack WEB开发: 众多优秀的WEB框架,众多大型网站均为Python开发,You ...

  7. Python基础之(判断,循环,列表,字典)

    一.python介绍 Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在 ...

  8. python初识-环境搭建,变量,条件,循环语句

    1.python环境搭建: (1)安装Anaconda ,可选择非C盘安装: 注意:都勾选: (2)安装Pycharm 默认安装即可,安装过程同样都勾选: (3)破解Pycharm https://w ...

  9. c++ 第一天 变量、判断、循环

    C++介绍 语言的产生 C++ 由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的,由于C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言 ,所以最初命 ...

随机推荐

  1. 对SQLServer错误使用聚集索引的优化案例(千万级数据量)

    前言: 半个月前发了文章 SQLServer聚集索引导致的插入性能低 终于等到生产环境休整半天,这篇文章是对前文的实际操作. 以下正文开始: 异常:近期发现偶尔有新数据插入超时. 分析:插入条码有多种 ...

  2. HTML+CSS基础(HTML篇)

    引言 在日常开发Android中,很多时候会遇到和WebView打交道,对CSS HTML JS不是很清楚的话是完不成一些功能的,本篇开始学习HTML,文章的主要内容是总结了慕课网中,HTML+CSS ...

  3. sed初理多行合并+sed之G、H、g、h使用+sed n/N使用说明

    转载:[shell]sed处理多行合并 - seyjs - 博客园 (cnblogs.com) 文件格式 table=t1 name owner address table=t2 id text co ...

  4. hdu 5090 Game with Pearls (额,, 想法题吧 / 二分图最大匹配也可做)

    题意: 给你N个数,a1,,,,an.代表第i个管子里有ai个珍珠. 规定只能往每根管里增加k的倍数个珍珠. 如果存在一套操作,操作完毕后可以得到1~N的一个排列,则Jerry赢,否则Tom赢. 问谁 ...

  5. vue2强制刷新,解决页面不会重新渲染的问题

    问题描述: 在使用Vue框架开发时,在函数中改变了页面中的某个值,在函数中查看是修改成功了,但在页面中没有及时刷新改变后的值: 解决: 运用 this.$forceUpdate();  //强制刷新, ...

  6. Linux的inode与block

    1,inode包含文件的元信息,具体来说有以下内容: 文件的字节数 文件拥有者的User ID 文件的Group ID 文件的读.写.执行权限 文件的时间戳,共有三个:ctime指inode上次文件属 ...

  7. webpack 打包图片资源

    webpack 打包图片资源 /** * loader: 1. 下载 2. 使用(配置) * plugins:1. 下载 2. 引入 3.使用 */ // 用来拼接绝对路径的方法 const {res ...

  8. python nose测试框架全面介绍十四 --- nose中的只跑上次失败用例

    玩过一段时间nose的朋友,一定会发现nose中有一个--failed的功能,官方解释为: --failed Run the tests that failed in the last test ru ...

  9. 南大《软件分析》课程笔记——Intermediate Representation

    南大<软件分析>--Intermediate Representation @(静态分析) Content 编译器和静态分析的关系 AST vs IR IR:3-地址代码(3AC) 实际静 ...

  10. FZU ICPC 2020 寒假训练 1

    B - Sum Problem In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n. Input The i ...