我是靠谱客的博主 彩色裙子,最近开发中收集的这篇文章主要介绍汇编语言基础(1~3章)汇编语言第三章 寄存器(内存访问),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文针对B站 【汇编语言】小甲鱼零基础汇编真正全集1-17章(前三章) 手动整理的笔记,可以帮助大家更好的入门汇编语言
链接 https://www.bilibili.com/video/BV1zW411n79C?p=19
如有侵权,请联系博主删除。

汇编语言

第一章 汇编语言基础

1.1 汇编语言

​ 汇编语言是机器指令的助记符,同机器指令一一对应。

1.3 汇编语言组成

​ 1、汇编指令(机器码的助记符)

​ 2、伪指令(编译期执行)

​ 3、其他符号(编译器识别)

1.4 存储器

​ 指令和数据在存储器中存放,即我们所说的内存

​ 磁盘不同于内存,磁盘的数据或程序如果不读到内存中,就无法被CPU使用

1.5 指令和数据

​ 这是应用上的概念,但在内存或者磁盘上,指令和数据没有任何区别,都是二进制信息。

1.6 存储单元

​ 存储器被划分为若干个存储单元,每个存储单元从0开始编号。

​ 1KB=1024B

1.7 CPU对存储器的读写

​ 需要进行三类信息交互:

​ 存储单元的地址(地址信息)

​ 器件的选择,读写命令(控制信息)

​ 读写数据(数据信息)

​ 计算机专门连接CPU和其它芯片的导线,通常称为总线,bus

​ 物理上:一根根导线的集合

​ 逻辑上划分为:

​ 地址总线

​ 数据总线

​ 控制总线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uews8Ru0-1629715221623)(C:UsersMiuRuiAppDataRoamingTyporatypora-user-imagesimage-20210820144940303.png)]

1.8 地址总线

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

1.9 数据总线

​ CPU与内存或其它器件之间的数据传送是通过数据总线进行,数据总线的宽度决定了CPU和外界的数据传输速度。

1.10 控制总线

​ CPU对外界部件的控制是通过控制总线完成的,是不同控制线的集合,有多少根控制总线就意味着CPU提供了对外部部件的多少种控制。每根线控制一个部件的读或者写。

1.11 内存地址空间

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

1.12 主板

​ 主板上又有核心器件和总线

1.13 接口卡

​ CPU对外部设备不能直接控制,直接控制这些设备进行工作的是插在扩展插槽上的接口卡。

1.14 各类存储器芯片

​ 从读写属性上看:

​ 随机存储器RAM和只读存储器ROM

​ 从功能和连接上看:

​ 随机存储器RAM、装有BIOS的ROM和接口卡上的RAM

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9pBcOhDy-1629715221626)(C:UsersMiuRuiAppDataRoamingTyporatypora-user-imagesimage-20210820152257195.png)]

1.15 内存地址空间

​ 8086PC机的内存地址空间分配:

​ 00000-9FFFF 主存储地址空间RAM

​ A0000-BFFFF 显存地址空间

​ C0000-FFFFF 各类ROM地址空间

​ 内存地址空间:最终运行程序的还是CPU,我们用汇编编程的时候必须要从CPU角度考虑问题

第二章 CPU工作原理-寄存器

​ 典型的CPU有运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。

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

2.1 通用寄存器

​ 8086所有的寄存器都是16位的可以存放两个字节,AX、BX、CX、DX存放一般性数据,通用寄存器。

​ 16位寄存器所能存储的数据最大值为2^16-1

​ AX分为AH和AL,为了兼顾上一代CPU

2.2 字在寄存器中的存储

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qgq65Jak-1629715221627)(C:UsersMiuRuiAppDataRoamingTyporatypora-user-imagesimage-20210820155944133.png)]

2.3 几条汇编指令

​ 不区分大小写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M9cV5Oa6-1629715221629)(C:UsersMiuRuiAppDataRoamingTyporatypora-user-imagesimage-20210820160314418.png)]

2.4 物理地址

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

2.5 16位结构的CPU

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

2、寄存器最大宽度为16位

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

2.6 8086CPU

​ 8086CPU有20位地址总线,寻址能力为1M

​ 内部为16位结构,只能传送16位地址,表现出的寻址能力只有64位。

​ 8086采用内部两个16位地址来表示20位物理地址,段地址、偏移地址

​ 物理地址 = 段地址*16+偏移地址

2.8 段的概念

​ 内存被划分成为了一个一个段,每一个段有一个段地址。编程时可以根据需要将地址连续的内存单元看做一个段。

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

2.9 段寄存器

​ 8086CPU有4个段寄存器:CS代码段、SS堆栈段、DS数据段、ES附加段寄存器

2.10 CS和IP

​ CS和IP是8086CPU中最关键的寄存器,他们指示了CPU当前要读取指令的地址,IP为指令指针寄存器

​ 8086工作过程简述:

​ 1、从CS、IP指向内存单元读取指令,读取的指令进入指令缓冲器。

​ 2、IP=IP+所读取指令的长度,从而指向下一条指令。

​ 3、执行指令,跳转到1步骤,重复该过程。

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

2.11 修改CS、IP的指令

​ 程序员可以通过控制修改CS、IP值进行控制CPU执行目标指令。

​ mov指令不能修改CS、IP的值,8086提供了另外的指令来进行修改:转移指令,jmp

jmp 段地址:偏移地址

​ 仅修改IP的内容:

jmp 某一合法的寄存器

jmp ax 类似于mov IP,ax

2.12 代码段

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

