您当前的位置: 首页 > 

风间琉璃•

暂无认证

  • 2浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

汇编基础简介

风间琉璃• 发布时间:2021-08-26 00:03:38 ,浏览量:2

1.简介

(1)汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令 (2)汇编语言可以通过编译得到机器语言, 机器语言可以通过反汇编得到汇编语言. (3)高级语言可以通过编译得到汇编语言\机器语言, 但汇编语言\机器语言几乎不可能还原成高级语言.

机器语言 机器语言是机器指令的集合。电子计算机的机器指令是一系列二进制数字。计算机将之转换为一系列高低电平脉冲信号来驱动硬件工作的。

汇编语言 由于机器语言指令都是由01组成,难以编写,记忆和维护程序.所以汇编语言为了解决这一问题产生。汇编语言的主体是汇编指令,汇编指令是机器指令的助记符

汇编语言作用过程 首先汇编指令,经过编译器处理,然后被编译器解释成机器码(类似于替换作用,不完全是替换),变成机器码,交给CPU

汇编语言的组成

1.汇编指令(机器码的助记符)
2.伪指令(由编译器执行)
3.其他符号(由编译器识别,如:+ - * /)
汇编语言的核心是汇编指令,他决定了汇编语言的特性

存储器 CPU是计算机的核心部件,它控制整个计算机的运作并进行运算,要想让一个CPU工作,就必须向他提供指令和数据。CPU工作的信息要求:指令+数据 指令和数据在存储器中存放,也就是平时所说的内存。一台PC中内存的作用仅次于CPU

存储单元 存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号。一个存储器有128个存储单元,编号从0–127 1KB=1024B 1MB=1024KB 1GB=1024MB 1TB=1024GB

CPU对存储器的读写 CPU要想进行数据的读写,必须和外部器件(即芯片)进行三类信息的交互

1.地址信息:存储单元的地址
2.控制信息:芯片的选择,读或写命令
3.数据信息:读或写的数据

总线 连接CPU和其他芯片的导线,逻辑上分为地址总线、数据总线、控制总线 在这里插入图片描述

地址总线 CPU是通过地址总线指定存储单元,地址总线传送的能力决定了CPU对存储单元的寻址能力。(一般32位CPU,寻址能力为2^32=4G)

一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N,即这个CPU的位数是N,如32位的CPU就有32根地址总线这样的CPU最多可以寻找2的N次方个内存单元

数据总线 CPU通过数据总线来与内存等器件进行数据传送,数据总线的宽度决定了CPU和外界的数据传送速度

控制总线 控制总线是一些不同控制的集合,CPU通过控制总线对外部器件的控制。控制总线的宽度决定了CPU对外部器件的控制能力

小结

CPU管脚和总线相连。总线的宽度表示CPU不同方面的性能:

地址总线的宽度决定了CPU的寻址能力;
数据总线的宽度决定了CPU与其他器件进行一次数据传送的量;
控制总线宽度决定了CPU对系统中其他器件的控制。

思考:

指令 :指令告诉CPU怎么操作。
数据:数据告诉CPU什么操作什么。

指令和数据的关系
指令和数据是应用上的概念。
在内存或磁盘中,指令和数据没有任何区别,都是二进制信息。
CPU处理的二进制信息 可以是汇编代码(指令),也可以是数据

CPU怎么区分二进制信息是指令还是数据呢?
通过二进制信息以不同的总线传入CPU来区分
一般通过数据总线,地址总线的都是数据
通过控制总线是命令
 


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

主板:主要的电路板 接口卡:CPU通过接口卡间接控制外部设备

各类存储器在物理上是独立的,但是: 1.都和CPU的总线相连; 2.CPU对他们进行读或写的时候都通过控制线发出的内存读写命令。 3.CPU通过接口卡间接控制外部设备 在这里插入图片描述

2.CPU工作原理

CPU组成:CPU由运算器、控制器等器件组成,靠内部总线相连

16位结构的CPU特征:

1)运算器一次最多可以处理16位的数据。

2)寄存器的最大宽度为16位

3)寄存器和运算器之间的通路是16位的

内部总线和外部总线 (1)内部总线:实现CPU内部各个器件之间的联系。 (2)外部总线:实现CPU和主板上其他器件的联系。

寄存器 8086CPU有14个寄存器,名称分别为: AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

通用寄存器: 通常用来存放一般性数据 AX,BX,CX,DX, 这四个寄存器都是可以分为2个独立的8位寄存器使用

	AX=AH+AL
	BX=BH+BL
	CX=CH+CL
	DX=DH+DL
    AX的低8位(0-7)构成AL寄存器
	高8位(8-15)构成了AH寄存器
	AH和AL寄存器是可以独立使用的8位寄存器

16位:从低地址到高地址分别是0-15。 16位寄存器所能存储的数据最大值为216-1 。

字:字(word)是两字节,16位 8086 CPU所有的寄存器是16位,可以存放2个字节(一个字) 字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。 在这里插入图片描述

物理地址 所有的内存单元构成一个一维的线性存储空间。 CPU访问内存单元时要给出内存单元的唯一地址就是物理地址。

8086CPU地址物理

1.8086有20位地址总线,可传送20位地址,实际上的寻址能力为1M 2.8086内部为16位结构,它只能传送16位的地址,理论上表现出的寻址能力却只有64K

思考:8086CPU如何用内部16位的数据转换成20位的地址?


1.8086CPU采用一种在内部用两个16位地址合成的方法,来形成20位的物理地址
 即:段地址+偏移地址=物理地址
 
2.地址加法器合成物理地址的方法: 物理地址=段地址×16+偏移地址

