Size: a a a

Ассемблер

2021 September 11

d

disba1ancer in Ассемблер
а если не seh?
источник

E

Entusiast in Ассемблер
😂
источник

D

DarkPerl in Ассемблер
😂
источник

P

ProMiNick in Ассемблер
а если не SEH, то это просто организация ebp фрейма. Кстати о фреймах, надо допилить набор макросов struct, local чтоб полноценно esp фрейм трекился. А то я в который раз упирался в то, что блок virtual нельзя адресовать относительно переменной адресной базы.
источник

E

Entusiast in Ассемблер
"просто организация ebp фрейм"
Иногда бессмысленная организация кадра стека

И, кстати, установка SEH относится к кадру стека потому,  что он так и устанавливается. Если в функции используется стек - кадр обеспечен (ну такова логика компилятора)
push handler        ; exception handler
push dword[fs:0x00] ; previous exception handler
mov dword[fs:0x00], esp
источник

E

Entusiast in Ассемблер
Ну нет, это я загнул чего-то, он вообще использует функции ОС

Ну а насчёт кадра при try-catch - не вижу там зависимости от него, можно сделать обработчик без использования кадра стека, но скомпилировав через G++ я вообще запутался - он тут напихал локальных переменных (ещё и точек входа как мух: _main, _tmainCRT, _WinMainCRT, __main, __GLOBAL_sub_I_main), как всегда, поэтому тут без кадра никак.
источник

P

ProMiNick in Ассемблер
кадр от ebp в Си может не зависеть, а вот уровень вложенности защиты от исключений на ebp завязан.
источник

E

Entusiast in Ассемблер
🤨
Кадр и есть EBP
источник

E

Entusiast in Ассемблер
Вот я как-то установил SEH без кадра стека
Значит всё-таки это для ЯВУ нужно (и не для SEH, а, скорее, вообще для работы с локальными переменными, потому что Си любит локальные переменные)?  Уровень вложенности это вообще понятие от enter op2, вроде как, пошлоenter op2, вроде как, пошло
источник

d

disba1ancer in Ассемблер
Кстати, на 16ти битах нельзя адресовать относительно sp, только относительно bp
источник

E

Entusiast in Ассемблер
А как это относится к SEH на Windows
источник

d

disba1ancer in Ассемблер
Никак, это просто интересный факт
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
еще через bx можно
источник

d

disba1ancer in Ассемблер
Можно, но сегмент по умолчанию будет не тот
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
значит надо указывать нужный
источник

P

ProMiNick in Ассемблер
ESP frame & EBP frame - кадры разные бывают.
источник

s

s54816 in Ассемблер
Установить-то ты можешь что угодно, но вот адресовать локальные переменные в обработчике относительно esp сложно. Кто его знает, что там в esp было, когда исключение произошло. А с ebp достаточно лишь восстановить этот самый ebp.
источник

E

Entusiast in Ассемблер
Ну вот я и говорю - дело в локальных переменных
А изначально вообще всё пошло от того, почему компилятор Си создаёт кадр стека там, где без него можно обойтись. И вот на O3 он без него и обходится
Но ProMinick выдвинул идею, что это с SEH связано. С SEH это не связано, а вот с локальными переменными - да.
Но это не относится к тому, что без EBP можно обойтись, где нужны локальные переменные. Как раз где локальные переменные - и нужен кадр EBP
источник

s

s54816 in Ассемблер
Есть ещё плюсовые исключения, которые в винде через SEH реализованы. Там всё как раз на ebp завязано.

А что касается кадра стека — банально анализировать крэшдампы гораздо проще. И дёшево. Если быстродействие настолько важно, что какой-то там push ebp сильно влияет, функцию лучше заинлайнить. Не будет ни функции, ни кадра стека.
источник

E

Entusiast in Ассемблер
Ну мы про них и говорим
В Си блоков try-catch нет, вроде как. Но там можно установить обработчик через асм-вставку, или WinAPI
источник