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个格子,比如AL(1),AX(2),EAX(4),RAX(8)。
对CPU来说,内存和硬盘就是一个(数字)地址而已。显存,IO地址,U盘也是地址,
存取内存比寄存器慢很多,所以编写程序尽量用寄存器存数,而不是内存地址。
4,CPU的记忆单元-寄存器很少,只有几十上百个,每个寄存器都有一个名字,比如AX,BX,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指向了数据地址,那软件就会执行错误了(“执行”了数据,“显示”了机器语言)。
(文中写了PC,PC有两个意思,一个是个人计算机Personal Computer,另一个是CPU的PC寄存器,他存储了下一条要执行的指令的地址。)
寄存器分通用,专用两种,比如CX主要用于计数,BX适合作为计算内存地址的基点。
5. 我们知道随着Intel微处理器(CPU)的更新换代,从808/8088,286,386,奔腾系列,到core2,i7等等,我们的软件可以运行在以上所有的CPU上,这种硬件的向上兼容性是怎么实现的呢?其实很简单,每次把上一次的电路包括即可,因为集成电路发展很快,一单元的空间所能存放的电路以指数级在增长,所以包括以前的电路是很容易实现的。
而软件为什么能一直兼容?所有的软件最终编译为汇编机器指令,八位机时代,我们用了AL,AH,16位时代我们用AX,BX,32位我们用EAX,EBX,64位用RAX,RBX。
16位程序在32位OS,CPU上运行,只用到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存到内存地址678,679(字)中。DWORD
MOV BYTE[SI],12 ;把12存到SI所代表的地址中。寄存器指定地址:只有BX,BP,SI,DI等,比如: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。
电脑启动后,CPU把BIOS程序调入内存某个地址(0xf0000)。
HLT:halt,CPU睡眠停止,等待动作。
9.0x7C00 - 0x7DFF :启动区内容的装载地址。512字节,这个地址是IBM和Intel规定的,已经不能更改。----开机启动程序地址
一些内存地址是不能(由应用程序)读写使用的,比如OS,BIOS,库文件的地址。*(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 ;删除生成两个文件
2013-12-22