#有关汇编语言的org指令(许多不为人知的故事):

有关汇编语言的org指令(许多不为人知的故事):

也许不知道是从什么时候开始,java这种高级语言已经占领市场,连我毕业的大学,现在都不再教C语言的内容了,为了就业率,但是其实作为一个程序员,我表示深深的遗憾啊,还在用C语言的被当作老怪兽看待,什么自动编译,自动部署,自动化的东西太多了,我们程序员都要被玩坏了,理解底层真的困难并且没用吗,nonono,,能够弄明白一些底层的东西对理解计算机,理解各种现在化设备还是很有好处的。光学会了什么mavengroveypython之类的,没有前途。
说到org指令,我这里可有一坨坨的话要说啊,它是汇编语言里面的一条伪指令,说道伪指令,我还是要有一坨坨的话要说的,它不会被编译成可执行的二进制代码,二进制代码,其实就是机器可以执行的代码,那机器可执行的代码呢?其实很多书籍里面都没有提,为啥子呢?为啥最后一层的窗户纸就这么厚?其实,不是,这个牵扯到机密性的东西,为了电脑安全,我们最好不要碰。不过,哈哈,这是逗你玩呢,其实计算机很简单,但是很多人,包括搞机的程序员在内,都觉得电脑很神奇的,其实这简直是误导,计算机不懂任何代码,它只会进行电路的高低电平转化而已,如果知道这个,对理解机器语言有一些些的了解了,但是还不够,那么到底什么是机器语言呢?
理解机器语言,首选理解的是,脉冲

  1. 抛开一切cpu,计算机,内存之类的东西,我们搞一个小电路来看看,假如让你设计一个小电路,可以进行加减乘除,你会怎么做呢?
  2. 你肯定会想,首先,这个电路要动起来,那动起来,要有节奏啊,你会在每个节奏点上,进行一个电路对存储设备的转化,怎样将大象放入冰箱?1,打开冰箱门,2 ,把大象放进去,3,合上冰箱门,对!就是这个节奏,就是这个feel
  3. 脉冲其实就是高低电平的转化,一个高电平,再接一个低电平,就是一个脉冲,脉冲最好是方波,不要正弦波,这样对于电路来说,它更好理解。