3.“地址段×16”即是数据左移4位(二进制位的左移4位,十六进制的左移1位)
在地址加法器中,如何完成“段地址×16”?二进制形式的段地址左移4位

在这里插入图片描述 地址加法器工作原理:物理地址=段地址*16+偏移地址

8086CPU读写内存的步骤

1、CPU中的相关部件提供段子和偏移地址这两个16位的地址;
2、段地址和偏移地址通过内部总线送入到一个称为地址加法器的部件;
3、地址加法器将两个16位地址合并成一个20位的地址;
4、地址加法器通过内部总线将20位物理地址送送入输入输出地址;
5、输入输出控制电路将20位物理地址送上地址总线;
6、20位物理地址被地址总线传送到存储器。

在这里插入图片描述

段 人为定义的,将若干地址连续的内存单元看作一个段。用段地址*16定位段的起始地址(基址),用偏移地址定位段中的内存单元。

注意:一个段的起始地址是16的倍数。偏移地址为16位,寻址能力为64K,所以段的最大长度也是64K

段寄存器**:CS(代码段)、DS(数据段)、SS(堆栈段)、ES(附加段)**

当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址

IP:指令指针寄存器【专用寄存器】

CPU工作过程:

     1.从CS:IP指向内存单元,读取指令,读取的指令进入指令缓冲器
     2.IP=IP+所读取指令的长度,从而指向下一条指令
     3.执行指令,转到步骤1,重复这个过程

在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H 即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行 FFFF0H单元中的指令是8086PC机开机后执行的第一条指令

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

jmp 段地址:偏移地址       ;同时修改CS和IP
指令中的段地址修改CS  偏移地址修改IP

jmp 某一合法寄存器        ;则是仅修改IP
比如:jmp ax                  ;再通过ax寄存器来修改

注意:mov不能对CS,IP操作,mov只能操作AX这样的通用寄存器
jmp是只具有一个操作对象的指令

代码段 可以将长度为N(N 通用寄存器 -> 段寄存器

[address] […]表示一个内存单元,“[…]”中的…表示内存单元的【偏移地址】 执行指令时,8086CPU自动取DS中的数据为内存单元的【段地址】

读取10000H单元的内容(从内存中传入数据给寄存器)
mov bx,1000H
mov ds,bx       ;将1000H地址传给ds
mov al,[0]      ;将1000H单元的数据传给al  [0]偏移地址为0
将AL中的数据送入内存单元10000H(从寄存器传给内存)
mov bx,1000H
mov ds,bx
mov [0],al      ;al中的字节型数据送入到1000H:0中

字的传送 8086CPU是16位结构,有16根数据线,所以可以一次性传送16位的数据 即:一次可以传送一个字

数据段 对于8086CPU,在编程时可以将长度为N(N小于等于64KB)的一组代码存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放数据的,从而定义了一个数据段。

访问数据段中的数据 用DS存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元

区别:CS和IP存放当前指令的段地址和偏移地址

栈 具有特殊的访问方式的存储空间,也是内存空间的一部分,数据先进后出 8086CPU提供入栈和出栈指令:以字为单位

    push(入栈)
    pop(出栈)
    1.push ax:将寄存器ax中的数据送入栈中
    2.pop ax:从栈顶取出数据送入ax

段寄存器SS:存放栈顶的段地址 寄存器SP:存放栈顶的偏移地址【专用寄存器】

段寄存器SS存放栈顶的段地址,寄存器SP存放栈顶的偏移地址。任意时刻SS:SP指向栈顶元素。

执行push ax时
1.sp=sp-2
2.将ax中的内容送入到ss:sp指向的内存单元 ,ss:sp此时指向新栈顶

执行pop ax时
1.将ss:sp指向的内存单元的内容送入到ax中,下一轮push会覆盖
2.sp=sp+2
 
如果栈是空的,sp指向哪里?
sp指向最高地址单元的下一个单元

栈顶越界的问题 sp指向最高地址单元的下一个单元 8086CPU只记录栈顶,栈空间由自己控制。栈顶越界问题导致溢出漏洞。 8086CPU只考虑当前的情况:当前栈顶在何处;当前要执行的指令时哪一条。

栈段 对于8086,在编程时可以将长度为N(N小于等于64KB)的一组代码存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是当作栈来用,从而定义了一个栈段

设栈顶的变化范围是0-FFFFH,从栈空时sp=0(最高地址单元FFFFH的下一个单元0000H)一直压栈,直到栈满,sp=0; 如果再次压栈,栈顶将环绕,覆盖原来栈中的内容

注**:一段内存,既可以是代码的存储空间,又可以是数据的存储空间,还可以是栈空间,**关键在于CPU中寄存器的设置,即:cs、ip、ss、sp、ds的设置

汇编指令

!!!汇编指令对大小写不敏感
1.mov指令(传送指令)
mov opt1,opt2  ;将opt2的值传给opt1

mov 寄存器,数据;mov ax,8
mov 寄存器,寄存器;mov ax,bx  ;是将寄存器中的值进行操作
mov 寄存器,内存单元;mov ax,[0]
mov 内存单元,寄存器;mov [0],ax
mov 段寄存器,寄存器;mov ds,ax
mov 寄存器,段寄存器;mov ax,ds

2.add
add opt1,opt2   ;opt1=opt1+opt2

add 通用寄存器,数据
add 通用寄存器,通用寄存器
add 通用寄存器,内存单元
add 内存单元,寄存器

3.sub
sub opt1,opt2  ;opt1=opt1-opt2

sub 通用寄存器,数据
sub 通用寄存器,通用寄存器
sub 通用寄存器,内存单元
sub 内存单元,通用寄存器 

关注
打赏
1665385461
查看更多评论
立即登录/注册

微信扫码登录

0.0447s