Programming languages 过去他们是如何直接输入机器代码的?
我在这篇文章中读到,人们过去常常直接输入机器指令 我想看看他们的键盘和显示器的一些图片。他们是否直接将这些指令输入内存?其中有多少是直接发送到CPU的?它过去的工作频率是多少?我想多读一些关于这些计算机和编程的书Programming languages 过去他们是如何直接输入机器代码的?,programming-languages,computer-science,Programming Languages,Computer Science,我在这篇文章中读到,人们过去常常直接输入机器指令 我想看看他们的键盘和显示器的一些图片。他们是否直接将这些指令输入内存?其中有多少是直接发送到CPU的?它过去的工作频率是多少?我想多读一些关于这些计算机和编程的书 请发一些好的推荐信。如果你见过或编程过其中的一台机器,请告诉我这个故事。好吧,如果你追溯到足够远的地方,代码是通过穿孔卡输入的 从19世纪起,在大学的微处理器实验室中,我们仍然有类似的设备(例如8085套件)——它们通常有一个十六进制键盘,您可以使用它将机器代码输入RAM中的某个指定位
请发一些好的推荐信。如果你见过或编程过其中的一台机器,请告诉我这个故事。好吧,如果你追溯到足够远的地方,代码是通过穿孔卡输入的
从19世纪起,在大学的微处理器实验室中,我们仍然有类似的设备(例如8085套件)——它们通常有一个十六进制键盘,您可以使用它将机器代码输入RAM中的某个指定位置,然后按另一个键开始执行。自20世纪50年代以来,几乎每台计算机都有独立的RAM,因此,指令永远不会直接进入CPU 您可能需要查看这些培训工具包的一些图像。 早期的电子计算机使用前面板显示并允许更改机器内部寄存器和内存的状态。前面板通常由安装在金属板面板上的指示灯、拨动开关和按钮阵列组成
只是为了稍微偏离大型机方法 我第一次体验低空飞行是在辛克莱ZX-81上。它有一个BASIC内置的变体,但您可以通过以下方式“轻松”在Z-80机器代码中编程:
- 向基本程序添加REM(注释)语句。用字符填充,以便为代码“保留”一些内存
- 在列表中查找机器代码操作码,并将机器代码手工组装为字节值
- 将字节值作为数据语句输入BASIC程序,并使用一个短循环依次读取每个字节值,然后将其插入内存中,内存中保存REM语句的“文本”
- 跳转到机器代码的入口点地址
啊,过去的好日子…:-) 80年代初,我还是个孩子,我家有幸拥有一台个人电脑——“苹果II”。像许多程序员一样,我从小就开始做游戏,因为我想创建自己的游戏。有一个内置的名为Applesoft BASIC的BASIC语言解释器,但速度太慢,无法制作任何合理的动画。至少有人告诉我,商业游戏都是用汇编语言编写的。于是开始了探索。。。要学习汇编语言。。。这首先意味着学习机器语言。。。(直接输入十六进制数,而不是代表微处理器指令的三个字母的文本代码) 苹果II使用6502微处理器。您必须学习的第一件事是内存映射,它是内存的每个部分(RAM和ROM)的范围和用途。以下是苹果电脑内存地图的链接][e: 左边空白处的黑色数字是内存位置。请注意,它从$0000到$FFFF。6502只能寻址16^4=65536或64k的内存。您可以看到RAM以$BFFF结尾。$C000-$CFFF范围将访问您放置在计算机中的任何外围卡。例如,磁盘驱动器控制器将进入插槽#6并将ld显示为$C600。当我还是个孩子的时候,我感觉很酷,我可以通过键入
$C600G
来重新启动系统,这将在ROM中执行(“G”代表“Go”)磁盘控制器重新启动例程。从$E000到$FFFF的空间最初只是ROM,但Apple][e(“e”代表“增强”)允许您来回切换(“银行切换”)并访问额外的8k内存
您看到内存映射的图形和文本区域了吗?这就是您在屏幕上显示的方式。在那些日子里(GUI之前),有一种“文本”模式,ROM中的程序将持续扫描$0400到$0800之间的内存(=4*16*16=1024字节位置,每个位置对应于屏幕上的一个位置)。它会将填充的ASCII字节转换为监视器上的字符。以下是6502指令集,它允许您移动字节:
为了把它放到上下文中,这里有一个来自ROM的子程序,它将浮点数相加,称为FADD:(完整浮点例程集合)
查看例程,冒号前的前四个十六进制数是内存地址。因此,如果要直接运行FADD例程,请键入F46EG
(同样,G表示“go”)
接下来的两个十六进制数,$A5和$F4是指令代码。如果你看一下方便的指令集图表,你会发现$A5表示“LDA”或加载累加器。累加器是6502处理器上三个内存位置(每个字节)中的一个,供你进行计算(这很好,是吗?)。LDA命令的$A5版本意味着要加载的内存位置来自所谓的“零页”或RAM的第一个$FF字节,这些字节大部分保留供系统使用(有几个字节可供程序员使用。同样,这太好了。)$F4是内存位置,其内容(一个字节)将被传输到累加器。下一行有指令$C5或“CMP”命令,同样是零页版本,然后将累加器的内容与内存位置$F8进行比较。这是称为“机器语言”的最低级别“是的,为了调试的目的,我们有时会输入一些小程序或乱放内存
接下来的几列更具可读性;您可以看到实际的“LDA”和“CMP”命令以及代表这些内存的变量X1和X2
F46E: A5 F4 FADD LDA X2
F470: C5 F8 CMP X1 COMPARE EXP1 WITH EXP2.
F472: D0 F7 BNE SWPALGN IF #,SWAP ADDENDS OR ALIGN MANTS.
F474: 20 25 F4 JSR ADD ADD ALIGNED MANTISSAS.
F477: 50 EA ADDEND BVC NORM NO OVERFLOW, NORMALIZE RESULT.
F479: 70 05 BVS RTLOG OV: SHIFT M1 RIGHT, CARRY INTO SIGN
F47B: 90 C4 ALGNSWP BCC SWAP SWAP IF CARRY CLEAR,
* ELSE SHIFT RIGHT ARITH.
F47D: A5 F9 RTAR LDA M1 SIGN OF MANT1 INTO CARRY FOR
F47F: 0A ASL RIGHT ARITH SHIFT.
F480: E6 F8 RTLOG INC X1 INCR X1 TO ADJUST FOR RIGHT SHIFT
F482: F0 75 BEQ OVFL EXP1 OUT OF RANGE.
F484: A2 FA RTLOG1 LDX #$FA INDEX FOR 6:BYTE RIGHT SHIFT.
F486: 76 FF ROR1 ROR E+3,X
F488: E8 INX NEXT BYTE OF SHIFT.
F489: D0 FB BNE ROR1 LOOP UNTIL DONE.
F48B: 60 RTS RETURN.