Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1

Определение объема оперативной памяти

31.03.2011, 18:27. Показов 1896. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал не хитрый код для определения объема оперативной памяти (В реальном режиме)..
Но результат не совсем верный.
По идеи 32х битной адресации должно хватить чтобы увидеть 4Гб памяти, но у меня больше 3325 не хочет..
Алгоритм простой и всем известный.. Пишем и читаем память пока не промахнемся..
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
masm
model tiny
.586p
 
include a:\tsh\include\output.inc
 
.code
org 100h
start:
    mov ax,3
    int 10h
    
    
    call Initialization
    
    mov ecx, 1048576
    mov eax, 1
    mov bl, 0AAh
 
    mov edi, 10
    
RUN_MEMSIZE:
    mov dl, byte ptr gs:[ecx]
    mov byte ptr gs:[ecx], bl
    mov bl, byte ptr gs:[ecx]
    mov byte ptr gs:[ecx], dl
    
    cmp bl, 0AAh
    jnz ERR_MEMSIZE
    add ecx, 1048576
    inc eax
    jmp RUN_MEMSIZE
 
ERR_MEMSIZE:
    
    dec edi
    jz END_MEMSIZE
    add ecx, 1048576
    jmp RUN_MEMSIZE
END_MEMSIZE:
 
    lea edi, buff
    call uBinToDecASCII
    OutputStr buff, 0, 0, 2
    
 
    ret
 
include a:\tsh\include\convrt.inc
include a:\tsh\include\list2_01.inc
.data
  buff db 256 dup(0)    
end start
output.inc
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
OutputStr   macro str,row,col,attr
        local NextChar,EOL
        pusha
        push es
        mov al,row
        mov bl,80
        mul bl
        add ax,col
        shl ax,1
        mov di,ax
        push 0B800h
        pop es
        mov si,offset str
        mov ah,attr
NextChar: 
        lodsb
        or al,al
        jz EOL
        stosw
        jmp NextChar
EOL:        pop es
        popa
endm
 
ClearBuf    macro buf, length,cod
        push ax
        push cx
        push di
        lea di,buf
        mov cx,length
        mov al,cod
        rep stosb
        pop di
        pop cx
        pop ax
endm
convrt.inc
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
218
219
220
221
222
223
224
225
226
227
228
229
230
CODESEG
uBinToDecASCII  proc
; In: EAX - Number, EDI - addr buffer
 
    push ebp
    mov ebp, esp
    
    push esi
    push edi
    push ebx
    
    mov esi,edi
    mov ebx,10
LabelProcBTDACII1:  
    xor edx,edx
    div ebx
    or dl,30h
    mov byte ptr [esi],dl
    inc esi
    or eax,eax  
    jnz LabelProcBTDACII1
    mov byte ptr [esi],0
LabelProcBTDACII2:
    dec esi
    mov al,byte ptr [esi]
    xchg byte ptr [edi],al
    mov byte ptr [esi],al
    inc edi
    cmp edi,esi
    jb LabelProcBTDACII2
 
    pop ebx
    pop edi
    pop esi
    pop ebp 
    
    ret
uBinToDecASCII endp
 
sBinToDecASCII  proc
; In: EAX - Number, EDI - addr buffer
 
    push ebp
    mov ebp, esp
    
    push esi
    push edi
    push ebx
    
    test    eax,80000000h
    jz unsigned
    mov byte ptr [edi],'-'
    neg eax
    inc edi 
unsigned:    
    mov esi,edi
    mov ebx,10
LabelProcSBTDACII1: 
    xor edx,edx
    div ebx
    or dl,30h
    mov byte ptr [esi],dl
    inc esi
    or eax,eax  
    jnz LabelProcSBTDACII1
    mov byte ptr [esi],0
LabelProcSBTDACII2: dec esi
    mov al,byte ptr [esi]
    xchg byte ptr [edi],al
    mov byte ptr [esi],al
    inc edi
    cmp edi,esi
    jb LabelProcSBTDACII2
    
    pop ebx
    pop edi
    pop esi
    pop ebp 
    
    ret
