2021-7-22 汇编语言 开篇:关于计算机(炉边小坐)

        古语有云:“近水楼台先得月”。这句话用来形容汇编语言最好不过。汇编语言是直接在硬件之上工作的语言,我们知道无论多么精巧绝伦的语言,最后都要通过编译器转变成机器语言才能让计算机理解并执行。在前面的文章,无论是 C语言,这类比较于接近低级语言的高级语言,亦或是更高级的 C++(当然只学了一半),我们对计算机硬件的探讨都比较浅显,就算是前四天对指针讨论——最接近硬件的部分,对计算机的硬件都是点染略过,但是学习汇编语言,这种更为接近计算机硬件,或者是本质的东西,了解硬件知识是必须的,当然,也没有到要你去焊电路板的程度。我们的研究点在于充分利用硬件系统的编程结构和指令集有效灵活的控制系统,并高效工作。

首先聊聊机器语言,机器语言,就是一系列机器指令的集合,计算机的机器指令就是一列二进制数字,它的0和1分别对应着计算机的低电平和高电平。高低电平在空间上的组合形成了不同的二进制内容,在时间上的变化形成了实时变化的各种信号,如时钟信号,电平的高低变化使得计算机内的电器元件被驱动,进行运算。除此之外,高低电平的不同并在各种硬件电路的支持下,催生了不同的机器代码,不同的数据存储,时间上的变化在各种硬件转化下形成了实时且有意义的数据流,从而推动计算机高效准确的处理数据。在现在的计算机里,有一个元件专门完成这项功能,这就是 CPU(Central Processing Unit,中央处理单元),它是一种微型处理器,我们说的计算机就是由 CPU 和其他受 CPU 调控的芯片、器件、设备组成的系统。

每一种 CPU,由于硬件设计和内部结构的不同,就需要用不同机器码来调控,让它正常工作。因此每一种 CPU都有其自己的机器指令集,也就是机器语言,例如 Intel 的酷睿系列(x86)和 Apple 的 M1 芯片(ARM)因为架构不同,其指令集也不相同,因此汇编语言不具有可移植性(后述)。

早期的计算机程序就是由 0101 组成,程序猿们在一条纸带上通过“1 打孔,0 不打孔”的方式将代码输入计算机,进行运算。

但是一长串的 0101 可读性奇差,而且发生错误很难纠错,即便错误只是一个 0 错写成 1.

由于机器码是如此的晦涩难懂,为了便于程序猿工作,人们发明了汇编语言。注意,汇编语言本质上也是机器指令,但和机器语言不同的是两者的表达方式,汇编语言是对一堆指令的命名,便于记忆,例如:机器指令 1000100111011000 表示把寄存器BX的内容送到AX中。汇编指令则写成mov ax,bx.这样的写法与人类语言接近,便于阅读和记忆。


操作:寄存器BX的内容送到AX中
机器指令:1000100111011000
汇编指令:mov ax,bx

(寄存器,简单地讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器。AX 和 BX 是其中的一员)

发明了汇编语言,程序猿就可以用汇编语言书写程序,汇编语言通过编译器转化为机器语言,供计算机阅读,这一点和我们学习过的高级语言一致。

到现今为止,汇编语言发展为三种指令,分别为:1、汇编指令——机器码的助记符,有对应的机器码;2、伪指令——没有对应的机器码;3、其他符号,如:+,-,*,/等,有编译器识别,无对应机器码。汇编语言的核心是汇编指令!

关于伪指令:

伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信息。例如,提供如下信息:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等。伪指令有2个特点:

(1)由于是伪“指令”,因而它只存在于汇编语言中。高级语言中不叫指令,叫语句;

(2)由于是“伪”指令,也即“假”指令,因而不是可执行指令,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息。          ——百度百科.伪指令

指令是在执行阶段发挥作用的,由CPU(Intel、AMD等)来执行。

伪指令是在编译阶段发挥作用的,由汇编器(MASM、TASM等)来解释。后文再叙述,据说这个概念没什么卵用(笑)其实是本人现阶段的逆向工程学习暂时不深入理解伪指令的概念,其实我们只要知道它没有对应的机器码,但也是汇编语言的重要组成即可。

接下来是储存器,它是除了 CPU 外计算机的重要组成部件,它为 CPU 提供供以计算的指令和数据,存储的部分我们在 C++的指针部分作了较为详尽的说明,可以参考下面文章:

2021-7-21 指针:强大而危险的灵魂【C++指针的应用---下】(炉边小坐)

在内存里,指令也是数据,都以二进制数存放。而 CPU 对存储器的读写,是通过地址寻址实现的,就像在街上找人,你得知道他在哪。且,读写一个数据时,还要指明对哪一个器件操作,进行什么操作,是读还是写,可见,CPU 要是想实现信息读写,必须和外部的(芯片?)进行三种信息的互通有无:1、储存单元的地址 2、器件选择,读写选择 3、数据信息、内容;

问题来了,计算机里的信息是通过电来传递的吧(准确来说是电信号),这点三岁小孩都知道,那电是在什么媒介里传输的呢?是电线吧,初中生也知道,那么 CPU 是通过什么电线将地址、数据、控制信息等电信号传到储存器芯片呢?计算机有专门连接 CPU 和其他芯片的导线,统称为总线,总线顾名思义就是一根根导线的集合,根据传递信息不同又分为三类:地址总线,控制总线和数据总线。

分析读的操作过程:1、CPU 通过地址线将地址信息 3 发出。2、CPU 通过控制线发出内存读写指令,选择存储器芯片,通知其将要从中读取数据。 3、存储器通过数据线将 3 单元中的数据“08”返回到 CPU。

写操作与读操作类似。

我们知道了 CPU 是如何执行读写操作的,那我们如何命令计算机进行数据读写?我们通过向其输入机器码、汇编指令(MOV AX,[3])来执行这个操作(传输[3]号单元的数据给 AX)。

地址总线的数量决定 CPU 可以对多少个存储单元进行寻址,举个例子,假如一个 CPU 有十条地址总线,我们知道,一条电路可以传输的稳定的状态只有两种:高电平和低电平,用于表示二进制中的“1”和“0”,那么十条线最多可以表示 2^10个地址,最低为 0,最高位 1023.

数据总线的传输逻辑和地址总线一样,8 根可以传输一个 8 位的二进制数据,以此类推,反映了 CPU 和其他元器件的数据传输速度 。

控制总线则是 CPU 对外部器件控制的通道,这里的总线集成了对许多不同器件控制的控制线,有多少根控制线,就意味着 CPU 对外部器件有多少种控制,其宽度(广度)决定了 CPU 对外部器件的控制力。

内存等内容日后补充。

2021-7-23 修改 (CPA with 黄睦泰)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值