Size: a a a

2020 February 17

MB

Mikail Bagishov in rust_offtopic
Слава
Я немного не понимаю, что такое выравнивание стека при вызове. Мы в стек кладём значения. Например, я сделал push al, и в стеке оказался 1 байт. Что должно быть выровненным?
В момент, когда ты делаешь call, соглашение о вызове требует что-то про стек. например чтобы вершина стека была кратна 16
источник

С

Слава in rust_offtopic
Bogdan
ну падинг, чтобы поинтры лежили по адресам кратным 8
Поинтеры. То есть, если я засовываю в стек 1 байт, то потом для помещения в стек поинтера в 8 байт я должен перед ним засунуть в стек 7 нулей. Так?
источник

MB

Mikail Bagishov in rust_offtopic
Да
источник

С

Слава in rust_offtopic
Тогда это делает вызывающий.
источник

MB

Mikail Bagishov in rust_offtopic
Только это уже не ABI а требования архитектуры
источник

С

Слава in rust_offtopic
Не помню я таких требований, с другой стороны я только под DOS на ассемблере писал
источник

B

Bogdan in rust_offtopic
Слава
Не помню я таких требований, с другой стороны я только под DOS на ассемблере писал
вобще х86 может читать не выровнянные данные, только медленнее
источник

А⚙

Антон ⚙️ in rust_offtopic
Gymmasssorla
Rewrite It In Rust
Чёрт, чат обновился прям перед кликом — и вот я сбросил счётчик непрочитанных сообщений. Аргх!
источник

B

Bogdan in rust_offtopic
и атомарные операции будут не атомарно работать
источник

MB

Mikail Bagishov in rust_offtopic
источник

B

Bogdan in rust_offtopic
The end of the input argument area shall be aligned on a 16 (32 or 64, if __m256 or __m512 is passed on stack) byte boundary. In other words, the value (%rsp + 8) is always a multiple of 16 (32 or 64) when control is transferred to the function entry point.
источник

B

Bogdan in rust_offtopic
источник

С

Слава in rust_offtopic
По-моему, это как-то связано с размером блока виртуальной памяти. Там либо 16 байт минимальной гранулярности, либо 16 килобайт при установленном множителе. Хотя я это уже очень смутно помню.
источник

B

Bogdan in rust_offtopic
не, это связано с тем что mmx регистры 128 бит, т.е. 16 байт
источник

B

Bogdan in rust_offtopic
Слава
По-моему, это как-то связано с размером блока виртуальной памяти. Там либо 16 байт минимальной гранулярности, либо 16 килобайт при установленном множителе. Хотя я это уже очень смутно помню.
4 килобайта, или 1 Гб если включены Huge Pages
источник

MB

Mikail Bagishov in rust_offtopic
Или 2 МБ.
источник

B

Bogdan in rust_offtopic
хотя лучше былобы 16 кб хотябы в 64 битном режиме, хз чего оставили 4 кб (((
источник

B

Bogdan in rust_offtopic
хмммм, не знал)
источник

B

Bogdan in rust_offtopic
источник

B

Bogdan in rust_offtopic
эххх, такую архитектуру просрали — ia64
источник