汇编语言学习笔记

汇编语言笔记

概念:

  • 寄存器:CPU中可以存储数据的器件,一个CPU中有多个寄存器。寄存器一般会给出一个标识符,例如AX,BX
  • CPU:CPU是计算机的核心部件,他控制整个计算机的运作并执行运算,要想让一个CPU工作必须给他提供指令和数据
    指令和数据存在存储器中,也就是平时所属的内存。

汇编语言的核心是汇编指令,它决定了汇编语言的特性

存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号
例如:一个存储器有128个存储单元,编号从0-127

CPU对存储器的读写

CPU想要进行数据的读写,必须和外部器件进行三类信息的交互

  1. 存储单元的地址(地址信息)
  2. 器件的选择,读或者写命令(控制信息)
  3. 读或者写的数据(数据信息)

CPU是通过地址总线来指定存储单元的
地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址

内存地址空间的概念:

一个CPU的地址线宽度为10的话,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。

  • BIOS:basic input output system
    BIOS是由主板和各类接口卡(如:显卡、网卡等),厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入和输出操作。主板和某些接口卡上插有相应的BIOS的ROM

各类存储器芯片:

从功能和连接上分为:

  • 随机存储器RAM
  • 装有BIOS的ROM
  • 接口卡上RAM

从读写属性上分为两类:

  • 随机存储器(RAM
  • 只读存储器(ROM)

8086CPU总共有14个寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
8086CPU所有的寄存器都是16位的,可以存放两个字节
AX,BX,CX,DX是通常用来存放一般性数据,被称为通用寄存器
在这里插入图片描述

18在AX存储器中的存储形式如下表所示:

18的二进制为10010,因为这里讨论的及寄存器都是16位的寄存器,所以我们需要给18的二级制形式补位,把它补成16位

在这里插入图片描述

2.2 字在寄存器中的存储

一个字可以存在一个16位的寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8为和低8位寄存器中

几条汇编指令

汇编指令控制CPU完成的操作用高级语言的语法描述
mov ax,18将18送入寄存器AXAX=18
mov ah,78将78送入AHAH=78
add ax,8将寄存器AX中的数值加上8AX=AX+8
mov ax,bx将BX中的数据送入寄存器AXAX=BX
add ax,bx将BX,AX中的内容相加,结果存在AX中AX=AX+BX

汇编指令不区分大小写

2.4 物理地址

概念:
CPU访问内存地址单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个唯一的线性空间。将这个唯一的地址称为物理地址

16位的CPU有一下几个特征

  • 运算器一次最多可以处理16位的数据
  • 寄存器的最大宽度位16位
  • 寄存器和运算器之间的通路是16位的

8086CPU给出物理地址的方法:

8086CPU有20位地址总线,可以传送20位地址,寻址能力位1M
8086CPU内部位16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K

问题:8086CPU内部16位的数据怎么转成20位的地址?

答:8086CPU采用一种在内部把两个16位地址合成的方法来形成20位的物理地址。

下面是实现过程的图片展示:

在这里插入图片描述

地址加法器实现地址转换的公式:

物理地址=段地址 * 16 + 便宜地址

下图展示了地址加法器的实现过程:

在这里插入图片描述

重点

  • 一个数据的二进制形式左移1位,相当于该数据乘以2
  • 一个数据的二进制形式左移N位,相当于乘以2的N次方
  • 地址加法器完成段地址*16的运算就是把二进制存放的地址左移4位
  • 一个数据的16进制形式左移1位,相当于乘以16
  • 一个数据的十进制形式左移1位,相当于乘以10
  • 一个数据X的N进制形式左移1位,相当于乘以X

内存单元的地址小结:

  • CPU可以用不同的段地址和偏移地址形成同一个物理地址
  • 可根据需要,将地址连续,起始地址位16的倍数的一组内存单元定义位一段

2.9 段寄存器

段寄存器就是提供段地址的。

8086CPU有4个段寄存器:
CS(code segment),DS(data segment),SS(stack segment),ES(extra segment)
当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址

CS和IP时8086CPU中最关键的寄存器,他们指示了CPU当前要读取的地址。

CS为代码段寄存器

IP为指令指针寄存器

8086CPU工作过程的简要描述:

1. 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;

2.IP=IP+所读取的指令的长度,从而指向下一条指令;

3.执行指令。转到步骤1,重复这个过程

在8086CPU加电启动或者复位以后(即CPU刚开始工作时),CS和IP被设置为CS=FFFFH,IP=0000H

即在8086CPU机器刚刚启动时,CPU从内存FFFF0单元中读取指令执行

FFFF0H单元中的指令时8086PC机开机后执行的第一条指令,这个前面的部分我们现在暂时不用知道

在任何时候,CPU将CS,IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。

如果说,内存中的一段信息曾被CPU执行过,那么,他所在的内存单元必然被CS:IP指向过

在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制

CPU从何处执行指令时由CS,IP中的内容决定的,程序员可以通过改变CS,IP中的内容开控制CPU执行目标指令

8086CPU中可以用mov指令改变大部分寄存器的内容,但是CS,IP寄存器的内容不可以通过mov指令来改变,但是8086CPU提供了另外的方法来改变它们的值,就是转移指令;

下面的方法可以修改CS,IP寄存器的内容

jmp 段地址: 偏移地址

例如:
jmp 2AE3:3
jmp 3:0B16

功能:用指令中给出的段地址修改CS,偏移地址修改IP

仅修改IP的内容

mov ax 200 把200放到ax中

jmp ax (类似于mov IP ,ax)

功能:用寄存器中的值修改IP

下面展示一个CPU的运行流程

内存存放的机器码和对应的汇编指令情况
初始值: CS=2000H,IP=0000H

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y6Ai8hty-1576112677572)(CPU运行流程.png)]

下表展示了运行过程

步骤CSIP汇编指令执行的位置
初始值2000H0000H--
第一步2003H0003Hmov ax ,6622H左上第一段
第二步1000H0003Hjmp 1000:3左上第二段
第三步1000030003Hmov ax 0123H右上第一段
第四步10006H0003Hmov ax,0000H右上第二段
第五步10008H0002jmp bx右下倒数第一个

后面第五步会一直跳转到第四步,这个是一个死循环。CPU会一直卡在这个地方,满负荷运转

在8063CPU中,在编程时可以根据需要将一组内存单元定义为一段。可以将长度为N(N<=64KB)的一组代码,存在一组地址连续,起始地址为16的倍数的内存单元内,这段内存时用来存放代码的,从而定义了一段代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OokmTwpH-1576112677573)(代码段.png)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值