Форум программистов, компьютерный форум, киберфорум
Наши страницы
FASM
Войти
Регистрация
Восстановить пароль
 
Shock9777
5 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 36
1

Вычислить размер программы формата .EXE

17.12.2017, 21:02. Просмотров 373. Ответов 3
Метки нет (Все метки)

Делаю это следующим образом:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
format MZ         ;EXEпрограмма
 
entry csg: begin  ;адрес первой команды программы
 
stack 256         ;размер стека – 256 байт
 
;============================================  
segment csg          ;сегмент кода
 
begin:
mov BX,zzz           ;получаем № параграфа конца программы
mov AX,ES            ;получаем № параграфа начала программы
sub BX,AX            ;вычисляем размер программы в параграфах
shl BX,4             ;умножаем на 16 (2 в 4ой степени),
                     ;получаем кол-во выделенных байт
mov [Razmer],BX
Далее соответственно идет код программы.. И размер переводится в 10ю с.с. и выводится:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
;перевод в 10ричную систему счисления
mov AX,[Razmer]
mov BX,10              ;основание сс. 10 для десятеричной
xor CX,CX              ;обнуляем СХ. Здесь будем хранить счётчик цикла
 
perevod:
xor DX,DX              ;обнуляем DX
div BX                 ;делим число на основание сс.
                       ;в остатке получается последняя цифра
 
push DX                ;сразу выводить её нельзя,
                       ;поэтому сохраним её в стэке (push)
 
inc CX                 ;СХ+1 увеличиваем значение счётчика
 
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули
 
or AX,AX               ;cравниваеи AX с нулём
jnz perevod            ;не равен? - цикл
 
vivod:  
pop AX                 ;последовательно достаем цифры из стека
 
or AL,30h              ;перевод числа в значение, соответствующего
                       ;ему символа осуществляется путем прибавления к нему 30h
                       ;т.к. символ отличается от машинного представления ровно на 30h
 
int 29h                ;осуществляем посимвольный вывод
loop vivod
В конце программы прописываю:
Assembler
1
segment zzz          ;фиксированный пустой сегмент
В результате компилирования получаю: 0
В чем может быть проблема?

Добавлено через 54 минуты
Может можно как-то по-другому вычислить размер exe-программы? Подскажите как
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2017, 21:02
Ответы с готовыми решениями:

Уменьшить размер .exe файла
Здравствуйте! Какими способами можно уменьшить .exe файл? В исходнике 470...

Вычислить логическое выражение not(A and B) or not C (A,В,С данные формата байт)
Пожалуйста, помогите не могу понять что надо делать. Задача:Вычислить...

Как узнать размер памяти программы (в параграфах)?
Вообщем, нужно определить при помощи функции 4Ah, размер памяти программы в...

Уменьшить размер программы хотя бы на один байт
Вот прастейшая прога на асме под вынь. размер получаится 211 баит. как...

Минимальный размер EXE файла PE формата.
Мне интересно с помощью какого компилятора ЯВУ можно создать исполняемый файл...

3
ФедосеевПавел
Модератор
3673 / 2041 / 843
Регистрация: 01.02.2015
Сообщений: 6,786
17.12.2017, 22:39 2
Может быть определить метку Finish: в конце программы и
Assembler
1
mov ax, Finish-begin
А в случае другого сегмента может вычисляться смещение внутри этого сегмента, а оно в начале zzz равно 0.
0
R71MT
3729 / 1353 / 295
Регистрация: 29.07.2014
Сообщений: 2,402
Записей в блоге: 5
27.12.2017, 11:12 3
Цитата Сообщение от Shock9777 Посмотреть сообщение
Вычислить размер программы формата .EXE - FASM
Смотря, "какой" размер тебе нужен - на диске, или в памяти.
По сути, оба\они хранятся в заголовке экзе-файла, только размер на диске хранится в явном виде, а занимаемый размер в памяти - нужно вычислять по формуле (в скобках указано смещение от начала заголовка, все поля размером в слово):
PartPag = (2)
PageCnt = (4)
HdrSize = (8)

