汇编语言

作者: Sephiroth_Ma | 来源:发表于2019-12-04 16:37 被阅读0次

    @[toc]

    汇编语言

    • 汇编语言的主体是汇编指令

    操作

    • 寄存器bx的内容送到ax中

    机器指令

    • 1000100111011000

    汇编指令

    • 汇编语言的核心是汇编指令,它决定了汇编语言的特性.
    • 形式:mov ax,bx
    • 指令组成:

    1.汇编指令:机器码的助记符,有一一对应的机器码
    2.伪指令:没有对应的机器码,有编译器执行,计算机不执行
    3.其他符号:如+,-,*,/等,由编译器识别,没有的对应的机器码

    寄存器

    • 寄存器:CPU中可以存储数据的器件,一个CPU中有多个寄存器.
    • ax,bx为寄存器的代号


      在这里插入图片描述

    指令和数据

    • 在内存或者磁盘中,指令和数据没有任何区别,都是二进制信息

    如 内存中的二进制信息 1000100111011000 计算机可以看作大小为89D8H的数据,也可以看作指令mov ax,bx
    1000100111011000 -> 89D8H
    1000100111011000 -> mov ax,bx

    存储单元

    • 存储器被划分成若干个存储单元

    如一个存储器有128个存储单元
    编号:0~127

    在这里插入图片描述
    • 计算机的存储器容量以字节为最小单位
    • 一个存储单元 ->一个字节(Byte) ->8个二进制位(bit)
    • 对于拥有128个存储单元的存储器,容量为128个字节
    • 大容量的存储器一般用以下单位来计量容量

    1KB = 1024B, 1MB = 1024KB, 1GB = 1024MB, 1TB = 1024GB

    CPU对存储器的读写

    • 读数据->指定存储单元的地址

      在读写数据时指明哪种操作,读还是写

    • 读写时与外部器件的信息交互:

      存储单元的地址(地址信息);
      器件的选择,读会写的命令(控制信息);
      读或写的数据(数据信息);

    总线

    在这里插入图片描述

    地址总线

    • CPU是通过地址总线来指定存储器单元的.
    • 寻址能力:

    一根导线可以传送两种:高电平,低电平,二进制表示为1,0
    如:10根地址总线
    则为 210 = 1024 最小为0 最大为1023
    一个CPU有N个地址总线->地址总线的宽度为N->寻址能力则为2N

    在这里插入图片描述

    控制总线

    • CPU对外部器件的控制是通过控制总线来进行的.
    • 有多少根控制总线,意味着CPU提供了对外部器件的多少种控制

    数据总线

    • CPU与内存或其他器件之间的数据传送是通过数据总线进行的.

    • 数据总线的宽度决定了CPU和外界数据传递的速度.

    • 8根数据总线一次可以传送8个bit(一个字节)


      在这里插入图片描述
    • 16根数据总线一次可以传递16个bit(两个字节)


      在这里插入图片描述
    • 读数据:

      CPU通过地址总线将信息3发出.
      CPU通过控制总线发出读取内存命令.
      存储器将3号单元的数据8通过数据线送入CPU.

    • 写数据

      CPU通过地址总线将地址信息3发出.
      CPU通过控制总线发出写入内存命令.
      CPU通过数据总线将26送入内存的3号单元中.

    • 命令计算机读写数据的汇编指令:

      mov ax,[3]

    检测点

    • (1) 1个CPU的寻址能力为8KB,那么它的地址总线的宽度为多少?

      N根的寻址能力为2N 一根地址总线寻址为21=2 10根地址总线就是210=1024byte=1KB 13根就是213=8KB 所以寻址能力为8KB的CPU,那么它的地址总线宽度为13根。
      公式: 8 * 1024 = 2N = 23 * 210 = 2(3+10) => N = 13

    • (2) 1KB的存储器有多少个存储单元.存储单元的编号从多少到多少?

      1024个存储单元,从0开始 0 ~ 1024-1 => 0 ~ 1023

    • (3) 1KB的存储器可以存储多少个bit.多少个Byte.

      1KB = 1024多少个Byte * 1KB * 8bit = 8192bit = 1024Byte

    • (4) 1GB、1MB、1KB分别是多少Byte.

      1KB=1024Byte
      1MB=1024 * 1024Byte
      1GB=1024 * 1024 * 1024Byte

    • (5) 8080、8088、 80286、 80386 的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为多少(KB)多少(MB)、多少 (MB)、多少 (GB)。

      一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。
      16根 216 = 64K
      20根 220 = 1MB
      24根 224 = 16MB
      32根 232 = 4GB

    • (6) 8080、 8088、8086、 80286、 80386的数据总线宽度分别为8根、8根、16根、16
      根、32根。则它们一次可以传送的数据为:多少(B)、多少(B)、多少 (B)、多少(B)、多少 (B)?

      8根数据总线一次可以传送8位二进制数据(即一个字节)。
      8080 8bit = 1B
      8088 8bit = 1B
      8086 16bit = 2B
      80286 16bit = 2B
      80386 32bit = 4B

    • (7) 从内存中读取1024字节的数据,8086至少要读 多少次,80386至少要读多少次?

      8086的数据总线宽度为16根 一次最多可传送16个bit数据, 1024字节有1024 * 8个bit数据,所以需要读 1024 * 8/16 = 512次
      80386的数据总线宽度为32根 一次最多可传送32个bit数据, 1024字节有1024 * 8个bit数据,所以需要读 1024 * 8/32 = 256次

    • (8) 在存储器中,数据和程序以什么形式存放?

      在存储器中指令和数据没有任何区别,都是二进制信息。

    内存空间地址

    在这里插入图片描述
    • 所有的物理存储器被看做一个由若干存储器组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段,叫一段地址空间.CPU在这段地址空间中读写数据,实际上就是在对应的物理存储器中读写数据.
    • 内存地址空间大小受CPU地址总线宽度的限制.8086CPU的地址总线宽度为20.可以传送 2020 个不同的地址信息(大小从0 ~ 2020 - 1)
    • 不同的计算机的内存地址空间的分配情况是不同的.
    • 对CPU来说,系统中的所有存储器的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制,这个逻辑存储器即是内存地址空间.

    寄存器

    • 在CPU上

      运算器进行信息处理;
      寄存器进行信息存储;
      控制器控制各种器件进行工作;
      内部总线连接各种器件,在它们之前进行数据传送;

    • 不同的CPU,寄存器的个数,结构是不同的,每个寄存器都有一个名称,这些寄存器是:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW.

    通用寄存器

    • 8086CPU的所有寄存器都是16位的.可以存放两个字节.AX,BX,CX,DX这4个寄存器通常来存放一般性数据,成为通用寄存器.


      image
    • 8086CPU的上一代CPU中的寄存器为8位,为了向上兼容,8086的4个通用寄存器可以拆分成两个独立使用的8位寄存器

      AX => AH AL
      BX => BH BL
      CX => CH CL
      DX => DH DL

      在这里插入图片描述
      在这里插入图片描述

    字在寄存器中的存储

    • 8086CPU可以一次性处理两种尺寸的数据

      字节:Byte 一个字节由8个bit组成,可以存放8位寄存器中.
      字:word 一个字由两个字节组成,分别称为高位字节,低位字节.


      在这里插入图片描述

    几条汇编指令

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    • 问题2.1

      指令执行后AX中的数据是多少?
      因为AX为16位寄存器,只能存放4位十六进制的数据,所以最高的位的1不能放在AX中保存,ax中的数据为:044CH

    在这里插入图片描述
    • 问题2.2

      指令执行后AX中的数据为多少?
      程序段中的最后一条指令 add al,93H ,执行前 al中的数据为C5H,相加所得的值为:158H,但是al为8位寄存器,只能存放两位十六进制的数据,所以最高为的1 丢失,ax中的数据为:0058H
      注意:此时的al是作为一个独立的8位寄存器来使用,和ah没有关系,CPU在执行这条命令时认为ah和al是两个不相关的寄存器
      如果执行add ax,93H,低8位的进位会存储在ah中,CPU在执行这条指令认为只有一个16位寄存器ax,进行的是16位运算.
      在进行数据传送或者运算时,要注意指令的两个操作对象的位数应该是一致的 如

      mov ax,bx  
      mov bx,cx
      mov ax,18H
      mov al,18H
      add ax,bx
      add ax,20000
      

      错误的指令为
      cpp mov ax,bl ;在8位寄存器和16位寄存器中传送数据 mov bh,ax ;在16位寄存器和8位寄存器中传送数据 mov al,20000 ;8位寄存器最大可放的值为255的数据 add al.100H ;将一个高于8位的数据加到一个8位的寄存器中

    检测点

    • (1) 写出每条汇编指令执行后相关寄存器中的值。
      mov ax,62627   AX=?         ;转换为十六进制:F4A3H   
      mov ah,31H     AX=?         ;将高8位值覆盖:31A3H  
      mov al,23H     AX=?         ;将低8位值覆盖:3123H   
      add ax,ax      AX=?         ;值相加:6246H  
      mov bx,826CH   BX=?         ;赋值:826CH   
      mov cx,ax      CX=?         ;ax赋值给cx:6246H  
      mov ax,bx      AX=?         826CH 
      add ax,bx      AX=?         04D8H 
      mov al,bh      AX=?         0482H 
      mov ah,bl      AX=?         6C82H 
      add ah,ah      AX=?         D882H 
      add al,6       AX=?         D888H 
      add al,al      AX=?         D810H 
      mov ax,cx      AX=?         6246H
      

    相关文章

      网友评论

        本文标题:汇编语言

        本文链接:https://www.haomeiwen.com/subject/jihlgctx.html