sBinToDecASCII endp
 
BinToBinASCII   proc
; In: ebx - Number, EDI - buffer
    push ebp
    mov ebp, esp
    
    push edi
    push ebx
    
    bsr ecx,ebx
    jnz LabelProcBTBA1
    mov ax,'0'
    stosw
    ret
LabelProcBTBA1: 
    inc ecx
    ror ebx,cl  
LabelProcBTBA2: rol ebx,1
    setc al
    or al,30h
    stosb
    loop LabelProcBTBA2
    mov ax,'b'
    stosw
    
    pop ebx
    pop edi
    pop ebp 
    
    ret
BinToBinASCII endp
 
BinToHexASCII   proc
; In: ebx - Number, EDI - buffer
    push ebp
    mov ebp, esp
    
    push edi
    push ebx
 
    mov ecx,8
next:rol ebx,4
    mov al,bl
    and al,0Fh
    cmp al,10
    jb LabelProcBTHA1
    add al,'A'-10-'0'
LabelProcBTHA1: 
    add al,'0'
    stosb
    loop next
    mov ax,'h'
    stosw
 
    pop ebx
    pop edi
    pop ebp
    
    ret
BinToHexASCII endp
 
uDecASCIIToBin  proc
; In: ESI - addr ASCIIZ
; Out: EAX - Number
    push ebp
    mov ebp, esp
    
    push esi
    push ebx
    
    xor ebx,ebx
LabelProcDATB1: 
    lodsb
    or al,al
    jz LabelProcDATB2
    and eax,0Fh
    lea ebx, [ebx+ebx*4]
    lea ebx, [eax+ebx*2]
    jmp LabelProcDATB1
LabelProcDATB2: mov eax,ebx
 
    pop ebx
    pop esi
    pop ebp
    
    ret
uDecASCIIToBin endp
 
HexASCIIToBin   proc
; In: ESI - addr ASCIIZ
; Out: EAX - Number
    push ebp
    mov ebp, esp
    
    push esi
    push ebx
        
    xor ebx,ebx
hex:    lodsb
    or al,al
    jz done
    shl ebx,4
    sub al,30h
    cmp al,9
    jbe LabelProcHATB1
    sub al,7h
    cmp al,15
    jbe LabelProcHATB1
    sub al,20h
LabelProcHATB1:
    or bl,al
    jmp hex 
done:mov eax,ebx
 
    pop ebx
    pop esi
    pop ebp
    
    ret
HexASCIIToBin endp
 
BinASCIIToBin   proc
; In: ESI - addr ASCIIZ
; Out: EAX - Number
    push ebp
    mov ebp, esp
    
    push esi
    push ebx
    
    xor ebx,ebx
LabelProcBATB1:
    lodsb
    or al,al
    jz LabelProcBATB2
    rcr al,1
    rcl ebx,1
    jmp LabelProcBATB1
LabelProcBATB2:
    mov eax,ebx
    
    pop ebx
    pop esi
    pop ebp
    
    ret
BinASCIIToBin endp
 
ends
list2_01.inc
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
              
;         Подпрограмма, устанавливающая режим
;              линейной адресации данных
;
 
; Порт, управляющий запретом немаскируемых прерываний
CMOS_ADDR      equ  0070h
CMOS_DATA      equ  0071h
; Селекторы сегментов
SYS_PROT_CS    equ  0008h
SYS_REAL_SEG   equ  0010h
SYS_MONDO_SEG  equ  0018h
 
CODESEG
;**********************************************
;* ВКЛЮЧЕНИЕ РЕЖИМА ЛИНЕЙНОЙ АДРЕСАЦИИ ПАМЯТИ *
;*       (процедура параметров не имеет)      *
;**********************************************
Initialization PROC
        pushad