虽然说了这么多,好像你明白了,其实,你还是一头雾水,那脉冲怎么推动电路进行高低电平转化呢?对啊,脉冲其实就是一个一个的高低电平,但是请看一下这个视频:这里写链接内容
怎么样,一个脉冲就可以理解为,那个人抽拉一下板子,让滚珠进行一步操作,不过他这个二进制加法器只能进行一次计算,当需要多加几次的时候,还需要手动将加数排列好在进行一次脉冲,那你就会想,如果有另外一个装置,专门进行加数的准备就好了,但是这些东西通过这个装置实现,好像很复杂的样子,但是其实,如果通过电路来设计,那就相当简单了!
说到这里,我们好像还没有考虑怎么通过电路来实现,虽然说很简单,但是也不简单,需要理解更多的电子电路里面的知识,所以写到这里,我不想提电子电路的东西,你只要知道,想移位、加法这些东西,计算机都把它转化为了2进制就可以了。
那机器码呢?由于我们有其他装置来控制加数的准备工作,那另外的装置其实就要保存这些操作的,而这些操作,可以理解为两个部分:1,控制加数部分,2,控制板子的抽拉。比如控制板子抽拉,其实电路要满足0000才能将板子推进去,而0001满足,电路就将板子拉出来,那抽拉就有两个状态码,那抽拉的机器语言就是一个两个时序的代码,那准备加数的电路呢?由于0000和0001已经被占用了,这两个条件具备的时候,电路都不会准备加数,那准备加数,我们定为0110把,所以如果要做一个加法运算,就需要至少3个时序,而每个时序做的操作,分别为 0001 | 0110 | 0000 这三部,转化为十六进制,就是 0x01| 0x06 | 0x00
那么就理解了为啥汇编语言编译出的机器码,但是汇编语言和我们这个加法器的区别在于,它除了操作这一个寄存器,还要操作其它寄存器的,一个cpu至少有8个寄存器,所以它的指令会有类似:为A寄存器添加数据,清空A寄存器,为B寄存器添加数据,清空B寄存器,将B寄存器的内容,加到A里,将A寄存器的内容,加到B里,将A,B寄存器的内容相加,保存到A里,等等等那么多的指令,这八个寄存器玩出的花样,就令人咋舌了,而就靠四位二进制,只能保存最多16种状态,也就是只能识别出16中状态,从而进行16种操作,这远远不行的。
累了吧,脑子是不是有点乱,那么休息一下,我们总结一下:所谓机器码,其实就是状态码,当达到某种状态,这个电路一看,哦呦,这个状态达到啦,执行某个操作,这就是机器码!那么这种状态达到了就执行某种操作的东西,保存在哪呢?对不起,这个既不保存在文件里,也不保存在内存里,这个东西,就是CPU设计时候的电路来实现的,它会在每个脉冲的时候,进行这几个位的检查,是什么状态,就执行什么操作,再说一遍,执行的东西,完全是通过电路来实现的,不是保存在什么位置的,也许某一天,会有可编辑机器码的cpu出现,但是现在真的不行,电路已经焊接完成,不可能再修改了。
那么既然八个寄存器,那需要的机器码就是相当的多啦,为了这个需求,cpu的工程师们连夜改造,终于出现了8位机器码的电脑,所以我们就会发现,所有的计算机程序,都是由八位八位的机器码实现的,比如ADD AX , 0x01 这样的操作,最后都会转化为机器码,它会转化为3个机器码,其实就是3个脉冲来完成的,明白了吧!
所以INtel的工程师一旦发明了一个芯片,一开始就要告诉大家,我们的芯片里面都有哪些寄存器,我们的机器码是多少,如果要给我们的芯片设计编译器,或者直接使用我们设计好的编译器之类的,都要转化为什么样子的机器码。至于cpu是几核心,几个缓存,几线程,几级任务调度之类的,呵呵,都是唬你玩,噱头而已,cpu当然越来越快,执行效率越来越高,但是对于编译器来说,翻译成为机器码就当务之急,至于他们cpu怎么实现的,电路怎么做的,关我毛线。
下面说说伪指令吧,如果你写了一个汇编指令:

start:
MOV AX,start

你认为,会编译成为什么样的?这就是机器码:0xB8, 0x00, 0x00

如果加上org呢?

ORG 0x20
start:
MOV AX,start

则会编译成为 : 0xB8, 0x20, 0x00

怎样,能看出来区别吧,其实org指令,就是改变标号的位置。

