Разница между моделью программирования и счетчиком программ и указателем стека в случае сборки? - PullRequest
1 голос
/ 22 марта 2019

Модель процессора I

 ● Registers  
    PC – Program Counter  
    Single data register (accumulator) without name  
    We will use symbol A to describe operations on this register  
 ● Stack with an unspecified implementation  
 ● Data specified by name or value  
    More realistic model will follow later 

  Instruction     Action         Description  
  ---------------------------------------------------------------------
  load data       A = data       Load data to accumulator  
  store data      data = A       Store data from accumulator to memory  
  add data        A += data      Add data to accumulator  
  push data                      Push data onto stack  
  call addr       Push PC        Jump and store return trace on the stack 
                  PC = addr
                  Pop PC 
  return          Pop PC         Return – jump to the previously stored trace addr  
  create data                    Allocate data on stack  
  destroy data                   Deallocate data from stack   

Модель процессора II

● More realistic version of model I  
● Stack explicitly implemented in memory  
● Stack Pointer register - SP  
● Stack operations defined explicitly using SP  
● Allocation and deallocation of local data implemented 
   by changing the value of SP (no data transfer occurs)
● Arguments and local variables accessed by names  
    Still unrealistic  

  Instruction    Action               Description
  ---------------------------------------------------------------------
  load data      A = data             Load data to accumulator (constant or variable)
  store data     data = A             Store data from accumulator to memory
  add data       A += data            Add data to accumulator (constant of variable)
  push data      *--SP = data         Place data on the stack (constant of variable)
  call addr      *--SP = data         Jump storing the return trace on the stack
                 PC = addr            
  return         PC = *SP++           Return to the previously stored trace address
  Create data    SP -= sizeof(data)   Allocate data on the stack
  Destroy data   SP += sizeof(data)   Deallocate data from the stack

Два вышеупомянутых слайда были представлены во время лекции по x86 / MIPS. Я не очень поняла.

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

Речь идет о моделях для двух разных процессоров (x86 / MIPS)? Кто для кого?

Может ли кто-нибудь любезно объяснить?

1 Ответ

4 голосов
/ 22 марта 2019

Оба x86-подобны, где call помещает адрес возврата (ПК) в стек. Обратите внимание, что ПК во время выполнения инструкции call указывает на конец инструкции / начало следующей, поэтому ПК - это адрес инструкции, которая должна выполняться после ret из call.

2-я модель более четко описывает работу стека, соответствуя x86 push / pop / call / ret. Это все изменилось.

MIPS jal помещает адрес возврата в регистр (регистр связи $lr является одним из 32 целочисленных регистров общего назначения в MIPS). Программное обеспечение может помещать его в стек вручную (например, в неконечные функции), но ISA не знает об этом / не заботится об этом.

MIPS даже архитектурно не имеет «указателя стека», который неявно используется для чего-либо. Callstack - это соглашение о программном обеспечении, хотя и очень полезное, которое, по существу, все программное обеспечение использует в основном так же, как x86, без единой инструкции, которая сочетает в себе изменение SP и загрузку или сохранение.

Единственное, что я понял, это две модели вызова функций с использованием стеков и выделения / освобождения куч. Один использует ПК, а другой использует SP.

Нет, это абсолютно неправильно на всех уровнях.

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

Память "кучи" является отдельной. Обычно это не одна вещь, например статическое и динамическое распределение обычно разделены в современных ОС. Но в любом случае, динамическое выделение кучи, такое как malloc, даст вам указатель на память, которая все еще действительна после add sp, 16 или чего-либо еще и ret, чтобы разрушить кадр стека текущей функции.

И, во-вторых, ПК вообще не участвует в распределении памяти . В деталях показано, что ПК читается как адрес возврата и записывается с помощью инструкций перехода / вызова / возврата. Он также известен как IP, указатель на инструкцию. На x86 32- и 64-разрядные версии регистра IP являются EIP / RIP соответственно.

...