Memory LC-3:BLKW ho指定存储数据的内存位置?

Memory LC-3:BLKW ho指定存储数据的内存位置?,memory,store,lc3,Memory,Store,Lc3,在LC-3中,当您使用BLKW时,如何将内存块初始化为位于位置x3102而不是下一个可用内存位置 首先,让我们附带注意,根据内存映射(例如,至少在x3000 xFDFF范围内),16位地址空间的所有内存都在那里供您使用,并且它被初始化为零;你可以随意使用它 一般来说,LC-3汇编程序不允许在整个文件中使用多个.ORIG指令,相反,它们要求在文件的开头使用一个.ORIG指令。如果他们允许后续的.ORIG指令,这将是一种实现您所要求的功能的方法 但是,即使他们经常这样做,我们也会遇到指令偏移量编码的

在LC-3中,当您使用BLKW时,如何将内存块初始化为位于位置x3102而不是下一个可用内存位置

首先,让我们附带注意,根据内存映射(例如,至少在x3000 xFDFF范围内),16位地址空间的所有内存都在那里供您使用,并且它被初始化为零;你可以随意使用它

一般来说,LC-3汇编程序不允许在整个文件中使用多个.ORIG指令,相反,它们要求在文件的开头使用一个.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
,使用
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位的偏移量,因此代码到代码的引用比代码到数据的引用可以到达更远的位置