我靠,你说了这么多,就这? 我只能说,就这些了,但是,不要忘了,CPU启动的时候,可不是裸身启动的,它可是要在醒来之前,在内存里就加载好很多指令的,就像谁不会一起来就光屁股跑出来一样,人家是要穿衣服的。而这些指令,都是加载到内存的 0x7C00之前的,这些指令在计算机断电之前,是保存在主板BIOS的一个只读存储器里的(只读不知道是不是,好像有些BIOS还能刷),当电脑一上电,这些东西就都加载到内存里随时待命的,其中包括很多东东的,比如中断向量表,控制显卡的程序,这些都是机器码,不用开发人员每次都手动敲到自己的程序里,我靠,我又开始说自动的事情了,好吧,抛不掉啊,我们永远是站在前人的肩膀上的。
那么问题来了,你写的代码中的标号,比如 start: 它是通过计算前面代码的长度,来得出标号的位置的,而如果编译象 MOV AX,start 这样的指令,标号的位置就会保存到AX,这里还不要紧,因为仅仅是保存,那么跳转呢?JMP会跳转的内存的某个位置,来执行,如果写 JMP start呢?而我们程序的实际加载位置,是要向后偏移 0x7C00个位置的,你跳到了不该跳的位置!所以,聪明的汇编开发者,发明了伪指令这个东西,伪指令是不会编译成为机器码的,但是它会影响编译的结果!比如,你加上ORG 0x7C00, 那么汇编程序一看,哎呦,你有ORG啊,怎么不早说呢,让我来把你的标号的位置都重新计算一下下啦,然后它就把标号位置都加上了 0x7C00 。
说道这,我没啥说的了,下面说说精简指令集和复杂指令集吧。
计算机刚刚发明的时候,其实是百家争鸣的景象,这可以想象的到的,每个人各有各的指令集,各有各的寄存器,每个人指令集不一样,那再往上走,那就会出现软件不兼容现象,到现在我们不是还在受着各种不兼容的痛苦吗?如果计算机一开始就出现一种,如果浏览器一开始就网景一家,我们程序员是多么幸福的啊,但是,没有但是啊,痛苦并快乐着吧。最后呢,留下来的就只有复杂指令集和精简指令集了,复杂指令集的主人是Intel公司,而精简指令集归ARM公司管。而扩展的复杂指令集,用到64位机器上,Intel和AMD公司就又玩出不一样的花样,真是头疼啊,都什么时代了,你们不能握手言和,让我们程序员轻松一点吗?
那其它CPU,其他怪兽机呢?早都被历史淘汰了,不知道在哪个计算机极客家中安度晚年呢,或者某些时候拿出来溜溜,给它写个编译器,写一两个小程序,算是一个古董了。
其实还没有完,目前除了这两种的cpu比较流行,其实还有其它的小型CPU,这些CPU由于耗电少,指令集更加精简,虽然不像那两种那么能力超强,但是对于小型的应用也完全胜任的,它们就是 51单片机和avr单片机,我们常见的电器,电冰箱,洗衣机,热水器,指纹打卡机,其中就是由他们控制的,当然他们也都有自己的指令集和编译器了。
那手机中总众多的芯片呢?什么联发科啊,海斯啊,高通晓龙啊,苹果A7啊,他们都是自己的设计芯片吗?为啥联发科的手机上面也可以跑,海斯上面也可以跑,为啥呢?其实他们都是ARM芯片,说到ARM其实是一个很牛的公司,它们自己不做芯片,什么?芯片公司不做芯片?胡说呢吧,不过真的,这家公司成立于英国剑桥,他们只做设计,他们设计了芯片中的核心电路并且让大家都遵寻相同的协议,他们赚钱靠卖专利,其他人如果也想设计一款arm芯片,就要买他们专利(很贵的呦),而且他们只提供内核设计,外围电路还要自己做。然后各个厂家拿回去的,就一分电路图,(这点图纸真他妈贵!),然后加上外围电路,有些ARM集成时钟,有些集成温度传感器(cpu温度就是靠它了。),有些还能集成其它的,随便设计,但是对不起,指令集和核心还是用的arm,这样就保证了兼容性,ARM公司还在设计新的核心,目前又设计出来A(application系列,主要用于手机,机顶盒等嵌入式设备)、R(realtime系列, 用于实时性较强的,比如汽车的控制系统)、M( Microcontroller 更平衡版本,如contrex-m10系列,目前也朝着A系列蓬勃发展) ,各个大公司,准备好掏腰包了吗?
当然如果你有兴趣,设计一款属于自己的cpu也未尝不可,当然你也要设计自己的指令集,自己的编译器,哥们,你亮了,如果真是出名了,别忘了俺的这块敲门砖哈。哦对了,据说我们国家的导弹里面的控制系统,用的就是ARM的芯片,是不是该换一换了?这样可不安全呦,,啥时候用上咱们屌丝自己设计的芯片呢?

  • 29
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值