| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 汇编语言访问寄存器和内存篇---02 -> 正文阅读 |
|
[嵌入式]汇编语言访问寄存器和内存篇---02 |
汇编语言访问寄存器和内存篇---02
CPU的组成
寄存器是CPU内部的信息存储单元
共性; 8086CPU所有的寄存器都是16位的, 可以存放两个字节。 通用寄存器——以AX为例一个16位寄存器存储一个16位的数据, 最大值?
例:在AX中存储18D
再例:在AX中存储20000D
横看成岭侧成峰问题: 8086上一代CPU中的寄存器都是8位 的,如何保证程序的兼容性?
“字”在寄存器中的存储8086是16位CPU
一个字(word)可以存在一个16位寄存器中
mov和add指令注:汇编指令不区分大小写 确定物理地址的方法物理地址
事实
问题:8086如何处理在寻址空间上的这个矛盾?! 8086CPU给出物理地址的方法8086CPU的解决方法
地址加法器合成物理地址的方法 : 段地址 * 16=基地址左移4个二进制位 演示:物理地址=段地址×16+偏移地址
“段地址×16+偏移地址=物理地址”的本质含义要解决的问题 : 用两个16位的地址(段地址、偏移地址), 相加得到一个20位的物理地址 本质含义 : CPU在访问内存时,用一个基础地址(段 地址×16)和一个相对于基础地址的偏移 地址相加,给出内存单元的物理地址。 内存的分段表示法用分段的方式管理内存8086CPU用“(段地址×16)+偏移地址=物理地址”的方 式给出内存单元的物理地址。
同一段内存,多种分段方案
(2)偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K 用不同的段地址和偏移地址形成同一个物理地址DebugDebug是DOS系统中的著名的调试程序,也可以运行在windows系统实模式下。 : 使用Debug程序,可以查看CPU各种寄存器中的内容、内存的情况,并且在机器指令级跟踪程 序的运行! 启动Debug在DOS提示符下输入命令:debug 用R命令查看、改变CPU寄存器的内容
用D命令查看内存中的内容
用E命令改变内存中的内容
用U命令将内存中的机器指令翻译成汇编指令有汇编指令
对应的机器码为
e 地址 数据 - 写入 d 地址 - 查看 u 地址 - 查看代码 用A命令以汇编指令的格式在内存中写入机器指令有汇编指令
对应的机器码为
a 地址 - 写入汇编指令
d 地址 - 查看数据 u 地址 - 查看代码 用T命令执行机器指令t - 执行CS:IP处的指令
先调整cs和ip寄存器初始值
用Q命令退出Debugq - 退出Debug CS、IP与代码段两个关键的寄存器
例示:在CS和IP指示下代码的执行
8086PC工作过程的简要描述: (1)从CS:IP指向内存单元读取 指令,读取的指令进入指 令缓冲器; (2)IP = IP + 所读取指令的长 度,从而指向下一条指令; (3)执行指令。 转到步骤 (1),重复这个过程。 指令读取和执行的实证演示-Debug 用debug程序执行下面的代码
a 地址 - 写入汇编指令 u 地址 - 查看代码 t - 执行CS:IP处代码
问:内存中有数据 B8 23 01 BB 03 00 89 D8 01 D8, 究竟用作一般数据,还是用作指令? 答:CPU将CS:IP指向的内存单元中的内容看作指令! jmp指令修改CS、IP的指令: 事实:执行何处的指令,取决于CS:IP 应用:可以通过改变CS、IP中的内容,来控制CPU要执行的目标指令 问题:如何改变CS、IP的值? 方法1:Debug 中的 R 命令可以改变寄存器的值——r cs, r ip Debug是调试手段,并非程序方式! 方法2:用指令修改
转移指令 jmp :
jmp 段地址:偏移地址
功能:用指令中给出的段地址修改CS,偏移地址修改IP。
某一合法寄存器
功能:用寄存器中的值修改IP。 问题分析
(1)mov ax,6622 内存中字的存储事实:对8086CPU,16位作为一个字 问题: 16位的字存储在一个16位的寄存器中,如何存储? 回答:
问题: 16位的字在内存中需要2个连续字节存储,怎么存放? 回答:
例:20000D(4E20H)存放0、1两个单元,18D (0012H)存放在2、3两个单元 字单元字单元:由两个地址连续的内存单元组成,存放一个字型数据(16位) 原理:在一个字单元中,低地址单元存放低位字节,高地址单元存放高位字节
(1)0地址单元中存放的字节型数据是( 20H) (2)0地址字单元中存放的字型数据是( 4E20H) (3)2地址单元中存放的字节型数据是( 12H ) (4)2地址字单元中存放的字型数据是( 0012H ) 用DS和[address]实现字的传送要解决的问题:CPU从内存单元中要读取数据 要求: CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址 原理: 在8086PC中,内存地址由段地址和偏移地址组成(段地址:偏移地址) 解决方案:DS和[address]配合 ,用 DS寄存器存放要访问的数据的段地址 ,偏移地址用[…]形式直接给出
字的传送8086CPU可以一次性传送一个字(16位的数据) 例
案例
DS与数据段对内存单元中数据的访问对于8086PC机,可以根据需要将一组内存单元定义为一个段。
例:用123B0H~123B9H的空间来存放数据
处理方法:(DS): ( [address])
将123B0H~123BAH的内存单元定义为数据段
用mov指令操作数据加法add和减法sub指令用DS和[address]形式访问内存中数据段方法小结
(2)用 mov 指令要访问内存单元,可以在mov指令中只给出单元的偏 移地址,此时,段地址默认在DS寄存器中。 (3)[address]表示一个偏移地址为address的内存单元。 (4)在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、 低地址单元和低8位寄存器相对应。 (5)mov、add、sub是具有两个操作对象的指令,访问内存中的数据段 (对照:jmp是具有一个操作对象的指令,对应内存中的代码段)。 (6)可以根据自己的推测,在Debug中实验指令的新格式。 栈及栈操作的实现栈结构栈是一种只能在一端进行插入或删除操作的数据结构。 栈有两个基本的操作:入栈和出栈。
栈顶的元素总是最后入栈,需要出栈时,又最先被从栈 中取出。 栈的操作规则:LIFO(Last In First Out,后进先出) CPU提供的栈机制: 现今的CPU中都有栈的设计。 8086CPU提供相关的指令,支持用栈的方式访问内存空间。 基于8086CPU的编程,可以将一段内存当作栈来使用。
例:设将10000H~1000FH内存当作栈来使用……入站:
出栈:
1、CPU如何知道一段内存空间被当作栈使用? 2、执行push和pop的时候,如何知道哪个单元是栈顶单元? 回答: 8086CPU中,有两个与栈相关的寄存器:
栈的操作push 指令和pop指令的执行过程push ax
pop ax
栈顶超界问题: 如何能够保证在入栈、出栈时,栈顶不 会超出栈空间? 执行入栈(push)时,栈顶超出栈空间执行出栈(pop)时,栈顶超出栈空间栈顶超界问题的解决栈的小结push、pop 实质上就是一种内存传送指令,可以在寄存器和内存 之间传送数据,与mov指令不同的是,push和pop指令访问的内 存单元的地址不是在指令中给出的,而是由SS:SP指出的。 执行push和pop指令时,SP 中的内容自动改变。 8086CPU提供的栈操作机制:
关于“段”的总结基础: 物理地址=段地址×16+偏移地址 做法:
三种段
综合示例:按要求设置段并执行代码综合示例:三个段地址可以一样滴! |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 0:33:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |