![]() |
eXeL@B —› Вопросы новичков —› winAPI в ассемблере и размер программ (по большей части вопрос для Bitfry) |
Посл.ответ | Сообщение |
|
Создано: 12 января 2009 05:19 · Поправил: vajrock · Личное сообщение · #1 Последние несколько дней читаю "Дневники чайника" Спасиб за такие мануалы. лучше них для начинающего ничего пока не нашол. Соб-но вопрос вот в чем... Решил посмотреть сколько будет занимать прога hello world на асме с винАпи функциями. Написал вот что: .386 .model flat, stdcall option casemap :none ; case sensitive include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data MsgBoxCaption db 'Hello, World!',0 MsgBoxText db 'My first program',0 .code start: push 0 push offset MsgBoxCaption push offset MsgBoxText push 0 call MessageBoxA push 0 call ExitProcess end start компилю: 09.01.2009 06:57 477 code.asm 09.01.2009 06:58 2 560 code.exe 09.01.2009 06:58 634 code.obj Открыл в hiew посмотреть что получилось и офигел... столько мусора... откуда столько?? хотя понятно откуда - от компилятора, но ЗАЧЕМ секции кода пустые?? (код 0000) Ладно думаю... фигня, подумаешь в 5 раз увеличился после компиляции, внеслось немного инфы об апи функция.... Открываю олю и отправляю на дебаг эту программульку и тут моя челюсь под стол упала. В диспечере задач: Занятая память: 1 676 Кб Этож в 670 раз больше самого исполняемого файла... что в него винда так напихала, что он раздулся до таких пределов в момент выполнения??? Собственно эт главный вопрос. Ща попробую другой сформулировать: В уроке, где было предложено разобрать прогу которая выводит аргументы командной строки на экран первой вызывается функция GetCommandLineA Она кладет в EAX адрес по которому можно забрать всю коммандную строку запуска программы. да вроде все нормально строка лежит в памяти и ее начало на пример в 00141EE0 Но тут появляется вопрос... как например оля определил где конец строки? по нулевому байту в конце строки ответишь ты. ДА я только что допер до этого, но тут же появляется второй вопрос Как например определит процессор что в этой области памяти лежит нужная инфа, которую не на нада модифицировать, точнее нельзя. Хотя я чет сам не понял что написал в прошлом предложении, поэтому попробую перефразировать Есть у нас например в коде программы 2 функции которые получаю поочередно вводимую инфу требуемую для последующей совместной обработки. И вот перваюя получет инфу, кладет в память и отписывает в ЕАХ адрес в памяти с инфой. Я закидываю в стек ЕАХ и ксорю его чтоб обнулить. Вызываю вторую такуюже,например, функцию. Она получает инфу и тут вопрос знатокам... Откуда она узнает что по томуже адресу нельзя положить новую инфу - старая затрется. Как эта область может пометится, чтоб знать, что в эту область не писать? ![]() |
|
Создано: 12 января 2009 15:31 · Поправил: Stack · Личное сообщение · #2 vajrock пишет: Открыл в hiew посмотреть что получилось и офигел... столько мусора... откуда столько?? хотя понятно откуда - от компилятора, но ЗАЧЕМ секции кода пустые?? (код 0000) дык секции вроде выравниваются нулями. vajrock пишет: В диспечере задач: Занятая память: 1 676 Кб фигасе. так этож почти как делфя занимает при таком же примерно коде, а там же систем.пас огого. и строки уникодные. ----- Md5 fcbb6c9c9a5029b24d70f2d67c7cca74 ![]() |
|
Создано: 12 января 2009 16:43 · Личное сообщение · #3 |
|
Создано: 14 января 2009 22:55 · Личное сообщение · #4 |
|
Создано: 18 января 2009 09:53 · Личное сообщение · #5 |
![]() |
eXeL@B —› Вопросы новичков —› winAPI в ассемблере и размер программ (по большей части вопрос для Bitfry) |