计算机基本知识

来源:互联网 发布:家电进销存软件 编辑:程序博客网 时间:2024/06/06 04:27

1.汇编语言学习与Makefile入门

  ORG   0x7C00 ;指明程序的装载地址  (将程序装到内存哪个起始地址上)

  INT    0x10    ;调用显卡BIOS

  JMP    entry  ;跳到某个地址

  MOV   ax, 0  ;AX=0

  所有的汇编指令都汇编为对应的机器指令,比如:

  ADD CX,0x1234  ;编译为: 81 C1 34 12 

2,计算机是用来计算的,计算的是什么?数据;数据需要一个地方保存、存储他,这个地方在哪?叫什么?存储数据的地方很多,可以统称为存储器。最大的存储器称为硬盘,也称外存储区,他的容量以GB,TB计算(现在的PC配置的硬盘基本是250G以上),他的速度较慢;还有一个叫内存储器,简称内存,(现在的PC配置的内存基本是8G),他的存储速度比硬盘快,他非常重要,因为所有的软件运行后都要保存在其中(我们点击一个exe可执行文件,他就从硬盘复制到了内存中);还有一个叫寄存器,他的作用就是存储CPU最最常用的数据,他是CPU中的存储电路(相当于机器语言中的变量),他的容量最小,以kB计算,他的速度最快,因为他离CPU最近,所谓的“近水楼台先得月”嘛。其实介于寄存器和内存之间的还有一个叫缓冲存储区,简称缓存,顾名思义,他用于在缓存CPU经常要用的数据。

3,我们把计算机看做一个机器人,CPU就是大脑,寄存器是大脑里的记忆单元,而内存和硬盘对计算机来说,只是一个柜子,一个存储东西(数据)的大柜子,机器人只能进行数据处理,按照人的指令执行。指令已经固化在大脑CPU内部,但数据存储在柜子里,这个柜子分为许多小格,每个小格都编了一个号,第一个小格叫0号,第二个叫1号,以此类推,每个小格存储一个字节。抽象来讲,是一个一维的线性数组。

一个小格是8bit一个字节,2个小格是2个字节,CPU可以操作1个,2个,4个,8个格子,比如AL1),AX2),EAX4),RAX8)。

CPU来说,内存和硬盘就是一个(数字)地址而已。显存,IO地址,U盘也是地址,

存取内存比寄存器慢很多,所以编写程序尽量用寄存器存数,而不是内存地址。

4CPU的记忆单元-寄存器很少,只有几十上百个,每个寄存器都有一个名字,比如AXBX,CX,DX,SP,BP,DI,DI等等,因为名正则言顺。寄存器只是一个存储单元,他只能存储东西(数据),我们对他所做的所有操作只有存数据在里面,还有从中取出数据。

比如:MOV AX,100 就是把数据100存储在AX寄存器中,MOV SS,AX 就是把AX中的数据取出来,并放到寄存器SS中。

MOV指令具体怎么实现呢?MOV指令对应一个机器指令01码,处理器有一个专门的译码电路逐条把这些01编码翻译为各种控制信号,然后控制其内部的电路完成一个个的运算或者是其它操作。

 在计算机(PC)中,数据和指令存储在一起,因为指令的表现形式也是数据,比如 ADD CX,0x1234  ;编译为: 81 C1 34 12 ,(这叫冯诺依曼结构,指令和数据存储在不同的存储器叫哈佛结构),那CPU怎么知道内存中的内容到底是数据还是指令呢?答案PC寄存器指向的都是指令,其他的都是数据。如果编程指针跑飞,就是PC指向了数据地址,那软件就会执行错误了(“执行”了数据,“显示”了机器语言)。

  (文中写了PCPC有两个意思,一个是个人计算机Personal Computer,另一个是CPUPC寄存器,他存储了下一条要执行的指令的地址。)

寄存器分通用,专用两种,比如CX主要用于计数,BX适合作为计算内存地址的基点。

5. 我们知道随着Intel微处理器(CPU)的更新换代,从808/8088286,386,奔腾系列,到core2i7等等,我们的软件可以运行在以上所有的CPU上,这种硬件的向上兼容性是怎么实现的呢?其实很简单,每次把上一次的电路包括即可,因为集成电路发展很快,一单元的空间所能存放的电路以指数级在增长,所以包括以前的电路是很容易实现的。

  而软件为什么能一直兼容?所有的软件最终编译为汇编机器指令,八位机时代,我们用了ALAH16位时代我们用AXBX32位我们用EAXEBX64位用RAXRBX

16位程序在32OSCPU上运行,只用到EAX的低16位,即AX,高16位就浪费没用,就是这样只用低位的寄存器而已。

6. 网络就是数据交换和通讯,云是海量数据的抽象,云存储是把数据存储在网络上(因为网络存储空间可以看做无限),云计算是分布式计算的更一步发展,是网络(很多计算机)作为一个整体的超大计算机计算,所以速度很快。

7. JMP entry;把PC寄存器指向entry这个地址,从此地址开始执行指令。

  Org 0x7c00 JMP 0x7C50;中间是0x50个数据。

方括号[],表示内存地址,如 MOV BYTE[678],123 ;就是把123存到内存地址678(字节)中。MOV WORD[678],123 123存到内存地址678679(字)中。DWORD

MOV BYTE[SI],12 ;12存到SI所代表的地址中。寄存器指定地址:只有BXBPSIDI等,比如:MOV AL,BYTE[DX ] 是不对的,只能如下:

MOV BX,DX MOV AL,BYTE[SI] 

 MOV源数据和目的数据必须位数相同,如是MOV AL[SI] 可省略BYTE

 CMP AL,0   JE finish     if(AL==0){goto finish ;}  ;compare 比较 ,JE jump if equal 

INT :interrupt 软件中断指令

8. 电脑中有一个程序,他在电脑主板的ROM中,他预先写入了操作系统开发人员经常会用到的一些程序,非常方便。他是一个函数(库)的集合,而INT就是用来调用这些函数的指令。INT的后面是数字,使用不同的数字可以调用不同的函数。比如:INT 0x10调用16号指令,他的作用是控制显卡。这个程序的名字叫BIOS

电脑启动后,CPUBIOS程序调入内存某个地址(0xf0000)。

HLThaltCPU睡眠停止,等待动作。

9.0x7C00 - 0x7DFF :启动区内容的装载地址。512字节,这个地址是IBMIntel规定的,已经不能更改。----开机启动程序地址

一些内存地址是不能(由应用程序)读写使用的,比如OSBIOS,库文件的地址。*int *0x0000 = 100;我们这样用C指针访问地址0就会出现错误(操作系统保护)。

编写操作系统的时候需要注意某些内存不能由应用程序访问,

Ipl.nas  :intial program loader 512字节的启动程序加载器

10.Makefile入门---一个聪明的批处理文件

 ipl.bin : ipl.nas Makefile

../z_tools/nask.exe ipl.nas ipl.bin ipl.lst

Make ipl.bin;寻找后面两个依赖文件,执行汇编生成目标文件

clean : -del ipl.bin -del ipl.lst ;删除生成两个文件

0 0
原创粉丝点击