什么是未使用的内存地址?
What is an unused memory address?
阅读这篇文章 HTML page on Commodore 64 memory allocations 因为我对旧计算机硬件感兴趣,所以我偶然发现 table 中的一个单元格声称内存地址未被使用。这到底意味着什么?这是否意味着如果您想在该地址中放置一些东西,您可以放置任何您想要的东西?困惑,并希望得到所有答案。谢谢。
内存映射通常应指定哪些程序使用此内存。如果他们说 "unused",这意味着这些指定的程序不使用这个地址。在这里你可以看得更清楚:https://www.c64-wiki.com/wiki/Zeropage:
Those zeropage addresses are useful and important in programming the
C64 - so useful that the internal KERNAL and BASIC system ROMs make
use of most of them, leaving only a handful that are completely "safe"
for machine language programmers to use for their own purposes,
without risking a system crash.
因此,内存映射仅对 KERNAL 和 BASIC 有效。
其他程序(包括您的程序)可以毫无风险地访问未使用的地址。如果加载了其他程序,则必须找出它们访问了哪些地址。您也可以访问其他地址 - 即使它们被其他程序使用 - 如果您确切地知道会发生什么,那么...
LT;DR。
它指的是 BASIC 或 KERNAL 例程不使用的工作 ram 地址,可免费用于通用编程。
详细说明:
您所引用的页面是一个非常好的资源,但如果您不熟悉系统本身,它会过于详细。我建议在深入了解这些细节之前了解一般的内存布局。
下面是取自COMPUTE! magazine issue 32
的一般内存映射
c64 内存映射是高度可配置的。您可以看到 I/O 和 ROM 区域位于 RAM 区域之上。在 C64 体系结构中,ROM 区域下面总是隐藏着 RAM。您可以关闭不需要到达下方 RAM 的 ROM 区域,并在需要时切换回 ROM(或 I/O)。您也可以将屏幕 ram 移动到您想要的任何位置。
只有 $0000-$0400 之间的区域,称为工作内存,是固定的,因为操作系统(BASIC 解释器和 KERNAL 例程)使用该区域。如果你想在没有奇怪的副作用的情况下使用工作内存中的内存,你必须关闭 BASIC 或 KERNAL ROM。
例如:如果您关闭 BASIC rom,您可以安全地使用从 $2 到 $90 的零页地址
虽然有聪明的解决方案。与实用工具一样,假设您不会使用数据集,驻留在数据集缓冲区($033C-$03FB)或使用屏幕内存作为临时缓冲区并有效地用乱码填满屏幕。
我还必须提醒一下,内存的第一页(从 $0000 到 $00FF)对于 6502 系列的 CPUS 是极其重要的。该区域称为零页。在零页工作的指令在内存中占用的字节少一个,执行速度快一个周期。此外,间接索引和间接索引内存模式仅在零页中可用。
如果您需要保留默认内存配置并且仍然需要一些零页变量,您需要在零页中找到未使用的地址。这是在详细内存映射中称为 'Unused' 的主要原因。
另请注意:用户编写的 ML 程序通常放在 $C000-$D000 中,BASIC 解释器不会触及并调用为 'Free Ram'
BASIC 和 KERNAL 使用大部分零页(地址 [=13=]00
到 [=14=]FF
),几乎没有留给您用于您自己的程序。未使用的地址是 [=15=]02
和 [=16=]FB
到 [=17=]FE
。
零页在 6502 和相关 CPU 上是特殊的。考虑指令:
LDA 34
这会将地址 34
的内容加载到累加器(寄存器之一)。对于零页地址,该指令有一个更快的版本:
LDA
到目前为止,没什么大不了的,但是有两种间接寻址模式需要零页。例如:
LDA ($FB),y
读取$FB
和$FC
的内容,把它们当作一个little-endian的16位地址,把Y
寄存器的值加到这个16-位地址,然后从该地址加载累加器。请注意,这使用零页中的两个相邻字节。这使得靠近零页末尾的四个未使用字节比 </code>.</p> 处的一个未使用字节更有用。
<p>如果您刚刚起步,可以只用四个字节的零页。稍后,您可能会考虑保存和恢复 BASIC 使用的部分零页。如果您从程序中调用任何 KERNAL 例程,您将希望避免使用 KERNAL 使用的部分。</p>
<p>如果您使用 BASIC 编程,none 这一点非常重要。您可能只会使用 <code>PEEK
和 POKE
来控制视频、音频和 I/O。您可以使用 BASIC 变量和数组来存储程序的数据。
阅读这篇文章 HTML page on Commodore 64 memory allocations 因为我对旧计算机硬件感兴趣,所以我偶然发现 table 中的一个单元格声称内存地址未被使用。这到底意味着什么?这是否意味着如果您想在该地址中放置一些东西,您可以放置任何您想要的东西?困惑,并希望得到所有答案。谢谢。
内存映射通常应指定哪些程序使用此内存。如果他们说 "unused",这意味着这些指定的程序不使用这个地址。在这里你可以看得更清楚:https://www.c64-wiki.com/wiki/Zeropage:
Those zeropage addresses are useful and important in programming the C64 - so useful that the internal KERNAL and BASIC system ROMs make use of most of them, leaving only a handful that are completely "safe" for machine language programmers to use for their own purposes, without risking a system crash.
因此,内存映射仅对 KERNAL 和 BASIC 有效。
其他程序(包括您的程序)可以毫无风险地访问未使用的地址。如果加载了其他程序,则必须找出它们访问了哪些地址。您也可以访问其他地址 - 即使它们被其他程序使用 - 如果您确切地知道会发生什么,那么...
LT;DR。
它指的是 BASIC 或 KERNAL 例程不使用的工作 ram 地址,可免费用于通用编程。
详细说明:
您所引用的页面是一个非常好的资源,但如果您不熟悉系统本身,它会过于详细。我建议在深入了解这些细节之前了解一般的内存布局。
下面是取自COMPUTE! magazine issue 32
的一般内存映射c64 内存映射是高度可配置的。您可以看到 I/O 和 ROM 区域位于 RAM 区域之上。在 C64 体系结构中,ROM 区域下面总是隐藏着 RAM。您可以关闭不需要到达下方 RAM 的 ROM 区域,并在需要时切换回 ROM(或 I/O)。您也可以将屏幕 ram 移动到您想要的任何位置。
只有 $0000-$0400 之间的区域,称为工作内存,是固定的,因为操作系统(BASIC 解释器和 KERNAL 例程)使用该区域。如果你想在没有奇怪的副作用的情况下使用工作内存中的内存,你必须关闭 BASIC 或 KERNAL ROM。
例如:如果您关闭 BASIC rom,您可以安全地使用从 $2 到 $90 的零页地址
虽然有聪明的解决方案。与实用工具一样,假设您不会使用数据集,驻留在数据集缓冲区($033C-$03FB)或使用屏幕内存作为临时缓冲区并有效地用乱码填满屏幕。
我还必须提醒一下,内存的第一页(从 $0000 到 $00FF)对于 6502 系列的 CPUS 是极其重要的。该区域称为零页。在零页工作的指令在内存中占用的字节少一个,执行速度快一个周期。此外,间接索引和间接索引内存模式仅在零页中可用。
如果您需要保留默认内存配置并且仍然需要一些零页变量,您需要在零页中找到未使用的地址。这是在详细内存映射中称为 'Unused' 的主要原因。
另请注意:用户编写的 ML 程序通常放在 $C000-$D000 中,BASIC 解释器不会触及并调用为 'Free Ram'
BASIC 和 KERNAL 使用大部分零页(地址 [=13=]00
到 [=14=]FF
),几乎没有留给您用于您自己的程序。未使用的地址是 [=15=]02
和 [=16=]FB
到 [=17=]FE
。
零页在 6502 和相关 CPU 上是特殊的。考虑指令:
LDA 34
这会将地址 34
的内容加载到累加器(寄存器之一)。对于零页地址,该指令有一个更快的版本:
LDA
到目前为止,没什么大不了的,但是有两种间接寻址模式需要零页。例如:
LDA ($FB),y
读取$FB
和$FC
的内容,把它们当作一个little-endian的16位地址,把Y
寄存器的值加到这个16-位地址,然后从该地址加载累加器。请注意,这使用零页中的两个相邻字节。这使得靠近零页末尾的四个未使用字节比 </code>.</p> 处的一个未使用字节更有用。
<p>如果您刚刚起步,可以只用四个字节的零页。稍后,您可能会考虑保存和恢复 BASIC 使用的部分零页。如果您从程序中调用任何 KERNAL 例程,您将希望避免使用 KERNAL 使用的部分。</p>
<p>如果您使用 BASIC 编程,none 这一点非常重要。您可能只会使用 <code>PEEK
和 POKE
来控制视频、音频和 I/O。您可以使用 BASIC 变量和数组来存储程序的数据。