汇编语言(1)

计算机其实是:接收用户输入指令与数据,经过中央处理器的数据与逻辑单元运算处理后,产生或存储有用的信息。
计算机可以分为三部分

  • 输入单元
  • 中央处理器(CPU)
  • 输出单元

整台机器的重点在于中央处理器(Central Processing Unit, CPU),CPU为一个具有特定功能的芯片,里面有微指令集。CPU可以分为两个主要单元,分别是算术逻辑单元和控制单元,算术逻辑主要负责程序运算和逻辑判断,控制单元则主要协调各组件和各单元间的工作。CPU读取的数据是从内存中读取的,内存中的数据可以从输入单元传输进来的,而CPU处理完毕的数据也必须要先写回内存中,最后数据才从内存传输到输出单元。也就是说,CPU必须经过和内存交互这层,才能与输入输出单元交互。

文字编码系统

所谓的编码系统可以想成是一个“字码对照表”,它把文字数据映射成固定的二进制编码进行存储。
为了解决语言之间的兼容问题,国际组织ISO/IEC指定了Unicode编码系统,即我们常称呼的UTF8。

汇编指令

机器指令1000100111011000,表示把寄存器BX的内容送到AX中,汇编指令则写写成

	move ax,bx

汇编由以下三类指令组成:

  • 汇编指令
  • 伪指令:没有对应的机器码,由编译器执行,计算机不执行
  • 其他符号

汇编的核心是汇编指令。

指令和数据

指令和数据是应用上的概念,在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。CPU在工作的时候把有的信息看做指令,有的信息看做数据。

存储单元

存储器被分成若干个存储单元,每个单元从0开始顺序编号,例如一个存储器有128个存储单元,编号从0~127。
那么一个存储单元存储多少信息呢,微机存储器的容量是以字节(byte)为最小单位的,也就是8bit。
0/1的单位我们成为1bit,但1bit太小,因此定义出Byte单位,1Byte=8bit。所以1GB文件的大小实际为1024 * 1024 * 1024B。

CPU对存储器的读写

CPU从内存中读数据,必须和外部组件确定以下三个信息:

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

CPU通过外部总线将信号传递给存储器。通过地址总线来指定存储器单元。假设一个CPU有10根地址总线,一根导线可以传送的稳定状态只有两种,高电平或者低电平。所以10根总线可以寻址的最小数为0,最大数为1024,即2的10次方。
CPU与内存或其他器件之间的数据传送是通过数据总线来进行的,CPU对外部组件的控制是通过控制总线来进行的。

存储芯片类型

存储芯片分为两类: 随机存储器(RAM)和只读存储器(ROM)。随机存储器可读可写,但关机后内容丢失,只读存储器关机后的内容不丢失。
存储器在物理上是独立器件,但是以下两点相同:

  • 都和CPU的外部总线相连
  • CPU对它们进行读写的时候都通过控制线发出内存读写命令。

每个物理存储器在逻辑存储器中占有一个地址段,即一段地址空间,CPU在这段空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
因为受CPU寻址能力的限制,所以内存存储空间的大小受CPU外部总线宽度的限制。

寄存器

一个典型的CPU有运算器、控制器、寄存器等构成。在CPU中:

  • 运算器进行信息处理
  • 寄存器进行信息存储
  • 控制器控制各种器件工作
  • 内部总线(不是上面说的外部总线),在它们之间进行数据的传送

8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器被称为通用寄存器,来存放一般性数据。
AX的低8位(0-7位)构成了AL寄存器,高8位构成了AH(high)寄存器。(十六进制数的一位相当于二进制数的四位)
一个字记为word,由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。比如一个字型数据20000,存在AX寄存器中,大小是20000,又可以看做是两个独立的字节型数据,大小为78和32
以下指令把18送入寄存器AX,不区分大小写。

   move ax,18

16位结构的CPU

8086CPU就是16为结构的CPU,它描绘了以下特性:

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

8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。从8086CPU的内部结构看,如果将地址从内部简单发出,那么它只能送出16位的地址,变现出的寻址能力只有64KB。所以它采用两个16位地址合成的方法来形成一个20位的物理地址。

  • CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址。
  • 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
  • 地址加法器将两个16位地址合成一个20位的物理地址
  • 地址加法器通过内部总线将20位物理地址送入输入输出控制电路,然后送上地址总线。
  • 地址被传送到存储器

地址加法器采用物理地址=段地址 * 16 + 偏移地址的方法合成。

CS和IP

CS和IP是8086CPU中最关键的两个寄存器,他们指示了CPU要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器。在任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行。
读取指令之后,IP值自增,在执行指令之前,会继续读取下一条指令。
那么怎么设置CS和IP的值,其他寄存器都是通过传送指令mov

	mov ax,123

但是不适用于CS和IP,可以使用jmp指令

	jmp 2AE3:3

执行后:CS=2AE3H,IP=0003H

内存中字的存储

CPU中用16位寄存器来存储一个字,在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放。
比如我们存储0、1两个内存单元存放数据20000(4E20H,H代表十六进制),对于这个字单元,0号单元是低地址单元,1号单元是高地址单元,则0号单元存放20H,1号单元存放4EH。
##DS和[address]
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,内存地址由段地址和偏移地址组成。8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。比如我们要读取1000H单元的内容,可以用如下的程序段进行

	mov bx,1000H
	mov ds,bx
	mov al,[0]

先把段地址送入BX寄存器中。1000H用段地址和偏移地址表示为1000:0,再把段地址1000H放入ds,然后用move al, [0]完成1000H到al的数据传送。
那么把数据从寄存器送入内存单元,则是:

	mov bx,1000H
	mov ds,bx
	mov [0],al

10000H到10003H的数据分别为23、11、22、66。来看下以下指令执行后,ax, bx, cx中的值

	mov ax,1000H
	mov ds,ax
	mov ax,[0]
	mov bx,[2]
	mov cx,[1]
	add bx,[1]
	add cx,[2]

前两条指令将ds设为1000H。
第三条在1000:0处存放的字型数据送入ax:1000:1单元存放的是字型数据的高8位,1000:0存放字型数据的低8位,所以指令执行之后ax中的数据为1123H。bx的数据为6622H,cx的数据为2211H。再接下来bx通过相加,数据变更为8833H,cx也相同。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值