8086汇编-基础知识

2020-02-06  本文已影响0人  码无不至

概述

本文来介绍最基础的8086汇编,将通过关键点的突出以及个人理解,而不会将原理做重点介绍,争取最快的速度来学会汇编并且使用,我们平时接触的C/C++/JAVA等语言都是高级语言,而计算机只能运行机器语言也就是0和1,高级语言通过编译成汇编语言再编译成机器语言运行到计算机上。高级语言、汇编语言、机器语言特性如下:

总线

总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线地址总线控制总线,分别用来传输数据、数据地址和控制信号。总线是一种内部结构,它是CPU、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。

内存

所有的内存单元都有唯一的地址,叫做物理地址,各类存储器的物理地址情况,内存地址空间的大小受CPU地址总线宽度的限制。8086的地址总线宽度为20,可以定位2^20个不同的内存单元(内存地址范围0x00000~0xFFFFF)所以8086的内存空间大小为1MB

寻址方式

8086CPU是16位的,但是地址总线是20位的,按理说CPU寻址能力只有2^16=64KB,那如何输送地址20位呢,这是8086的特殊性,它内部采用了地址加法器2个16位地址合成的方法生成1个20位的地址,一个地址称为段地址,一个称为偏移地址,地址加法器采用物理地址=段地址x16+偏移地址,比如8086要访问123C8H的内存单元,此时8086地址加法器进行合成,其步骤如下:
1.相关部件提供段地址1230和偏移地址00C8给地址加法器。
2.段地址1230和偏移地址00C8送入地址加法器。
3.地址加法器合成屋里地址:1230x16+00C8 = 123C8H。
4.输出物理地址。
在8086中,一般段地址又称为这个段的起始地址,偏移地址决定了这个段的最大长度:2^16=64KB。

CPU

CPU典型构成:寄存器,运算器,控制器。寄存器负责信息存储,运算器负责信息处理,控制器负责控制其它器件的工作。对我们目前学到的汇编主要是跟寄存器打交道,8086有14个16位寄存器,可以存放2个字节,8086寄存器如下所示:

register.png AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,称为通用寄存器。这四个寄存器为了兼容上一代的8086的8位寄存器,AX分为AH、AL,BX,CX和DX类似,H代表高位寄存器,L代表地位寄存器。汇编中存储数据常见的单位是字节(byte)和字(word),1word = 2byte,AX存放1个字,AH存放高字节,AL存放低字节。通常,CPU会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算,假设内存中有一块内存空间地址1的值是3,现在想把它的值加1,并将结果存储到另一块内存空间地址2,其流程如下:
1.CPU首先会将红色内存空间的值放到AX寄存器中:mov ax,地址1
2.然后让AX寄存器与1相加:add ax,1
3.最后将值赋值给内存空间:mov 地址2,ax

段寄存器

我们这里再重点介绍下段寄存器,前面我们说了相关部件提供段地址和偏移地址给地址加法器进行合成地址,到底是什么提供的的呢,就是段寄存器,包括:代码段寄存器(CS)、数据段寄存器(DS)、堆栈寄存器(SS)、附加段寄存器(ES)。

基础指令

mov指令

mov 寄存器, 数据       比如:mov ax,8 ;将十进制8传送到ax
mov 寄存器, 寄存器     比如: mov ax,bx ;将bx寄存器中的数据传送到ax
mov 寄存器,内存单元    比如:mov ax,[2000h] ;将地址2000H单元的内容传送到AL寄存器
mov 内存单元,寄存器    比如:mov[2000h],ax ;将ax传送到地址2000h中
mov 段寄存器,寄存器    比如:mov ds,ax ;将ax中的数据传入到ds中
mov 寄存器,段寄存器    比如  mov ax ,ds ;将ds中的数据传入到ax中

注意事项如下:

函数、方法,我们平时开发是使用非常频繁,我们看看函数最简单的的结构:函数名,函数参数,返回值,平时也在说函数调用栈,其实函数调用其底层就是对栈的操作,我们想彻底搞懂函数调用,我们必须先来认识栈,栈:是一种具有特殊的访问方式的存储空间(后进先出,Last In Out First,LIFO)。

stack.png
  1. 8086会将CS作为代码段的段地址,将CS:IP指向的指令作为下一条需要取出执行的指令
  2. 8086会将DS作为数据段的段地址,mov ax,[address]就是取出DS:address的内存数据放到ax寄存器中
  3. 8086会将SS作为栈段的段地址,任意时刻,SS:SP指向栈顶元素
  4. 8086提供了PUSH(入栈)和POP (出栈)指令来操作栈段的数据。

比如push ax是将ax的数据入栈,如下所示:

push.png pop ax是将栈顶的数据送入ax,如下所示: pop.png 注意:当栈为空的时候,栈顶指针指向栈地址最高的下一个地址单元。栈顶超界:当栈满的时候再使用push指令入栈,或栈空的时候再使用pop指令出栈,那将发生栈顶超界。

总结下,本篇文章介绍了编程语言的发展,以及汇编与高级语言的关系,通过对CPU、内存、寄存器、指令以及栈的学习,希望你能抓住关键点快速入门,下一篇将正式搭建环境编写汇编代码。敬请期待,祝学习快乐!

上一篇 下一篇

猜你喜欢

热点阅读