; Сохранить значения сегментных регистров в
; реальном режиме (кроме GS)
        mov     [CS:Save_SP],SP
        mov     AX,SS
        mov     [CS:Save_SS],AX
        mov     AX,DS
        mov     [CS:Save_DS],AX
; (работаем теперь только с кодовым сегментом)
        mov     AX,CS
        mov     [word ptr CS:Self_Mod_CS],AX
        mov     DS,AX
        cli
        mov     SS,AX
        mov     SP,offset Local_Stk_Top
        sti
 
; Установить режим линейной адресации
        call    SetLAddrModeForGS
 
; Восстановить значения сегментных регистров
        cli
        mov     SP,[CS:Save_SP]
        mov     AX,[CS:Save_SS]
        mov     SS,AX
        mov     AX,[CS:Save_DS]
        mov     DS,AX
        sti
; Разрешить работу линии A20
        call    Enable_A20
        popad
        ret
Initialization ENDP
 
; Область сохранения значений сегментных регистров
Save_SP DW ?
Save_SS DW ?
Save_DS DW ?
; Указатель на GDT
GDTPtr  DQ ?
; Таблица дескрипторов сегментов для
; входа в защищенный режим
GDT DW 00000h,00000h,00000h,00000h ;не используется
    DW 0FFFFh,00000h,09A00h,00000h ;сегмент кода CS
    DW 0FFFFh,00000h,09200h,00000h ;сегмент данных DS
    DW 0FFFFh,00000h,09200h,0008Fh ;сегмент GS
; Локальный стек для защищенного режима
; (организован внутри кодового сегмента)
label GDTEnd word
        DB 255 DUP(0FFh)
Local_Stk_Top DB (0FFh)
 
;*********************************************
;*        ОТМЕНИТЬ ПРЕДЕЛ СЕГМЕНТА GS        *
;* Процедура изменяет содержимое теневого    *
;* регистра GS таким образом, что становится *
;* возможной линейная адресация через него   *
;* 4 Gb памяти в реальном режиме             *
;*********************************************
SetLAddrModeForGS PROC 
; Вычислить линейный адрес кодового сегмента
        mov     AX,CS
        movzx   EAX,AX
        shl     EAX,4   ;умножить номер параграфа на 16
        mov     EBX,EAX ;сохранить линейный адрес в EBX
; Занести младшее слово линейного адреса в дескрипторы
; сегментов кода и данных
        mov     [word ptr CS:GDT+10],AX
        mov     [word ptr CS:GDT+18],AX
        ; Переставить местами старшее и младшее слова
        ror     EAX,16
; Занести биты 16-23 линейного адреса в дескрипторы
; сегментов кода и данных
        mov     [byte ptr CS:GDT+12],AL
        mov     [byte ptr CS:GDT+20],AL
; Установить предел (Limit) и базу (Base) для GDTR
        add     EBX, offset GDT
        mov [word ptr CS:GDTPtr],(offset GDTEnd-GDT-1)
        mov     [dword ptr CS:GDTPtr+2],EBX
; Сохранить регистр флагов
        pushf
; Запретить прерывания, так как таблица прерываний IDT
; не сформирована для защищенного режима
        cli
; Запретить немаскируемые прерывания NMI
        in      AL,CMOS_ADDR
        mov     AH,AL
        or      AL,080h      ;установить старший разряд
        out     CMOS_ADDR,AL ;не затрагивая остальные
        and     AH,080h
        ; Запомнить старое состояние маски NMI
        mov     CH,AH
; Перейти в защищенный режим
        lgdt    [fword ptr CS:GDTPtr]
        mov     BX,CS    ;запомнить сегмент кода
        mov     EAX,CR0
        or      AL,01b   ;установить бит PE
        mov     CR0,EAX  ;защита разрешена
        ; Безусловный дальний переход на метку SetPMode
        ; (очистить очередь команд и перезагрузить CS)
                DB      0EAh
                DW      (offset SetPMode)
                DW      SYS_PROT_CS
