Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
1

Адресация памяти с шириной шины больше 32 бит

29.01.2014, 14:30. Просмотров 1450. Ответов 22
Метки нет (Все метки)

Доброго времени суток Всем! Хотел бы узнать, как проверить наличие возможности реализации в процессоре адресации памяти с шириной шины больше 32 бит? Какие прерывания нужно использовать и какие биты проверять? И как это реализовать в программе?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2014, 14:30
Ответы с готовыми решениями:

Чтение 16 бит шины I2C
Как это можно сделать в Линуксе Ubuntu? есть i2cget , но мне надо прочитать адрес регистра из 16...

R600 получит внешнюю шину шириной в 512 бит
В распоряжении информационного агентства The Inquirer попала информация о готовящемся расширении...

Свойства шины памяти и подбор планки памяти
Имеется такая конфигурация: Свойства шины памяти Тип шины Dual DDR3...

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

Соттношение частот шины и памяти
На нынешних ноутбуках в продаже, ставят ОЗУ DDR III с частотой 1066MHz и выше, при этом шина (FSB)...

22
sh2ezo
1126 / 260 / 9
Регистрация: 11.06.2010
Сообщений: 1,050
29.01.2014, 17:42 2
наверное, надо глядеть в сторону CPUID. 64-битный ли процессор, можно узнать оттуда. Наверное, про PAE тоже из CPUID можно узнать. Читать надо маны интела
1
Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
30.01.2014, 03:03 3
CPUID - не поддерживается на процессорах ниже 486, хотя такие процессоры вам вряд ли доведется использовать, да и большинство процессоров уже с гибридной разрядностью. В целом, примерно так

Assembler
1
2
3
4
5
6
7
cpuid
cmp  eax,80000000h
jbe  32bits
mov  eax,80000001h 
cpuid
test edx,20000000h
jnz  64bits
Лично у меня подобный код работал, ибо 86-64x AMD.
1
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.01.2014, 10:19  [ТС] 4
cpuid - это функция уже вшитая в ассемблер? т.е. в ах возвращается значение размера шины? что-то немного не понял я...
0
30.01.2014, 10:19
Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
30.01.2014, 10:23 5
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
cpuid - это функция уже вшитая в ассемблер? т.е. в ах возвращается значение размера шины? что-то немного не понял я...
Можно сказать, что это инструкция процессора. Она привязана к регистру EAX. А вообще, документации на эту тему достаточно.
0
Mikl___
Ушел с форума
Автор FAQ
13706 / 6787 / 733
Регистрация: 11.11.2010
Сообщений: 12,196
30.01.2014, 11:05 6
Цитата Сообщение от Naydli Посмотреть сообщение
Можно сказать, что это инструкция процессора
это инструкция процессора, через ЕАХ сpuid получает аргументы

Добавлено через 11 минут
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
; masm windows gui #
.686P
.model flat
includelib user32.lib
includelib kernel32.lib
include windows.inc
extern _imp__MessageBoxA@16:dword
extern _imp__GetPriorityClass@4:dword
extern _imp__SetPriorityClass@8:dword
extern _imp__GetCurrentProcess@0:dword
extern _imp__GetThreadPriority@4:dword
extern _imp__SetThreadPriority@8:dword
extern _imp__GetCurrentThread@0:dword
extern _imp__Sleep@4:dword
 
REALTIME_PRIORITY_CLASS = 100h
THREAD_PRIORITY_TIME_CRITICAL = 0Fh
.data?
mesbox_text db 600h dup(?)
.code
start:  
    xor eax,eax
    cpuid
    mov edi,offset mesbox_text
    mov esi,offset buffer
    mov [esi+11],ebx
    mov [esi+15],edx
    mov [esi+19],ecx
    call StringOut
        mov eax,1
    cpuid
    push edx
    xor edx,edx
    mov ebx,eax
        mov esi,offset type_
    call StringOut
    mov eax,ebx
    shr eax,12
    and eax,011b
    mov esi,index1[eax*4]
    call StringOut
       mov esi,offset t0
    call StringOut
        mov eax,ebx
    shr eax,8
    and eax,01111b
    sub eax,3
