32-битный стек ARM: почему младшие 2 бита SP всегда должны быть 0? - PullRequest
0 голосов
/ 17 мая 2018

Я новичок в стеке и пытаюсь овладеть им, и это утверждение Stack Pointer давало мне много часов:

"В процессоре ARM Cortex-M стек всегда работает с 32-разрядными данными. Все обращения к стеку выровнены по словам, что означает, что младшие два бита SP (указатель стека) всегда должны быть 0."

Я знаю, что стек - это только часть оперативной памяти, которая содержит 32-разрядные данные, поэтому все операции, такие как PUSH / POP, должны быть 32-разрядными. У меня есть 2 вопроса об этом утверждении:

  1. Все обращения к стеку выровнены по слову. Должно ли это быть DWORD вместо WORD, чтобы компенсировать 32 бит? Если нет, то почему Word или 16 бит, а не 32 бита для всех обращений к стеку?

  2. Почему два младших разряда SP всегда должны быть равны нулю?

Есть мысли?

1 Ответ

0 голосов
/ 17 мая 2018

1) Все обращения к стеку выровнены по слову. Должно ли это быть DWORD вместо WORD, чтобы компенсировать 32 бит? Если нет, то почему Word или 16 бит, а не 32 бита для всех обращений к стеку?

Размер слова зависит от архитектуры процессора. На 32-битном Cortex-M слово состоит из 32 бит или 4 байта.

2) Почему два младших разряда SP всегда должны быть равны нулю?

Это другой способ сказать, что стек всегда должен быть выровнен по границе 4 байта или указатель стека должен всегда содержать адрес, кратный четырем байтам.

Например, двоичный адрес 0000 равен 0 десятичному. Три следующих адреса, 0001 (1 десятичный), 0010, (2 десятичный) и 0011 (3 десятичный) двоичные адреса имеют свои младшие значащие биты, установленные в 01, 10 и 11. 0100 (4 десятичных) - это первый адрес, следующий за 0000 с двумя младшими значащими битами, установленными в 0: это то же самое, что сказать, что это кратное 4 байта или, если вы предпочитаете, кратное размеру слова ЦП в байтах.

...