- 博客(19)
- 收藏
- 关注
原创 Day7 FIFO与鼠标控制
但是当前还存在一个有问题的现象,例如,右Ctrl键会产生两个字节的键码,按下时为“E0 1D”,松开时为“E0 9D”,在这种情况下,因为键盘的内部电路,一次只能发送一个字节,所以一次按下就会产生两次中断,第一次中断发送E0,第二次发送1D。所谓不产生鼠标中断,就是说即使鼠标发来数据,CPU也不会接收,所以,处于初期状态的鼠标,无论怎么操作,都不会有反应。所谓中断处理,就是打断CPU正在手头的工作,加塞处理另一个事情,所以必须完成的干净利索,而且中断处理进行期间,不再接受其他的中断。
2025-04-07 08:31:52
1028
原创 Day06 分割编译与中断处理
段的上限是4GB字节,需要使用一个32bits的数字表示。PIC的寄存器都是8位寄存器,IMR是“interrupt mask register”(中断屏蔽寄存器),8位分别对应8路IRQ(interrupt request,中断请求)信号,如果IMR的某一个bit为1,则这一路IRQ信号被屏蔽,PIC就忽视这一路信号。这个函数所做的动作主要是,将寄存器的值保存在栈里,然后将DS和ES调整到与SS相等,再调用_inthandler21,返回以后,将所有寄存器的值再返回到原来的值,最后执行IRETD。
2025-04-04 22:03:27
957
原创 Day5 结构体、文字显示与GDT/IDT初始化
使用OSASK字体数据(记录在hankaku.txt文件中),并使用专用工具makefont.exe将hankaku.txt文件制作成一个bin文件,接着使用bin2obj.exe工具使其生成目标文件,就可以连接到可执行文件中。各个设备有变化时就会产生中断,中断发生后,CPU暂时停止正在处理的任务,并做好接下来能够继续处理的准备,转而执行中断程序。段寄存器的低3bits不允许使用,因此段号可以是0 ~ 8191之间的数字,因此最多可以设置8192个段,存储这么多段的信息总共需要。
2025-03-16 22:54:27
859
原创 Day4 C语言与画面显示练习
在两种指令中,为了区别不同的设备,也需要使用设备的号码(称为“port”,意为港口),可以理解为CPU与设备交换信号的行为类似于船舶的出港和进港。调色板(palette):用8bits的颜色名来表示24bits种类的颜色,例如2号(8bits)颜色就是#ff0000(亮红),3号颜色就是#00ff0(亮绿)。在当前的画面模式中,画面上有320*200(=64000)个像素点,假设左上点的坐标为(0,0),则右下角的坐标为(319,199)。CLI屏蔽中断,就是将中断标志置为0的指令,即忽略中断请求;
2025-03-08 22:08:50
1096
原创 Day3 进入32位模式并导入C语言
并没有特殊的含义,只是由于启动区加载到0x7c00 ~ 0x7dff区域,所以0x07e00 ~ 0x9fbf之间没有特别用途,操作系统可以随意使用,因此就选择了0x8200之后的区域。它只是将所有的目标文件链接在一起组成了一个完整的机器语言文件,为了能实际使用,还需要针对不同操作系统的要求做必要的加工,例如用于识别的文件头,压缩等。当使用段寄存器时,以。CPU的16位模式和32位模式中,机器语言的命令代码不同,同样的机器语言,解释方法也不同,所以16位模式的机器语言在32位模式下无法运行,反之亦然。
2025-02-28 08:42:15
672
原创 Day2 汇编语言学习与Makefile入门
ipl.bin : ipl.nas Makefile”表示,如果期望制作一个ipl.bin文件,就需要先检查一下ipl.nas和Makefile是否准备好,如果存在,make工具就会自动执行下一行命令。此外,default是Makefile中的一个关键字,意思是如果只执行make命令,其后不跟任何选项参数,则默认执行这一句,所以在helloos5文件夹下,cmd执行。这个脚本的功能是将所输出的ipl.bin写入磁盘映像img的开头,组成一个新的完整的磁盘映像文件helloos.img。
2025-02-13 09:09:27
962
原创 day01 从计算机结构到汇编程序入门
书中例程的玩法一般是,将img操作系统镜像和一些辅助文件(比如,编译脚本,运行脚本)放置在一个文件夹下,这些脚本中的内容都是以相对路径编辑的,再将该文件夹放置在tolset目录下。表示启动区,一般是软盘的第一个扇区。由于启动区只有512字节,操作系统无法直接放在里边,因此一般将操作系统的引导程序放在启动区里。否则,则认为该软盘中没有所需的启动程序,就会上报一个不能启动的错误。今天开始记录看的《30天自制操作系统》这本书,书的名字显示这书不是一本好书,不过据说还不错,我就记录一下看书和实验的过程。
2025-01-20 08:58:37
124
原创 《code》 24th “低级语言与高级语言”
如果不经压缩,一帧数据是640x480,每个像素为24bits真彩色,每一帧则是921,600字节,如果播放速度为30帧/秒,则每秒需要存储空间为27,648,000字节,一部两小时的电影大概199,065,600,000字节(约200GB)。如果要为新的机器写一个汇编器,新的汇编器(本质上是一个程序)可以在已有的计算机上的使用汇编语言编写,并利用已有机器上的汇编器对其汇编,这种方式称为交叉汇编(cross-assembler),即利用计算机A的汇编器对运行在计算机B上的程序进行汇编。
2025-01-18 09:39:11
747
原创 《code》 23th “定点数和浮点数”
例如,当e为0时,科学计数法的指数为-127。为了防止有的数字过大或过小导致预留空间不足,一般使用科学计数法(scientific notation),它把每个数表示成有效位(或有效数)与10的幂乘积的形式。对于小数,基于二进制的存储和标志方式被称为定点格式(fixed-point format),所谓的定点是指小数点的位置总是在数字的特定位置。如果某个数不是以整数为系数的代数方程的解,那么这个数就是超越数(transcendental),所有超越数都是无理数,但反之不成立,pi和e就是典型的超越数。
2025-01-12 20:10:28
907
原创 《code》 22th “操作系统”
在启动计算机时,需要把CP/M加载到内存中。如果程序比磁盘的扇区大,存放这个程序就会用到多个扇区,但是磁盘上某些扇区被占用,某些扇区空闲,可能在磁盘上难以找到一块完整的连续的足够大的扇区存放程序,所以如果期望存储一个较大的程序(大于每个扇区的size)就需要手工记录。为了解决磁盘容量越来越大,难以查找的问题,DOS引入了层次文件系统(hierarchical file system),目录区同样存储在磁盘的特定区域,不同的是有些文件本身也是目录(这些文件包含其他文件,并且所包含的文件中仍旧可能存在目录)。
2025-01-11 19:23:04
752
原创 《code》 21th “总线”
一台完整的计算机会按照功能将各部件分别安装在几个电路板上,这些电路板之间就通过总线(Bus)连接。总线可以认为是数字信号的集合,这些信号被提供给计算机上的每块电路板。地址信号:由微处理器产生,通常对RAM进行寻址,也可以用来对连接到计算机上的其他设备寻址;数据输出信号:由微处理器产生,用来把数据写入到RAM或其他设备;数据输入信号:由其他部分产生,由微处理器读取。通常是由RAM输出,也有其他部件对微处理器提供数据的输入;
2025-01-02 09:03:19
705
原创 《code》19th “两种典型的微处理器”
除了CF(进位标志位)和ZF(零标志位)外,8080还添加了3个其他的标志位(flag),包括SF(符号标志位),PF(奇偶标志位)和AF(辅助进位标志位)。由于8080芯片中有6个寄存器(如果假设累加器也算一个寄存器,8080将包含7个,在汇编代码的实现中看起来确实作用是相似的),因此它存在63个MOV指令用于将数据从一个寄存器移动到另一个寄存器(依然遵循左边是目的操作数,右边是源操作数)。对于LDA指令,它可以把单字节的操作数搬移到累加器中,该指令的最后直接跟的是操作数在RAM中的16位地址;
2024-12-28 16:27:59
1301
原创 《code》 18th “从算盘到芯片”
当存储器比较小时,就需要通过某些存储器地址控制其他介质来存取信息,这样就绕开了存储器的大小限制(例如,假设在存储器的某地址写入一个字节就在纸带上打一个孔,而从存储器中读出这个字节的时候就相当于在纸带上读取一个孔)。集成电路需要经过非常复杂的工艺流程,包括将硅片分层(大致为绝缘层,导体层,整流层和放大层),然后非常精确的掺入杂质,以及蚀刻不同的区域形成微小组件。书中在这中间还说了很多有趣的历史,“信息论”,“控制论”,“赛博朋克”的来源,“electronic brain (电脑)”的来源等。
2024-12-21 17:59:12
666
原创 《code》 17th “自动操作”
可以想到的一个方法是有另一个的RAM专门用于保存指令(本质也是二进制,不同二进制组合表示不同的人类语言指令),该指令RAM和存放待计算的数据的RAM有所存放的东西一一对应,即RAM。计算乘法是就可以用到“Jump If Not Zero”指令,同样是将乘法认为是一个数(其中一个乘数)的重复多次(另一个乘数)相加,使用非零跳转指令,可以再没跳转一次后将累加的次数(另一个乘数)递减1直到减为为0,则停止跳转。这四个指令中的零和进位指的是,使用该指令前最近的一条计算指令的输出是否为0和是否进位。
2024-12-18 08:55:56
800
原创 《code》 16th存储器组织
RAM阵列的存储容量可以用以下公式计算,其单位是由数据输入端决定的(每次可以输入多少数据,则单位就是多少)。例如,下图中输入输入端每次可以输入8bits(或1字节)的数据,地址输入有10bits,则该RAM可以保存1024x8bits的数据,或称为1024字节的数据。将该电路称为1024x8 RAM阵列。需要注意的是,根据最初11章引入的继电器的基本结构,每个继电器都需要与某个电源连接在一起,可以认为继电器有一个实际做功电源和一个控制电源,当然两者有时候也是同一个。
2024-12-04 22:36:16
1225
原创 《code》 14th “反馈与触发器”
如果计数器的输出连接灯泡,则0000 0000时灯泡为全灭,1111 1111时为全亮,从全灭到全部亮起总共需要经历255次跳变,从本次全灭到下次全灭则总共需要256次跳变。当保持位为1时,电路的输出与数据段相同(数据端1,Q为1;先看加法器,将八位加法器的低8bits输出传输至八位锁存器,“保存”开关控制时钟位,通过“来自锁存器”开关控制2-1选择器的输出是来自锁存器还是来自其他开关。由于在原则上,复位和置位应该是相反的,并且期望只有一个数据输入端,因此对两者设置同输入,并在之间加装反向器。
2024-12-01 19:34:29
1099
原创 《code》 13th “如何实现减法”
由于逻辑异或门的特点是“输入A为0则输出等同输入B,输出A为1则输出相反与输入B”,因此可以使用逻辑异或门,将取反作为公共的异或门输入A,将第二个操作数作为异或门的输入B。书中本章节最后,对于二进制补码,二进制负数之类的概念讲的确实清晰,值得看原书,但是对于补数的概念,感觉有点前后矛盾了,个人理解起来有点牵强,不过也可以接受。同样的,在十进制中,使用一串9减去减数得到的差就叫做对9的补数。但是在求对1的补数的时候好像根本不需要使用减法,只需对原来的操作数1变为0,0变为1,即取反码(inverse)。
2024-11-26 08:51:05
894
原创 《code》 12th chapter “二进制加法器”
如果使用同样规格的继电器制作一台加法器,该加法器的运算总的速度为:加法算数的位数*全加器硬件的速度。这被称为“行波进位”(ripple carry)。更快的加法器使用“前置进位”的电路来提高计算速度。当继电器后来被真空管替代,真空管后来又被晶体管替代。但搭建8位加法器仍旧需要144个晶体管(如果使用前置进位,则需要更多的晶体管)。
2024-11-23 12:26:11
1306
原创 《code》11th chapter “门”
理论上只需要四个开关就可以定义顾客中意的猫咪,其实就像代码中的那样:性别,是否生育,颜色组1,颜色组2(因为此时有四种颜色待选,所以需要两个开关才能完全表示)。现在回到选猫的问题,最开始说的,只需要两个开关就可以演示该猫的颜色,即可以认为两个开关控制四个灯的亮灭,即两个输入获得四个输出。显然,也类似开关的并联,闭合任一开关,都可以点亮灯泡。与门的符号不仅仅代表了两个串联的继电器,还暗示了上边的继电器与电源相连,并且两个继电器都接地。本书的每一章就是一个长长的章,中间没有分节,至少11章之前是的,有点难搞。
2024-11-22 08:53:17
721
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人