在LC-3中,当您使用BLKW时,如何将内存块初始化为位置x3102,而不是下一个可用的内存位置?
首先,让我们注意一下,根据内存映射(例如,至少在x3000-xFDFF范围内),您可以使用16位地址空间的所有内存,并将其初始化为零;您可以随意使用它。
通常来说,LC-3汇编器不允许在整个文件中使用多个.ORIG指令,相反,它们在文件的开头需要一个。如果它们确实允许使用后续的.ORIG指令,则这将是完成您所要求的方法。
但是即使经常这样做,我们也会遇到指令偏移量编码的限制。因此,下面将显示一个替代解决方案。
但是首先,让我们看一下指令偏移量/立即编码的限制。
通常的数据存储器访问指令格式具有非常有限的偏移量,仅值9位(+/-大约256),并且该偏移量是pc相对的。因此,例如,以下操作无效:
.ORIG x3000
LEA R0, TESTA
LD R1, TESTA
LEA R2, TESTB ; will get an error due to instruction offset encoding limitation
LD R3, TESTB ; will get an error due to instruction offset encoding limitation
HALT
TESTA
.FILL #1234
.BLKW xFA ; exactly enough padding to relocate TESTB to x3100
TESTB
.FILL #4321 ; which we can initialize with a non-zero value
.END
此示例:虽然这将成功地将TESTB
放置在x3100上,但由于9位pc相对位移有限,所以LEA
或LD
指令都无法达到它。
.BLKW操作数必须缩小大小,这显然很痛苦-通过在其中支持.ORIG
指令可以消除此方面。)] >因此,大块等的替代方法是求助于使用零初始化的内存,并使用附近的指针变量引用该其他内存:使用LD
加载地址,而不是LEA
和[C0 ]访问一个值而不是LDI
。
LD
在上面的后者中,没有声明要在.ORIG x3000 LEA R0, TESTA LD R1, TESTA LD R2, TESTBRef ; will put x3100 into R3 LDI R3, TESTBRef ; will access the memory value at address x3100.. HALT TESTA .FILL #1234 TESTBRef ; a nearby data pointer, that points using the full 16-bits .FILL x3100 .END
处保留存储,也不能使用非零初始化(例如,没有字符串,没有预定义的数组)在x3100
处初始化该存储。
使用数据到数据指针,x3100
。与代码对代码/数据引用(即
instructions
引用代码或数据)不同,数据对代码/数据(即data引用代码或数据)指针具有全部16位可用于指向。因此,一旦我们使用这种方法,简单地使用其他内存,就放弃了将标签自动放置在其他标签之后(对于那些其他区域),也放弃了非零初始化。TESTBRef
指令-因此,通过使用多个文件,我们可以将代码和数据放置在地址空间中的不同位置。但是,代码到数据指令的偏移编码限制仍然适用,因此,您可能最终还是要手动管理其他此类存储区,并同时使用数据指针。