首页 > 其他分享 >自己动手写CPU - 6

自己动手写CPU - 6

时间:2025-01-11 23:28:35浏览次数:3  
标签:bin 自己 in2 in1 动手 line CPU bne op

自己动手写CPU_qq85058522的博客-CSDN博客

CPU不加功能了,但汇编器可以有。

下面写一个把汇编(助记符)翻译成机器码的小工具。Python熟些,就用它了。很简单,就是字符串替换。直接上代码。

import sys

if len(sys.argv) != 2:
    print("usage: python assembler xxx.asm")
    exit(0)
code_path = sys.argv[1]
print('processing %s' % code_path)

op_dict={'ldr':0,'mov':0,'add':1,'sub':2,'and':3,'or':4,'cmp':5,'beq':6,'bne':7}
for i,line in enumerate(open(code_path).readlines()):
    try:
        line = line.split('//')[0]
        line = line.replace('bne', "bne r7 ")
        line = line.replace('beq', "beq r7 ")
        (op,in1,in2) = line.lower().replace(',',' ').split()
        # print(op,in1,in2)

        bin_op = op_dict[op]
        bin_in1 = int(in1[1:])
        bin_in2 = int(in2[1:])
        if '#' in in2: bin_in2 += 0x0800   #1<<11: [11]表示立即数

        code = (bin_op<<12) + (bin_in1<<8) + (bin_in2)
        print("%d: op = 'h%04x" % (i,code))

    except:
        print("@@@line %d: error(s) occured."%i)

从命令行运行时传入xxx.asm即可,否则会报错,提示usage: python assembler xxx.asm。

主要代码就下面这10行:

        line = line.split('//')[0]
        line = line.replace('bne', "bne r7 ")
        line = line.replace('beq', "beq r7 ")
        (op,in1,in2) = line.lower().replace(',',' ').split()

这4行对指令做预处理,去掉注释并按空格逗号分隔成3段。这里bne/beq只有两段,稍做转换,这样所有指令可以对齐,方便使用相同的规则来处理。

        bin_op = op_dict[op]
        bin_in1 = int(in1[1:])
        bin_in2 = int(in2[1:])
        if '#' in in2: bin_in2 += 0x0800   #1<<11: [11]表示立即数

这4行是指令转码。按op分段解码,转换成二进制码。

        code = (bin_op<<12) + (bin_in1<<8) + (bin_in2)
        print("%d: op = 'h%04x" % (i,code))

这2行是将3个分段的二进制加起来,形成一条机器码。这里打印出来,然后复制到FPGA环境,就可以编译下载并运行新程序了。

把一节的程序拿过来试试:

ldr r0,#0
ldr r1,#1
add r0,r1
add r1,#1
cmp r1,#11
bne #2
mov r7,r7   //while(1);

输出

processing r:/code.asm
0: op = 'h0800
1: op = 'h0901
2: op = 'h1001
3: op = 'h1901
4: op = 'h590b
5: op = 'h7f02
6: op = 'h0707

可以用了。

标签:bin,自己,in2,in1,动手,line,CPU,bne,op
From: https://blog.csdn.net/weixin_46766770/article/details/145084309

相关文章

  • WiFi+4G摄像头拍照图传模块(夜视2K高清1080P)-关于参考资料,程序移植,新建调用自己的
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/product/audioCamera.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p> 关于参考资料......
  • 终于决定:把自己家的能源管理系统开源了!
    决定了很久把自己公司的能管平台开源了,部分功能和bug正在修复中。欢迎star欢迎轻拍地址:https://gitee.com/ustcyc/zhitan-ems介绍通过物联网技术,采集企业水、电、气、热等能耗数据,帮企业建立能源管理体系,找到跑冒滴漏,从而为企业节能提供依据。进一步为企业实现碳跟踪、碳盘......
  • cpu占用率为什么有时会超过100%?
    文章目录cpu占用率为什么有时会超过100%?1.多核处理器的影响2.监控工具的计算方式3.虚拟化环境的影响4.短时间峰值5.软件或驱动程序的问题结论cpu占用率为什么有时会超过100%?CPU占用率超过100%的现象在多核处理器系统中是比较常见的,主要原因如下:1.多核处......
  • 如何控制docker中占用系统资源(CPU,内存)的份额?
    在Docker中,你可以通过多种方式来控制容器对系统资源(如CPU和内存)的使用份额,以确保容器不会过度消耗宿主机的资源,并与其他容器公平地共享资源。以下是一些常用的方法:一.控制CPU资源CPU份额(CPUShares):Docker使用CPU份额来分配CPU时间。默认情况下,所有容器具有相同的CPU份额,这意......
  • CPU、MCU、MPU、SOC、DSP、ECU、GPU、FPGA傻傻分不清楚?一文讲清它们的区别
    前言在电子领域中,我们经常提到CPU、MCU、MPU、SOC、DSP、ECU、GPU、FPGA等,它们都是常见的芯片或处理器类型,但是却在结构、功能和应用场景上存在着显著的差异。有些朋友可能不太能区分,今天我们就来依次介绍一下。一、定义与功能1、CPU(CentralProcessingUnit,中央处理器)定义:是......
  • 突然发现上海交大的《动手学大模型》实战教程真的好清晰!附资源分享
    本课介绍今天分享一个上海交大的免费的大模型课程,有相关教程文档和Slides,目前是4.1K星标,还是挺火的!《动手学大模型》系列编程实践教程,由上海交通大学2024年春季《人工智能安全技术》课程(NIS3353)讲义拓展而来(教师:张倬胜),旨在提供大模型相关的入门编程参考。通过简单实践,帮......
  • 【等待优化】sql server CXPACKET 等待 导致 CPU飙高、CPU100%
    From: https://www.cnblogs.com/gered/p/12539368.html目录【1】CXPACKET的基本解决策略【1.1】CXPACKET 解释【1.2】在OLTP上解决CXPACKET的办法——调整并行度【1.3】Data-warehousing/Reportingserver上的CXPACKET【1.4】MixedSystem(OLTP&OLAP)【2】CPU......
  • 为自己的数据集写yaml文件
    这篇文章会非常简短,快速让你拥有自己的yaml文件,如果有小伙伴的数据集有yaml文件,那就再次加深一下印象吧,或者点点赞也是可以滴,嘻嘻每个人的数据集不一样拥有的yaml文件也有所不同,其中注意类别和路径这俩个核心就可以了,照抄yolov8里面的coco128.yaml先给大家看一下我的yaml文件......
  • 在Autodl上跑目标检测项目(yolov8+自己的数据集)
    大家好啊,我依旧是兰白,好久没更新了,哈哈最近忙着学校的考试,耽搁好久了,在之前我分享的yolo专栏中,包含了以下内容(有需要的盆友可以看看) voc格式转换为yolo格式 合并两个类似数据集Vscode远程连接Autodl上传数据集或文件到Autodl(xshell+xftp)这些包含从刚开始收集的数据集......
  • 动手学深度学习-卷积神经网络-1从全连接层到卷积
    目录不变性 多层感知机的限制平移不变性局部性  卷积“沃尔多在哪里”回顾 通道小结 我们之前讨论的多层感知机十分适合处理表格数据,其中行对应样本,列对应特征。对于表格数据,我们寻找的模式可能涉及特征之间的交互,但是我们不能预先假设任何与特征交互相关的......