;   mov esi,index[eax*4]
;   call StringOut
        mov esi,offset t1
    call StringOut
    mov eax,ebx
    shr eax,4
    and eax,01111b
       call IntToStr
       mov esi,offset t2
    call StringOut
    mov eax,ebx
    and eax,01111b
        call IntToStr
        mov esi,offset t32
    call StringOut
    pop edx
    xor ebx,ebx
a3:     shr edx,1
        jnc a4
        mov esi,index2[ebx*4]
    call StringOut
a4: inc ebx
    cmp ebx,25
    jle a3
        mov esi,offset t30
    call StringOut
        call _imp__GetCurrentProcess@0
        push eax             ; hProcess
        call _imp__GetPriorityClass@4
        mov ebx,eax        ; PriorityClass = GetPriorityClass(GetCurrentProcess);
        call _imp__GetCurrentThread@0
        push eax             ; hThread
        call _imp__GetThreadPriority@4
        mov esi,eax        ; Priority = GetThreadPriority(GetCurrentThread);
        push REALTIME_PRIORITY_CLASS
        call _imp__GetCurrentProcess@0
        push eax             ; hProcess
        call _imp__SetPriorityClass@8 ; SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
        push THREAD_PRIORITY_TIME_CRITICAL
        call _imp__GetCurrentThread@0
        push eax             ; hThread
        call _imp__SetThreadPriority@8 ; SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
        push 10
        call _imp__Sleep@4         ; Sleep(10);
        rdtsc
        mov TimerLo,eax
        mov TimerHi,edx
        push 1000             ; DelayTime=1000
        call _imp__Sleep@4         ; Sleep(DelayTime);
        rdtsc
        sub eax,TimerLo
        sbb edx,TimerHi
        mov TimerLo,eax
        mov TimerHi,edx
        push esi             ; Priority
        call _imp__GetCurrentThread@0
        push eax             ; hThread
        call _imp__SetThreadPriority@8 ; SetThreadPriority(GetCurrentThread, Priority);
        push ebx             ; PriorityClass
        call _imp__GetCurrentProcess@0
        push eax             ; hProcess
        call _imp__SetPriorityClass@8 ; SetPriorityClass(GetCurrentProcess, PriorityClass);
    xor edx,edx
        mov eax,TimerLo
        call IntToStr
    mov esi,offset t31
    call StringOut
    push MB_OK + MB_ICONASTERISK
    push offset mesbox_title   
    push offset mesbox_text
    push 0
    call _imp__MessageBoxA@16
    retn
StringOut   proc
a1: lodsb
    or al,al
    jz a2
    stosb
    loop a1
a2: retn
StringOut   endp
IntToStr proc
    or edx,edx      ;число 64-разрядное?
    jnz b1
    cmp eax,10  ;число меньше 10?
        jae @f
    add al,30h
    stosb
        retn
@@: cmp eax,100    ;число меньше 100?
    jae b1
    aam
    add ax,3030h
    xchg ah,al
    stosw
    retn
b1: push ecx
    mov dword ptr Data_Int64,eax;младшая часть 64-разрядного числа
    mov dword ptr Data_Int64+4,edx;старшая часть 64-разрядного числа
    fninit          ;сброс сопроцессора
    fild Data_Int64     ;загрузить число в двоичном коде
    fbstp Data_BCD      ;извлечь число в коде BCD
    mov ecx,9               ;в десятом байте информация о знаке числа
@@:     cmp byte ptr [ecx-1+Data_BCD],0
    jnz @f
    loop @b             ;пропускаем незначащие (нулевые) разряды слева
@@: mov al,byte ptr [ecx-1+Data_BCD];загружаем первую значащую пару разрядов
        cmp al,9  ;если в старшей тетраде 0 - пропустить старшую тетраду
    ja @f
    add al,30h      ;младшую тетраду переводим в ASCII
    stosb
    dec ecx
