最早期的计算机雏形采用打孔纸带作为程序,理解打孔纸带计算机运行原理有利于我们理解计算机CPU的运行原理。
因为到目前为止,计算机的运行原理本质上没有变,都是运行0/1状态的计算。
基本原理
打孔纸带编程的本质是基于机器码的程序。
场景举例
假定现在有一个简单CPU,其能运行10种指令,对应的二进制为:
halt -- 0000
mov -- 0001
add -- 0010
and -- 0011
or -- 0100
xor -- 0101
sub -- 0110
shift -- 0111
load -- 1000
store -- 1001
同时,CPU带有8个通用寄存器,对应二进制如下:
r0 -- 0000
r1 -- 0001
r2 -- 0010
r3 -- 0011
r4 -- 0100
r5 -- 0101
r6 -- 0110
r7 -- 0111
程序功能及代码
1、将 内存地址(ex:0x1a)放到寄存器0
2、寄存器0的地址所对应的数据读取到寄存器1
3、将另一个内存地址(ex:0x2c)放到寄存器0
4、将寄存器0的地址所对应的数据读到寄存器2
5、将寄存器1和寄存器2的数值相加,存储到寄存器3
6、将第三个地址(ex:0x3e)放到寄存器0
7、将寄存器3的数值写入寄存器0所对应的地址
对应的汇编代码如下:
mov r0, 0x1a
load r1, [r0]
mov r0, 0x2c
load r2, [r0]
addr r3, r1, r2
mov r0, 0x3e
store r3, [r0]
halt
机器码翻译
前面讲到,CPU支持10个指令,同时这些指令有自己的格式和参数,我们以二进制每16位为一组做成编码,不足的补0,指令规范如下:
mov : 0001 xxxx yyyy yyyy
load: 1000 xxxx yyyy 0000
add: 0010 xxxx yyyy zzzz
store: 1001 xxxx yyyy yyyy
halt: 0000 0000 0000 0000
其中xxxx yyyy zzzz 分别代表了代码中要写的具体数值。
于是翻译后,上面的代码就变成:
#0 0001 0000 0001 1010 - mov r0 0x1a
#1 1000 0001 0000 0000 - load r1 [r0]
#2 0001 0000 0010 1100 - mov r0 0x2c
#3 1000 0010 0000 0000 - load r2 [r0]
#4 0010 0011 0001 0010 - add r3 r1 r2
#5 0001 0000 0011 1110 - mov r0 0x3e
#6 1001 0011 0000 0000 - store r3 [r0]
#7 0000 0000 0000 0000 - halt
至此,一个汇编程序代码就简单的翻译成纯粹的二进制格式。
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
点击这里找小助理0元领取:嵌入式物联网学习资料(头条)
纸带编码原理
纸带的每一行规定了8个孔位,每个孔位代表1bit,可以打孔也可以不打,打孔代表1,不打代表0。
纸带每行8个bit,两行就是16个bit,上面的二进制代码,以8位一行,表现在只带上,就如下图所示:
○○○● ○○○○ – 0001 0000
○○○● ●○●○ – 0001 1010
●○○○ ○○○● – 1000 0001
…后续省略
纸带编码识别
到这里我们几乎能够明白纸带编码原理了,但是还差一点,就是如何识别纸带编码,这里我们可以发挥想象比如:
- 方案1:采集器是8个探针(探针很粗,不会扎破纸带), 纸带上下都有探针,有孔的地方,探针会接触导通,而没孔的地方则不会导通,另外再配备1个传送带,按照恒定匀速拖动纸带移动,这样CPU就能够识别纸带编码,进而进行计算。
- 方案2:纸带上下有个 发光二极管,遮挡则不导通,类似于现在的形成开关。
声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。
———— END ————
文章链接:https://mp.weixin.qq.com/s/kHCjz_Ev7HNo_ZlUyqBfRg
转载自:嵌入式专栏
文章来源:计算机程序的来源
版权申明:本文来源于网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
如若转载,请注明出处:https://www.vsaren.com/135469.html