我在学习汇编语言,需要澄清一些事情。如果我对这个问题有任何疑问,请纠正我,因为我对装配了解不多。程序集内存分配
我看的所有教程都将汇编程序的变量分配给内存地址,如0x0000
,我可以理解您必须在汇编中手动分配内存地址,但您如何知道要使用的地址?
很明显,从最低内存地址开始是有道理的,但如果分配的变量大于0x0000
处的内存,该怎么办?所讨论的变量是否会运行到0x0001
或0x0002
?如果它确实不会把其他变量分配给具有相似编号的空格(或者你不应该把它们分配给那些关闭)?
如果我有两个程序同时运行(在一个现代操作系统中)并且我在这两个程序中都使用了相同的内存地址,一个程序是否会与另一个程序发生冲突,或者OS是否只分配一个可用内存地址,而不管程序中实际写入的内容是什么?
关于这个问题的任何信息表示赞赏。
感谢您的详细解答!在答案的最后部分,如何精确计算每一位数据需要多少空间?手动计算一个程序的数百个变量似乎不可行。用你的话说,你如何“摆脱”? – ubiquibacon 2010-08-17 00:37:54
我从未在任何大型项目中使用过程序集,但在我的操作系统类中推荐的启发式算法是按大小对变量进行排序,然后将最小的变量放在最低内存地址处。这并不总是最好的布局 - 您可能能够在大数据类型之间使用小数据类型。 您应该能够从变量的类型中知道它需要多少内存 - 请参考汇编语言的文档。请记住,一个变量在程序的整个运行过程中会占用相同数量的内存。它不能“增长”。这就是溢出发生的原因。 – 2010-08-17 00:41:40
伟大的答案,只是一个更正。正确对齐数据不是关于节省空间,因为它的所有连续内存无论如何。它与数据总线如何映射到内存有关。前8位从地址0开始,接下来的8位连接到地址1.这意味着从地址0开始的16位整数可以在单次读取中读取,因为它使用数据总线的两侧。但是,如果一个16位整数从1开始,它现在必须进行两次读取才能得到整个整数。对于32位整数,出于同样的原因,它们应该在可被4整除的地址处开始。 – Despertar 2016-05-18 22:06:24