单个内存地址可以存储多少条机器指令?

Posted

技术标签:

【中文标题】单个内存地址可以存储多少条机器指令?【英文标题】:How many machine instructions can single memory address store? 【发布时间】:2015-04-11 12:43:49 【问题描述】:

我是 GDB 的新手,目前正在尝试检查内存。我想标题说明了一切。基本上我编译了一些c代码并将断点设置为main。当我输入 x/x $eip 时,它会返回一些机器指令 0xd02404c7。 在第二次尝试x/5x $eip它回馈0x8048426 <main+9>: 0xd02404c7 0xe8080484 0xfffffebe 0x9066c3c9 0x8048436: 0x90669066 所以我在这里有点困惑。地址 0x8048426--0x8048436 之间的空间等于 10。所以事实证明,四条指令占用了“10 个地址”。我的问题是: 内存地址最多可以存储 4 条机器指令吗? 为什么要存储 4 条机器指令需要“10 个地址”? 处理器有多少位与单个内存地址可以存储多少机器指令之间有什么关系吗? 对不起,如果这个问题听起来很傻。

【问题讨论】:

差不是10,而是0x10,即16。一个内存地址存储一个字节(8位)。指令在 x86 上是可变长度的。 一些指令比其他指令需要更少的内存。考虑mov eax ebxneg eaxnop。这三个使用不同数量的内存,数量也取决于架构。您应该反汇编您的代码并打印说明以更清楚地看到它。 非常感谢。请再问一个问题。内存地址是十六进制的吧?因此,如果不是 0x8048436 而不是 0x8048526 差异将是 x100 即 16^2? 内存地址是十六进制是不对的。 gdb 将其显示为十六进制,仅此而已。十六进制数字的通用表示以0x 开头。当您看到时,该数字很可能是十六进制的。是的,差异是 0x100 或 256。 【参考方案1】:

地址0x8048426--0x8048436之间的空间等于10。所以原来4条指令占用了“10个地址”

不完全是,它等于0x10,它是一个十六进制数,等于十进制的16。 所以这些指令占用 16 个字节。

内存地址最多可以存储4条机器指令吗?

地址的粒度为 1 个字节。也就是说,一个地址正好指一个字节。

机器指令可以占用 1 个或更多字节。所以一个内存地址,一个字节,最多可以存储1条机器指令,至少在x86上是这样。

为什么要“10个地址”来存储4条机器指令?

您看到的每个数字都不是说明。您看到的 4 个数字称为单词,是您的 CPU 通常使用的。

处理器有多少位和单个内存地址可以存储多少机器指令之间有什么关系吗?

不是真的。一个内存地址最多可以存储一条指令。因为指令至少有 1 个字节长(对于 x86)。

但是“处理器有多少位”可以表明您的处理器可以访问扩展的或不同的指令集。

【讨论】:

哦...现在我明白了。谢谢。

以上是关于单个内存地址可以存储多少条机器指令?的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言实验四

操作系统(王道)二

汇编指令汇集及注意事项001(未完)

Linux 内存寻址

内存管理

linux监控平台搭建-内存