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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 汇编学习《汇编语言(第三版)》王爽著第二章学习 -> 正文阅读

[嵌入式]汇编学习《汇编语言(第三版)》王爽著第二章学习

第二章寄存器

一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。外部总线实现CPU和主板上其他器件的联系。

  • 运算器进行信息处理

  • 寄存器进行信息存储

  • 控制器控制各种器件进行工作

  • 内部总线连接各种器件,在他们之间进行数据的传送

    不同CPU寄存器个数、结构不同。8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW

2.1通用寄存器

8086CPU的所有寄存器都是16位的,可以存放两个字节。

AX、BX、CX、DX这4个寄存器都可分为两个独立可用的8位寄存器

  • AX可分为AH和AL
  • BX可分为BH和BL
  • CX可分为CH和CL
  • DX可分为DH和DL

如tuyi

2.2字在寄存器中的储存

  • 字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中

  • 字:记为word,一个字由两个字节组成,这两个字节分别称为这两个字的高位字节和低位字节,

    字:01001110|00100000

    ? 高位字节 低位字节

    十六进制表示的数据后面加H,在二进制表示的数据后面加B,十进制后什么都不加

2.3几条汇编指令

汇编指令控制CPU完成的操作用高级语言的语法描述
mov ax,18将18送入寄存器AXAX=18
mov ah,78将78送入寄存器AHAH=78
add ax,8将寄存器AX中的数值加上8AX=AX+8
mov ax,bx将寄存器BX中的数据送入寄存器AXAX=BX
add ax,bx将AX和BX中的数据相加结果存在AX中AX=AX+BX

程序段中指令的执行情况

程序段中的指令指令执行后AX中的数据指令执行后BX中的数据
mov ax,001AH001AH0000H
mov bx,0026H001AH0026H
add al,bl0040H0026H
add ah,bl2640H0026H
add bh,al2640H4026H
mov ah,00040H4026H
add al,85H00C5H4026H
add al,93H0058H4026H

例,使用汇编指令编程计算2的4次方

使用下面3条指令写如2000:0开始的内存单元

mov ax,1
add ax,ax
jmp 2000:0003

2.4物理地址

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

CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不的CPU可以有不同的形成物理地址的方式。我们现在讨论8086CPU是如何在内部形成内存单元的物理地址。

2.5 16位结构的CPU

我们说8086CPU的上一代CPU(8080、8085)等是8位机,而8086是16位机,也可以说是8086是16位结构的CPU。

对于16位结构CPU的解释:

  • 运算器一次最多可以处理16位的数据;

  • 寄存器的最大宽度为16位;

  • 寄存器和运算器之间的通路为16位。

2.6 8086CPU给出物理地址的方法

8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。从8086CPU的内部结构来看,如果将地址从内部简单地出发,那么它只能送出16位的地址,表现出的寻址能力只有64KB。

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址

8086CPU相关部件的逻辑结构如图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WuOPap0n-1648993596099)(C:\Users\仲以昕\Desktop\屏幕截图 2022-03-31 201802.png)]

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

在这里插入图片描述

2.7 段的概念

地址10000H100FFH的内存单元组成一个段,该段的起始地址为1000H,段地址为1000H,大小为100H;我们也可以认为地址10000H1007FH、10080H~100FFH的内存单元组成两个段,他们的起始地址为:10000H和1080H,段地址为1000H和1008H,大小都为80H

在这里插入图片描述

2.8 CS和IP

CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。CS为代码段寄存器,IP位指令指针寄存器,从名称上我们可以看出它们和指令的关系。

在8060PC机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。

下图为8086CPU读取、执行指令的工作原理
在这里插入图片描述

  1. 8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H;
  2. 内存20000H~20009H单元存放这可执行的机器码;
  3. 内存20000H~20009H单元中存放的机器码对应的汇编指令如下
地址内容长度对应汇编指令
20000H~20002HB823013Bytemov ax,0123H
20003H~20005HBB03003Bytemov bx,0003H
20006H~20007H89D82Bytemov ax,bx
20008H~20009H01D82Byteadd ax,bx

8086CPU的工作过程可以简要描述如下

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

2.9修改CS、IP的值

