Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 3
1
TASM

Сколько байт и почему занимает сегмент данных программы?

10.09.2020, 15:01. Показов 2960. Ответов 3
Метки нет (Все метки)

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
; символ пробела заменен за # для наглядности,
; чтобы продемонстрировать, что алгоритм работает 
; и с пустой строкой!)))
 
LOCALS @@
.model small
.stack  100h
.data
Before db "Before:", 0
After  db "After:", 0
Newline db 10, 0
string db "##################This is a string, just a string",0
emptyString db "###########",0
number db 3 dup(?), "$"
numberLength = $-number-1
 
; замечательный макрос  
PrintString macro str
    local strlabel
    .data
        strlabel db str, 0
    .code
        mov si, offset strlabel
        call PrintZString
endm
 
.code
main proc
    mov ax, @data
    mov ds, ax
 
    ; mov di, offset string
    ; call Strlen
    ; ; ax contains string length
 
    ; mov di, offset number
    ; mov si, numberLength
    ; mov dx, ax
    ; call IntToASCIIString
 
    ; mov dx, offset number
    ; call PrintString
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PrintString - печать строки
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    PrintString "Before: "
    mov si, offset string
    call PrintZString            ; печатаем исходную строку
 
    push offset string  
    call DeleteSpaces           ; удаляем из строки пробелы
    sub sp, 2   ; удаляем параметры из стека
 
    PrintString 10  ; newline 
 
    PrintString "After: "
    mov si, offset string
    call PrintZString            ; печатаем обработанную строку
 
 
    PrintString 10
 
 
    PrintString "Before: "
    mov si, offset emptyString
    call PrintZString            ; печатаем исходную строку
 
    push offset emptyString
    call DeleteSpaces           ; удаляем из строки пробелы
    sub sp, 2   ; удаляем параметры из стека
 
    PrintString 10
 
    PrintString "After: "
    mov si, offset emptyString
    call PrintZString            ; печатаем обработанную строку
 
    mov ax, 4c00h               
    int 21h                     ; выходим из программулины
main endp
 
 
; принимает параметр через стек!!!
DeleteSpaces proc
 
push bp
mov bp, sp
 
; параметр, переданный через стек!!!
mov di, word ptr [bp+4]
 
; можно определить вложеную функцию в самом начале, это
; будет окей, но тогда при вызове процедуры DeleteSpaces
; начнет выполняться код вложеной ниже процедур
; так как сами по себе процедуры никак не обособлены как
; сущности для процессора, для процессора это просто перехо
; ды ip с одного места на другое и не более. 
jmp @@Skip  ; теперь при вызове DeleteSpaces код PrintZString не будет выполнен,
    ; si -- char buffer
    PrintZString proc
        @@lp:
            lodsb
            ;   al = [di]; di++;
 
            cmp al, 0
            je @@Exit
 
            ; putting char to stdout: PutChStdout(char dl), then calling PutChStdout = mov ah, 02h; int 21h
            mov dl, al
            mov ah, 02h 
            int 21h
        jmp @@lp
 
        @@Exit:
        ret
    endp
@@Skip:
 
; алгоритм !!!!!!!!!!!!!!!!
;     freeposition = array;
 
;    while(true) {
;         if (*array == 0) return;
;         if (array == " ") {
;             array++;
;         } else {
;             break;
;         }
;     }
 
;     while(array != 0) {
;         *freeposition = *array
;         array++;
;         freeposition++;
;     }
 