@@:     xor ax,ax       ;распаковываем остальные разряды числа
    mov al,byte ptr [ecx-1+Data_BCD]
    shl ax,4            ;выделяем старшую и младшую тетрады
    shr al,4
    add ax,3030h        ;переводим в ASCII-код
    xchg ah,al
    stosw
    loop @b
    pop ecx
    retn
IntToStr    endp
Data_Int64   dq 0;64-разрядное число
Data_BCD     dt 0;число в BCD-формате
TimerHi dd 0
TimerLo dd 0
PriorityClass dd 0
Priority dd 0
mesbox_title db 'Windows 32',0
buffer db 'Процессор: ',20h dup(0);строка для вывода результатов исследования
index1 dd offset t7,offset t8,offset t9
type_ db 0Ah,'тип: ',0
t0 db 0Ah,'семейство: ',0
t1 db 0Ah,'модель: ',0
t2 db 0Ah,'модификация: ',0
t3 db '386',0
t4 db '486',0
t5 db 'Pentium',0
t6 db 'Pentium Pro',0
index dd offset t3,offset t4,offset t5,offset t6,0
t7 db 'OEM (x86)',0
t8 db 'Overdrive',0
t9 db 'Dual',0
index2  dd offset t10,offset t11,offset t12,offset t13
    dd offset t14,offset t15,offset t16,offset t17
    dd offset t18,offset t19,offset t35,offset t20
        dd offset t21,offset t22,offset t23,offset t24
    dd offset t25,offset t35,offset t35,offset t35
    dd offset t35,offset t35,offset t35,offset t26
    dd offset t27,offset t28
t10 db 0Ah,'содержит сопроцессор (FPU) и может выполнять весь набор команд 80387',0
t11 db 0Ah,'поддержка усовершенствованного режима V86 (флаги VIF и VIP в EFLAGS биты VME и PVI в CR0)',0
t12 db 0Ah,'поддержка точек останова по вводу/выводу, бита DE в CR0',0
t13 db 0Ah,'поддержка страниц до 4Мб, бит PSE в CR4, модифицированных битов в элементах списков',0Ah,\
    'страниц (PDE) и таблиц страниц (PTE)',0
t14 db 0Ah,'поддержка команды RDTSC и бита TSC в CR4',0
t15 db 0Ah,'поддержка команд RDMSR и WRMSR и машинно-спецефичных регистров, совместимых с Pentium',0
t16 db 0Ah,'поддержка физических адресов более 32 бит, дополнительный уровень',0Ah,\
    'в таблицах трансляции страниц, страницы по 2 Мб и бит PAE в CR4. Число битов для физических',0Ah,\
    'адресов зависит от модели процессора. Так, Pentium Pro поддерживает 36 бит',0
t17 db 0Ah,'поддержка бита MCE в CR4',0
t18 db 0Ah,'поддержка команды CMPXCHG8B',0
t19 db 0Ah,'cодержит встроенный контроллер прерываний (APIC),',0
t20 db 0Ah,'поддержка быстрых системных вызовов, команд SYSENTER и SYSEXIT (Pentium II)',0
t21 db 0Ah,'поддержка машинно-спецефичных регистров MTRR',0
t22 db 0Ah,'поддержка бита PGE в CR4 и глобальных флагов в PTDE и PTE, указывающих элементы TLB,',0Ah,\
    'которые принадлежат сразу нескольким задачам',0
t23 db 0Ah,'поддержка машинно-спецефичного регистра MCG_CAP',0
t24 db 0Ah,'поддержка команд CMOVcc и FCMOVcc',0
t25 db 0Ah,'поддержка таблицы атрибутов страниц (PAT)',0
t26 db 0Ah,'поддержка набора команд MMX',0
t27 db 0Ah,'поддержка команд быстрого чтения/записи (MMX2)',0
t28 db 0Ah,'поддержка расширения SSE (Pentium III)',0
t30 db 0Ah,0Ah,'Частота процессора: ',0
t31 db ' Гц',0
t32 db 0Ah,0Ah,'Поддерживаемые расширения:',0
t35 db 0
end start
компилируем, запускаем, наслаждаемся
1
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
30.01.2014, 15:44  [ТС] 7
В общем кое что сделал)) Вот программа, вроде работает, но есть некоторые сомнения...)) проверьте если не сложно)
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
.8086
.model small
.586
.data
mes  db 'Podderzhivaetsya tolko shina 32bit',0Dh,0Ah,'$'
mes1  db 'Podderzhivaetsya shina 64bit',0Dh,0Ah,'$'
 
