Memory LC-3:BLKW ho指定存储数据的内存位置?
在LC-3中,当您使用BLKW时,如何将内存块初始化为位于位置x3102而不是下一个可用内存位置 首先,让我们附带注意,根据内存映射(例如,至少在x3000 xFDFF范围内),16位地址空间的所有内存都在那里供您使用,并且它被初始化为零;你可以随意使用它 一般来说,LC-3汇编程序不允许在整个文件中使用多个.ORIG指令,相反,它们要求在文件的开头使用一个.ORIG指令。如果他们允许后续的.ORIG指令,这将是一种实现您所要求的功能的方法 但是,即使他们经常这样做,我们也会遇到指令偏移量编码的限制。因此,我将在下面展示另一种解决方案 但首先,让我们看看指令偏移量/立即编码限制 通常的数据存储器访问指令格式具有非常有限的偏移量,只有9位值(+/-约256位),并且偏移量是相对于pc的。因此,例如,以下方法不起作用:Memory LC-3:BLKW ho指定存储数据的内存位置?,memory,store,lc3,Memory,Store,Lc3,在LC-3中,当您使用BLKW时,如何将内存块初始化为位于位置x3102而不是下一个可用内存位置 首先,让我们附带注意,根据内存映射(例如,至少在x3000 xFDFF范围内),16位地址空间的所有内存都在那里供您使用,并且它被初始化为零;你可以随意使用它 一般来说,LC-3汇编程序不允许在整个文件中使用多个.ORIG指令,相反,它们要求在文件的开头使用一个.ORIG指令。如果他们允许后续的.ORIG指令,这将是一种实现您所要求的功能的方法 但是,即使他们经常这样做,我们也会遇到指令偏移量编码的
.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
,使用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
处使用非零初始化(例如,没有字符串,没有预定义的数组)初始化该存储
使用数据到数据指针TESTBRef
。与代码到代码/数据引用(即引用代码或数据的说明)不同,数据到代码/数据
(即数据引用代码或数据)指针具有所有16位可用于指向
因此,一旦我们使用这种简单使用其他内存的方法,我们就放弃了在其他标签之后自动放置标签(对于那些其他区域),也放弃了非零初始化
一些LC-3汇编程序将允许多个文件,每个文件都允许自己的
.ORIG
指令-因此,通过使用多个文件,我们可以将代码和数据放置在地址空间的不同位置。但是,代码到数据指令偏移量编码限制仍然适用,因此,您可能最终会手动管理其他此类内存区域,并使用数据指针
请注意,JSR指令有一个11位的偏移量,因此代码到代码的引用比代码到数据的引用可以到达更远的位置