鱼C论坛

 找回密码
 立即注册
查看: 1064|回复: 5

[已解决]基础知识:内存寻址

[复制链接]
发表于 2023-4-12 16:33:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看了小甲鱼西瓜视频中《零基础入门学习汇编语言》中的第10课,4分18秒的时候,只给定了一个物理内存地址,为什么会把整条指令的三个字节都读到呢、一个物理地址不是代表存储单元吗?一个存储单元不是只能存放1个byte吗?小白求解答
最佳答案
2023-4-12 17:07:21
本帖最后由 jackz007 于 2023-4-12 17:09 编辑

        8086 汇编语言采用变长指令,也就是说,不同指令对应的字节数是不同的。每一条汇编语言指令的格式为
操作码 + 操作数
        其中,操作码的长度固定为 1 个字节,操作数为 0 ~ 5 个字节,操作数的字节数由操作码来决定,或者可以换句话说,一个操作码对应的操作数的字节数是确定的,所以,只要读取汇编语言指令的第一个字节,通过查表就可以知道后面的操作数是几个字节了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-12 16:38:22 | 显示全部楼层
当你提到小甲鱼的《零基础入门学习汇编语言》中的第10课,4分18秒的时候,他可能在讲解内存寻址的过程。在计算机中,内存中的每个字节都有一个唯一的物理地址。一个物理地址确实对应一个存储单元,而一个存储单元可以存放1个字节(8位)的数据。

当计算机需要执行一条指令时,它首先从指令寄存器中获取指令的地址。然后,计算机会根据指令的大小和类型,从内存中读取一个或多个字节。如果一条指令占用3个字节,那么计算机会依次读取这3个字节,并将其组合成一条完整的指令。

以一个简单的例子来说明这个过程:

假设内存中的物理地址0x1000存放着一条指令的第一个字节。如果这条指令占用3个字节,那么接下来的两个字节将分别位于物理地址0x1001和0x1002。在这个情况下,计算机会首先读取地址0x1000上的字节,然后继续读取地址0x1001和0x1002上的字节。最后,计算机将这三个字节组合成一条完整的指令,并执行该指令。

总之,尽管一个物理地址确实只代表一个存储单元,而一个存储单元只能存放1个字节的数据,但计算机在执行指令时会按照指令的长度从内存中读取多个连续的字节。这就是为什么给定一个物理地址时,计算机能够读取并执行占用多个字节的指令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-12 16:43:51 | 显示全部楼层
isdkz 发表于 2023-4-12 16:38
当你提到小甲鱼的《零基础入门学习汇编语言》中的第10课,4分18秒的时候,他可能在讲解内存寻址的过程。在 ...

读取到指令后的逻辑我明白,但是一开始时,它是如何知道这个指令要读取3个字节的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 17:07:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2023-4-12 17:09 编辑

        8086 汇编语言采用变长指令,也就是说,不同指令对应的字节数是不同的。每一条汇编语言指令的格式为
操作码 + 操作数
        其中,操作码的长度固定为 1 个字节,操作数为 0 ~ 5 个字节,操作数的字节数由操作码来决定,或者可以换句话说,一个操作码对应的操作数的字节数是确定的,所以,只要读取汇编语言指令的第一个字节,通过查表就可以知道后面的操作数是几个字节了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-12 17:07:51 | 显示全部楼层
yrp1226 发表于 2023-4-12 16:43
读取到指令后的逻辑我明白,但是一开始时,它是如何知道这个指令要读取3个字节的呢?

当计算机开始读取一条指令时,它首先读取指令的操作码(opcode),这个操作码是指令的第一个字节。操作码用于确定指令的类型和功能。根据不同的指令集(如x86、ARM等),每个操作码对应一个特定的指令,而每个指令可能占用不同长度的字节数。

计算机内部有一个解码器(decoder),它的作用是根据操作码来识别指令的长度和功能。当计算机读取到指令的操作码后,解码器会立即判断该指令占用的字节数以及需要读取的操作数。然后,计算机会根据解码器的判断继续读取后续的字节,直到将整条指令读取完毕。

以x86指令集为例,假设计算机读取到一个操作码0x89,这个操作码表示一个MOV指令,用于将一个寄存器的值移动到另一个寄存器。该指令通常占用2个字节。解码器识别到操作码0x89后,知道需要再读取一个字节(操作数)以获取源寄存器和目标寄存器的信息。然后,计算机会读取接下来的一个字节,并将这两个字节组合成一条完整的指令。

因此,在读取指令的过程中,计算机首先根据操作码来确定指令的长度和功能,然后再根据解码器的判断读取相应数量的字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-4-12 17:32:09 | 显示全部楼层
明白了,多谢各位解答,非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 04:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表