IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> (二)汇编语言——寄存器 -> 正文阅读

[嵌入式](二)汇编语言——寄存器

目录

通用寄存器

汇编指令

物理地址

段寄存器

CS:IP

JMP

字的存储

字单元

DS

SS:SP

过程

总结


? ? ? ? 接下来我们来介绍寄存器,同时会介绍一些基本的语句(mov,add等),好了,就让我们进入今天的学习吧!同时,我们以8086为例子来介绍,参考来自王爽老师的书。


? ? ? ? 说起寄存器,我们可不陌生,在单片机中我们已经接触过了。但是这个地方的寄存器要比单片机中有点不一样,以8086为例子,一共有14个寄存器:

  • 通用寄存器:AX、BX、CX、DX;
  • 变址寄存器:SI、DI;
  • 指针寄存器:SP、BP;
  • 指令指针寄存器:IP;
  • 段寄存器:CS、SS、DS、ES;
  • 标志寄存器:PSW?

? ? ? ? 这些我们在后面都会一一介绍,不过首先,我们来介绍一下通用寄存器。

通用寄存器

????????8086所有的寄存器都是16位的,所以最大可以存放2^16 - 1,但是目前有个问题,就是8080是8位的,那么两种是否是否是完全不同的两个东西,答案是否定的,这是因为8086的寄存器,分为高位(H)和低位(L),这就相当于两个8位,不得不说,还是满巧妙地,这样也解决了我的疑问,为什么在单片机里面寄存器可以拆开来用。

汇编指令

????????接下来我们来简单介绍三个汇编指令:mov、 add和sub,主要就是用来移动数据和加减数据(add是加,sub是减)。

????????可以说非常简单了?,就不再赘述。唯一需要注意的就是,当加法溢出之后,溢出位是直接没有的,比如16位数据相加溢出,17位的1直接消失,而如果是8位,也不会向高位溢出,也是直接舍弃。

? ? ? ? 就像这里红色圈起来的0058,当执行add al, 93,之后,相当于,c5+93=158,然后1溢出,不会向高位进位。?

物理地址

? ? ? ? 我们知道,8086有20位地址总线,所以寻址能力应该为1M。但是有个问题,就是8086是16位的机器,并不能一次传输20位的数据,这可怎么办呢?

? ? ? ? 解决办法就是用两个16位寄存器合成20位数据,这样就解决了问题,也就是:物理地址=段地址×16+偏移地址,接下来我们来看一看。

????????这样,我们表示123C8就可以直接用1230:00C8来表示,当然也可以用其他的,在此不再赘述。

段寄存器

? ? ? ?8086一共有4个段寄存器,分别是CS、DS、SS、ES,我们接下来将讲解一下有关CS、DS以及SS。

CS:IP

  • CS:代码段寄存器
  • IP:指令指针寄存器
  • CS:IP:CPU将内存中CS:IP指向的内容当作指令执行。

????????CS是代码段寄存器,也就是说CS:IP,就代表着这个地址后面的数据当作代码去执行,具体执行过程如下所示。

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

? ? ? ? 但是有个问题,就是如何去修改CS段寄存器的值,经过测试,我们发现无法直接赋值,所以只能通过R命令去修改。但是这样过于繁琐,所以我们要学习一个新的指令:JMP。

JMP

? ? ? ? 这个主要就是用来修改CS的地址的,也叫转移指令。如果需要同时修改CS、IP的内容比如:jmp2AE3:3,jmp3:0B16。

jmp 段地址:偏移地址

????????仅修改IP的内容jmp某一合法寄存器

jmp ax(类似于mov IP,ax)

字的存储

? ? ? ? CPU中,低位字节存在低地址单元,高位字节存在高地址单元,高8位放高字节,低8位放低字节。千万要小心,下图数据为4E20和0012,不要读反了,注意高位和低位,千万小心!!!!

字单元

????????由两个地址连续的内存单元组成,存放一个字型数据(16位)。

DS

????????接下来,如果CPU需要从内存单元中要读取数据,这应该这么操作呢?答案是用DS和[address]配合。

  • 用DS寄存器存放要访问的数据的段地址
  • 偏移地址用[...]形式直接给出
mov bx,1000H
mov ds,bx
mov al,[0]
  1. 字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放再高地址单元中。
  2. 用mov指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。
  3. [address]表示一个偏移地址为address的内存单元。
  4. 在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
  5. mov、add、sub是具有两个操作对象的指令,访问内存中的数据段(对照:jmp是具有一个操作对象的指令,对应内存中的代码段)。

? ? ? ??栈就简单简单介绍一下,因为大家都熟悉。??

  • ? ? ? ? 栈是一种只能在一端进行插入或删除操作的数据结构。
  • ????????栈有两个基本的操作:入栈和出栈。
  • ????????入栈:将一个新的元素放到栈顶;
  • ????????出栈:从栈顶取出一个元素。
  • ????????栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。
  • ????????栈的操作规则:LIFO(LastInFirstOut,后进先出)。

????????PUSH(入栈)和POP(出栈)指令(以字为单位对栈进行操作),其实和C语言很像,比较简单。唯一就是可能越界和栈空,千万注意,因为CPU不会帮你检查,一旦出问题,很有可能修改其他地方的数据。

  • ????????push ax:将ax中的数据送入栈中
  • ????????pop ax:从栈顶取出数据送入ax

现在就是有个问题,一段内存如何当作内存来使用啊?答案是SS段地址。

SS:SP

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

过程

push ax

  1. SP=SP–2;
  2. 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。

pop ax

  1. 将SS:SP指向的内存单元处的数据送入ax中;
  2. SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

总结

? ? ? ? 关于寄存器部分就讲完了,继续学习。?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:27:08  更:2022-12-25 11:28:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/25 14:31:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码