2019-09-04 6041
偏移地址是指段内相对于段起始地址的偏移值, 例如一个存储器的大小是1KB,可以把它分为4段,第一段的地址范围就是0—255,第二段的地址范围就是256-511,依次类推。
段地址就是每一段的首地址,第一段的段地址就是0,计算它们的物理地址只需要把段地址左移4位就可以了,再加上偏移地址就可以了
(H表示16进制)
错误认识:内存被划分成了一个一个的段,每个段有一个段地址 其实: 内存并没有分段,段的划分来自于CPU,由于8086CPU用(段地址*16)+偏移地址=物理地址 的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存 以后在编程时可以根据需要,将若干个地址联系的内存单元看做一个段,用段地址*16定位段的起始地址(基础地址) 用偏移地址定位段中的内存单元 注意: 1.段地址*16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数 2.偏移地址为16位,16位地址的寻址能力为64k 所以一个段的长度最大为64k
CPU访问内存单元时,必须向内存提供内存单元的物理地址 CPU可以用不同的段地址和偏移地址形成同一个物理地址 偏移地址16位,变化范围为0~FFFFH,仅用偏移地址最多可寻64k个内存单元 比如段地址为10000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH 在8086CPU中: 存储单元的地址用两个元素来描述,即段地址和偏移地址 数据在21F60H内存单元中 对于80806PC机的两种描述: 1.数据存在内存2000:1F60单元中 2.数存在内存的2000段中的1F60H单元中
段寄存器就是提供段地址的 CS:代码段寄存器; DS:数据段寄存器; SS:堆栈段寄存器; ES:扩展段寄存器; IP:指令指针寄存器 当CPU要访问内存时,有这四个段寄存器提供内存单元的段地址 CS和ip是CPU中最关键的寄存器,他们指示了CPU当前要读取指令的地址
1.从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器 2.IP=IP+所读取指令的长度, 从而指向下一条指令 3.执行指令,跳转到步骤1 重复过程 在加电或复位即CPU开始工作时 CS被设置为CS=FFFF,IP被设置为0000。 CPU从内存FFFF 0单元中读取执行指令 FFFF 0单元中的指令是开机后执行的第一条指令
在任何时候 CPU将CS、IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址 到内存中读取指令码。执行 如果说内存中的段信息曾被CPU执行过的话,那么它所在的内存单元必然被CS:IP指向过
在CPU中,能够用指令读写部件只有寄存器。可以通过改变寄存器中的内容实现对CPU的控制 CPU从何处执行指令是由CS、IP中的内容决定的。可以通过改变CS、IP中的内容来控制CPU执行目标指令 如何改变: mov 传送指令 如:mov ax, 123 mov指令可以改变大部分寄存器的值,被称为传送指令 mov指令不能设置CS、IP的值,8086提供了另外的指令来改变它们的值 jmp 转移指令: 同时修改CS、IP的内容: jmp 段地址:偏移地址 如: jmp 2ae3:3 jmp 3:0b16 用指令中给出的段地址来修改CS, 偏移地址修改IP 仅修改IP的内容: jmp 某一合法寄存器 如: jmp ax(类似于 mov IP,ax) jmp bx 用寄存器中的值修改IP
在编程是可以根据需要。将一组内存单元定义为一个段 可以将长度为n(n<=64kb)的一组代码 ,存在一组地址连续且起始地址为16的倍数 的内存单元中,这段内存是用来存放代码到的,从而定义了一个代码段 CPU只认 被CS:IP指向的内存单元 中的内容为指令 如何使得代码段中的指令被执行? 将一段内存当做代码段,仅仅是我们在编程时的一种安排 CPU并不会由于这种安排,就自动的将我们定义的代码段中的指令当做指令来执行 所以要将CS:IP指向所定义的代码段中的第一条指令的首地址
1.段地址在CPU的寄存器中存放,当CPU要访问内存时,由段寄存器提供内存单元的段地址 CPU有4个段寄存器,其中CS来存放指令的段地址 2.CS存放指令的段地址,IP存放指令的偏移地址 任意时刻,CPU将CS:IP指向的内容当做指令执行 3.CPU的工作过程: 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器 IP指向下一条命令 执行指令(调整到步骤1)重复这个过程 4.CPU提供转义指令来修改CS、IP的内容
老版本windows直接cmd 输入debug就可以进入 我的是win10 需要安装DOSbox软件 安装好DOSDbox后打开会有这样的界面 同时下载一个debug.exe 可以放在任意一个盘 在dosbox窗口输入: mount c d:\ d:\ debug: 进入debug模式(这里的d盘就是你放debug.exe的地方)
R命令: 查看、改变 CPU寄存器的内容 D命令: 查看内存中的内容 E命令: 改写内存中的内容 U命令: 将内存中的机器指令翻译成汇编指令 T命令: 执行一条机器指令 A命令: 以汇编指令的格式在内存中写入一条机器指令
计算2的8次方
**
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。