Практика языка C (МФТИ, 2023-2024). Семинар 6.3. Вызовы функций в ассемблере x86 и ABI.

  Рет қаралды 4,973

Konstantin Vladimirov

Konstantin Vladimirov

Күн бұрын

Практические занятия по языку C на первом курсе МФТИ. Кафедра информатики.
На этом занятии мы займёмся вызовами функций и познакомимся с основными концепциями ABI: работой со стеком, caller и callee saved регистрами и конвенциями передачи аргументов. Во второй половине мы немного обсудим инлайн-ассемблер и сформулируем главное правило разработки на ассемблере.
Семинарист: Константин Владимиров.
Дата: 11 марта 2024 года.
Съёмка: Марк Гончаров.
Звук: Юлий Тарасов.
Предыдущий семинар: • Практика языка C (МФТИ...
Следующий семинар: • Практика языка C (МФТИ...
Слайды к занятиям: cs.mipt.ru/wp/?page_id=7775
Примеры кода: github.com/tilir/c-graduate
Задачник: olymp1.vdi.mipt.ru/
Timeline
00:00 Что такое вызов функции?
09:00 Конвенции вызова и удобные инструкции.
14:25 Callee-saved и caller-saved регистры.
27:50 Исследуем System V ABI
35:35 Более сложные эксперименты
44:10 Время решать задачи
46:00 Инлайн-ассемблер
56:06 Альтернативы ассемблеру
01:07:40 Полуразбор проблемы AP
Errata
* Тут пока пусто

Пікірлер: 16
@handlewithoutsuitcase
@handlewithoutsuitcase 3 ай бұрын
Какой замечательный преподаватель и жутко полезный материал! Спасибо!
@user-gl2pc2ek2b
@user-gl2pc2ek2b 3 ай бұрын
Спасибо что вы есть Константин, у многих нету возможности учится в МФТИ, а вы эту возможность даете!
@alexandrgonzales6503
@alexandrgonzales6503 3 ай бұрын
Согласен на все 100
@mahabat23
@mahabat23 2 ай бұрын
перед просмотром сразу ставлю лайк!
@Chromaggus
@Chromaggus 3 ай бұрын
Caller - звонарь Calleе - аллё, отвечающий
@tilir
@tilir 3 ай бұрын
Отличное мнемоническое правило, спасибо ))
@ruslankhl
@ruslankhl 2 ай бұрын
Спасибо!
@Icanfly-
@Icanfly- Ай бұрын
Может я чего не понимаю 4:15 ? регистр rsp же всегда указывает на вершину стека, а не на адрес возврата. Адрес возврата лежит по смещению от регистра RSP и при вызове команды RET значение возврата выталкивается из стека в регистр ЕIP при этом значение RSP автоматически корректируется. Если я что то упустил подскажите пожалуйста в какую сторону смотреть. P.S за выкладывание лекций спасибо - круто что и у остальных людей есть возможность самостоятельно пообучаться!
@The604FX
@The604FX 2 ай бұрын
На слайде 41 (Вызов функций и ABI) опечатка: mov ebx, esi в комментарии написано "// eDx = b"
@a47mm_net23
@a47mm_net23 Ай бұрын
С учетом того, что клоны sun Solaris всё ещё живут в opensource, утверждение про смерть System V какое-то преждевременное.
@Stedmiel
@Stedmiel 3 ай бұрын
1:05:46 или вам не повезло в квадрате и вам попался какой-нибудь 8051 (б-же, когда он уже помрет окончательно), под который нормального сишного компилятора нет даже. и для прошивки чуть больше, чем помигать диодом наверняка придется либо костылять ассемблерные вставки, либо еще что-нибудь подобное *косится на его разные виды памяти, которых вечно нехватает, различные вендорские костыли к архитектуре и вот это все*
@tilir
@tilir 3 ай бұрын
Да, в эмбедеде этого хватает, сочувствую.
@alexandrgonzales6503
@alexandrgonzales6503 3 ай бұрын
Не помрет, вон китайцы недавно сделали 32-битное ядро 51-го, обещают 70 кратное ускорение
@sibedir
@sibedir Ай бұрын
calleR-командиР вызывает callee: - callee, сделай то..., за собой прибери. callee, не тупи, и всегда попроси: - не троньте 12-15, bx и bp. (би пи)
@andreykhakimov5588
@andreykhakimov5588 3 ай бұрын
Спасибо большое Константин Игоревич! Как всегда, я в восторге, преисполнен положительными эмоциями! Пора это сообщение уже как шаблон постить под каждым вашим видео, ведь они всегда содержат очень ценный материал, а подача ... великолепная! stdin: 208 161 208 191 208 176 209 129 208 184 208 177 208 190 32 208 177 208 190 208 187 209 140 209 136 208 190 208 181 32 208 154 208 190 208 189 209 129 209 130 208 176 208 189 209 130 208 184 208 189 32 208 152 208 179 208 190 209 128 208 181 208 178 208 184 209 135 33 code: [[nodiscard]] std::optional convertToString(std::vector uchars) { if (uchars.empty()) [[unlikely]] return std::nullopt; std::string result {}; std::move(std::begin(uchars), std::end(uchars), std::back_inserter(result)); if (result.empty()) [[unlikely]] return std::nullopt; return result; } [[nodiscard]] std::vector readSTD_IN() { std::vector text { }; for(int tmp; std::cin >> tmp;) text.emplace_back(tmp); return text; } int main() { std::vector text { readSTD_IN() }; std::optional str_opt { convertToString(std::move(text)) }; std::cout
@VonDerSchah
@VonDerSchah 2 ай бұрын
кто ленивый как я: print(bytearray(int(i) for i in " ".join(open("/tmp/1").read().split(" ")).split()).decode())
Кәріс өшін алды...| Synyptas 3 | 10 серия
24:51
kak budto
Рет қаралды 1,3 МЛН
Every Weird Math Paradox
11:15
ThoughtThrill
Рет қаралды 4,4 М.
Вселенная и Специальная теория относительности.
3:51:36
ЗЛОЙ АНАЛИТИК ВСЕЛЕННОЙ.
Рет қаралды 7 МЛН
Кәріс өшін алды...| Synyptas 3 | 10 серия
24:51
kak budto
Рет қаралды 1,3 МЛН