实现8位定点寄存器

大家好
我要在Python中写一个微控制器的模拟器
(为什么要Python?因为我喜欢它!!!)
但是我有问题.
该处理器的注册表全部8位(有些人为10位
其他奇怪的登记册)
我需要模拟寄存器的固定点行为,
并访问单个位.
F.X. (这是一个伪python会话,仅供理解)
或者
1
0
<异常....等等等等不在范围内>
0x7fe
#or 111111110,记忆截断了上部(或者也许
产生例外?)
0x00
#再次截断
1
#还是真的? Z标志表示算术操作中的溢出
可以在Python中这样做吗?
谢谢

# 回答1


在7月1日,08:57,nickoooola 或者
1
0
<异常....等等,不在范围内>>> reg2 = 0x7fe#in Binary 111111110,或11位长
0x7fe
#or 111111110,记忆截断了上部(或者也许
生成异常?)>> reg2 += 0x02#结果为10000000000,再次包含10位
0x00
#再次被截断>> myProcessor.flags ['z']
1
#还是真的? Z标志表示算术操作中的溢出
可以在Python中这样做吗?
谢谢
我不确定这是否正是您要寻找的(这可能是
有点低),但是MyHDL可能很有趣.它提供低级H/
W模拟功能. http://myhdl.jandecaluwe.com/doku.php
史蒂文
# 回答2


Nickoooola写道:
[...]
或者
1
0
<异常....等等等等不在范围内>
0x7fe
#or 111111110,记忆截断了上部(或者也许
产生例外?)
0x00
#再次截断
1
#还是真的? Z标志表示算术操作中的溢出
可以在Python中这样做吗?
我这样做是为了一张照片,通常只是使用蛮力,例如
temp = reg2 + 0x02
reg2 = temp&0xff
如果温度&0x100:
标志| = carry_mask
别的:
标志&= 〜CARRAN_MASK
如果temp&0xff:
标志&= 〜Zero_mask
别的:
标志| = Zero_Mask
因为它是图片,并且只有六个算术/逻辑
操作,代码以此形式保留.有了更大的东西,它将
像您
建议..(只是草图)..
class fixed_register(对象):
def __init__(self,size,val = 0):
self.mask =〜(-1 <<大小)
self.ovfmask = 1 <<大小
self.val = val&self.mask
使用适当的__add__,__sub__等.
操纵位.
祝你好运,梅尔.
# 回答3


在2008-07-01,nickoooola 有人发布了一个固定宽度整数的课程
一段时间的类型.
位运算符&|,〜, ^所有工作都像在C中一样工作.
如果您
想.
或者
1
0
<异常....等等等等不在范围内>
0x7fe
#or 111111110,记忆截断了上部(或者也许
生成一个例外 ?)
0x00
#再次截断
1
#还是真的? Z标志表示算术操作中的溢出
可以在Python中这样做吗?
是的.上面显示的所有内容都是可能的.如果你真的想要
为了变得聪明,您需要在__setattr__上阅读
__getAttr__,__getItem__和__setitem__对象方法.
他们将允许您为语义定义特殊处理
以下:
foo.something = x#调用foo .__ setattr ___('sosings',x)
x = foo.something#呼叫foo .__ getAttr ___
foo [n] = x#调用foo .__ setItem __(n,x)
x = foo [n]#调用foo .__ getitme __(n)
在后两种情况下,您可以根据需要支持切片.
这可以使您可以从登记册中获取" Bitfield":
x = processor.rega [4:7]#获取位4,5,6
processor.rega [4:7]#设置位4,5,6
请记住,在Python片中,传统上是半开的
间隔 - 它们不包括"正确"端点.那是
会混淆更习惯阅读处理器的人
传统上关闭位范围的数据表
间隔.您_could_暗示您的__ [sg] etitem__ slice
处理以便将其视为封闭间隔.那会
对习惯的人更加直观
微处理器注册定义,但可能会混淆
经验丰富的Python程序员.
__setattr __和__getAttr __的写作方法有点
棘手.最终很容易获得无限的递归.它是
并不难解决/避免,但是需要一段时间才能获得
挂它.
- -
格兰特·爱德华兹·格兰特·尤!

visi.com
# 回答4


感谢所有的回复!
梅尔:我也想构建一个图片模拟器,但我想这样做
"大项目的Python"学习练习,我在
过去仅用于小脚本,现在我想将其用于更多东西
"大的".
您有一些代码要共享吗?
myhdl似乎很有趣,我认为我可以在其源
代码...我认为一定有类似的东西
我需要的8位注册课程
我尝试你们所说的话,如果变成某事
有用,我向社区报告.
尼古拉
PS
对不起,我的英语...
# 回答5