Определить размер модуля = ((PageCnt*512)-(HdrSize*16)) - PartPag
В итоге получаем такой код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
format  mz        ; DOS-EXE
stack   100h
entry   @code:start
 
segment @data
mess0   db    13,10,'File RAW-size: $'
mess1   db    13,10,'File MEM-size: $'
buff    db    10 dup(0)        ; буфер для заголовка
 
 
segment @code
start:  mov   ax,[ds:2Ch]      ; адрес 'Cегмента окружения DOS'
        mov   es,ax
        mov   ds,ax
 
;====== Получаем своё имя!
; там куча строк, которые заканчиваются нулевым словом,
; после которого идёт наше имя:
        xor   ax,ax
        mov   di,ax            ; ES:DI = область поиска
        mov   cx,-1
@@:     repne scasb            ; ищем нулевое слово
        scasb
        jnz   @b
 
;====== Нашли имя запущенной программы!
; открываем файл на диске, и читаем из него заголовок (1Ch-байт)
        lea   dx,[di+2]
        mov   ax,3D00h
        int   21h
        xchg  ax,bx            ; BX указатель..
 
        mov   ax,@data         ; настроим DS/ES на себя
        mov   ds,ax
        mov   es,ax
 
        mov   ax,3F00h         ; считать из файла
        mov   dx,buff
        mov   cx,10            ; 10-байт заголовка
        int   21h
        mov   ah,3Eh           ; закрыть файл
        int   21h
 
;====== Вывод размеров на экран!
; по смещению(2) в буфере лежит слово с размером файла на диске
        mov   dx,mess0
        call  Message
        mov   ax,word [buff+2]
        push  ax
        call  hex2asc
 
; выводим размер файла в памяти (см.формулу выше)
        mov   dx,mess1
        call  Message
        mov   ax,word [buff+4]
        mov   bx,word [buff+8]
        shl   ax,9             ; PageCnt * 512
        shl   bx,4             ; HdrSize * 16
        sub   ax,bx
        pop   bx               ; PartPag
        sub   ax,bx
        call  hex2asc
 
;=== Выход в DOS по клавише
        xor   ax,ax
        int   16h
        mov   ax,4C00h
        int   21h
;**********************************************************
Message:                      ; Мессаги
        mov   ah,9
        int   21h
        ret
;-------
hex2asc:
        xor   cx,cx           ; Вывод АХ на экран
        mov   bx,10
isDiv:  xor   dx,dx
        div   bx
        push  dx
        inc   cx
        or    ax,ax
        jnz   isDiv
isOut:  pop   ax
        cmp   al,9
        jle   noHex
        add   al,7
noHex:  add   al,30h
        int   29h
        loop  isOut
        ret
А твоим способом обычно вычисляют участок кода (например для шифрования), хотя им можно вычислить и размер, ..только COM-файла.
2
Ethereal
Нарушитель
4163 / 1774 / 228
Регистрация: 17.02.2013
Сообщений: 2,659
31.12.2017, 05:27 4
Цитата Сообщение от R71MT Посмотреть сообщение
По сути, оба\они хранятся в заголовке экзе-файла, только размер на диске хранится в явном виде
Размер на диске может быть больше, чем указано в заголовке EXE-файла. Когда-то так делали самодельные оверлеи, которые подчитывали из EXE в память по мере необходимости. Т.е. истинный размер EXE-файла на диске можно получить только обращением к самому файлу. Хотя, в общем-то, ТС-у можно и не лезть в такие тонкости.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2017, 05:27

Какой приблизительно размер добавляемого компонента и влияет ли он на размер самой программы
Здравствуйте, меня интересует вопрос, когда создаешь какой нить компонент,...

Не запускаются почти все приложения формата exe*
Здравствуйте,у меня такая проблема(ознакомился с форумом,очень много...

Иконка для flash-ролика формата .exe
Добрый вечер!) Такой вопрос. Создаю какой-нибудь флеш-ролик. Например,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru