re——基础入门(2)段和debug

re——基础入门(2)段和debug8086CPU 在访问内存时要由相关部件提供内存单元的段地址和偏移地址 送入地址加法器合成物理地址

大家好,欢迎来到IT知识分享网。

段是用于管理内存单元的一种方式

段只是一种概念,我们将内存单元划分成各个部分,我们将这些分的部分称为段,便于cpu对内存单元的控制,但实际上内存只被分成内存单元。

我们将段地址×16作为这一段的基础地址,再加偏移地址来搜索这段内的内存单元。有两点需要注意:段地址×16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数:偏移地址为16位,16位地址的寻址能力为 64KB,所以一个段的长度最大为 64KB。

CPU 可以用不同的段地址和偏移地址形成同一个物理地址。

“数据在21F60H 内存单元中。”这句话对于 8086PC 机一般不这样讲,取而代之的是两种类似的说法:①数据存在内存 2000:1F60 单元中;②数据存在内存的2000H 段中的 1F60H 单元中。这两种描述都表示“数据在内存21F60H单元中”。

8086CPU 在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。这里,需要看一下,是什么部件提供段地址。段地址在 8086CPU 的段寄存器中存放。8086CPU 有 4 个段寄存器:CS、DS、SS、ES。当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址。

CS 和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。 CS 为代码段寄存器,IP为指令指针寄存器。在8086PC 机中, 任意时刻, 设CS 中的内容为M, IP中的内容为N, 8086CPU将从 内存Mx16+N单元开始,读取一条指令并执行。也可以这样表述:8086机中, 任意时刻, CPU将CS:IP指向的内容当作指令执行。re——基础入门(2)段和debug

在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和lP被设置为CS=FFFFH, IP=OOOOH,即在8086PC机刚启动时,CPU从内存FFFFOH单元中读取指令执行,FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。

CPU将CS:IP指向的内存单元中的内容看作指令。

我们如何改变CS、IP的值呢?可以用mov指令,8086CPU大部分寄存器的值,都可以用mov指令来改变,mov指令被称为传送指令。

但是,mov指令不能用千设置CS、IP的值,原因很简单,因为8086CPU没有提供这样的功能。8086CPU为CS、IP提供了另外的指令来改变它们的值。能够改变CS、IP的内容的指令被统称为转移指令

若想同时修改CS、IP的内容,可用形如“jmp段地址:偏移地址”的指令完成

若想仅修改1P的内容,可用形如“jmp某一合法寄存器”的指令完成,如

如何使得代码段中的指令被执行呢?将 段内存当作代码段, 仅仅是 我们在编程时的种安排, CPU 并不会由于这种安排, 就自动地将 我们定义的代码段中的指令当作指令来执行。 CPU 只认被 CS:IP 指向的内存单元中的内容为指令。 所以, 要让 CPU 执行我们放在代码段中的指令, 必须要将 CS:IP 指向所定义的代码段中的第条指令的首地址。 对于上面的例子, 我们将段代码存放在 123B0H~123B9H 内存单元中, 将其定义为代码段, 如果要让这段代码得到执行, 可设CS=123BH、 IP=0000H。

Debug的使用

  • 用Debug的R命令查看、改变CPU寄存器的内容;
  • 用Debug的D命令查看内存中的内容;
  • 用Debug的E命令改写内存中的内容;
  • 用Debug的U命令将内存中的机器指令翻译成汇编指令;
  • 用Debug的T命令执行一条机器指令;用Debug的A命令以汇编指令的格式在内存中写入一条机器指令re——基础入门(2)段和debug要查看内存IOOOOH处的内容, 首先将这个地址表示为段地址:偏移地址的格式, 可以是1000:0, 然后用 “d1000:0″列出1000:0处的内容。
    使用 “d段地址:偏移地址” 的格式, Debug 将列出从指定内存单元开始的 128个内
    存单元的内容。 图2.34 中, 在使用d1000:0 后, Debug列出了1000:0~1000:7F中的内容。

中间是从指定地址开始的128个内存单元的内容, 用十六进制的格式输出, 每行 的输出从16 的整数倍的地址开始, 最多输出16 个单元的内容。 从图中, 我们可以知道, 内存1000:0 单元中的内容是72H, 内存1000:l单元中的内容是6 4H, 内存1000:0~1000:F 中的内容都在第一行;内存1000:10 中的内容是6DH, 内存1000:11处的内容是61H, 内存I000: IO~ I 000: IF中的内容都在第二行。 注意在每行的中间有一个 “ -“, 它将每行的输出分为两部分, 这样便千查看。 比如, 要想从图中找出 1000:6B单元中内容, 可以从中间是从指定地址开始的128个内存单元的内容,可以从1000:60 找到行, -“前面是I000:60~ 1000:67 的8个单元, 后面是1000:68~1000:6F的8个单元, 这样我们就可以从 1000:68 单元向后数3个单元, 找到I000:6B单元, 可以看到, 1000:68中的内容为67H 。

左边是每行的起始地址。右边是每个内存单元中的数据对应的可显示的ASCII码字符。比如,内存单元1000:0、1000:l、1000:2中存放的数据是72H、64H、73H,它对应的ASCII字符分别是”r”、”d”、”s”;内存单元1000:36.中的数据是OAH,它没有对应可显示的ASCll字符,Debug就用”.”代替。

用D命令查看范围:“d 1000:0 9”

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119359.html

(0)
上一篇 2025-11-06 08:15
下一篇 2025-11-06 08:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信