SetPMode:
        ; Подготовить границы сегментов
        mov     AX,SYS_REAL_SEG
        mov     SS,AX
        mov     DS,AX
        mov     ES,AX
        mov     FS,AX
        ; Снять ограничения с сегмента GS
        mov     AX,SYS_MONDO_SEG
        mov     GS,AX
; Вернуться в реальный режим
        mov     EAX,CR0
        and     AL,11111110b ;сбросить бит PE
        mov     CR0,EAX      ;защита отключена
 
        ; Безусловный дальний переход на метку SetRMode
        ; (очистить очередь команд и перезагрузить CS)
            DB 0EAh
            DW (offset SetRMode)
Self_Mod_CS DW ?
 
SetRMode:
        ; Регистры стека и данных
        ; настроить на сегмент кода
        mov     SS,BX
        mov     DS,BX
        ; Обнулить дополнительные сегментные
        ; регистры данных (GS не трогать!)
        xor     AX,AX
        mov     ES,AX
        mov     FS,AX
        ; Возврат в реальный режим,
        ; прерывания снова разрешены
        in      AL,CMOS_ADDR
        and     AL,07Fh
        or      AL,CH
        out     CMOS_ADDR,AL
        popf
        ret
SetLAddrModeForGS ENDP 
 
;****************************************
;* Разрешить работу с памятью выше 1 Мб *
;****************************************
Enable_A20 PROC 
        call    Wait8042BufferEmpty
        mov     AL,0D1h ;команда управления линий A20
        out     64h,AL
        call    Wait8042BufferEmpty
        mov     AL,0DFh ;разрешить работу линии
        out     60h,AL
        call    Wait8042BufferEmpty
        ret
Enable_A20 ENDP 
 
;***********************************************
;*   ОЖИДАНИЕ ОЧИСТКИ ВХОДНОГО БУФЕРА I8042    *
;* При выходе из процедуры:                    *
;* флаг ZF установлен - нормальное завершение, *
;* флаг ZF сброшен - ошибка тайм-аута.         *
;***********************************************
Wait8042BufferEmpty proc 
        push    CX
        mov     CX,0FFFFh  ;задать число циклов
@@kb:   in      AL,64h     ;получить статус
        test    AL,10b     ;буфер i8042 свободен?
        loopnz  @@kb       ;если нет, то цикл
        pop     CX
        ; (если при выходе сброшен флаг ZF - ошибка)
        ret
Wait8042BufferEmpty endp 
ENDS
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2011, 18:27
Ответы с готовыми решениями:

Тест оперативной памяти
Программа провисает после запуска. Компилирует нормально, без ошибок. Подскажите где ошибка может быть.. .model small .stack 256 ...

Тест оперативной памяти
Всем доброго времени суток! Возникла такая проблема: необходимо написать программу для тестирования оперативной памяти, образно я...

Объем свободной оперативной памяти
Как через ассемблер (tasm) узнать объем свободной оперативной памяти? Подскажите, как сделать, а то я вообще не представляю...:wall: ...

2
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
31.03.2011, 20:21
http://wasm.ru/article.php?article=hardzen
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
31.03.2011, 20:42  [ТС]
murderer, Это я видел.. и мой код по сути почти такой самый..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.03.2011, 20:42
Помогаю со студенческими работами здесь

Отобразить объем оперативной памяти
Нужно создать программу, которая отображает объем оперативной памяти. (использовать прерывание 12). заранее спасибо.

Тест скорости оперативной памяти
Подскажите пожалуйста. Ошибки в строках 35/39/40. .model small .stack 256 .data M1 DB ':$' M3 DB 'Finish time in ms....$' ...

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

Дисассемблирование в оперативной памяти команды вычитания sub
Здравстуйте. Прошу помощи, вот задачка. Написать программу дисассемблирования в оперативной памяти команды вычитания sub. Информацию...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru