Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2 / 2 / 0
Регистрация: 01.10.2018
Сообщений: 210
1

Как определить размер программы выполнения

29.05.2021, 10:49. Показов 2097. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть код
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
assume CS:code, DS:code ;указываем соответствие сегментных регистров
 
code segment ;начало сегмента кода
 
org 256h ;адрес начала программы
 
main proc ;начало главной процедуры
 
Очищаем экран:
 
mov ax, 0600h
 
mov bh, 07 ; bh=07h - атрибут текста
 
mov cx, 0000 ;ch=0 - номер верхней строки, cl=0 - номер левого столбца для очистки
 
mov dx, 184fh ;dh=18h - номер нижней строки, cl=4fh - номер правого столбца для очистки
 
int 10h ;вызов системного прерывания видеосервиса
 
; вывод на экран строки
 
mov ah, 13h ; функция вывода строки
 
mov al, 01h ;присвоить всем символам атрибут в BL, переместить курсор дальше
 
mov bh, 00h ; номер страницы
 
mov bl, 07h ; задание черно-белого цвета
 
mov cx, msg_subject_len ; длина строки
 
mov dh, 00ah ; номер строки на экране
 
mov dl, 019h ; номер столбца на экране
 
mov bp, offset msg_subject ; адрес начала строки, т.е. расстояние в байтах до первого байта этой строки от начала сегмента, в котором она находится
 
int 10h ; вызов системного прерывания
 
; вывод на экран строки
 
mov ah, 13h ; функция вывода строки
 
mov al, 01h ;присвоить всем символам атрибут в BL,
 
переместить курсор дальше
 
mov bh, 00h ; номер страницы
 
mov bl, 07h ; задание черно-белого цвета
 
mov cx, msg_student_len ; длина строки
 
mov dh, 00bh ; номер строки на экране
 
mov dl, 019h ; номер столбца на экране
 
mov bp, offset msg_student; адрес начала строки, т.е. расстояние в байтах до первого байта этой строки от начала сегмента, в котором она находится
 
int 10h ; вызов системного прерывания
 
; вывод на экран строки
 
mov ah, 13h ; функция вывода строки
 
mov al, 01h ;присвоить всем символам атрибут в BL, переместить курсор дальше
 
mov bh, 00h ; номер страницы
 
mov bl, 07h ; задание черно-белого цвета
 
mov cx, msg_name_len ; длина строки
 
mov dh, 00ch ; номер строки на экране
 
mov dl, 019h ; номер столбца на экране
 
mov bp, offset msg_name ; адрес начала строки, т.е. расстояние в байтах до первого байта этой строки от начала сегмента, в котором она находится
 
int 10h ; вызов системного прерывания
 
; вывод на экран строки
 
mov ah, 13h ; ah=13h - вывод строки
 
mov al, 01h ;присвоить всем символам атрибут в BL, переместить курсор дальше
 
mov bh, 00h ; номер страницы
 
mov bl, 07h ; задание черно-белого цвета
 
mov cx, msg_variant_len ; длина строки
 
mov dh, 00dh ; номер строки на экране
 
mov dl, 019h ; номер столбца на экране
 
mov bp,offset msg_variant ; адрес начала строки, т.е. расстояние в байтах до первого байта этой строки от начала сегмента, в котором она находится
 
int 10h ; вызов системного прерывания
 
Ожидание нажатия любой клавиши:
 
mov ax, 0 ; ждем нажатия любой кнопки
 
int 16h ; вызов системного прерывания
 
Очищаем экран:
 
mov ax, 0600h
 
mov bh, 07 ; bh=07h - атрибут текста
 
mov cx, 0000 ;ch=0 - номер верхней строки, cl=0 - номер левого столбца для очистки
 
mov dx, 184fh ;dh=18h - номер нижней строки, cl=4fh - номер правого столбца для очистки
 
int 10h ;вызов системного прерывания видеосервиса
 
Цикл вывода на экран текста:
 
mov cx, some_text_len ; сx=длина строки
 
start: ; начало цикла
 
lea si, some_text ; si=адрес начала строки some_text
 
mov ax, 00h ; функция символьного вывода
 
