Можно не вызывать ExitProcess а просто вернуться (с помощью ret в асме), это ещё изрядно подрежет размер. Хотя в старых виндах (XP точно) такой трюк иногда оставлял программу в памяти: Kernel32!BaseThreadInitThunk после возврата функции потока вызывает ExitThread - а винда в дополнение к основному потоку создаёт ещё штук пять для своих нужд, они и заставляли процесс не завершаться. 😉 18:18 А релоки-то зачем? /FIXED и забыть про них. Pelles C обскакал MASM потому что последний использует invoke и стандартный трамплин, например из User32.Lib: call _MessageBoxA@16 … _MessageBoxA@16: jmp [__imp__MessageBoxA@16]; имп находится в Import Address Table а Pelles C делает call [__imp__MessageBoxA@16] напрямую. В принципе можно отгрызть ещё нимношка если грохнуть Import Lookup Table в импорте и перетащить IAT к Import Directory Table (она начинается с нужного IAT нуля, так как ILT уже нет), но это ручками. Помнится один товарищ изгалялся ради компактного PE, код и данные совал в его заголовки. Было весело.
Разъёб, обожаю такие видосы и статьи, которые по сути не предоставляют какого-то фундаментального знания, но дают знание о том, что это знание существует)
Линкеры везде консольные... Не врубился в шутку юмора. Винда тоже с консолью старается дружить. Один PowerShell чего стоит. Это всё конечно не полноценный терминал, но хоть что-то. Благодарю за интерес к каналу!
Линковщики были переименованы. В видео LINK.EXE весит 852 кб, LINK1.EXE 462 кб (10:30), а в сборке с сайта наоборот. А в папке Linkers снова как в видео. Где верно?
Если вы про SmallestProg.tpl, то поиграйтесь с настройками Linker: ALIGN:16. Увеличивайте значение, но чтобы было кратно 4-м. Размер будет немного больше, но надёжность вырастет.
4096 - это не для процессора, это размер кластера на диске 4 килобайта (минимальная область на диске для хранения информации). Это чтобы файл быстрее грузился
@firststepsforward , а выравнивание по процессору - это по разрядности его регистров (8,16,32,64) - это то, как поля структур данных размещаются в памяти. Это тоже необходимо для ускорения обработки данных, чтобы процессор загрузил только то, что ему надо и не вычленял свои данные из набора. Например, если у тебя выравнивание по разрядности 64, то даже поле в структуре данных, объявленное, как байт будет занимать в памяти 8 байт - чтобы сразу эти 8 байт (64 бит) загрузить в регистр процессора и больше не возиться с ними. А ещё полезнее, когда процессор записывает обратно данные в правильно выровненную структуру. Тогда ему не надо перед записью в память загружать имеющиеся в ней данные объединять со своими данными. Но это все относится к компилятору C/C++. А ассемблере такое выравнивание надо делать самому, руками.
У меня проект билдится с предупреждениями: LINK2 : warning LNK4108: /ALIGN specified without /DRIVER or /VXD; image may not run LINK2 : warning LNK4078: multiple ".text" sections found with different attributes (40000040) Но при запуске EXE вылетает окно с ошибкой: "Ошибка при запуске приложения (0xc0000018). Пробовал на 3х разных компах под Win7. Везде одинаково. Подскажите пожалуйста, что не так?
Пробуйте в Project options проекта изменять значение ALIGN:16 в сторону увеличения на кратное 16 или попробуйте другим линкером (возможно 3 варианта: LINK.EXE, LINK1.EXE, LINK2.EXE). Если проект делали на основе SmallestPtog.tpl, то в текстовом файле проекта будут кой-какие подсказки. Два предупреждения (warning) при сборке проекта с такими настройками будут вываливаться всегда. Не обращайте внимания на предупреждения, только на ошибки. В общем - поиграйте с настройками. В Windows 7 не тестировал. У меня стоит Windows 10 LTSC x64. и Windows 11 21H2 x64
Можно не вызывать ExitProcess а просто вернуться (с помощью ret в асме), это ещё изрядно подрежет размер. Хотя в старых виндах (XP точно) такой трюк иногда оставлял программу в памяти: Kernel32!BaseThreadInitThunk после возврата функции потока вызывает ExitThread - а винда в дополнение к основному потоку создаёт ещё штук пять для своих нужд, они и заставляли процесс не завершаться. 😉
18:18 А релоки-то зачем? /FIXED и забыть про них.
Pelles C обскакал MASM потому что последний использует invoke и стандартный трамплин, например из User32.Lib:
call _MessageBoxA@16
…
_MessageBoxA@16:
jmp [__imp__MessageBoxA@16]; имп находится в Import Address Table
а Pelles C делает call [__imp__MessageBoxA@16] напрямую.
В принципе можно отгрызть ещё нимношка если грохнуть Import Lookup Table в импорте и перетащить IAT к Import Directory Table (она начинается с нужного IAT нуля, так как ILT уже нет), но это ручками.
Помнится один товарищ изгалялся ради компактного PE, код и данные совал в его заголовки. Было весело.
ExitProcess - да, так и есть. В ролике на тему диалогового окна об этом будет.
Разъёб, обожаю такие видосы и статьи, которые по сути не предоставляют какого-то фундаментального знания, но дают знание о том, что это знание существует)
Спасибо за понимание всей глубины наших глубин!
Когда автор упомянул, что линковщик ассемблера - чисто консольная утилита, у меня настроение махом подскочило, хотя я сижу на python.😅😅
Линкеры везде консольные... Не врубился в шутку юмора. Винда тоже с консолью старается дружить. Один PowerShell чего стоит.
Это всё конечно не полноценный терминал, но хоть что-то.
Благодарю за интерес к каналу!
Но что касается терминала, я сижу в командных терминалах ОС, то есть готовыми сборками, где консоль есть, не пользуюсь.
WSL опять-таки, если уж на то пошло...
🔥просто шик
Благодарю!
👍👍👍
Спасибо!
Линковщики были переименованы. В видео LINK.EXE весит 852 кб, LINK1.EXE 462 кб (10:30), а в сборке с сайта наоборот. А в папке Linkers снова как в видео. Где верно?
В сборке, которую Вы скачали: FASM64\masm32\BIN\LINKERS
ead.me - там всё подробно написано и правильно. Там же лекция- справочник.
А у меня при запуске мелкой программы происходит ошибка при запуске приложения(0xc0000018), из-за чего может такое возникнуть? Пишу на Винде 7
Если вы про SmallestProg.tpl, то поиграйтесь с настройками Linker: ALIGN:16. Увеличивайте значение, но чтобы было кратно 4-м. Размер будет немного больше, но надёжность вырастет.
4096 - это не для процессора, это размер кластера на диске 4 килобайта (минимальная область на диске для хранения информации). Это чтобы файл быстрее грузился
Благодарю.
@firststepsforward , а выравнивание по процессору - это по разрядности его регистров (8,16,32,64) - это то, как поля структур данных размещаются в памяти. Это тоже необходимо для ускорения обработки данных, чтобы процессор загрузил только то, что ему надо и не вычленял свои данные из набора. Например, если у тебя выравнивание по разрядности 64, то даже поле в структуре данных, объявленное, как байт будет занимать в памяти 8 байт - чтобы сразу эти 8 байт (64 бит) загрузить в регистр процессора и больше не возиться с ними. А ещё полезнее, когда процессор записывает обратно данные в правильно выровненную структуру. Тогда ему не надо перед записью в память загружать имеющиеся в ней данные объединять со своими данными. Но это все относится к компилятору C/C++. А ассемблере такое выравнивание надо делать самому, руками.
Жжёшь!
Благодарю!
У меня проект билдится с предупреждениями:
LINK2 : warning LNK4108: /ALIGN specified without /DRIVER or /VXD; image may not run
LINK2 : warning LNK4078: multiple ".text" sections found with different attributes (40000040)
Но при запуске EXE вылетает окно с ошибкой:
"Ошибка при запуске приложения (0xc0000018).
Пробовал на 3х разных компах под Win7. Везде одинаково.
Подскажите пожалуйста, что не так?
Пробуйте в Project options проекта изменять значение ALIGN:16 в сторону увеличения на кратное 16 или попробуйте другим линкером (возможно 3 варианта: LINK.EXE, LINK1.EXE, LINK2.EXE).
Если проект делали на основе SmallestPtog.tpl, то в текстовом файле проекта будут кой-какие подсказки.
Два предупреждения (warning) при сборке проекта с такими настройками будут вываливаться всегда.
Не обращайте внимания на предупреждения, только на ошибки.
В общем - поиграйте с настройками.
В Windows 7 не тестировал. У меня стоит Windows 10 LTSC x64. и Windows 11 21H2 x64
@@firststepsforward Спасибо большое!
Смена линкера не помогла, но с ALIGN:48 сработало. Размер файла конечно больше получился: 1024.
Ок!
6:25 Автор настолько увлёкся урезанием и сокращением, что обрезал последнее поле с "Make", где "Готово" нажимается :D
:).
Судя по всему команда jmp аналогична goto из других языков и ассемблеров
Да. Точнее будет: goto аналогична jmp. При организации семантики Си именно как обеспечение возможности сохранить функции jmp, добавили goto .
Шрифты меньше надо делать...
Ок!
@@firststepsforward нет, стой!)
скинули лишнее, никакого "ажирения" :)
"Я просто беру камень и отсекаю всё лишнее..." ;)