.stack 100h
.code
  start:
          mov     ax,@data  ;присвоение ax адреса сегмента данных
          mov     ds, ax
   xor   EAX, EAX
   db    0Fh, 0A2h      ;TASM не знает команду CPUID поэтому вводим ее в кодах
cmp  eax,80000000h
jbe  tre_two            ;перейти если ниже
mov  eax,80000001h 
db    0Fh, 0A2h         ;TASM не знает команду CPUID поэтому вводим ее в кодах
test edx,20000000h
jnz  six_four           ;перейти если меньше или равно
jmp exit            
tre_two:
    mov ah,9
    mov dx,offset mes           
    int 21h
jmp exit
six_four:
    mov ah,9
    mov dx,offset mes1          
    int 21h
exit:
mov ax, 4c00h
         int 21h
 
  end start
Добавлено через 19 минут
Цитата Сообщение от Naydli Посмотреть сообщение

Assembler
1
2
3
cmp  eax,80000000h
mov  eax,80000001h 
test edx,20000000h
.
А что значат эти строки?
0
Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
30.01.2014, 21:37 8
Я не знаю, как в TASM, но вот что я вижу.

Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
.8086
Лучше выкинуть. Да и при запуске на процессорах ниже 486 от проги не будет толку.

Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
mov * * ax,@data
я бы заменила @data на CS.

Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
cmp *eax,80000000h
mov *eax,80000001h
test edx,20000000h
Грубо говоря, махинации по определению процессора. Но! Следует отметить, что на процессорах других марок значения могут отличаться.

Если конкретно,

Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
mov *eax,80000001h
махинация по получению дополнительных функций.

Если EAX перед cpuid будет равно 0, то в регистры EBX, EDX, ECX выдается ASCII строка по 4 байта в каждом регистре.
0
Ethereal
5130 / 2347 / 317
Регистрация: 17.02.2013
Сообщений: 3,391
31.01.2014, 04:28 9
Цитата Сообщение от Naydli Посмотреть сообщение
я бы заменила @data на CS.
И попала бы пальцем в небо.
0
Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
31.01.2014, 04:36 10
Цитата Сообщение от Ethereal Посмотреть сообщение
И попала бы пальцем в небо.
Почему же? Хотя возможно, это уже спецификация компилятора. FASM ругается на @data, да и .data не нужно. Пихаю строки для вывода в конец. Запускаю под виртуальным досом. Все работает. Чего не нравится?
0
Ethereal
5130 / 2347 / 317
Регистрация: 17.02.2013
Сообщений: 3,391
31.01.2014, 06:05 11
По кочану. И FASM тут не при чем. Это свойство MS-DOS, а не компилятора. У EXE-файла в MS-DOS сегмент данных (если он есть) и сегмент кода - разные сегменты. Поэтому CS не равно @data.

Добавлено через 5 минут
Цитата Сообщение от Naydli Посмотреть сообщение
FASM ругается на @data, да и .data не нужно. Пихаю строки для вывода в конец. Запускаю под виртуальным досом. Все работает. Чего не нравится?
Зашибись логика. Ты создаешь EXE-файлы без сегмента данных, пихаешь свои данные в сегмент кода, приравниваешь DS к CS и естественно у тебя все работает, но затем ты начинаешь учить других, что в программе, в которой сегмент данных есть, он равен сегменту кода ? Ну ну ...

