汇编语言是怎么产生的?汇编语言是机器指令的助记符,与机器指令一一对应。而对不同的CPU来说有不同的汇编指令集。显然,机器语言虽然高效,但是难以让人理解,可读性和查错性都不强,所以才出现了中间语言——汇编语言。
寄存器是CPU中存储数据的器件,一个CPU可以有多个寄存器。寄存器又有自己的代号,如AX,BX。说到数据,在内存和磁盘上,指令和数据的区别并不大,本质上都是作为二进制存储,但是CPU工作的时候,指令和数据则有不同的意义。
存储器包含若干个存储单元,每个单元从0开始编号。一个单元存储8bit,也就是一个字节Byte。但是在量度存储器的容量时,常常用字节作为最小的单位。CPU在读写存储器时,是按照:寻址——选择控制——读写的顺序进行工作的。而参与这一过程的主角——三条线:地址线、数据总线、控制总线,它们的作用分别如下:
地址线:CPU含有地址线的数量称为地址总线的宽度,于是寻址的范围就是2的宽度次方个存储单元。
数据总线:一根数据总线对应一个二进制位(1bit),8根数据总线可以传输一个字节。
控制总线:宽度决定CPU对外部器件的控制能力。
而可寻内存单元构成的叫做CPU的内存地址空间,分别由两个字节组成:高位字节和低位字节。
前面我们谈到不同的CPU对应不同的汇编指令,以及不同的寄存器数量。在这里我们着重介绍一种重要的CPU:8086CPU。
8086CPU由20位地址总线组成,具有1MB寻址能力。16位结构,一次性处理传输暂存的数据位16位。内部则用两个16位地址(段地址和偏移地址)通过地址加法器合成一个20位的物理地址。合成方式为:16*段地址+偏移地址。充分体现了用两个少位单元代替多位单元的思想。同时,正因为这个物理地址一个合成的地址,所以可以有不同的段地址和偏移地址的组合方式。
段地址和偏移地址是怎样暂时存储的呢?这里有两个重要的寄存器:CS寄存器和IP寄存器。前者储存段地址,称为代码段寄存器,后者储存偏移地址,称为指令指针寄存器。所以,我们基本上可以想象出执行一条指令的全过程了:CS和IP中的值送入地址加法器,计算出物理地址:16*CS+IP,然后用得到的物理地址传入输入输出控制器,通过地址总线寻找到指令的首地址,然后通过数据总线送回来,再送入指令缓冲器,这时候,我们的IP寄存器加上代码段长度的地址长度,指向下一个指令后,再执行当前指令,执行完后进入下一个循环,周而复始。
由此,我们知道,读取指令,不过就是改变CS和IP的值,使物理地址指向我们想要读取的指令集。那么怎么改变CS和IP的值呢?用MOV指令可以吗?
我们知道,MOV可以修改寄存器AX,BX等寄存器的值,然而,在8086CPU中,MOV指令不能直接修改CS、IP内容,因为MOV指令叫做传送指令,只能通过执行指令前完成IP加上代码段长度这一个自增过程实现间接改变IP寄存器的值。能直接修改CS,IP的指令叫做转移指令,如JMP。 格式为JMP 段地址:偏移地址。
若仅仅修改IP内容,就用jmp 寄存器(AX,BX) 这一格式的语句。寄存器的值作为IP的新值。所以从某种意义上来说,jmp ax等同于mov ip ax。