Определение объема оперативной памяти
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
|