2013-12-12 3 views
0

Я не знаю, если название моего вопроса является правильным, но я учусь во время выполнения стеки и у меня есть следующий код C:время выполнения Stack коды 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 

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

ответ

0

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

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

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

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

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, где его можно передать. Вероятно, он также может быть возвращен в стек.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^