电子计算机需要用到的汇编语言是一种什么样的指令?

language)是一种用于电子计算机、微处理器、微控制器或其余可编程器件的低级语言,亦称为符号语言,是计算机高级程序设计语言的鼻祖。汇编语言不像其余大多数的程序设计语言同样被普遍用于程序设计,可是汇编语言运行效率很是高,快速执行和响应,在某些场合下仍然有着不可替代的做用,例如操做系统内核,工业控制,驱动设备等领域具备普遍的应用。程序员

2. 为何要学习汇编语言

那咱们为何还要学习汇编语言呢?这是由于汇编语言在计算机中有着独特的做用——直击计算机系统的核心,能够帮助咱们更好的学习和理解计算机原理和操做系统的理解,因此学习汇编语言仍是颇有必要的。编程

也就是说,经过学习汇编语言,咱们可以感知,体会和理解机器的逻辑功能。向上为理解各类软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础,并掌握底层的程序调试和错误分析方法。并发

3. 由机器语言到汇编语言

3.1 机器语言与机器指令

机器语言是机器指令的集合。学习

机器指令是一台机器能够正确执行的命令。操作系统

机器指令则是由一串二进制数(0和1)来表示的,例如。翻译

因此在早期程序员们的工做就是将0 , 1这样的二进制数的程序代码打在纸带或卡片上,1表示打孔,0表示不打孔,再将程序经过纸带或卡片机输入计算机进行运算。设计

可是这样会有一个问题,若是用打纸带编写这样的程序时,不当心写错了,要找出错误是很是头疼的,因此机器码指令对于排错极其不方便,而汇编语言就是为了解决这样的问题。

3.2 汇编语言和汇编指令

汇编语言的主体就是汇编指令。

汇编指令和机器指令的差异在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式,也就是说汇编指令其实就是机器指令的助记符,便于程序员们记忆。

3.3 汇编语言编写程序的工做过程

程序员们能够经过汇编指令代替机器指令编写程序,但计算机只认识机器指令,难点在于计算机要如何执行程序员用汇编指令编写的程序?这就须要一个能将汇编指令翻译成机器指令的翻译程序,而这个翻译的程序咱们一般叫作“汇编器”或者“编译器”。

从上图中能够清楚的看到汇编语言的工做过程,当程序员们编写好一段汇编程序指令后,计算机是不能直接执行汇编指令,须要运行编译器把汇编程序编译成机器码指令,而后再交给计算机去执行。

下图是汇编程序的示例:

伪指令不是计算机能直接执行的,而是由编译器把伪汇编指令转换成纯汇编指令,再转成机器码指令的过程当中须要用到的。

4. 浅谈计算机的组成

主板上主要有如下这些部件:

 CPU,是计算机的运算核心和控制核心(即中央处理器)

 总线,计算机在运行过程当中传输数据或指令

 内存,计算机运行过程当中数据的读写

 扩展槽(接外部设备),例如显示器,键盘鼠标等 

cpu是计算机的核心部件,想要让cpu进行工做运算就必须向它提供指令和数据,而数据和指令存放在存储器(内存)中。

处理器是一台电子计算机的核心,它会从内存中获取指令,并发起一系列由该指令因此定义的操做,当这些操做结束后,它接着再取下一条指令,一般状况下,这个过程是接二连三,循环往复的。

4.2 寄存器和算术逻辑部件

处理器有不少引脚,其中有一部分引脚是用来将参与运算的数据送入处理器内部,有些引脚是复用的,当被加数送入处理器,就须要经过寄存器存储数据。算术逻辑单元是专门负责运算的,能够计算加法,减法或乘法,也能够作逻辑运算。

处理器内部还会有一个控制器,在指令的执行过程当中,负责给各个部件发送控制信号,使各个部件在某个时间点执行某个动做。

例如RA和RB寄存器分别存储了被加数和加数,而后算数逻辑单元计算完后会将结果存储到寄存器RC中。

处理器老是很繁忙,当它在工做运行的时候,全部数据在寄存器里面都只能是临时存在一会,而后在送往别处,这也是它为何叫作“寄存器”的缘由。在早期寄存器只能保存4比特,8比特,16比特,也称为4位,8位,16位寄存器,如今的处理器通常是32位或64位,甚至更多。

