MARS - 地址超出范围

时间:2016-10-26 12:34:46

标签: memory out-of-memory mips primes mars-simulator

我正在使用Mars MIPS模拟器编写一个程序,它可以找到高达65,025的所有素数,然后以Ulam Spiral的形式在256x256位图显示上创建像素表示。

我的程序的data细分如下:

display:    .word   0:65536         # allocates a memory address for each  pixel, and initialises each to 0 (256 x 256)
numPixels:  .word   655536          # number of pixels on 256x256 display
black:      .word   0x00000000      # hex code for black
white:      .word   0x00FFFFFF      # hex code for white

primeArray: .word   1:65025         # array of 65025 elements initialised to '1' (1 = prime, 0 = not prime)
length:     .word   65025           # length of primeArray

我想在此data细分中尝试做的是保留:

  • 65,536个字对应每个像素
  • 3个字来存储'65,536'和黑白的十六进制代码
  • 整数的65,025字1 - 65,025
  • 1个字来存储号码'65,025'
按照给定的顺序

该程序使用Sieve of Eratosthenes来迭代primeArray并将素数存储为1,将非素数存储为0。到目前为止,我有两个独立工作的函数:

  • 第一个通过迭代每个65,536像素并将每种颜色设置为白色来清除位图显示。

  • 第二次迭代primeArray并通过使用Eratosthenes筛选算法将相应索引的编号存储到01

如果我自己运行这些功能,程序就会执行而没有错误。但是,如果我尝试执行clearDisplay后跟calcPrimes,我会收到以下内存错误:

line 63: Runtime exception at 0x0040009c: address out of range 0x10400000

其中第63行位于一个循环内,如果该元素不是素数,则设置primeArray[i] = 0

导致此错误的原因是什么?数据段是否足够大以存储我希望在执行之前的所有内容?

分配说明要求包括clears a block of memory - 这与我的问题相关的子程序吗?

1 个答案:

答案 0 :(得分:1)

您的数据段中存在拼写错误:

template< size_t N_1, size_t N_2, typename callable, typename T_out, size_t N,
      std::enable_if_t< N_1 >= N_2> *p>
template<std::size_t... I>
void A< N_1, N_2, callable, T_out, N, p>::foo()
{
}

256 * 256是65536,而不是655536。