mov al, pos ; al=содержимое ячейки памяти pos
 
add si, ax ; si=si+ax - сдвигаем si на pos единиц
 
Устанавливаем курсор в позицию 0 строка, pos столбец:
 
mov ah, 02h ; функция установки курсора
 
mov bh, 00 ; bh=00h - номер страницы
 
mov dh, 00 ; dh=00h - номер строки
 
mov dl, pos ; dl=00h - номер столбца
 
int 10h ; вызов системного прерывания
 
mov al, [si] ; al=содержимое ячейки памяти по адресу хранящемуся в si
 
cmp al, '0' ; сравнение al c кодом символа '0'
 
jl no_blink ; если код меньше-значит мигать не надо
 
cmp al, '9' ; сравнение al с кодом символа '9'
 
jg no_blink ; если код больше - мигать не надо
 
mov bl, 87h ; иначе надо мигать. bl=87h - код предписывающий символу мигать белым цветом
 
jmp show ;переход по метке show
 
Режим без мигания:
 
no_blink:
 
mov bl, 07h ;bl=07b - код предписывающий символу не мигать
 
show: ; метка show
 
push cx ; заносим в стек регистр cx
 
mov ah, 09h ; ah=09h - код для записи символа и атрибутов на позиции курсора
 
mov bh, 00h ; bh=00h - номер страницы
 
mov cx, 01h ; cx=00h - количество раз, которые нужно записать символ
 
int 10h ; вызов системного прерывания
 
pop cx ; восстанавливаем ранее сохраненный в стек регистр cx
 
add pos, 1 ; увеличиваем pos для записи в следующий столбец
 
loop start ; повторяем цикл loop пока сx не станет равным нулю
 
mov ax, 4c00h ;ax=4c00h - завершения работы, 4с – номер функции, 00 возвращаемое значение
 
int 21h ; вызов системного прерывания
 
main endp ; конец главной процедуры
 
Данные:
 
msg_subject db 'SYSTEM SOFTWARE'
 
msg_subject_len=$-msg_subject
 
msg_student db 'STUDENT OF GROUP IVT-319'
 
msg_student_len=$-msg_student
 
msg_name db 'Satvalod D. F.'
 
msg_name_len=$-msg_name
 
msg_variant db 'VARIANT-26'
 
msg_variant_len=$-msg_variant
 
some_text db 'This program was created 22 May 2021. Variant-26!'
 
some_text_len=$-some_text ;символ $ указывает на байт последнего символа переменной some_text, тогда $-some_text длина строки
 
pos db 0
 
code ends ; окончание сегмента кода
 
end main ; окончание программы
как я могу узнать ее размер во время выполнения и вывести на экран? И еще вопрос про функцию 4ah, которая выделяет и сжимает блоки памяти, как ее использовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2021, 10:49
Ответы с готовыми решениями:

Как определить время выполнения программы?
как определить время выполнения программы

Подскажите как определить результат выполнения этой программы
Begin n:=30; a:=1; b;=1; for j:= 3 to n do begin b:=a+b; a:=b; ...

Изменять размер многомерного массива, в ходе выполнения программы
Объясните мне пожалуйста, как это можно делать, так как предыдущая тема с "багом" результата не...