​ 将一段内存当做代码段,仅仅是我们编程过程时的一种安排,CPU并不会由于这种安排就自动的将我们定义的代码段中的指令当做指令来执行。

实验一 查看CPU和内存,用机器指令和汇编语言指令编程

​ 32位电脑可用,安装虚拟机,win7 32位版本即可

​ cmd命令行输入debug

​ R命令查看、改变CPU寄存器内容

​ D命令查看内存中的内容

​ E命令改写内存中的内容

​ U命令将内存中的·机器指令翻译成汇编指令

​ T命令执行一条机器指令

​ A命令以汇编指令的格式在内存中写入一条机器指令

第三章 寄存器(内存访问)

3.1 内存中字的存储

​ 从0地址开始存,低位存在低地址单元

​ 任何两个地址连续的内存单元,N好单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。

3.2 DS和[address]

​ CPU首先获取内存单元地址才能进行读取,DS寄存器通常用来存放要访问的段地址。如果我们要读取10000H单元的内容:

mov bx, 10000H

mov ds, bx

mov al, [0]

​ 上面三条指令将10000H(1000:0)中的数据读取到al中

​ mov可以将数据直接送入寄存器或者将一个寄存器中内容存入另一个寄存器,除此之外还可以将一个内存单元中的内容送入一个寄存器

​ mov指令格式:mov 寄存器名,内存单元地址

​ ‘[…]’表示一个内存单元,’[0]'表示内存单元的偏移地址。

​ 8086CPU不支持将数据直接送入段寄存器,DS是一个段寄存器,所以采用数据-》通用寄存器-》段寄存器

3.3 字的传送

​ 因为8086CPU是16位结构,有16位数据线,所以可以一次性传送16位数据,也就是一次性传送一个字。

3.4 mov add sub指令

​ mov 寄存器,数据

​ mov 寄存器,寄存器

​ mov 寄存器,内存单元

​ mov 内存单元,寄存器

​ mov 段寄存器,寄存器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IHu0yDc-1629715221630)(C:UsersMiuRuiAppDataRoamingTyporatypora-user-imagesimage-20210823095002023.png)]

3.5 数据段

​ 8086pc机,起始地址是16倍数,长度为N<=64K。

3.6 栈

​ 先进后出,后出先进

​ push入栈、pop出栈

​ 入栈、出栈都是以字为单位进行

​ CPU通过寄存器CS和IP中存放的当前指令的段地址和偏移地址知道当前要执行的指令所在的位置,而8086CPU中有两个寄存器,段寄存器SS存放站定的段地址,寄存器SP存放栈顶的偏移地址。任意时刻SS:SP指向栈顶元素。

​ push执行时,sp=sp-2,将ax中的被日本风送入ss:sp指向的内存单元处ss:sp此时指向新栈顶。

​ 任意时刻,SS:SP指向栈顶元素,当栈为空时,栈中没有元素,即不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2,栈最底部字单元的地址为1000:000E时,所以栈空时SP=0010H

3.8 栈顶超界问题

​ 当栈满的时候再使用push指令入栈,栈空的时候再使用pop指令出栈,都将发生栈顶超界问题。栈顶超界是危险的,因为栈空间之外可能存放了其它有用途的数据、代码等,这些数据、代码可能是我们自己程序中的,也可能是别的程序中的。

​ 我们编程时必须考虑栈的大小,纺织入站的数据太多而导致的超界。出栈时也要注意。

3.9 push/pop指令

​ push和pop指令格式:

​ 1、push寄存器:将一个寄存器中的数据入栈

​ 2、pop寄存器:出栈,用一个寄存器接收出栈的数据

​ 3、push段寄存器:讲一个段寄存器中的数据入栈

​ 4、pop段寄存器:出栈,用一个段寄存器接收出栈的数据

​ 5、push内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位)

​ 6、pop内存单元:出栈,用一个内存字单元接收出入栈的数据

3.10 栈段

​ 将一段内存当做栈段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排救灾执行push、pop等栈操作指令时就自动地将我们的栈当做栈空间来访问。

​ 任一时刻ss:sp都指向栈顶元素,当栈空的时候ss:sp指向栈的最底部单元下面的单元,该单元的偏移地址为最底部字的偏移地址+2,栈最底部字单元的地址为1000:FFFE时,栈空时,sp=0000H。

​ 栈顶的范围是0~FFFFH,从栈空的时候sp=0,一直压栈,直到栈满,sp=0,如果再次压榨,栈顶将环绕覆盖了原来栈中的内容。所以一个栈的最大值为64K,对于8086这种16位PC机来说。
出入栈的数据

3.10 栈段

​ 将一段内存当做栈段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排救灾执行push、pop等栈操作指令时就自动地将我们的栈当做栈空间来访问。

​ 任一时刻ss:sp都指向栈顶元素,当栈空的时候ss:sp指向栈的最底部单元下面的单元,该单元的偏移地址为最底部字的偏移地址+2,栈最底部字单元的地址为1000:FFFE时,栈空时,sp=0000H。

​ 栈顶的范围是0~FFFFH,从栈空的时候sp=0,一直压栈,直到栈满,sp=0,如果再次压榨,栈顶将环绕覆盖了原来栈中的内容。所以一个栈的最大值为64K,对于8086这种16位PC机来说。

最后

以上就是彩色裙子为你收集整理的汇编语言基础(1~3章)汇编语言第三章 寄存器(内存访问)的全部内容,希望文章能够帮你解决汇编语言基础(1~3章)汇编语言第三章 寄存器(内存访问)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部