程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

mov指令可以修改AX中的值如 mov ax,123 将AX中值设为123,CPU大部分寄存器的值都可以用mov指令来改变,mov指令被称为传送指令

但是mov指令不能用于设置CS、IP的值,这里引用jmp指令

jmp 2AM3:3,执行后CS=2AE3H,IP=003H,CPU将从 2AE33H 处读取指令

jmp 3:0B16,执行后CS=0003H,CPU将从 00B46H 处读取指令

“ jmp 段地址:偏移地址 ”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP

若向仅修改IP的内容,可用形如“jmp 莫一合法寄存器”的指令完成

jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H

? 指令执行后:ax=1000H,CS=2000H,IP=1000H

jmp bx,指令执行前:bx=0B16H,CS=2000H,IP=0003H

? 指令执行后:bx=0B16H,CS=2000H,IP=0B16H

"jmp 某一合法寄存器"指令的功能为:用寄存器中的值修改IP

在这里插入图片描述

指令执行序列:

  1. mov ax,6622H
  2. jmp 1000:3
  3. mov ax,0000
  4. mov bx,ax
  5. jmp bx
  6. mov ax,0123H
  7. 转到第三步

2.10代码段

我们可以将长度为N(N<=64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中

mov ax,0000   (B8 00 00)
add ax,0123H  (05 23 01)
mov bx,ax     (8B D8)
jmp bx        (FF E3)

这段长度为10个字节的指令,存放在123B0H~123B9H 的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存是用来存放代码的,是一个大妈段,他的段地址为123BH,长度为10个字节

2.11 Debug的使用

  1. 什么是debug

    debug是DOS、windows都提供的实模式程序的调试工具。使用它可以查看CPU各种寄存器中的内容,内存的情况在机器码级跟踪程序的运行

  2. 我们用到的Debug功能

    • 用Debug的R命令查看、改变CPU寄存器的内容;
    • 用Debug的D命令查看内存中的内容
    • 用Debug的E命令改写内存中的内容
    • 用Debug的U命令将内存中的机器指令翻译成汇编指令
    • 用Debug的T命令执行一条机器指令
    • 用Debug的A命令以汇编指令的格式在内存中写入一条机器指令

(1.首先打开DOSBox

(2.输入debug

? -r

在这里插入图片描述

CS=0740,IP=0100,内存 0740:0100 处的指令为CPU当前要读取、执行的指令。在所有寄存器的下方,Debug列出了CS:IP所指向的内存单元为 0740:0100,此处存放的机器码为 0000 ,对应的汇编指令为ADD [BX+SI],AL

(3.-r ax (回车后输入1111如下图在输入r)

在这里插入图片描述

(4.用Debug的D命令查看内存中的内容

在这里插入图片描述

在这里插入图片描述

(4.用debug的E命令来改写内存中的内容

在这里插入图片描述
也可以用E命令向内存中写入字符串,如用E命令从内存0740:0开始写入:数值1,字符串“c++”、字符3、字符串“IBM”
在这里插入图片描述
用E命令将机器码写入内存

机器码对应的汇编指令
b80100mov ax,0001
b90200mov cx,0002
01c8add ax,cx
(5.用U命令将内存中的内容翻译为汇编指令

在这里插入图片描述
(6.使用debug的T命令可以执行一条或者多条指令,简单地使用T命令可以执行CS:IP指向的指令
在这里插入图片描述
解释:我们首先用E命令向从1000:0开始的内存单元中写入了8个字节的机器码;然后用R命令查看CPU中寄存器的状态,可以看到CS=0740H IP=0100H,若要用T命令控制CPU执行我们写到1000:0的指令,必须先让CS:IP指向1000:0,;接着用R命令修改CS、ip中的内容;
之后我们用T命令使得CPU执行我们写到1000:0的指令(执行T命令后,debug显示输出CPU中寄存器状态,AX内容被改为1,IP改为IP+3,)在这里插入图片描述
继续使用T命令
(7.用A命令以汇编指令的形式在内存中写入机器指令
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:53:39  更:2022-04-07 22:54:47 
 
开发: 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年11日历 -2024/11/26 4:29:42-

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