;     *freeposition = 0;
 
    ; si = указатель на текущую позицию чтения
    ; di = указатель на текущую позицию для записи (свободная позиция)
    ; сначала мы находим первый непробельный символ, а если таких не найдется,
    ; то просто выходим из процедуры
    ; затем мы на свободные позиции записываем оставшуюся часть строки
    ; фактически мы просто делаем сдвиг строки влево на количество пробельных
    ; символов
 
    ; действительно, lodsb и stosb замечательные команды, которые подходят для
    ; этой процедуры наилучшим образом, не понимаю, почему мне сразу не пришло 
    ; в голову их использовать!
 
    push ds
    pop es ; es = ds
    mov si, di  ; di is a free position
                ; si is a current position
 
    @@SearchingFirstSymbol:
    lodsb   ; al = [si]; si++
    cmp al, 0
    je @@Exit
    cmp al, "#" ; <<----------- этот символ будет удаляться из строки
    je @@SearchingFirstSymbol
 
    @@While:
    cmp al, 0
    je @@Exit
        stosb   ; [di] = al; di++
        lodsb   ; al = [si]; si++
    jmp @@While
 
    @@Exit:
    stosb   ; al=0; [di] = al; di++
    pop bp
    ret 
 
    ; тоже вложенная процедура, но по своей сути
    ; никакой вложенности тут нет, в дебаггере 
    ; код просто идёт за последней инструкцией ret
    ; можно было бы её не вкладывать, а просто написать
    ; сразу за процедурой DeleteSpaces, и сгенерированный
    ; код никак бы не поменялся
    PrintString proc
        mov ah, 9   ;номер системного вызова для печати строки в стандартный поток вывода
        int 21h     ;делаем системный вызов
        ret
    endp
endp
 
end main
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2020, 15:01
Ответы с готовыми решениями:

Сколько байт занимает символ и почему?
Добрый день, уважаемые форумчане. Всем известно что sizeof(char) == 1 .Заметил, что...

Сколько байт занимает один символ BigInteger?
Думаю, для записи одной цифры достаточно 4 бита. Но так ли это в BigInteger? Сколько байт/бит...

Как определить, сколько байт занимает массив?
Как определить сколько байт занимает массив? Приведите фрагмент кода, с помощью которого можно это...

Почему переменная занимает именно столько байт?
Вычислите значение переменной size после выполнения кода программы на языке Turbo-C (модель памяти...

3
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
10.09.2020, 15:36 2
Лучший ответ Сообщение было отмечено Влада3456 как решение

Решение

Before db "Before:", 0 - 8 байт
After db "After:", 0 - 7 байт
Newline db 10, 0 - 2 байта
string db "##################This is a string, just a string",0 - 50 байт
emptyString db "###########",0 - 12 байт
number db 3 dup(?), "$" - 4 байта (3+1)
numberLength = $-number-1 - константа компилятора, не занимает памяти

Итого 83 байта. В реальности сегмент данных займёт 96 байт, т.к. память в DOS выравнивается по 16-байтным параграфам.
1
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 3
10.09.2020, 16:24  [ТС] 3
спасибо

Добавлено через 36 минут
а макрос тоже же считается ?сколько он занимает ?
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
10.09.2020, 17:09 4
Влада3456, макрос я не считал. Он каждый раз при вызове разворачивается, и к сегменту данных добавляются его строки-параметры. Например, при вызове PrintString "After: " добавится 8 байт (7 - длина строки, плюс нуль-терминатор). И так каждый раз по всей проге надо посчитать: 9+2+8+2+9+2+8=40. Добавляя к имеющимся 83, получим 123 (или 128 в выровненной памяти).
0
10.09.2020, 17:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2020, 17:09
Помогаю со студенческими работами здесь

Демонстрация того, сколько байт занимает каждый тип переменной
В блогах видел большую тему про переменные. Там была таблица про то, сколько байт занимает каждый...

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

Предположим, что переменная типа CHAR занимает 1 байт, переменная типа INTEGER занимает два байта
Предположим, что переменная типа CHAR занимает 1 байт, переменная типа INTEGER занимает два байта,...

Как узнать, сколько памяти занимает тот или иной элемент программы?
Товарищи, подскажите, пожалуйста, ответы на следующие вопросы: 1) Есть какие-либо средства...

Оцените, сколько места на компакт-диске занимает видеоинформация и сколько звуковая дорожка
На компакт-диске записана видеозапись допроса обвиняемого в формате MPEG4 - сжатый формат. Размер...

Сегмент видеопамяти размером в один экран: сколько это в единицах памяти
Сегмент видеопамяти размером в один экран это сколько в единицах памяти?


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

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