Можно ли получить адрес памяти, который не кратен 4 в 32-битной машине? - PullRequest
2 голосов
/ 03 ноября 2011

Я наткнулся на фрагмент кода сборки, подобный следующему

int fourth(char *str) {
return str[3];
{
0804834f <fourth>:
804834f: 55 push %ebp
8048350: 89 e5 mov %esp,%ebp
8048352: 8b 45 08 mov 0x8(%ebp),%eax
8048355: 83 c0 03 add $0x3,%eax
8048358: 0f be 00 movsbl (%eax),%eax
804835c: c9 leave
804835d: c3 ret

почему он достигает M [(% eax) +3]?

спасибо заранее

1 Ответ

4 голосов
/ 03 ноября 2011

Да, конечно.Если вы только адресуете byte, то вы должны быть в состоянии достичь любого адреса.(что имеет место в фрагменте кода: movsbl - это байтовый доступ)

Кроме того, x86 обеспечивает несогласованный доступ к памяти даже для многобайтовых слов.(хотя, как правило, с затратами на производительность) Так что даже в этом случае адрес не должен быть кратным 4.

* Исключение составляют регистры SSE / AVX.Где вам нужно использовать явные смещенные mov инструкции для смещенного доступа к памяти.

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