4.3 指令和数据的表示

计算机中的数据和指令通常是存储在磁盘或内存中,永久性的存储是存放在外存中,也就是磁盘;当计算机在开始运行工做的时候,须要把数据从外存(磁盘)读到内存中,而后cpu经过总线对数据和指令进行运算。

咱们知道数据和指令都是由二进制表示的,1000这样的二进制信息是数据,仍是指令呢?

若是咱们把这样的二进制信息当作数据来看的话,那么就是89D8H,H表明是十六进制的数据形式;若是当作程序来看的话,就是MOV AX,BX这样的汇编程序指令;也就是说既能够当作数据,也能够当作程序,固然这是由CPU来决定的。

4.4 计算机中的存储单元

存储器被划分为若干个存储单元,从0开始顺序编号。

例如:一个存储器有128个存储单元,编号从0~127,但实际上内存空间是很大的,8086有20条数据线,寻址空间220,为1MB,编号为0~FFFFF。

4.5 计算机中的总线

在计算机中专门有链接CPU和其余芯片的导线,一般称为总线(英文为BUS),计算机中的总线有数据总线(Data Bus),地址总线(Address Bus),控制总线(Control Bus),以下图所示:

地址总线(Address Bus):cpu是经过地址总线来指定存储数据的地址,当cpu要从存储单元(内存)读取或存储数据时,就能够经过地址总线把数据存储到指定的地址中。地址总线越多说明可寻址的地址范围越大,N根地址总线(宽度为N),对应寻址空间为 。

数据总线(Data Bus):CPU与内存或其它器件之间来回传输须要处理或存储数据的总线。数据总线的宽度决定了CPU和外界的数据传送速度。

举个例子,向内存中写入数据89D8H时的数据传送。

上图是8088CPU和8086CPU写入数据89D8H(十六进制) ,8088CPU只有8位数据总线的,这意味着8088CPU每次只能传输8位的数据,在传输89D8H十六进制数据时,须要传输两次。8086CPU有16位数据总线,每次能够传输16位的数据,在传输89D8H数据只须要传输一次就能够了。

控制总线:CPU经过控制总线对外部器件进行控制,控制总线是一些不一样控制线的集合,控制总线宽度决定了CPU对外部器件的控制能力。

5. 内存读写与地址空间

CPU要想进行数据的读写,必须和外部器件进行三类信息的交互:即存储单元的地址(地址信息),器件的读或写命令(控制信息),读或写的数据(数据信息)

CPU对存储器的读写示例:

MOV AL,[3]汇编指令的含义就是从编号为3的存储单元读取数据存储到寄存器AL,过程如上图所示:CPU经过地址线找到编号为3的存储单元,而后经过控制线发出读取数据命令,再由数据线把内存的数据08传输到CPU中。

CPU是如何经过地址线找到内存中的数据的?这又得提到内存地址空间了。

CPU地址总线宽度为N,那么其寻址空间为;8086CPU的地址总线宽度为20,那么其寻址空间就是,能够寻址1MB个内存单元,其内存地址空间为1MB。

CPU管理地址空间分配

全部的物理存储器被看做一个由若干存储单元组成的逻辑存储器,每一个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间;CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。

5.3 寄存器及数据存储

寄存器是CPU内部的信息存储单元,8086CPU有14个寄存器:

通用寄存器:AX、BX、CX、DX

变址寄存器:SI、DI

指针寄存器:SP、BP

指令指针寄存器: IP

8086CPU全部的寄存器都是16位的,能够存放两个字节。

以通用寄存器AX为例,一个16位寄存器存储一个16位的数据,最大能够存储216 - 1,十进制为65535。

在AX中存储20000D(八进制),十六进制为4E20H,二进制为0000B:

那么如今有一个问题,上一代CPU中的寄存器都是8位的,那么8086CPU要如何保证程序的兼容性?

解决方案就是通用寄存器均可以分为两个独立的8位寄存器使用,也就是说,对于AX寄存器,能够分为AH和AL两个独立的寄存器,当你操做其中一个寄存器时,并不会影响到另外一个寄存器;同理, BX能够分为BH和BL, CX能够分为CH和CL,等等......

另外,把二进制数据转换成十六进制能够直观的看出这个数据是由哪些8位数据构成。

