Стек времени выполнения кода C

Я не знаю, правильно ли назван мой вопрос, но я изучаю стеки во время выполнения и у меня есть следующий C-код:

int main() {
  int a, b, c , x;
  a = 4;
  b = 5
  c = 6
  x = func(a, b, c);
  return;
}
int func(int x, int y, int z) {
  int p, q, r;
  p = x*x;
  q = y/z;
  r = p + q;
  return r;
}

Это скомпилировано и загружено в папку x3000.

Я имею дело с симулированным компьютером под названием lc3. Мне нужно выяснить, как будет выглядеть стек времени выполнения при выполнении этого кода. Мое понимание темы слишком ограничено, чтобы реально решить эту проблему, но вот как я думаю, это должно выглядеть:

x0000
      (I don't know how the return should look either)
      (Assignments that I don't know how to interpret)
      r
      q
      p
      main's frame pointer
      Return address to main
      Return value to main
      x a
      y b
      z c
      (I don't know the assignments should look in the run-time stack)
      x
      c
      b
      a
xEFFF

Я надеюсь, что кто-то может предложить мне некоторую ясность в этом вопросе. Заранее спасибо.

1 ответ

Решение

Хорошо, все зависит от того, какой ABI вы используете. Если это что-то похожее на SystemV x86 Abi (тот, что в 32-битных linux). Это должно выглядеть так, как вы описали. (Я изменил свой ответ, чтобы он соответствовал тому, что википедия описывает для LC-3)

прежде всего, вы достигнете main()и имеют 4 локальные переменные, каждая из которых является int, (Предполагая каждый int равен 4 байта, а стек выровнен по 4 байта), они будут храниться в:

0xEFFC: a
0xEFF8: b
0xEFF4: c
0xEFF0: x

Затем вы вызываете функцию, а именно func(), Аббревиатура LC-3 говорит, что параметры должны передаваться в стеке справа налево:

0xEFEC: z --> c
0xEFE8: y --> b
0xEFE4: x --> a

Затем вы должны сэкономить место для возвращаемого значения, указать адрес возврата и сохранить R5:

0xEFE0: Return value
0xEFDC: Return address to main
0xEFD8: Space for R5

Опять локальные переменные:

0xEFD4: p
0xEFD0: q
0xEFCC: r

В современных системах возвращаемое значение может быть передано в регистрах (например, EAX). Это зависит от вашего ABI, где его пройти. Возможно, он может быть возвращен и в стеке.

Другое дело, что каждая функция может создавать кадр стека, помещая в стек базовый адрес стека родителя и предполагая, что их стек начинается с этого адреса.

У вас, вероятно, должен быть документ, в котором все эти вещи определены.

Другие вопросы по тегам