Nickoooola写道:
在Python3中,我会使用(可变的)旁观.
空闲3.0b1
bytearray(B'\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00')
1
(0、1、0、0、0、0、0、0、0)
字节射线子类可以强制执行所有"位"(存储为字节)is
0或1,对您的口味具有自定义表示形式,并添加方法
喜欢.flipall().
使用8个字节而不是1以保持对象值的开销是
实际上,与最小对象大小为16个字节(在Win32xp上)相比.
24
在python2.x中,您可以使用阵列模块使等效变形
字符阵列.
Terry Jan Reedy
# 回答6


在2008-07-01,Terry Reedy 在Python3中,我会使用(可变的)旁观.
空闲3.0b1
bytearray(B'\ x00 \ x00 \ x0 0 \ x00 \ x00 \ x00 \ x00 \ x00')
1
(0、1、0、0、0、0、0、0、0)
字节射线子类可以强制执行所有"位"(存储为字节)is
0或1,对您的口味具有自定义表示形式,并添加方法
喜欢.flipall().
似乎在此类数组上实施Alu操作会
比在类型上实施比特索引要多得多
衍生在更"整数"的基础上.我很模糊如何
一个子类基本的东西,例如整数,所以也许我全都
湿,将__getItem__和__setitem__添加到整数类型
甚至不可能.
- -
格兰特·爱德华兹·格兰特·尤!你们知道我们吗
刚通过黑色
visi.com太空洞?
# 回答7


格兰特·爱德华兹(Grant Edwards)写道:
在python3中,我会使用(可变的)bytearray.idle 3.0b1
bytearray(B'\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00')
1
(0,1,0,0,0,0,0,0,0,0)a bytearray子类可以强制执行所有'lits'(存储为字节)as0或1,在您的口味中具有自定义的表示,并添加Methodslike .flipall( ).

似乎在此类数组上实施Alu操作会
比在类型上实施比特索引要多得多
衍生在更"整数"的基础上.我很模糊如何
一个子类基本的东西,例如整数,所以也许我全都
湿,将__getItem__和__setitem__添加到整数类型
甚至不可能.
如果一个人只需要点操作,那么数组方法就很容易.如果
一个人只想要int算术和全列逻辑,然后int方法是
简单的. OP并未完全指定需求.
INT方法的问题是INT是不可变的.
因此,如果一个人想亚类int隐藏该位掩码
位操作,一个人必须覆盖 *每个人可能会使用的每个操作,
包括所有算术和全部逻辑,即使INT操作
除了结果的类别以外,给出了正确的答案.
班级(int):
...
def __add __(自我,其他):
返回位(自我+其他)
...
如果没有
a,b =位(1),位(2)
c = a+b #c现在是一个int,而不是位
因此,有一个不子类的趋势,而要么离开
重复代码中删除的额外功能或将其放入功能中
反而.
setters =(1,2,4,8,16,32,64,...,2147483648)#略微伪代码
unsetters =(〜1,〜2,〜4,... 〜2147483648)#ditto
def bitset(n,bit):返回n | Setter [bit]
def bitunset(n,bit):返回n&unsetter [bit]
因此没有获得不错的reg [n]功能,也不容易显示
没有呼叫的单个位 *另一个 *功能.
另一只带有可变阵列的另一只,设置位是一个突变,
因此,除非一个人想幻想,否则不需要__setitem__
并强制执行设置为0或1.
这是一个权衡.
Terry Jan Reedy

# 回答8


在2008-07-01,Terry Reedy

如果一个人只想要位操作,那么数组方法是
简单的.如果一个人只想要int算术和全部逻辑,
然后int方法很容易. OP没有完全指定
需要.
他说他正在写一个微处理器模拟器,所以他要去
想要整数操作,全位逻辑操作和
个人位(按数字和名称)和位片
使用权.
当我开始搜索一点点谷歌搜索之后,我就意识到了.
由于我们正在进行固定宽度的操作,所以Python的INT
操作除了班级以外没有正确答案
结果.
在带有枪管变速杆的机器上,可能会更快
这个:
def bitset(n,bit):返回n | (1 <<位)
def bitclr(n,bit):返回n&〜(1 << bit)
但是,您的方法很容易被修改以支持切片:
导入操作员
masks = [(1 << n)在范围内(32)]
def mask(位):
如果类型(位)是切片:
返回降低(操作员.__或__,蒙版[位])
返回口罩[钻头]
def bitset(n,bit):
返回n |面具(位)
有片的字面语法吗?这似乎没有
工作:
比特斯特(n,0:4)
更重要的是,我认为将切片得到支持,所以
您需要比特场的值,可以做到这一点:
OP =指令[6:8]
src =指令[3:6]
dest =指令[0:3]
切片的半闭间隔符号可能正在
将程序员推到墙上,因为所有
正在遵循的文档使用封闭间隔.
Python程序员被宠坏了. :)
- -
格兰特·爱德华兹·格兰特·尤!我认为我的职业生涯
在被毁了!
visi.com

标签: python

添加新评论