5.4 “字”在寄存器中的存储

对于8086CPU来讲,它的寄存器是16位的,能够存储2个字节,这称为1个字(word),各个数位编号为0 - 15,其中0-7是低字节,8-15是高字节,这个字的高位字节存在这个寄存器的高8位寄存器, 这个字的低位字节存在这个寄存器的低8位寄存器。

同理,对于32位寄存器能够存放4字节,这称为一个双字(double word),各个数位编号为0 - 31,其中0-15是低字节,16-31是高字节。64位寄存器以此类推.....

06.寻址模式与数据传输指令等

本次笔记从C语言的经典代码出发,学习汇编语言的接口作业。

汇编程序员眼中的系统结构

在用户层编写程序(不涉及kernel,因此也不涉及保护模式等),x86系统看起来是下述结构:

    • 条件码,用于存储最近执行指令的结果状态信息,用于条件跳转指令的判断。
    • 以字节编码的连续存储空间;
    • 存放程序代码、数据、运行栈以及操作系统数据。

如何从C代码生产汇编代码

  • -O2表示优化,等级为2(-O3太激进);
  • -S表示生产汇编文件;
  • 生产汇编文件code.s。

在x86-32中,使用“字(word)”来表示16位整数类型,“双字”表示32位。汇编语言中没有数据类型,一般采用汇编指令的后缀来进行区分。

为两个整数(32位)相加。

    • “l”后缀表示是双字运算;
    • 无符号/带符号整数加法运算的指令是一样的。

类似于表达式 x += y或者:

把x与y加起来,放在t中(结果存于eax中)。

数据传送指令(mov)

  • 将一个“双字”从Source移到Dest;
    • 可以被1,2或4个字节来表示
  • 寄存器:8个通用寄存器之一
  • 存储器:四个连续字节,支持多种访存寻址模式
  • movl $-147, (%eax)表示eax中的值作为地址,把-147这个值放到eax的值所代表的地址的地址空间中去;
  • 如果没有美元符号,则把数字当成地址;
  • 不能两个操作数都为内存地址!

表示寄存器R指定内存地址。

  • 寄存器R指定内存起始地址;

表示,取ebp的值,加上8,作为地址,取出连续4个byte来(因为mov后缀为l),放在edx中。

如上图,以ebp作为基准。

如上图,假设现在已知ebp存储0x104:

  • 第一条,ebp作为基址(0x104),加12偏移量,即0x110(注意是16进制)的值0x120取出来,并将0x120值赋给exc;
  • 第二条,将ebp作为基址,加8偏移量,即0x10c的值0x120取出来,并将其赋给edx;
  • 第三条,即将exc的值作为地址,将地址对应的值取出来,赋给%eax;

心得:movl (%ecx), %eax表示将ecx的值作为地址,并将其地址对应的值取出来,赋给eax;即,movl其实是对两个地址对应的数值(可是立即数、可是地址)进行操作。

  • D为常量(地址偏移量);
  • Rb为基址寄存器:8个通用寄存器其之一;
  • Ri为索引寄存器:%esp不作为索引寄存器,一般%ebp也不做这个用途;

[指令语句]每一条指令语句都必须产生指令代码(目标代码),在汇编源程序时可以由计算机执行,所以这种语句也称为可执行语句。每个指令语句代表计算机的一种基本能力,如数据传输、两个数的加减、移位等。这种能力是在目标程序(一组有序的指令代码)运行时完成的,它取决于中央处理器(CPU)、内存、内存和,计算机中的I/O接口和其他硬件设备。[pseudo instruction statement用来表示汇编程序是如何汇编源程序的,所以这种语句也称为命令语句。例如,源程序中的伪指令语句告诉汇编程序如何对源程序进行分段,哪些逻辑段在程序段中,哪些是当前段,哪些段寄存器指向它们,定义了哪些数据,以及如何分配存储单元,伪指令语句除了定义用于生成目标代码的特定数据外,没有相应的目标代码。这些伪指令语句的命令功能是由汇编程序在汇编源程序时执行程序而不是在运行目标程序时执行的。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任。如有侵权/违法内容,本站将立刻删除。

我要回帖

更多关于 从1加到100汇编调用c语言 的文章

 

随机推荐