FPC умеет так )
Ассемблерные вставки это сама по себе и есть ошибка. Ты видишь в коде func(arg1), и думаешь, что это указатель. А на деле компилятор передаёт его в стек, или ещё куда-то (в зависимости от температуры и УФ-индекса), и весь твой код ломается, ломается и ещё раз ломается. Писать нужно весь код только на ассемблере, тогда будешь понимать, что у тебя происходит.
Вот, например: myfunc: Ты указатель в стек передал, смог бы ты тут написать lea eax, dword[esp+4] чисто логически? Сомневаюсь, такой ошибки ты бы никогда не сделал. ret callfunc: push arg1 call myfunc add esp, 4 ret
Типа возврат из функции адреса аргумента?) ахахахаха
Нет, типа в коде выше он затёр стек, думая что компилятор ему даёт указатель, а на самом деле в функции он ему даёт смещение внутри стека. Он сделал lea eax, myvar Думая, что у него там указатель, а на деле компилятор ему сделал lea eax, dword[esp+N], и он затёр весь стек.
Это даже сформулировать тяжело... Видишь одно, а компилятор делает другое. Как так писать можно вообще? Зачем мешать ассемблер со всякой хернёй...
Ну тут надо просто помнить, чем являются аргументы и локальные переменные. И что передавать их адреса глубже по цепочке вызовов можно, а возвращать - нельзя
Чем являются аргументы в С* и локальные переменные в С* и как ведёт себя С-компилятор* и как он захочет сгенерировать код*
Ну локальные переменные и аргументы это либо сохраняемые регистры, либо место в стеке. С местом в стеке как я сказал дело обстоит, а от регистра взять адрес все равно не получится
purebasic
если не думать, а знать, то всех этих ошибок можно избежать
По моему мнению, это плохо. Потому что нужно заучивать логику компилятора. А главное, приходится её заучивать только когда начинаешь писать код на ассемблере. А код на ассемблере начинают писать когда не хватает сил компилятора.
Как и суть какого-либо знания вообще
Обсуждают сегодня