Добавлено через 9 минут
Цитата Сообщение от Naydli Посмотреть сообщение
Чего не нравится?
Не нравится то, что ты не советуешь убрать сегмент данных, перекинуть данные в сегмент кода и только после этого заменять в тексте @data на CS. Ты советуешь только заменить. А это означает правильную программу превратить в не правильную. Доступно изъясняюсь ?
0
Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
31.01.2014, 06:25 12
Цитата Сообщение от Ethereal Посмотреть сообщение
Ты создаешь EXE-файлы
Вообще-то COM. Если есть какие-то ошибки, то почему вот такое вот:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
org 100h
 
  start:
    mov     ax,cs
    mov     ds, ax
 
    mov ah,9
    mov dx,mes1
    int 21h
 
mov ax, 4c00h
         int 21h
mes1  db 'Message$'
Работает?

Добавлено через 4 минуты
Устраивать спор по EXE и наворотах DOS не собираюсь, это не в моей компетенции.
0
Ethereal
5130 / 2347 / 317
Регистрация: 17.02.2013
Сообщений: 3,391
31.01.2014, 06:48 13
Потому-что в COM-файле один сегмент для кода, данных и стека. Даже лучше сказать, что в ней нет никаких сегментов. COM-программа - это просто образ фрагмента памяти перед исполнением.

И в COM программе
mov ax,cs
mov ds,ax
не нужно. Там в момент запуска CS=DS=ES=SS

Добавлено через 1 минуту
Цитата Сообщение от Naydli Посмотреть сообщение
Устраивать спор по EXE и наворотах DOS не собираюсь, это не в моей компетенции.
Но в сообщении 7 топика исходный текст именно программы EXE. Не COM. Причем EXE с отдельными сегментами кода и данных.
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
31.01.2014, 10:44  [ТС] 14
Цитата Сообщение от Ethereal Посмотреть сообщение
Но в сообщении 7 топика исходный текст именно программы EXE. Не COM. Причем EXE с отдельными сегментами кода и данных.
Полностью согласен) Программа EXE-шная. Судя из всех споров программа у меня получилась правильная? или нет?)
0
Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
31.01.2014, 10:47 15
SkN[i]lpl[e][r], а у тебя она что выводит? У меня после переделок 32 выдает.
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
31.01.2014, 10:49  [ТС] 16
тоже 32 выдает, просто компа 64 битного у меня нету чтоб проверить)
0
Mikl___
Ушел с форума
Автор FAQ
13706 / 6787 / 733
Регистрация: 11.11.2010
Сообщений: 12,196
31.01.2014, 11:22 17
SkN[i]lpl[e][r],
судя по названию темы "Адресация памяти с шириной шины больше 32 бит" тебе нужно понять поддерживает ли твой комп АДРЕСНУЮ ШИНУ у которой 32 или более разрядов. С разрядностью регистров
Цитата Сообщение от SkN[i]lpl[e][r] Посмотреть сообщение
просто компа 64 битного у меня нету чтоб проверить)
это никак не связано, 16-разрядный intel 80286 поддерживал 24-разрядную адресную шину, у Pentium 32-разрядная архитектура, но 64-разрядная шина данных и адреса
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
31.01.2014, 14:01  [ТС] 18
ну в таком случае получается программа не правильная, раз показывает что 32 разрядная, у меня intel atom и вроде как должно быть 64...
0
Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
31.01.2014, 14:04 19
SkN[i]lpl[e][r], а под чем запускаешь? Тут надо под чистым досом.
0
SkN[i]lpl[e][r]
3 / 3 / 2
Регистрация: 12.05.2011
Сообщений: 248
31.01.2014, 14:09  [ТС] 20
Naydli, эмулятор DOS-Box
0
31.01.2014, 14:09
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2014, 14:09

Сегментная адресация памяти
Здравствуйте, читаю небольшой материал про процессор 8086 и появившийся в нем режим сегментации...

Распределение и адресация памяти
Доброго времени суток. Уважаемые гуру и ассемблеристы , требуется подсказка начинающему...

Количество памяти на видеокарте и ширина шины
вот такой вопрос, нужно ли относительно слабой видеокарте типа nVidiaGT630 2гига памяти, или же это...


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

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

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