169 похожих чатов

А с каким компилятором не будет ошибкой использовать асм вставки?

14 ответов

62 просмотра

FPC умеет так )

Ассемблерные вставки это сама по себе и есть ошибка. Ты видишь в коде func(arg1), и думаешь, что это указатель. А на деле компилятор передаёт его в стек, или ещё куда-то (в зависимости от температуры и УФ-индекса), и весь твой код ломается, ломается и ещё раз ломается. Писать нужно весь код только на ассемблере, тогда будешь понимать, что у тебя происходит.

Вот, например: myfunc: Ты указатель в стек передал, смог бы ты тут написать lea eax, dword[esp+4] чисто логически? Сомневаюсь, такой ошибки ты бы никогда не сделал. ret callfunc: push arg1 call myfunc add esp, 4 ret

КТ315
Вот, например: myfunc: Ты указатель в стек переда...

Типа возврат из функции адреса аргумента?) ахахахаха

The Bird of Hermes
Типа возврат из функции адреса аргумента?) ахахаха...

Нет, типа в коде выше он затёр стек, думая что компилятор ему даёт указатель, а на самом деле в функции он ему даёт смещение внутри стека. Он сделал lea eax, myvar Думая, что у него там указатель, а на деле компилятор ему сделал lea eax, dword[esp+N], и он затёр весь стек.

КТ315
Нет, типа в коде выше он затёр стек, думая что ком...

Это даже сформулировать тяжело... Видишь одно, а компилятор делает другое. Как так писать можно вообще? Зачем мешать ассемблер со всякой хернёй...

КТ315
Нет, типа в коде выше он затёр стек, думая что ком...

Ну тут надо просто помнить, чем являются аргументы и локальные переменные. И что передавать их адреса глубже по цепочке вызовов можно, а возвращать - нельзя

The Bird of Hermes
Ну тут надо просто помнить, чем являются аргументы...

Чем являются аргументы в С* и локальные переменные в С* и как ведёт себя С-компилятор* и как он захочет сгенерировать код*

КТ315
Чем являются аргументы в С* и локальные переменные...

Ну локальные переменные и аргументы это либо сохраняемые регистры, либо место в стеке. С местом в стеке как я сказал дело обстоит, а от регистра взять адрес все равно не получится

purebasic

КТ315
Нет, типа в коде выше он затёр стек, думая что ком...

если не думать, а знать, то всех этих ошибок можно избежать

Aiwan \ (•◡•) / _bot
если не думать, а знать, то всех этих ошибок можно...

По моему мнению, это плохо. Потому что нужно заучивать логику компилятора. А главное, приходится её заучивать только когда начинаешь писать код на ассемблере. А код на ассемблере начинают писать когда не хватает сил компилятора.

Как и суть какого-либо знания вообще

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта