寄存器与内存-CS、IP与代码段、jmp指令、内存中字的存储

发布于:2022-11-03 ⋅ 阅读:(496) ⋅ 点赞:(0)

一、CS、IP与代码段

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

例示:在CS和IP指示下代码的执行

8086CPU当前状态:CS中内容为2000H,IP中内容为0000H
内存20000H~20009H处存放着可执行的机器代码
在这里插入图片描述

8086PC工作过程的简要描述:

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

指令读取和执行的实证演示-Debug

用debug程序执行下面的代码
  mov ax, 0123H
  mov bx, 0003H
  mov ax, bx
  add ax, bx

a 地址 - 写入汇编指令
u 地址 - 查看代码
t - 执行CS:IP处代码
在这里插入图片描述
在这里插入图片描述
可以想象成用u命令的时候看到的是代码,用d命令是看到的是数据
在这里插入图片描述
在这里插入图片描述
问:内存中有数据 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 命令可以改变寄存器的值——rcs, rip

Debug是调试手段,并非程序方式!
不能指着用户打开程序后去调试

方法2:用指令修改

  mov cs,2000h
  mov ip,0000h
很明显这种做法是不可行的,对于寄存器来讲不能把所谓的数存进去,另外对于指令角度是可行的,但是对于应用角度是不可取的(8086cpu不提供对cs和ip修改的指令)
在这里插入图片描述
想要知道某一个指令合不合法,在debug中一试便知。

方法3:转移指令 jmp(跳转指令)

同时修改CS、IP的内容
jmp 段地址:偏移地址
  jmp 2AE3:3
  jmp 3:0B16
功能:用指令中给出的段地址修改CS,偏移地址修改IP。
仅修改IP的内容
  jmp 某一合法寄存器
  jmp ax (类似于 mov IP, ax)
  jmp bx
功能:用寄存器中的值修改IP
  
  

在这里插入图片描述
从20000H开始,执行的序列是:
 (1)mov ax,6622
 (2)jmp 1000:3
 (3)mov ax,0000
 (4)mov bx,ax
 (5)jmp bx
 (6)mov ax,0123H
 (7)转到第(3)步执行
在这里插入图片描述
在这里插入图片描述
这是在执行上面程序中debug的实际操作,可以看到后续执行的为循环操作。想要学好汇编语言关键在于实际操作,每一个指令都可以在debug中进行实际操作!!!

三、内存中字的存储

前言-字的概念

计算机在进行数据处理,一次存取、加工、传送的数据长度称为字(word)。一个字一般由多个(整数倍)字节构成。
通常1word=2Byte=16bit
一个字由两个字节组成,16位组成
通常称16位是一个字,32位是一个双字,64位是两个双字
计算机的字长决定CPU一次处理实际位数的多少,字长越大,性能越优。

内存中字的存储

事实:对8086CPU,16位作为一个字(现在很多机器都是32位/64位,就是32/64位作为一个字)
问:
 16位的字存储在一个16位的寄存器中,如何存储?
答:
 高8位放高字节,低8位放低字节
问:
 16位的字在内存中需要2个连续字节存储,怎么存放?
答:
 低位字节存在低地址单元,高位字节存在高地址单元
例:20000D(4E20H)存放0、1两个单元,18D(0012H)存放在2、3两个单元
在这里插入图片描述

字单元

字单元:由两个地址连续的内存单元组成,存放一个字型数据(16位)
原理:在一个字单元中,低地址单元存放低位字节,高地址单元存放高位字节
  在起始地址为0的单元中,存放的是4E20H
  在起始地址为2的单元中,存放的是0012H
问题:
(1)0地址单元中存放的字节型数据是( 20H )
(2)0地址字单元中存放的字型数据是( 4E20H )
(3)2地址单元中存放的字节型数据是( 12H )
(4)2地址字单元中存放的字型数据是( 0012H )


网站公告

今日签到

点亮在社区的每一天
去签到