Как определить сколько памяти занимает объект в момент выполнения программы?
sizeof здесь ребята не подойдёт т.к. он работает только в момент компиляции(и тоже не понятно как...

4
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
29.05.2021, 12:57 2
Т.к. это программа типа DOS com, т.е. по сути бинарный образ программы, то именно код в памяти занимает место от первой до последней метки.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
code segment
org 100h
 
main proc
..............
 
mov ax, codelength
call ShowUInt16
 
 
main endp
 
ShowUInt16 proc
............
ShowUInt16 endp
 
LastLabel label word
 
codelength equ LastLabel-main
 
code ends
end main
Вывести число на экран процедурой из закреплённой темы
Ввод и вывод чисел в различных системах счисления
0
2 / 2 / 0
Регистрация: 01.10.2018
Сообщений: 210
29.05.2021, 13:29  [ТС] 3
ФедосеевПавел, я где то читал что программе com в dos выдается 640кб или это не так?
0
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
29.05.2021, 13:42 4
Я не знаю, что вы читали, что хотите вывести на экран.

Если размер кода - то я показал принцип, хотя в мелочах мог и ошибиться.

То число (640КиБайт), это максимально теоретически возможное выделение памяти для одной запускаемой программы.
Т.к. DOS - грубо говоря, однозадачная ОС, без возможности какого либо контроля за поведением программы, то наглая программа может творить со всей доступной памятью что угодно, а доступна ей абсолютно вся память на материнской плате.
DOS ведёт учёт блоков памяти в пределах первого мегабайта. Есть даже где-то структура - "список списков". Разобравшись со "списком списков" узнаете, сколько может программа использовать памяти, не разрушая участки памяти, используемые разными драйверами и резидентами. Но это уже не ко мне - никогда не интересовался и не видел применения знанию о доступе к системным структурам.
0
Модератор
2121 / 991 / 169
Регистрация: 23.07.2018
Сообщений: 3,328
Записей в блоге: 3
01.06.2021, 13:40 5
Цитата Сообщение от CyberDude Посмотреть сообщение
де то читал что программе com в dos выдается 640кб
Цитата Сообщение от DOS Technical Reference
When the user starts the program at the command line, COMMAND.COM loads the executable program module into the largest unused block of available memory and reads the file header.

If there is not enough memory available, the system returns an error code and passes control to the program. Your program should use the SETBLOCK function call (4AH) to reduce allocated memory to the size it needs. Note: Because it is likely that the default stack supplied by DOS 4.00 lies in the area of memory being freed, a .COM program should remember to set up its own stack before issuing a SETBLOCK. The SETBLOCK call frees unneeded memory which then can be used for loading subsequent programs.
Проверьте, если Вам интересно или нужно. Попробуйте из своей .COM-программы запустить другую досовским EXECом, не изменяя размеры блока памяти.
( EXEC 4Bh )
http://www.ctyme.com/intr/rb-2939.htm
http://www.ctyme.com/intr/rb-2936.htm
Потом измените размер блока с помощью функции 4Ah.
Начальный сегмент блока ( в регистре ES ) можно оставать тем же, что и на старте программы.

Добавлено через 30 минут
Размер блока (в 16-байтных параграфах), похоже, в предыдущем параграфе.
0191:0000 5A 92 01 6D 9E 00 00 00 4D 00 00 00 00 00 00 00
0191:0010 CD 20 FF 9F 00 EA FF FF AD DE C8 20 00 F0 00 00
0191:0020 18 01 10 01 18 01 18 01 01 01 01 00 02 FF FF FF
0191:0030 FF FF FF FF FF FF FF FF FF FF FF FF 88 01 00 00
0191:0040 00 00 14 00 18 00 92 01 FF FF FF FF 00 00 00 00
0191:0050 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0191:0060 CD 21 CB 00 00 00 00 00 00 00 00 00 00 20 20 20
0191:0070 20 20 20 20 20 20 20 20 00 00 00 00 00 20 20 20
0191:0080 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00
0191:0090 00 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0191:00A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0191:00B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0191:00C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0191:00D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0191:00E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0191:00F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0191:0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0191:0110 EB FE
В нашем случае, 9E6D016 = 64891210 в байтах
0
01.06.2021, 13:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2021, 13:40
Помогаю со студенческими работами здесь

Определить время выполнения программы
Господа как засеч време выполнение программы? Заранее всем огромное спасибо!!!

Определить результат выполнения программы
var a: integer; b,c: integer; procedure proc(var a: integer; b,c:integer); begin a:=7; b:=8;...

Определить время выполнения программы
uses crt; var a:array of integer; i,k,n:integer; begin writeln('n='); readln(n); for i:=1...

Определить время выполнения программы
Как узнать сколько выполняется программа на С++.Т.е. что бы со всеми результатами,скажем в конце,...

Определить результат выполнения программы
определить результат выполнения программы: var s: string; i,j : integer; begin s:= '...

Определить время выполнения программы
Вот задание Вот написал код using System; using System.Threading; namespace...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru